qtmobility/plugins/multimedia/directshow/player/directshowplayerservice.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    43 
    43 
    44 #include "directshowaudioendpointcontrol.h"
    44 #include "directshowaudioendpointcontrol.h"
    45 #include "directshowiosource.h"
    45 #include "directshowiosource.h"
    46 #include "directshowmetadatacontrol.h"
    46 #include "directshowmetadatacontrol.h"
    47 #include "directshowplayercontrol.h"
    47 #include "directshowplayercontrol.h"
    48 #include "directshowvideooutputcontrol.h"
       
    49 #include "directshowvideorenderercontrol.h"
    48 #include "directshowvideorenderercontrol.h"
    50 #include "vmr9videowindowcontrol.h"
    49 #include "vmr9videowindowcontrol.h"
    51 
    50 
    52 #include "../../src/multimedia/qmediacontent.h"
    51 #include "../../src/multimedia/qmediacontent.h"
    53 
    52 
    75 
    74 
    76 DirectShowPlayerService::DirectShowPlayerService(QObject *parent)
    75 DirectShowPlayerService::DirectShowPlayerService(QObject *parent)
    77     : QMediaService(parent)
    76     : QMediaService(parent)
    78     , m_playerControl(0)
    77     , m_playerControl(0)
    79     , m_metaDataControl(0)
    78     , m_metaDataControl(0)
    80     , m_videoOutputControl(0)
       
    81     , m_videoRendererControl(0)
    79     , m_videoRendererControl(0)
    82     , m_videoWindowControl(0)
    80     , m_videoWindowControl(0)
    83     , m_audioEndpointControl(0)
    81     , m_audioEndpointControl(0)
    84     , m_taskThread(0)
    82     , m_taskThread(0)
    85     , m_loop(qt_directShowEventLoop())
    83     , m_loop(qt_directShowEventLoop())
   101     , m_seekable(false)
    99     , m_seekable(false)
   102     , m_atEnd(false)
   100     , m_atEnd(false)
   103 {
   101 {
   104     m_playerControl = new DirectShowPlayerControl(this);
   102     m_playerControl = new DirectShowPlayerControl(this);
   105     m_metaDataControl = new DirectShowMetaDataControl(this);
   103     m_metaDataControl = new DirectShowMetaDataControl(this);
   106     m_videoOutputControl = new DirectShowVideoOutputControl; 
       
   107     m_audioEndpointControl = new DirectShowAudioEndpointControl(this);
   104     m_audioEndpointControl = new DirectShowAudioEndpointControl(this);
   108     m_videoRendererControl = new DirectShowVideoRendererControl(m_loop);
       
   109     m_videoWindowControl = new Vmr9VideoWindowControl;
       
   110 
   105 
   111     m_taskThread = new DirectShowPlayerServiceThread(this);
   106     m_taskThread = new DirectShowPlayerServiceThread(this);
   112     m_taskThread->start();
   107     m_taskThread->start();
   113 
       
   114     connect(m_videoOutputControl, SIGNAL(outputChanged()), this, SLOT(videoOutputChanged()));
       
   115     connect(m_videoRendererControl, SIGNAL(filterChanged()), this, SLOT(videoOutputChanged()));
       
   116 }
   108 }
   117 
   109 
   118 DirectShowPlayerService::~DirectShowPlayerService()
   110 DirectShowPlayerService::~DirectShowPlayerService()
   119 {
   111 {
   120     {
   112     {
   140     }
   132     }
   141 
   133 
   142     delete m_playerControl;
   134     delete m_playerControl;
   143     delete m_audioEndpointControl;
   135     delete m_audioEndpointControl;
   144     delete m_metaDataControl;
   136     delete m_metaDataControl;
   145     delete m_videoOutputControl;
       
   146     delete m_videoRendererControl;
   137     delete m_videoRendererControl;
   147     delete m_videoWindowControl;
   138     delete m_videoWindowControl;
   148 
   139 
   149     ::CloseHandle(m_taskHandle);
   140     ::CloseHandle(m_taskHandle);
   150 }
   141 }
   151 
   142 
   152 QMediaControl *DirectShowPlayerService::control(const char *name) const
   143 QMediaControl *DirectShowPlayerService::requestControl(const char *name)
   153 {
   144 {
   154     if (qstrcmp(name, QMediaPlayerControl_iid) == 0)
   145     if (qstrcmp(name, QMediaPlayerControl_iid) == 0) {
   155         return m_playerControl;
   146         return m_playerControl;
   156     else if (qstrcmp(name, QAudioEndpointSelector_iid) == 0)
   147     } else if (qstrcmp(name, QAudioEndpointSelector_iid) == 0) {
   157         return m_audioEndpointControl;
   148         return m_audioEndpointControl;
   158     else if (qstrcmp(name, QMetaDataControl_iid) == 0)
   149     } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) {
   159         return m_metaDataControl;
   150         return m_metaDataControl;
   160     else if (qstrcmp(name, QVideoOutputControl_iid) == 0)
   151     } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) {
   161         return m_videoOutputControl;
   152         if (!m_videoRendererControl && !m_videoWindowControl) {
   162     else if (qstrcmp(name, QVideoRendererControl_iid) == 0)
   153             m_videoRendererControl = new DirectShowVideoRendererControl(m_loop);
   163         return m_videoRendererControl;
   154 
   164     else if (qstrcmp(name, QVideoWindowControl_iid) == 0)
   155             connect(m_videoRendererControl, SIGNAL(filterChanged()),
   165         return m_videoWindowControl;
   156                     this, SLOT(videoOutputChanged()));
   166     else
   157 
   167         return 0;
   158             return m_videoRendererControl;
       
   159         }
       
   160     } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) {
       
   161         if (!m_videoRendererControl && !m_videoWindowControl) {
       
   162             m_videoWindowControl = new Vmr9VideoWindowControl;
       
   163 
       
   164             setVideoOutput(m_videoWindowControl->filter());
       
   165 
       
   166             return m_videoWindowControl;
       
   167         }
       
   168     }
       
   169     return 0;
       
   170 }
       
   171 
       
   172 void DirectShowPlayerService::releaseControl(QMediaControl *control)
       
   173 {
       
   174     if (!control) {
       
   175         qWarning("QMediaService::releaseControl():"
       
   176                 " Attempted release of null control");
       
   177     } else if (control == m_videoRendererControl) {
       
   178         setVideoOutput(0);
       
   179 
       
   180         delete m_videoRendererControl;
       
   181 
       
   182         m_videoRendererControl = 0;
       
   183     } else if (control == m_videoWindowControl) {
       
   184         setVideoOutput(0);
       
   185 
       
   186         delete m_videoWindowControl;
       
   187 
       
   188         m_videoWindowControl = 0;
       
   189     }
   168 }
   190 }
   169 
   191 
   170 void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream)
   192 void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream)
   171 {
   193 {
   172     QMutexLocker locker(&m_mutex);
   194     QMutexLocker locker(&m_mutex);
  1118     }
  1140     }
  1119 }
  1141 }
  1120 
  1142 
  1121 void DirectShowPlayerService::videoOutputChanged()
  1143 void DirectShowPlayerService::videoOutputChanged()
  1122 {
  1144 {
  1123     IBaseFilter *videoOutput = 0;
  1145     setVideoOutput(m_videoRendererControl->filter());
  1124 
       
  1125     switch (m_videoOutputControl->output()) {
       
  1126     case QVideoOutputControl::RendererOutput:
       
  1127         videoOutput = m_videoRendererControl->filter();
       
  1128         break;
       
  1129     case QVideoOutputControl::WindowOutput:
       
  1130         videoOutput = m_videoWindowControl->filter();
       
  1131         break;
       
  1132     default:
       
  1133         break;
       
  1134     }
       
  1135 
       
  1136     setVideoOutput(videoOutput);
       
  1137 }
  1146 }
  1138 
  1147 
  1139 void DirectShowPlayerService::graphEvent(QMutexLocker *locker)
  1148 void DirectShowPlayerService::graphEvent(QMutexLocker *locker)
  1140 {
  1149 {
  1141     if (IMediaEvent *event = com_cast<IMediaEvent>(m_graph, IID_IMediaEvent)) {
  1150     if (IMediaEvent *event = com_cast<IMediaEvent>(m_graph, IID_IMediaEvent)) {