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