qtmobility/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    52 #include <coecntrl.h>
    52 #include <coecntrl.h>
    53 #include <coemain.h>    // For CCoeEnv
    53 #include <coemain.h>    // For CCoeEnv
    54 #include <w32std.h>
    54 #include <w32std.h>
    55 #include <mmf/common/mmfcontrollerframeworkbase.h>
    55 #include <mmf/common/mmfcontrollerframeworkbase.h>
    56 
    56 
    57 #include <AudioOutput.h>
       
    58 #include <MAudioOutputObserver.h>
       
    59 
       
    60 S60VideoPlayerSession::S60VideoPlayerSession(QMediaService *service)
    57 S60VideoPlayerSession::S60VideoPlayerSession(QMediaService *service)
    61     : S60MediaPlayerSession(service)
    58     : S60MediaPlayerSession(service)
    62     , m_player(0)
    59     , m_player(0)
    63     , m_rect(0, 0, 0, 0)
    60     , m_rect(0, 0, 0, 0)
    64     , m_output(QVideoOutputControl::NoOutput)
    61 //FIXME    , m_output(QVideoOutputControl::NoOutput)
    65     , m_windowId(0)
    62     , m_windowId(0)
    66     , m_dsaActive(false)
    63     , m_dsaActive(false)
    67     , m_dsaStopped(false)
    64     , m_dsaStopped(false)
    68     , m_wsSession(CCoeEnv::Static()->WsSession())
    65     , m_wsSession(CCoeEnv::Static()->WsSession())
    69     , m_screenDevice(*CCoeEnv::Static()->ScreenDevice())
    66     , m_screenDevice(*CCoeEnv::Static()->ScreenDevice())
    70     , m_window(0)
    67     , m_window(0)
       
    68     , m_displayWindow(0)
    71     , m_service(*service)
    69     , m_service(*service)
    72     , m_aspectRatioMode(Qt::KeepAspectRatio)
    70     , m_aspectRatioMode(Qt::KeepAspectRatio)
    73     , m_originalSize(1, 1)
    71     , m_originalSize(1, 1)
    74     , m_audioOutput(0)
       
    75     , m_audioEndpoint("Default")
    72     , m_audioEndpoint("Default")
    76 {  
    73 {
       
    74 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
       
    75     m_audioOutput = 0;
       
    76 #endif
       
    77 
    77     resetNativeHandles();
    78     resetNativeHandles();
       
    79 #ifdef MMF_VIDEO_SURFACES_SUPPORTED
       
    80     QT_TRAP_THROWING(m_player = CVideoPlayerUtility2::NewL(
       
    81         *this,
       
    82         0,
       
    83         EMdaPriorityPreferenceNone
       
    84         ));
       
    85 #else
    78     QT_TRAP_THROWING(m_player = CVideoPlayerUtility::NewL(
    86     QT_TRAP_THROWING(m_player = CVideoPlayerUtility::NewL(
    79         *this, 
    87         *this,
    80         0, 
    88         0,
    81         EMdaPriorityPreferenceNone, 
    89         EMdaPriorityPreferenceNone,
    82         m_wsSession, 
    90         m_wsSession,
    83         m_screenDevice, 
    91         m_screenDevice,
    84         *m_window, 
    92         *m_window,
    85         m_rect, 
    93         m_rect,
    86         m_rect));
    94         m_rect));
    87     m_dsaActive = true;
    95     m_dsaActive = true;
    88     m_player->RegisterForVideoLoadingNotification(*this);
    96     m_player->RegisterForVideoLoadingNotification(*this);
       
    97 #endif // MMF_VIDEO_SURFACES_SUPPORTED
    89 }
    98 }
    90 
    99 
    91 S60VideoPlayerSession::~S60VideoPlayerSession()
   100 S60VideoPlayerSession::~S60VideoPlayerSession()
    92 {
   101 {
    93 #if !defined(HAS_NO_AUDIOROUTING_IN_VIDEOPLAYER)
   102 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
    94     if (m_audioOutput)
   103     if (m_audioOutput)
    95         m_audioOutput->UnregisterObserver(*this);
   104         m_audioOutput->UnregisterObserver(*this);
    96     delete m_audioOutput;
   105     delete m_audioOutput;
    97 #endif
   106 #endif
    98     m_player->Close();
   107     m_player->Close();
    99     delete m_player;
   108     delete m_player;
   100 }
   109 }
   101 
   110 
   102 void S60VideoPlayerSession::doLoadL(const TDesC &path)
   111 void S60VideoPlayerSession::doLoadL(const TDesC &path)
   103 {
   112 {
       
   113 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   104     // m_audioOutput needs to be reinitialized after MapcInitComplete
   114     // m_audioOutput needs to be reinitialized after MapcInitComplete
   105     if (m_audioOutput)
   115     if (m_audioOutput)
   106         m_audioOutput->UnregisterObserver(*this);
   116         m_audioOutput->UnregisterObserver(*this);
   107     delete m_audioOutput;
   117     delete m_audioOutput;
   108     m_audioOutput = NULL;
   118     m_audioOutput = NULL;
   109 
   119 #endif
   110     m_player->OpenFileL(path);
   120     m_player->OpenFileL(path);
   111 }
   121 }
   112 
   122 
   113 void S60VideoPlayerSession::doLoadUrlL(const TDesC &path)
   123 void S60VideoPlayerSession::doLoadUrlL(const TDesC &path)
   114 {
   124 {
       
   125 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   115     // m_audioOutput needs to be reinitialized after MapcInitComplete
   126     // m_audioOutput needs to be reinitialized after MapcInitComplete
   116     if (m_audioOutput)
   127     if (m_audioOutput)
   117         m_audioOutput->UnregisterObserver(*this);
   128         m_audioOutput->UnregisterObserver(*this);
   118     delete m_audioOutput;
   129     delete m_audioOutput;
   119     m_audioOutput = NULL;
   130     m_audioOutput = NULL;
   120 
   131 #endif
   121     m_player->OpenUrlL(path);
   132     m_player->OpenUrlL(path);
   122 }
   133 }
   123 
   134 
   124 int S60VideoPlayerSession::doGetBufferStatusL() const
   135 int S60VideoPlayerSession::doGetBufferStatusL() const
   125 {
   136 {
   134 }
   145 }
   135 
   146 
   136 void S60VideoPlayerSession::setVideoRenderer(QObject *videoOutput)
   147 void S60VideoPlayerSession::setVideoRenderer(QObject *videoOutput)
   137 {
   148 {
   138     Q_UNUSED(videoOutput)
   149     Q_UNUSED(videoOutput)
   139     QVideoOutputControl *videoControl = qobject_cast<QVideoOutputControl *>(m_service.control(QVideoOutputControl_iid));
   150 /*FIXME    QVideoOutputControl *videoControl = qobject_cast<QVideoOutputControl *>(m_service.control(QVideoOutputControl_iid));
   140     
   151     
   141     //Render changes
   152     //Renderer changes
   142     if (m_output != videoControl->output()) {
   153     if (m_output != videoControl->output()) {
   143         
   154         
   144         if (m_output == QVideoOutputControl::WidgetOutput) {
   155         if (m_output == QVideoOutputControl::WidgetOutput) {
   145             S60VideoWidgetControl *widgetControl = qobject_cast<S60VideoWidgetControl *>(m_service.control(QVideoWidgetControl_iid));
   156             S60VideoWidgetControl *widgetControl = qobject_cast<S60VideoWidgetControl *>(m_service.control(QVideoWidgetControl_iid));
   146             disconnect(widgetControl, SIGNAL(widgetUpdated()), this, SLOT(resetVideoDisplay()));
   157             disconnect(widgetControl, SIGNAL(widgetUpdated()), this, SLOT(resetVideoDisplay()));
   158         }
   169         }
   159         
   170         
   160         m_output = videoControl->output();
   171         m_output = videoControl->output();
   161         resetVideoDisplay();
   172         resetVideoDisplay();
   162     }
   173     }
       
   174 */
   163 }
   175 }
   164 
   176 
   165 bool S60VideoPlayerSession::resetNativeHandles()
   177 bool S60VideoPlayerSession::resetNativeHandles()
   166 {
   178 {
   167     QVideoOutputControl* videoControl = qobject_cast<QVideoOutputControl *>(m_service.control(QVideoOutputControl_iid));
   179 /*FIXME    QVideoOutputControl* videoControl = qobject_cast<QVideoOutputControl *>(m_service.control(QVideoOutputControl_iid));
   168     WId newId = 0;
   180     WId newId = 0;
   169     TRect newRect = TRect(0,0,0,0);
   181     TRect newRect = TRect(0,0,0,0);
   170     Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio;
   182     Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio;
   171     
   183     
   172     if (videoControl->output() == QVideoOutputControl::WidgetOutput) {
   184     if (videoControl->output() == QVideoOutputControl::WidgetOutput) {
   187             newId = QApplication::allWidgets().at(0)->effectiveWinId();
   199             newId = QApplication::allWidgets().at(0)->effectiveWinId();
   188         
   200         
   189         Q_ASSERT(newId != 0);
   201         Q_ASSERT(newId != 0);
   190     }
   202     }
   191     
   203     
   192     if (newRect == m_rect &&  newId == m_windowId && aspectRatioMode == m_aspectRatioMode) 
   204     if (newRect == m_rect &&  newId == m_windowId && aspectRatioMode == m_aspectRatioMode) {
   193         return false;
   205         return false;
       
   206     }
   194     
   207     
   195     if (newId) {
   208     if (newId) {
   196         m_rect = newRect;
   209         m_rect = newRect;
   197         m_windowId = newId;
   210         m_windowId = newId;
   198         m_window = m_windowId->DrawableWindow();
   211         m_window = m_windowId->DrawableWindow();
   199         m_aspectRatioMode = aspectRatioMode;
   212         m_aspectRatioMode = aspectRatioMode;
   200         return true;
   213         return true;
   201     }
   214     }
   202     return false;
   215     return false;
       
   216 */    
   203 }
   217 }
   204 
   218 
   205 bool S60VideoPlayerSession::isVideoAvailable() const
   219 bool S60VideoPlayerSession::isVideoAvailable() const
   206 {
   220 {
   207 #ifdef PRE_S60_50_PLATFORM
   221 #ifdef PRE_S60_50_PLATFORM
   294 {
   308 {
   295     setError(aError);
   309     setError(aError);
   296     m_player->Prepare();
   310     m_player->Prepare();
   297 }
   311 }
   298 
   312 
       
   313 #ifdef MMF_VIDEO_SURFACES_SUPPORTED
       
   314 void S60VideoPlayerSession::MvpuoPrepareComplete(TInt aError)
       
   315 {
       
   316 /*FIXME    setError(aError);
       
   317     TRect rect;
       
   318     S60VideoWidgetControl* widgetControl = qobject_cast<S60VideoWidgetControl *>(m_service.control(QVideoWidgetControl_iid));
       
   319     const QSize size = widgetControl->videoWidgetSize();
       
   320     rect.SetSize(TSize(size.width(), size.height()));
       
   321 
       
   322     if (m_displayWindow)
       
   323         m_player->RemoveDisplayWindow(*m_displayWindow);
       
   324 
       
   325     RWindow *window = static_cast<RWindow *>(m_window);
       
   326     if (window) {
       
   327         window->SetBackgroundColor(TRgb(0, 0, 0, 255));
       
   328         TRAPD(error,
       
   329             m_player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect);
       
   330             TSize originalSize;
       
   331             m_player->VideoFrameSizeL(originalSize);
       
   332             m_originalSize = QSize(originalSize.iWidth, originalSize.iHeight);
       
   333             m_player->SetScaleFactorL(*window, scaleFactor().first, scaleFactor().second));
       
   334         setError(error);
       
   335     }
       
   336     m_displayWindow = window;
       
   337 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
       
   338     TRAPD(err,
       
   339         m_audioOutput = CAudioOutput::NewL(*m_player);
       
   340         m_audioOutput->RegisterObserverL(*this);
       
   341     );
       
   342     setActiveEndpoint(m_audioEndpoint);
       
   343     setError(err);
       
   344 #endif
       
   345     loaded();
       
   346     */
       
   347 }
       
   348 #else
   299 void S60VideoPlayerSession::MvpuoPrepareComplete(TInt aError)
   349 void S60VideoPlayerSession::MvpuoPrepareComplete(TInt aError)
   300 {
   350 {
   301     setError(aError);
   351     setError(aError);
   302     TRAPD(err, 
   352     TRAPD(err, 
   303         m_player->SetDisplayWindowL(m_wsSession, 
   353         m_player->SetDisplayWindowL(m_wsSession, 
   310         m_originalSize = QSize(originalSize.iWidth, originalSize.iHeight);
   360         m_originalSize = QSize(originalSize.iWidth, originalSize.iHeight);
   311         m_player->SetScaleFactorL(scaleFactor().first, scaleFactor().second, true));
   361         m_player->SetScaleFactorL(scaleFactor().first, scaleFactor().second, true));
   312 
   362 
   313     setError(err);
   363     setError(err);
   314     m_dsaActive = true;
   364     m_dsaActive = true;
   315 #if !defined(HAS_NO_AUDIOROUTING_IN_VIDEOPLAYER)
   365 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   316     TRAP(err, 
   366     TRAP(err, 
   317         m_audioOutput = CAudioOutput::NewL(*m_player);
   367         m_audioOutput = CAudioOutput::NewL(*m_player);
   318         m_audioOutput->RegisterObserverL(*this);
   368         m_audioOutput->RegisterObserverL(*this);
   319     );
   369     );
   320     setActiveEndpoint(m_audioEndpoint);
   370     setActiveEndpoint(m_audioEndpoint);
   321     setError(err);
   371     setError(err);
   322 #endif
   372 #endif
   323     loaded();
   373     loaded();
   324 }
   374 }
       
   375 #endif // MMF_VIDEO_SURFACES_SUPPORTED
   325 
   376 
   326 void S60VideoPlayerSession::MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError)
   377 void S60VideoPlayerSession::MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError)
   327 {
   378 {
   328     Q_UNUSED(aFrame);
   379     Q_UNUSED(aFrame);
   329     Q_UNUSED(aError);
   380     Q_UNUSED(aError);
   353         metaDataEntries().insert(TDesC2QString(entry->Name()), TDesC2QString(entry->Value()));
   404         metaDataEntries().insert(TDesC2QString(entry->Name()), TDesC2QString(entry->Value()));
   354         delete entry;
   405         delete entry;
   355     }
   406     }
   356     emit metaDataChanged();
   407     emit metaDataChanged();
   357 }
   408 }
   358 
   409 #ifdef MMF_VIDEO_SURFACES_SUPPORTED
       
   410 void S60VideoPlayerSession::resetVideoDisplay()
       
   411 {
       
   412     if (resetNativeHandles()) {
       
   413         TRect rect;
       
   414 //FIXME        S60VideoWidgetControl* widgetControl = qobject_cast<S60VideoWidgetControl *>(m_service.control(QVideoWidgetControl_iid));
       
   415 //FIXME        const QSize size = widgetControl->videoWidgetSize();
       
   416 //FIXME        rect.SetSize(TSize(size.width(), size.height()));
       
   417         if (m_displayWindow)
       
   418             m_player->RemoveDisplayWindow(*m_displayWindow);
       
   419         RWindow *window = static_cast<RWindow *>(m_window);
       
   420         if (window) {
       
   421             window->SetBackgroundColor(TRgb(0, 0, 0, 255));
       
   422             TRAPD(err,
       
   423                m_player->AddDisplayWindowL(m_wsSession,
       
   424                                            m_screenDevice,
       
   425                                            *window,
       
   426                                            rect,
       
   427                                            rect));
       
   428             setError(err);
       
   429         }
       
   430         m_displayWindow = window;
       
   431         if(    mediaStatus() == QMediaPlayer::LoadedMedia
       
   432             || mediaStatus() == QMediaPlayer::StalledMedia
       
   433             || mediaStatus() == QMediaPlayer::BufferingMedia
       
   434             || mediaStatus() == QMediaPlayer::BufferedMedia
       
   435             || mediaStatus() == QMediaPlayer::EndOfMedia) {
       
   436             Q_ASSERT(m_displayWindow != 0);
       
   437             TRAPD(err, m_player->SetScaleFactorL(*m_displayWindow, scaleFactor().first, scaleFactor().second));
       
   438             setError(err);
       
   439         }
       
   440     }
       
   441 }
       
   442 #else
   359 void S60VideoPlayerSession::resetVideoDisplay()
   443 void S60VideoPlayerSession::resetVideoDisplay()
   360 {
   444 {
   361     if (resetNativeHandles()) {
   445     if (resetNativeHandles()) {
   362         TRAPD(err,
   446         TRAPD(err,
   363            m_player->SetDisplayWindowL(m_wsSession, 
   447            m_player->SetDisplayWindowL(m_wsSession, 
   374             TRAPD(err, m_player->SetScaleFactorL(scaleFactor().first, scaleFactor().second, true));
   458             TRAPD(err, m_player->SetScaleFactorL(scaleFactor().first, scaleFactor().second, true));
   375             setError(err);
   459             setError(err);
   376         }
   460         }
   377     }
   461     }
   378 }
   462 }
       
   463 #endif //MMF_VIDEO_SURFACES_SUPPORTED
   379 
   464 
   380 void S60VideoPlayerSession::suspendDirectScreenAccess()
   465 void S60VideoPlayerSession::suspendDirectScreenAccess()
   381 {
   466 {
   382     m_dsaStopped = stopDirectScreenAccess();
   467     m_dsaStopped = stopDirectScreenAccess();
   383 }
   468 }
   407 }
   492 }
   408 
   493 
   409 QString S60VideoPlayerSession::activeEndpoint() const
   494 QString S60VideoPlayerSession::activeEndpoint() const
   410 {
   495 {
   411     QString outputName = QString("Default");
   496     QString outputName = QString("Default");
   412 #if !defined(HAS_NO_AUDIOROUTING_IN_VIDEOPLAYER)
   497 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   413     if (m_audioOutput) {
   498     if (m_audioOutput) {
   414         CAudioOutput::TAudioOutputPreference output = m_audioOutput->AudioOutput();
   499         CAudioOutput::TAudioOutputPreference output = m_audioOutput->AudioOutput();
   415         outputName = qStringFromTAudioOutputPreference(output);
   500         outputName = qStringFromTAudioOutputPreference(output);
   416     }
   501     }
   417 #endif
   502 #endif
   419 }
   504 }
   420 
   505 
   421 QString S60VideoPlayerSession::defaultEndpoint() const
   506 QString S60VideoPlayerSession::defaultEndpoint() const
   422 {
   507 {
   423     QString outputName = QString("Default");
   508     QString outputName = QString("Default");
   424 #if !defined(HAS_NO_AUDIOROUTING_IN_VIDEOPLAYER)
   509 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   425     if (m_audioOutput) {
   510     if (m_audioOutput) {
   426         CAudioOutput::TAudioOutputPreference output = m_audioOutput->DefaultAudioOutput();
   511         CAudioOutput::TAudioOutputPreference output = m_audioOutput->DefaultAudioOutput();
   427         outputName = qStringFromTAudioOutputPreference(output);
   512         outputName = qStringFromTAudioOutputPreference(output);
   428     }
   513     }
   429 #endif
   514 #endif
   430     return outputName;
   515     return outputName;
   431 }
   516 }
   432 
   517 
   433 void S60VideoPlayerSession::setActiveEndpoint(const QString& name)
   518 void S60VideoPlayerSession::setActiveEndpoint(const QString& name)
   434 {
   519 {
       
   520 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   435     CAudioOutput::TAudioOutputPreference output = CAudioOutput::ENoPreference;
   521     CAudioOutput::TAudioOutputPreference output = CAudioOutput::ENoPreference;
   436 
   522 
   437     if (name == QString("Default"))
   523     if (name == QString("Default"))
   438         output = CAudioOutput::ENoPreference;
   524         output = CAudioOutput::ENoPreference;
   439     else if (name == QString("All"))
   525     else if (name == QString("All"))
   442         output = CAudioOutput::ENoOutput;
   528         output = CAudioOutput::ENoOutput;
   443     else if (name == QString("Earphone"))
   529     else if (name == QString("Earphone"))
   444         output = CAudioOutput::EPrivate;
   530         output = CAudioOutput::EPrivate;
   445     else if (name == QString("Speaker"))
   531     else if (name == QString("Speaker"))
   446         output = CAudioOutput::EPublic;
   532         output = CAudioOutput::EPublic;
   447 #if !defined(HAS_NO_AUDIOROUTING_IN_VIDEOPLAYER)
   533 
   448     if (m_audioOutput) {
   534     if (m_audioOutput) {
   449         TRAPD(err, m_audioOutput->SetAudioOutputL(output));
   535         TRAPD(err, m_audioOutput->SetAudioOutputL(output));
   450         setError(err);
   536         setError(err);
   451         
   537         
   452         if (m_audioEndpoint != name) {
   538         if (m_audioEndpoint != name) {
   454             emit activeEndpointChanged(name);
   540             emit activeEndpointChanged(name);
   455         }
   541         }
   456     }
   542     }
   457 #endif
   543 #endif
   458 }
   544 }
   459 
   545 #ifdef HAS_AUDIOROUTING_IN_VIDEOPLAYER
   460 void S60VideoPlayerSession::DefaultAudioOutputChanged( CAudioOutput& aAudioOutput,
   546 void S60VideoPlayerSession::DefaultAudioOutputChanged( CAudioOutput& aAudioOutput,
   461                                         CAudioOutput::TAudioOutputPreference aNewDefault )
   547                                         CAudioOutput::TAudioOutputPreference aNewDefault )
   462 {
   548 {
   463     // Emit already implemented in setActiveEndpoint function
   549     // Emit already implemented in setActiveEndpoint function
   464     Q_UNUSED(aAudioOutput)
   550     Q_UNUSED(aAudioOutput)
   477         return QString("Earphone");
   563         return QString("Earphone");
   478     else if (output == CAudioOutput::EPublic)
   564     else if (output == CAudioOutput::EPublic)
   479         return QString("Speaker");
   565         return QString("Speaker");
   480     return QString("Default");
   566     return QString("Default");
   481 }
   567 }
       
   568 #endif //HAS_AUDIOROUTING_IN_VIDEOPLAYER)