bool S60VideoPlayerSession::resetNativeHandles() { WId newId = 0; TRect newRect = TRect(0,0,0,0); Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio; S60VideoWidgetControl *widgetControl; if (!m_videoOutput) // this is for pre Symbian^3 devices as we need output for CVideoPlayerUtility widgetControl = qobject_cast<S60VideoWidgetControl *>(m_service.requestControl(QVideoWidgetControl_iid)); else widgetControl = qobject_cast<S60VideoWidgetControl *>(m_videoOutput); if (widgetControl) { QWidget *videoWidget = widgetControl->videoWidget(); newId = widgetControl->videoWidgetWId(); newRect = QRect2TRect(QRect(videoWidget->mapToGlobal(videoWidget->pos()), videoWidget->size())); aspectRatioMode = widgetControl->aspectRatioMode(); } else { if (QApplication::activeWindow()) newId = QApplication::activeWindow()->effectiveWinId(); if (!newId && QApplication::allWidgets().count()) newId = QApplication::allWidgets().at(0)->effectiveWinId(); Q_ASSERT(newId != 0); } if (newRect == m_rect && newId == m_windowId && aspectRatioMode == m_aspectRatioMode) return false; if (newId) { m_rect = newRect; m_windowId = newId; m_window = m_windowId->DrawableWindow(); m_aspectRatioMode = aspectRatioMode; return true; } return false; }
/*! * Apply the pending changes for window. */ void S60VideoPlayerSession::applyPendingChanges(bool force) { DP0("S60VideoPlayerSession::applyPendingChanges +++"); if ( force || QMediaPlayer::LoadedMedia == mediaStatus() || QMediaPlayer::StalledMedia == mediaStatus() || QMediaPlayer::BufferingMedia == mediaStatus() || QMediaPlayer::BufferedMedia == mediaStatus() || QMediaPlayer::EndOfMedia == mediaStatus()) { int error = KErrNone; RWindow *const window = m_videoOutputDisplay ? m_videoOutputDisplay->windowHandle() : 0; const QRect extentRect = m_videoOutputDisplay ? m_videoOutputDisplay->extentRect() : QRect(); const QRect clipRect = m_videoOutputDisplay ? m_videoOutputDisplay->clipRect() : QRect(); #ifdef VIDEOOUTPUT_GRAPHICS_SURFACES if (m_pendingChanges & WindowHandle) { if (m_displayWindow) { m_player->RemoveDisplayWindow(*m_displayWindow); m_displayWindow = 0; } if (window) { TRAP(error, m_player->AddDisplayWindowL(*m_wsSession, *m_screenDevice, *window, QRect2TRect(extentRect), QRect2TRect(clipRect))); if (KErrNone == error) m_displayWindow = window; } m_pendingChanges = ScaleFactors; } if (KErrNone == error && (m_pendingChanges & DisplayRect) && m_displayWindow) { TRAP(error, m_player->SetVideoExtentL(*m_displayWindow, QRect2TRect(extentRect))); if (KErrNone == error) TRAP(error, m_player->SetWindowClipRectL(*m_displayWindow, QRect2TRect(clipRect))); m_pendingChanges ^= DisplayRect; m_pendingChanges |= ScaleFactors; } #else if (m_pendingChanges & WindowHandle || m_pendingChanges & DisplayRect) { if (window) { TRAP(error, m_player->SetDisplayWindowL(*m_wsSession, *m_screenDevice, *window, QRect2TRect(extentRect), QRect2TRect(clipRect))); if (KErrNone == error) m_displayWindow = window; } m_dsaActive = (KErrNone == error); m_dsaStopped = false; m_pendingChanges = ScaleFactors; } #endif // VIDEOOUTPUT_GRAPHICS_SURFACES if (KErrNone == error && (m_pendingChanges & ScaleFactors) && m_displayWindow && m_videoOutputDisplay) { const TVideoRotation rotation = videoRotation(m_videoOutputDisplay->rotation()); const bool swap = (rotation == EVideoRotationClockwise90 || rotation == EVideoRotationClockwise270); const QSize extentSize = swap ? QSize(extentRect.height(), extentRect.width()) : extentRect.size(); QSize scaled = m_nativeSize; if (m_videoOutputDisplay->aspectRatioMode() == Qt::IgnoreAspectRatio) scaled.scale(extentSize, Qt::IgnoreAspectRatio); else if (m_videoOutputDisplay->aspectRatioMode() == Qt::KeepAspectRatio) scaled.scale(extentSize, Qt::KeepAspectRatio); else if (m_videoOutputDisplay->aspectRatioMode() == Qt::KeepAspectRatioByExpanding) scaled.scale(extentSize, Qt::KeepAspectRatioByExpanding); const qreal width = qreal(scaled.width()) / qreal(m_nativeSize.width()) * qreal(100); const qreal height = qreal(scaled.height()) / qreal(m_nativeSize.height()) * qreal(100); #ifdef VIDEOOUTPUT_GRAPHICS_SURFACES TRAP(error, m_player->SetScaleFactorL(*m_displayWindow, width, height)); #else static const TBool antialias = ETrue; TRAP(error, m_player->SetScaleFactorL(width, height, antialias)); #endif // VIDEOOUTPUT_GRAPHICS_SURFACES m_pendingChanges ^= ScaleFactors; } if (KErrNone == error && (m_pendingChanges && Rotation) && m_displayWindow && m_videoOutputDisplay) { const TVideoRotation rotation = videoRotation(m_videoOutputDisplay->rotation()); #ifdef VIDEOOUTPUT_GRAPHICS_SURFACES TRAP(error, m_player->SetRotationL(*m_displayWindow, rotation)); #else TRAP(error, m_player->SetRotationL(rotation)); #endif // VIDEOOUTPUT_GRAPHICS_SURFACES m_pendingChanges ^= Rotation; } setError(error); } DP0("S60VideoPlayerSession::applyPendingChanges ---"); }
/*! Constructs the CVideoPlayerUtility2 object with given \a service and \a object. And Registers for Video Loading Notifications. */ S60VideoPlayerSession::S60VideoPlayerSession(QMediaService *service, S60MediaNetworkAccessControl *object) : S60MediaPlayerSession(service) , m_accessPointId(0) , m_wsSession(&CCoeEnv::Static()->WsSession()) , m_screenDevice(CCoeEnv::Static()->ScreenDevice()) , m_service(service) , m_player(0) #ifndef VIDEOOUTPUT_GRAPHICS_SURFACES , m_dsaActive(false) , m_dsaStopped(false) #endif , m_videoOutputControl(0) , m_videoOutputDisplay(0) , m_displayWindow(0) #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER , m_audioOutput(0) #endif , m_audioEndpoint(DefaultAudioEndpoint) , m_pendingChanges(0) , m_backendInitiatedPause(false) { DP0("S60VideoPlayerSession::S60VideoPlayerSession +++"); m_networkAccessControl = object; #ifdef VIDEOOUTPUT_GRAPHICS_SURFACES QT_TRAP_THROWING(m_player = CVideoPlayerUtility2::NewL( *this, 0, EMdaPriorityPreferenceNone )); m_player->RegisterForVideoLoadingNotification(*this); #else RWindow *window = 0; QRect extentRect; QWidget *widget = QApplication::activeWindow(); if (!widget) widget = QApplication::allWidgets().at(0); Q_ASSERT(widget); WId wid = widget->effectiveWinId(); if (!wid) wid = widget->winId(); window = static_cast<RWindow *>(wid->DrawableWindow()); extentRect = QRect(widget->mapToGlobal(widget->pos()), widget->size()); TRect clipRect = QRect2TRect(extentRect); const TRect desktopRect = QRect2TRect(QApplication::desktop()->screenGeometry()); clipRect.Intersection(desktopRect); QT_TRAP_THROWING(m_player = CVideoPlayerUtility::NewL( *this, 0, EMdaPriorityPreferenceNone, *m_wsSession, *m_screenDevice, *window, QRect2TRect(extentRect), clipRect)); m_dsaActive = true; m_player->RegisterForVideoLoadingNotification(*this); #endif // VIDEOOUTPUT_GRAPHICS_SURFACES S60VideoPlayerEventHandler::instance()->addApplicationFocusObserver(this); DP0("S60VideoPlayerSession::S60VideoPlayerSession ---"); }