42 #include "qmediaimageviewerservice_p.h" |
42 #include "qmediaimageviewerservice_p.h" |
43 |
43 |
44 #include "qmediacontrol_p.h" |
44 #include "qmediacontrol_p.h" |
45 #include "qmediaservice_p.h" |
45 #include "qmediaservice_p.h" |
46 |
46 |
47 #include "qmediacontent.h" |
47 #include <qmediacontent.h> |
48 #include "qmediaresource.h" |
48 #include <qmediaresource.h> |
49 #include "qvideooutputcontrol.h" |
49 #include <qmediaobject_p.h> |
50 #include "qmediaobject_p.h" |
50 #include <qvideorenderercontrol.h> |
51 #include "qvideorenderercontrol.h" |
51 #include <qvideowidgetcontrol.h> |
52 #include "qvideowidgetcontrol.h" |
|
53 |
52 |
54 #include <QtCore/qdebug.h> |
53 #include <QtCore/qdebug.h> |
55 |
54 |
56 #include <QtCore/qurl.h> |
55 #include <QtCore/qurl.h> |
57 #include <QtGui/qimagereader.h> |
56 #include <QtGui/qimagereader.h> |
59 |
58 |
60 #include <QtNetwork/qnetworkaccessmanager.h> |
59 #include <QtNetwork/qnetworkaccessmanager.h> |
61 #include <QtNetwork/qnetworkreply.h> |
60 #include <QtNetwork/qnetworkreply.h> |
62 #include <QtNetwork/qnetworkrequest.h> |
61 #include <QtNetwork/qnetworkrequest.h> |
63 |
62 |
64 #include <QtMultimedia/qabstractvideosurface.h> |
63 #include <qabstractvideosurface.h> |
65 #include <QtMultimedia/qvideosurfaceformat.h> |
64 #include <qvideosurfaceformat.h> |
66 |
65 |
67 QT_BEGIN_NAMESPACE |
66 QT_BEGIN_NAMESPACE |
68 |
67 |
69 class QMediaImageViewerServicePrivate : public QMediaServicePrivate |
68 class QMediaImageViewerServicePrivate : public QMediaServicePrivate |
70 { |
69 { |
71 public: |
70 public: |
72 QMediaImageViewerServicePrivate() |
71 QMediaImageViewerServicePrivate() |
73 : viewerControl(0) |
72 : viewerControl(0) |
74 , outputControl(0) |
|
75 , rendererControl(0) |
73 , rendererControl(0) |
76 , network(0) |
74 , network(0) |
77 , internalNetwork(0) |
75 , internalNetwork(0) |
78 { |
76 { |
79 } |
77 } |
80 |
78 |
81 bool load(QIODevice *device); |
79 bool load(QIODevice *device); |
82 void clear(); |
80 void clear(); |
83 void _q_outputChanged(QVideoOutputControl::Output output); |
|
84 |
81 |
85 QMediaImageViewerControl *viewerControl; |
82 QMediaImageViewerControl *viewerControl; |
86 QMediaImageViewerOutputControl *outputControl; |
|
87 QMediaImageViewerRenderer *rendererControl; |
83 QMediaImageViewerRenderer *rendererControl; |
88 QNetworkAccessManager *network; |
84 QNetworkAccessManager *network; |
89 QNetworkAccessManager *internalNetwork; |
85 QNetworkAccessManager *internalNetwork; |
90 QImage m_image; |
86 QImage m_image; |
91 }; |
87 }; |
139 m_surface->present(QVideoFrame(image)); |
135 m_surface->present(QVideoFrame(image)); |
140 } |
136 } |
141 } |
137 } |
142 } |
138 } |
143 |
139 |
144 QMediaImageViewerOutputControl::QMediaImageViewerOutputControl(QObject *parent) |
|
145 : QVideoOutputControl(parent) |
|
146 , m_output(NoOutput) |
|
147 { |
|
148 } |
|
149 |
|
150 QList<QVideoOutputControl::Output> QMediaImageViewerOutputControl::availableOutputs() const |
|
151 { |
|
152 return QList<Output>() |
|
153 << RendererOutput; |
|
154 } |
|
155 |
|
156 void QMediaImageViewerOutputControl::setOutput(Output output) |
|
157 { |
|
158 switch (output) { |
|
159 case RendererOutput: |
|
160 emit m_output = output; |
|
161 break; |
|
162 default: |
|
163 m_output = NoOutput; |
|
164 } |
|
165 emit outputChanged(m_output); |
|
166 } |
|
167 |
|
168 bool QMediaImageViewerServicePrivate::load(QIODevice *device) |
140 bool QMediaImageViewerServicePrivate::load(QIODevice *device) |
169 { |
141 { |
170 QImageReader reader(device); |
142 QImageReader reader(device); |
171 |
143 |
172 if (!reader.canRead()) { |
144 if (!reader.canRead()) { |
173 m_image = QImage(); |
145 m_image = QImage(); |
174 } else { |
146 } else { |
175 m_image = reader.read(); |
147 m_image = reader.read(); |
176 } |
148 } |
177 |
149 |
178 if (outputControl->output() == QVideoOutputControl::RendererOutput) |
150 if (rendererControl) |
179 rendererControl->showImage(m_image); |
151 rendererControl->showImage(m_image); |
180 |
152 |
181 return !m_image.isNull(); |
153 return !m_image.isNull(); |
182 } |
154 } |
183 |
155 |
184 void QMediaImageViewerServicePrivate::clear() |
156 void QMediaImageViewerServicePrivate::clear() |
185 { |
157 { |
186 m_image = QImage(); |
158 m_image = QImage(); |
187 |
159 |
188 if (outputControl->output() == QVideoOutputControl::RendererOutput) |
160 if (rendererControl) |
189 rendererControl->showImage(m_image); |
|
190 } |
|
191 |
|
192 void QMediaImageViewerServicePrivate::_q_outputChanged(QVideoOutputControl::Output output) |
|
193 { |
|
194 if (output != QVideoOutputControl::RendererOutput) |
|
195 rendererControl->showImage(QImage()); |
|
196 |
|
197 if (output == QVideoOutputControl::RendererOutput) |
|
198 rendererControl->showImage(m_image); |
161 rendererControl->showImage(m_image); |
199 } |
162 } |
200 |
163 |
201 /*! |
164 /*! |
202 \class QMediaImageViewerService |
165 \class QMediaImageViewerService |
209 : QMediaService(*new QMediaImageViewerServicePrivate, parent) |
172 : QMediaService(*new QMediaImageViewerServicePrivate, parent) |
210 { |
173 { |
211 Q_D(QMediaImageViewerService); |
174 Q_D(QMediaImageViewerService); |
212 |
175 |
213 d->viewerControl = new QMediaImageViewerControl(this); |
176 d->viewerControl = new QMediaImageViewerControl(this); |
214 d->outputControl = new QMediaImageViewerOutputControl; |
|
215 connect(d->outputControl, SIGNAL(outputChanged(QVideoOutputControl::Output)), |
|
216 SLOT(_q_outputChanged(QVideoOutputControl::Output))); |
|
217 |
|
218 d->rendererControl = new QMediaImageViewerRenderer; |
|
219 } |
177 } |
220 |
178 |
221 /*! |
179 /*! |
222 */ |
180 */ |
223 QMediaImageViewerService::~QMediaImageViewerService() |
181 QMediaImageViewerService::~QMediaImageViewerService() |
224 { |
182 { |
225 Q_D(QMediaImageViewerService); |
183 Q_D(QMediaImageViewerService); |
226 |
184 |
227 delete d->rendererControl; |
185 delete d->rendererControl; |
228 delete d->outputControl; |
|
229 delete d->viewerControl; |
186 delete d->viewerControl; |
230 } |
187 } |
231 |
188 |
232 /*! |
189 /*! |
233 */ |
190 */ |
234 QMediaControl *QMediaImageViewerService::control(const char *name) const |
191 QMediaControl *QMediaImageViewerService::requestControl(const char *name) |
235 { |
192 { |
236 Q_D(const QMediaImageViewerService); |
193 Q_D(QMediaImageViewerService); |
237 |
194 |
238 if (qstrcmp(name, QMediaImageViewerControl_iid) == 0) { |
195 if (qstrcmp(name, QMediaImageViewerControl_iid) == 0) { |
239 return d->viewerControl; |
196 return d->viewerControl; |
240 } else if (qstrcmp(name, QVideoOutputControl_iid) == 0) { |
|
241 return d->outputControl; |
|
242 } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { |
197 } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { |
243 return d->rendererControl; |
198 if (!d->rendererControl) { |
244 } else { |
199 d->rendererControl = new QMediaImageViewerRenderer; |
245 return 0; |
200 d->rendererControl->showImage(d->m_image); |
|
201 |
|
202 return d->rendererControl; |
|
203 } |
|
204 } |
|
205 return 0; |
|
206 } |
|
207 |
|
208 void QMediaImageViewerService::releaseControl(QMediaControl *control) |
|
209 { |
|
210 Q_D(QMediaImageViewerService); |
|
211 |
|
212 if (!control) { |
|
213 qWarning("QMediaService::releaseControl():" |
|
214 " Attempted release of null control"); |
|
215 } else if (control == d->rendererControl) { |
|
216 delete d->rendererControl; |
|
217 |
|
218 d->rendererControl = 0; |
246 } |
219 } |
247 } |
220 } |
248 |
221 |
249 /*! |
222 /*! |
250 */ |
223 */ |
454 d->currentMedia = QMediaResource(); |
427 d->currentMedia = QMediaResource(); |
455 d->cancelRequests(); |
428 d->cancelRequests(); |
456 |
429 |
457 if (media.isNull()) { |
430 if (media.isNull()) { |
458 d->service->d_func()->clear(); |
431 d->service->d_func()->clear(); |
459 |
432 if (d->status != QMediaImageViewer::NoMedia) { |
460 d->status = QMediaImageViewer::NoMedia; |
433 d->status = QMediaImageViewer::NoMedia; |
461 |
434 emit mediaStatusChanged(d->status); |
462 emit mediaStatusChanged(d->status); |
435 } |
463 } else { |
436 } else { |
464 d->possibleResources = media.resources(); |
437 d->possibleResources = media.resources(); |
465 d->loadImage(); |
438 d->loadImage(); |
466 } |
439 } |
467 } |
440 } |