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)) { |