diff options
author | Markus Nolvi <markus.nolvi@digia.com> | 2010-09-15 13:23:03 +0300 |
---|---|---|
committer | Mica <qt-info@nokia.com> | 2010-09-22 16:15:15 +0300 |
commit | 5f7e3a79a3567a9b9b6262d4e4c2f80505983762 (patch) | |
tree | 7b60ff0c9e51461022c8d511e408574e03a88ede | |
parent | 8011b82c16fd2a948ec4d21782d218554ac39822 (diff) |
Symbian: Implemented QStreamControl for s60 backend + some needed
refactoring
15 files changed, 406 insertions, 163 deletions
diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/mediaplayer_s60.pri b/plugins/multimedia/symbian/mmf/mediaplayer/mediaplayer_s60.pri index e80d4a2134..ab895d5848 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/mediaplayer_s60.pri +++ b/plugins/multimedia/symbian/mmf/mediaplayer/mediaplayer_s60.pri @@ -34,7 +34,8 @@ HEADERS += \ $$PWD/s60audioplayersession.h \ $$PWD/ms60mediaplayerresolver.h \ $$PWD/s60videowidget.h \ - $$PWD/s60mediaplayeraudioendpointselector.h + $$PWD/s60mediaplayeraudioendpointselector.h \ + $$PWD/s60mediastreamcontrol.h SOURCES += \ $$PWD/s60mediaplayercontrol.cpp \ @@ -48,7 +49,8 @@ SOURCES += \ $$PWD/s60mediarecognizer.cpp \ $$PWD/s60audioplayersession.cpp \ $$PWD/s60videowidget.cpp \ - $$PWD/s60mediaplayeraudioendpointselector.cpp + $$PWD/s60mediaplayeraudioendpointselector.cpp \ + $$PWD/s60mediastreamcontrol.cpp contains(surfaces_s60_enabled,yes) { diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.cpp index 1bcf586c23..8c0652d96e 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.cpp @@ -90,11 +90,11 @@ qint64 S60AudioPlayerSession::doGetPositionL() const return ms.Int64() / qint64(1000); } -bool S60AudioPlayerSession::isVideoAvailable() const +bool S60AudioPlayerSession::isVideoAvailable() { return false; } -bool S60AudioPlayerSession::isAudioAvailable() const +bool S60AudioPlayerSession::isAudioAvailable() { return true; // this is a bit happy scenario, but we do emit error that we can't play } diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.h index 1ceb7040b1..dde4bd4dde 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.h @@ -73,8 +73,8 @@ public: ~S60AudioPlayerSession(); //From S60MediaPlayerSession - bool isVideoAvailable() const; - bool isAudioAvailable() const; + bool isVideoAvailable(); + bool isAudioAvailable(); // From MAudioLoadingObserver void MaloLoadingStarted(); diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.cpp index 060a0cd862..f7b8e870a1 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.cpp @@ -40,14 +40,15 @@ ****************************************************************************/ #include "s60mediametadataprovider.h" +#include "s60mediaplayercontrol.h" #include "s60mediaplayersession.h" #include <QtCore/qdebug.h> -S60MediaMetaDataProvider::S60MediaMetaDataProvider(MS60MediaPlayerResolver& mediaPlayerResolver, QObject *parent) +S60MediaMetaDataProvider::S60MediaMetaDataProvider(QObject *control, QObject *parent) : QMetaDataReaderControl(parent) - , m_mediaPlayerResolver(mediaPlayerResolver) - , m_session(NULL) + , m_control(NULL) { + m_control = qobject_cast<S60MediaPlayerControl*>(control); } S60MediaMetaDataProvider::~S60MediaMetaDataProvider() @@ -56,9 +57,8 @@ S60MediaMetaDataProvider::~S60MediaMetaDataProvider() bool S60MediaMetaDataProvider::isMetaDataAvailable() const { - m_session = m_mediaPlayerResolver.PlayerSession(); - if (m_session) - return m_session->isMetadataAvailable(); + if (m_control->session()) + return m_control->session()->isMetadataAvailable(); return false; } @@ -69,102 +69,31 @@ bool S60MediaMetaDataProvider::isWritable() const QVariant S60MediaMetaDataProvider::metaData(QtMultimediaKit::MetaData key) const { - m_session = m_mediaPlayerResolver.PlayerSession(); - if (m_session && m_session->isMetadataAvailable()) - return m_session->metaData(metaDataKeyAsString(key)); + + if (m_control->session()) + return m_control->session()->metaData(key); return QVariant(); } QList<QtMultimediaKit::MetaData> S60MediaMetaDataProvider::availableMetaData() const { - m_session = m_mediaPlayerResolver.PlayerSession(); - QList<QtMultimediaKit::MetaData> metaDataTags; - if (m_session && m_session->isMetadataAvailable()) { - for (int i = QtMultimediaKit::Title; i <= QtMultimediaKit::DeviceSettingDescription; i++) { - QString metaData = metaDataKeyAsString((QtMultimediaKit::MetaData)i); - if (!metaData.isEmpty()) { - if (!m_session->metaData(metaData).toString().isEmpty()) { - metaDataTags.append((QtMultimediaKit::MetaData)i); - } - } - } - } - return metaDataTags; + if (m_control->session()) + return m_control->session()->availableMetaData(); + return QList<QtMultimediaKit::MetaData>(); } QVariant S60MediaMetaDataProvider::extendedMetaData(const QString &key) const { - m_session = m_mediaPlayerResolver.PlayerSession(); - if (m_session && m_session->isMetadataAvailable()) - return m_session->metaData(key); + + if (m_control->session()) + return m_control->session()->metaData(key); return QVariant(); } QStringList S60MediaMetaDataProvider::availableExtendedMetaData() const { - m_session = m_mediaPlayerResolver.PlayerSession(); - if (m_session && m_session->isMetadataAvailable()) - return m_session->availableMetaData().keys(); - return QStringList(); -} -QString S60MediaMetaDataProvider::metaDataKeyAsString(QtMultimediaKit::MetaData key) const -{ - switch(key) { - case QtMultimediaKit::Title: return "title"; - case QtMultimediaKit::AlbumArtist: return "artist"; - case QtMultimediaKit::Comment: return "comment"; - case QtMultimediaKit::Genre: return "genre"; - case QtMultimediaKit::Year: return "year"; - case QtMultimediaKit::Copyright: return "copyright"; - case QtMultimediaKit::AlbumTitle: return "album"; - case QtMultimediaKit::Composer: return "composer"; - case QtMultimediaKit::TrackNumber: return "albumtrack"; - case QtMultimediaKit::AudioBitRate: return "audiobitrate"; - case QtMultimediaKit::VideoBitRate: return "videobitrate"; - case QtMultimediaKit::Duration: return "duration"; - case QtMultimediaKit::MediaType: return "contenttype"; - case QtMultimediaKit::CoverArtImage: return "attachedpicture"; - case QtMultimediaKit::SubTitle: // TODO: Find the matching metadata keys - case QtMultimediaKit::Description: - case QtMultimediaKit::Category: - case QtMultimediaKit::Date: - case QtMultimediaKit::UserRating: - case QtMultimediaKit::Keywords: - case QtMultimediaKit::Language: - case QtMultimediaKit::Publisher: - case QtMultimediaKit::ParentalRating: - case QtMultimediaKit::RatingOrganisation: - case QtMultimediaKit::Size: - case QtMultimediaKit::AudioCodec: - case QtMultimediaKit::AverageLevel: - case QtMultimediaKit::ChannelCount: - case QtMultimediaKit::PeakValue: - case QtMultimediaKit::SampleRate: - case QtMultimediaKit::Author: - case QtMultimediaKit::ContributingArtist: - case QtMultimediaKit::Conductor: - case QtMultimediaKit::Lyrics: - case QtMultimediaKit::Mood: - case QtMultimediaKit::TrackCount: - case QtMultimediaKit::CoverArtUrlSmall: - case QtMultimediaKit::CoverArtUrlLarge: - case QtMultimediaKit::Resolution: - case QtMultimediaKit::PixelAspectRatio: - case QtMultimediaKit::VideoFrameRate: - case QtMultimediaKit::VideoCodec: - case QtMultimediaKit::PosterUrl: - case QtMultimediaKit::ChapterNumber: - case QtMultimediaKit::Director: - case QtMultimediaKit::LeadPerformer: - case QtMultimediaKit::Writer: - case QtMultimediaKit::CameraManufacturer: - case QtMultimediaKit::CameraModel: - case QtMultimediaKit::Event: - case QtMultimediaKit::Subject: - default: - break; - } - - return QString(); + if (m_control->session()) + return m_control->session()->availableExtendedMetaData(); + return QStringList(); } diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.h index 2bf528dda0..eb995080df 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.h @@ -43,18 +43,18 @@ #define S60MEDIAMETADATAPROVIDER_H #include <qmetadatareadercontrol.h> -#include "ms60mediaplayerresolver.h" +#include "s60mediaplayercontrol.h" QT_USE_NAMESPACE -class S60MediaPlayerSession; +class S60MediaPlayerControl; class S60MediaMetaDataProvider : public QMetaDataReaderControl { Q_OBJECT public: - S60MediaMetaDataProvider(MS60MediaPlayerResolver& mediaPlayerResolver, QObject *parent = 0); + S60MediaMetaDataProvider(QObject *control, QObject *parent = 0); ~S60MediaMetaDataProvider(); bool isMetaDataAvailable() const; @@ -66,11 +66,7 @@ public: QStringList availableExtendedMetaData() const; private: - QString metaDataKeyAsString(QtMultimediaKit::MetaData key) const; - -private: - MS60MediaPlayerResolver& m_mediaPlayerResolver; - mutable S60MediaPlayerSession *m_session; + S60MediaPlayerControl *m_control; }; #endif // S60VIDEOMETADATAPROVIDER_H diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.cpp index 6b17a49aaf..7568417576 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.cpp @@ -127,13 +127,13 @@ QMediaTimeRange S60MediaPlayerControl::availablePlaybackRanges() const qreal S60MediaPlayerControl::playbackRate() const { - // TODO: Add Symbian^3 support + // Playback rate retrieving is not supported in Symbian return m_mediaSettings.playbackRate(); } void S60MediaPlayerControl::setPlaybackRate(qreal rate) { - // TODO: Add Symbian^3 support + // Playback rate setting is not supported in Symbian m_mediaSettings.setPlaybackRate(rate); emit playbackRateChanged(playbackRate()); @@ -230,7 +230,7 @@ void S60MediaPlayerControl::setMedia(const QMediaContent &source, QIODevice *str emit mediaStatusChanged(status); } emit mediaChanged(m_currentResource); - } +} S60MediaPlayerSession* S60MediaPlayerControl::session() { @@ -239,7 +239,7 @@ S60MediaPlayerSession* S60MediaPlayerControl::session() void S60MediaPlayerControl::setVideoOutput(QObject *output) { - m_mediaPlayerResolver.VideoPlayerSession()->setVideoRenderer(output); + m_mediaPlayerResolver.VideoPlayerSession()->setVideoRenderer(output); } bool S60MediaPlayerControl::isAudioAvailable() const @@ -265,3 +265,8 @@ void S60MediaPlayerControl::setAudioEndpoint(const QString& name) { m_mediaSettings.setAudioEndpoint(name); } + +void S60MediaPlayerControl::setMediaType(S60MediaSettings::TMediaType type) +{ + m_mediaSettings.setMediaType(type); +} diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.h index 8376b2d7f9..b392957cad 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.h @@ -73,17 +73,21 @@ public: { } + enum TMediaType {Unknown, Video, Audio, Data}; + void setVolume(int volume) { m_volume = volume; } void setMuted(bool muted) { m_muted = muted; } void setPlaybackRate(int rate) { m_playbackRate = rate; } void setMediaStatus(QMediaPlayer::MediaStatus status) {m_mediaStatus=status;} void setAudioEndpoint(const QString& audioEndpoint) { m_audioEndpoint = audioEndpoint; } + void setMediaType(S60MediaSettings::TMediaType type) { m_mediaType = type; } int volume() const { return m_volume; } bool isMuted() const { return m_muted; } qreal playbackRate() const { return m_playbackRate; } QMediaPlayer::MediaStatus mediaStatus() const {return m_mediaStatus;} QString audioEndpoint() const { return m_audioEndpoint; } + S60MediaSettings::TMediaType mediaType() const { return m_mediaType; } private: int m_volume; @@ -91,6 +95,7 @@ private: qreal m_playbackRate; QMediaPlayer::MediaStatus m_mediaStatus; QString m_audioEndpoint; + S60MediaSettings::TMediaType m_mediaType; }; class S60MediaPlayerControl : public QMediaPlayerControl @@ -123,14 +128,15 @@ public: virtual void setMedia(const QMediaContent&, QIODevice *); virtual void play(); virtual void pause(); - virtual void stop(); - S60MediaPlayerSession* session(); - void setAudioEndpoint(const QString& name); + virtual void stop(); // Own methods + S60MediaPlayerSession* session(); void setVideoOutput(QObject *output); const S60MediaSettings& mediaControlSettings() const; - + void setAudioEndpoint(const QString& name); + void setMediaType(S60MediaSettings::TMediaType type); + private: MS60MediaPlayerResolver &m_mediaPlayerResolver; S60MediaPlayerSession *m_session; diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.cpp index ae8535e548..6e874e08da 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.cpp @@ -53,6 +53,7 @@ #include "s60videooverlay.h" #include "s60videorenderer.h" #include "s60mediaplayeraudioendpointselector.h" +#include "s60mediastreamcontrol.h" #include <qmediaplaylistnavigator.h> #include <qmediaplaylist.h> @@ -64,21 +65,17 @@ S60MediaPlayerService::S60MediaPlayerService(QObject *parent) , m_audioPlayerSession(NULL) , m_metaData(NULL) , m_audioEndpointSelector(NULL) - , m_videoWidget(NULL) - , m_videoWindow(NULL) - , m_videoRenderer(NULL) + , m_streamControl(NULL) , m_videoOutput(NULL) { m_control = new S60MediaPlayerControl(*this, this); - m_metaData = new S60MediaMetaDataProvider(*this); + m_metaData = new S60MediaMetaDataProvider(m_control, this); m_audioEndpointSelector = new S60MediaPlayerAudioEndpointSelector(m_control, this); + m_streamControl = new S60MediaStreamControl(m_control, this); } S60MediaPlayerService::~S60MediaPlayerService() { - delete m_videoWidget; - delete m_videoRenderer; - delete m_videoWindow; } QMediaControl *S60MediaPlayerService::requestControl(const char *name) @@ -92,18 +89,18 @@ QMediaControl *S60MediaPlayerService::requestControl(const char *name) if (qstrcmp(name, QAudioEndpointSelector_iid) == 0) return m_audioEndpointSelector; + if (qstrcmp(name, QMediaStreamsControl_iid) == 0) + return m_streamControl; + if (!m_videoOutput) { if (qstrcmp(name, QVideoWidgetControl_iid) == 0) { - m_videoWidget = new S60VideoWidgetControl; - m_videoOutput = m_videoWidget; + m_videoOutput = new S60VideoWidgetControl(this); } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { - m_videoRenderer = new S60VideoRenderer; - m_videoOutput = m_videoRenderer; + m_videoOutput = new S60VideoRenderer(this); } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { - m_videoWindow = new S60VideoOverlay; - m_videoOutput = m_videoWindow; + m_videoOutput = new S60VideoOverlay(this); } if (m_videoOutput) { @@ -124,7 +121,7 @@ void S60MediaPlayerService::releaseControl(QMediaControl *control) { if (control == m_videoOutput) { m_videoOutput = 0; - m_control->setVideoOutput(0); + m_control->setVideoOutput(m_videoOutput); } } @@ -140,13 +137,20 @@ S60MediaPlayerSession* S60MediaPlayerService::PlayerSession() S60MediaRecognizer::MediaType mediaType = m_mediaRecognizer->mediaType(url); switch (mediaType) { - case S60MediaRecognizer::Video: - case S60MediaRecognizer::Url: - return VideoPlayerSession(); - case S60MediaRecognizer::Audio: - return AudioPlayerSession(); - default: - break; + case S60MediaRecognizer::Video: + case S60MediaRecognizer::Url: + { + m_control->setMediaType(S60MediaSettings::Video); + return VideoPlayerSession(); + } + case S60MediaRecognizer::Audio: + { + m_control->setMediaType(S60MediaSettings::Audio); + return AudioPlayerSession(); + } + default: + m_control->setMediaType(S60MediaSettings::Unknown); + break; } return NULL; @@ -181,6 +185,8 @@ S60MediaPlayerSession* S60MediaPlayerService::VideoPlayerSession() m_metaData, SIGNAL(metaDataChanged())); connect(m_videoPlayerSession, SIGNAL(activeEndpointChanged(const QString&)), m_audioEndpointSelector, SIGNAL(activeEndpointChanged(const QString&))); + connect(m_videoPlayerSession, SIGNAL(mediaChanged()), + m_streamControl, SLOT(handleStreamsChanged())); } m_videoPlayerSession->setVolume(m_control->mediaControlSettings().volume()); @@ -218,6 +224,8 @@ S60MediaPlayerSession* S60MediaPlayerService::AudioPlayerSession() m_metaData, SIGNAL(metaDataChanged())); connect(m_audioPlayerSession, SIGNAL(activeEndpointChanged(const QString&)), m_audioEndpointSelector, SIGNAL(activeEndpointChanged(const QString&))); + connect(m_audioPlayerSession, SIGNAL(mediaChanged()), + m_streamControl, SLOT(handleStreamsChanged())); } m_audioPlayerSession->setVolume(m_control->mediaControlSettings().volume()); diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.h index f92ccf6113..41155386c3 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.h @@ -60,10 +60,9 @@ class S60VideoPlayerSession; class S60AudioPlayerSession; class S60MediaPlayerControl; class S60MediaMetaDataProvider; -class S60VideoWidgetControl; +class S60MediaStreamControl; class S60MediaRecognizer; -class S60VideoRenderer; -class S60VideoOverlay; + class QMediaPlaylistNavigator; class S60MediaPlayerService : public QMediaService, public MS60MediaPlayerResolver @@ -89,9 +88,7 @@ private: S60AudioPlayerSession *m_audioPlayerSession; S60MediaMetaDataProvider *m_metaData; S60MediaPlayerAudioEndpointSelector *m_audioEndpointSelector; - QMediaControl *m_videoWidget; - QMediaControl *m_videoWindow; - QMediaControl *m_videoRenderer; + S60MediaStreamControl *m_streamControl; QMediaControl *m_videoOutput; }; diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp index 43b316dbc3..867586837b 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp @@ -144,8 +144,8 @@ void S60MediaPlayerSession::load(QUrl url) if(m_stream) doLoadUrlL(QString2TPtrC(url.toString())); else - doLoadL(QString2TPtrC(QDir::toNativeSeparators(url.toLocalFile())))); - setError(err); + doLoadL(QString2TPtrC(QDir::toNativeSeparators(url.toLocalFile())))); + setError(err); } void S60MediaPlayerSession::play() @@ -192,6 +192,7 @@ void S60MediaPlayerSession::stop() doStop(); emit positionChanged(0); } + void S60MediaPlayerSession::reset() { m_play_requested = false; @@ -218,7 +219,6 @@ int S60MediaPlayerSession::bufferStatus() int progress = 0; TRAPD(err, progress = doGetBufferStatusL()); - // If buffer status query not supported by codec return 100 // do not set error if(err == KErrNotSupported) @@ -238,9 +238,91 @@ QVariant S60MediaPlayerSession::metaData(const QString &key) const return m_metaDataMap.value(key); } -QMap<QString, QVariant> S60MediaPlayerSession::availableMetaData() const +QVariant S60MediaPlayerSession::metaData(QtMultimediaKit::MetaData key) const { - return m_metaDataMap; + return metaData(metaDataKeyAsString(key)); +} + +QList<QtMultimediaKit::MetaData> S60MediaPlayerSession::availableMetaData() const +{ + QList<QtMultimediaKit::MetaData> metaDataTags; + if (isMetadataAvailable()) { + for (int i = QtMultimediaKit::Title; i <= QtMultimediaKit::DeviceSettingDescription; i++) { + QString metaDataItem = metaDataKeyAsString((QtMultimediaKit::MetaData)i); + if (!metaDataItem.isEmpty()) { + if (!metaData(metaDataItem).isNull()) { + metaDataTags.append((QtMultimediaKit::MetaData)i); + } + } + } + } + return metaDataTags; +} + +QStringList S60MediaPlayerSession::availableExtendedMetaData() const +{ + return m_metaDataMap.keys(); +} + +QString S60MediaPlayerSession::metaDataKeyAsString(QtMultimediaKit::MetaData key) const +{ + switch(key) { + case QtMultimediaKit::Title: return "title"; + case QtMultimediaKit::AlbumArtist: return "artist"; + case QtMultimediaKit::Comment: return "comment"; + case QtMultimediaKit::Genre: return "genre"; + case QtMultimediaKit::Year: return "year"; + case QtMultimediaKit::Copyright: return "copyright"; + case QtMultimediaKit::AlbumTitle: return "album"; + case QtMultimediaKit::Composer: return "composer"; + case QtMultimediaKit::TrackNumber: return "albumtrack"; + case QtMultimediaKit::AudioBitRate: return "audiobitrate"; + case QtMultimediaKit::VideoBitRate: return "videobitrate"; + case QtMultimediaKit::Duration: return "duration"; + case QtMultimediaKit::MediaType: return "contenttype"; + case QtMultimediaKit::CoverArtImage: return "attachedpicture"; + case QtMultimediaKit::SubTitle: // TODO: Find the matching metadata keys + case QtMultimediaKit::Description: + case QtMultimediaKit::Category: + case QtMultimediaKit::Date: + case QtMultimediaKit::UserRating: + case QtMultimediaKit::Keywords: + case QtMultimediaKit::Language: + case QtMultimediaKit::Publisher: + case QtMultimediaKit::ParentalRating: + case QtMultimediaKit::RatingOrganisation: + case QtMultimediaKit::Size: + case QtMultimediaKit::AudioCodec: + case QtMultimediaKit::AverageLevel: + case QtMultimediaKit::ChannelCount: + case QtMultimediaKit::PeakValue: + case QtMultimediaKit::SampleRate: + case QtMultimediaKit::Author: + case QtMultimediaKit::ContributingArtist: + case QtMultimediaKit::Conductor: + case QtMultimediaKit::Lyrics: + case QtMultimediaKit::Mood: + case QtMultimediaKit::TrackCount: + case QtMultimediaKit::CoverArtUrlSmall: + case QtMultimediaKit::CoverArtUrlLarge: + case QtMultimediaKit::Resolution: + case QtMultimediaKit::PixelAspectRatio: + case QtMultimediaKit::VideoFrameRate: + case QtMultimediaKit::VideoCodec: + case QtMultimediaKit::PosterUrl: + case QtMultimediaKit::ChapterNumber: + case QtMultimediaKit::Director: + case QtMultimediaKit::LeadPerformer: + case QtMultimediaKit::Writer: + case QtMultimediaKit::CameraManufacturer: + case QtMultimediaKit::CameraModel: + case QtMultimediaKit::Event: + case QtMultimediaKit::Subject: + default: + break; + } + + return QString(); } void S60MediaPlayerSession::setMuted(bool muted) @@ -317,6 +399,7 @@ void S60MediaPlayerSession::loaded() emit durationChanged(duration()); emit videoAvailableChanged(isVideoAvailable()); emit audioAvailableChanged(isAudioAvailable()); + emit mediaChanged(); } } @@ -472,19 +555,23 @@ void S60MediaPlayerSession::stopStalledTimer() { m_stalledTimer->stop(); } + QString S60MediaPlayerSession::TDesC2QString(const TDesC& aDescriptor) { return QString::fromUtf16(aDescriptor.Ptr(), aDescriptor.Length()); } + TPtrC S60MediaPlayerSession::QString2TPtrC( const QString& string ) { // Returned TPtrC is valid as long as the given parameter is valid and unmodified return TPtrC16(static_cast<const TUint16*>(string.utf16()), string.length()); } + QRect S60MediaPlayerSession::TRect2QRect(const TRect& tr) { return QRect(tr.iTl.iX, tr.iTl.iY, tr.Width(), tr.Height()); } + TRect S60MediaPlayerSession::QRect2TRect(const QRect& qr) { return TRect(TPoint(qr.left(), qr.top()), TSize(qr.width(), qr.height())); diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.h index e31a784aea..f02b8494fe 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.h @@ -74,8 +74,8 @@ public: void setVolume(int volume); bool isMuted() const; void setMuted(bool muted); - virtual bool isVideoAvailable() const = 0; - virtual bool isAudioAvailable() const = 0; + virtual bool isVideoAvailable() = 0; + virtual bool isAudioAvailable() = 0; bool isSeekable() const; void play(); void pause(); @@ -83,7 +83,10 @@ public: void reset(); bool isMetadataAvailable() const; QVariant metaData(const QString &key) const; - QMap<QString, QVariant> availableMetaData() const; + QVariant metaData(QtMultimediaKit::MetaData key) const; + QList<QtMultimediaKit::MetaData> availableMetaData() const; + QStringList availableExtendedMetaData() const; + QString metaDataKeyAsString(QtMultimediaKit::MetaData key) const; void load(QUrl url); int bufferStatus(); virtual void setVideoRenderer(QObject *renderer); @@ -129,7 +132,6 @@ protected: QRect TRect2QRect(const TRect& tr); TRect QRect2TRect(const QRect& qr); - protected slots: void tick(); void stalled(); @@ -147,6 +149,7 @@ signals: void metaDataChanged(); void error(int error, const QString &errorString); void activeEndpointChanged(const QString &name); + void mediaChanged(); private: qreal m_playbackRate; diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.cpp new file mode 100644 index 0000000000..3dab3c1843 --- /dev/null +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "s60mediastreamcontrol.h" +#include "s60mediaplayersession.h" +#include "s60mediaplayercontrol.h" +#include <qmediastreamscontrol.h> + +#include <QtCore/qdir.h> +#include <QtCore/qurl.h> +#include <QtCore/qdebug.h> + +S60MediaStreamControl::S60MediaStreamControl(QObject *control, QObject *parent) + : QMediaStreamsControl(parent) + , m_control(NULL) + , m_mediaType(S60MediaSettings::Unknown) +{ + m_control = qobject_cast<S60MediaPlayerControl*>(control); + m_mediaType = m_control->mediaControlSettings().mediaType(); +} + +S60MediaStreamControl::~S60MediaStreamControl() +{ +} + +int S60MediaStreamControl::streamCount() +{ + int streamCount = 0; + if (m_control->isAudioAvailable()) + streamCount++; + if (m_control->isVideoAvailable()) + streamCount++; + + return streamCount; +} + +QMediaStreamsControl::StreamType S60MediaStreamControl::streamType(int streamNumber) +{ + Q_UNUSED(streamNumber); + + QMediaStreamsControl::StreamType type = QMediaStreamsControl::UnknownStream; + + if (m_control->mediaControlSettings().mediaType() == S60MediaSettings::Video) + type = QMediaStreamsControl::VideoStream; + else + type = QMediaStreamsControl::AudioStream; + + return type; +} + +QVariant S60MediaStreamControl::metaData(int streamNumber, QtMultimediaKit::MetaData key) +{ + Q_UNUSED(streamNumber); + + if (m_control->session()) { + if (m_control->session()->isMetadataAvailable()) + return m_control->session()->metaData(key); + } + return QVariant(); +} + +bool S60MediaStreamControl::isActive(int streamNumber) +{ + if (m_control->mediaControlSettings().mediaType() == S60MediaSettings::Video) { + switch (streamNumber) { + case 1: + return m_control->isVideoAvailable(); + case 2: + return m_control->isAudioAvailable(); + default: + break; + } + } + return m_control->isAudioAvailable(); +} + +void S60MediaStreamControl::setActive(int streamNumber, bool state) +{ + Q_UNUSED(streamNumber); + Q_UNUSED(state); + // Symbian MMF does not support enabling or disabling specific media streams +} + +void S60MediaStreamControl::handleStreamsChanged() +{ + emit streamsChanged(); +} diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.h new file mode 100644 index 0000000000..702ebc7b21 --- /dev/null +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef S60MEDIASTREAMCONTROL_H +#define S60MEDIASTREAMCONTROL_H + +#include <QVariant> + +#include "s60mediaplayercontrol.h" + +#include <qmediastreamscontrol.h> +#include <qtmedianamespace.h> + +QT_USE_NAMESPACE + +class S60MediaPlayerControl; +class S60MediaSettings; + +class S60MediaStreamControl : public QMediaStreamsControl +{ + Q_OBJECT +public: + S60MediaStreamControl(QObject *session, QObject *parent = 0); + ~S60MediaStreamControl(); + + // from QMediaStreamsControl + int streamCount(); + QMediaStreamsControl::StreamType streamType(int streamNumber); + QVariant metaData(int streamNumber, QtMultimediaKit::MetaData key); + bool isActive(int streamNumber); + void setActive(int streamNumber, bool state); + +public Q_SLOTS: + void handleStreamsChanged(); + +private: + S60MediaPlayerControl *m_control; + S60MediaSettings::TMediaType m_mediaType; +}; + +#endif //S60MEDIASTREAMCONTROL_H diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp b/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp index f3c2083b44..f894f09d8c 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp @@ -103,11 +103,8 @@ S60VideoPlayerSession::~S60VideoPlayerSession() m_audioOutput->UnregisterObserver(*this); delete m_audioOutput; #endif - if (m_player) { - m_player->Close(); - delete m_player; - m_player = NULL; - } + m_player->Close(); + delete m_player; } void S60VideoPlayerSession::doLoadL(const TDesC &path) @@ -233,24 +230,32 @@ bool S60VideoPlayerSession::resetNativeHandles() return false; } -bool S60VideoPlayerSession::isVideoAvailable() const +bool S60VideoPlayerSession::isVideoAvailable() { #ifdef PRE_S60_50_PLATFORM - return true; // this is not support in pre 5th platforms + return true; // this is not supported in pre 5th platforms #else - if (m_player) - return m_player->VideoEnabledL(); - else + if (m_player) { + bool videoAvailable = true; + TRAPD(err, videoAvailable = m_player->VideoEnabledL()); + setError(err); + return videoAvailable; + }else { return false; + } #endif } -bool S60VideoPlayerSession::isAudioAvailable() const +bool S60VideoPlayerSession::isAudioAvailable() { - if (m_player) - return m_player->AudioEnabledL(); - else + if (m_player) { + bool audioAvailable = true; + TRAPD(err, audioAvailable = m_player->AudioEnabledL()); + setError(err); + return audioAvailable; + }else { return false; + } } void S60VideoPlayerSession::doPlay() @@ -372,6 +377,7 @@ void S60VideoPlayerSession::MvpuoPrepareComplete(TInt aError) void S60VideoPlayerSession::MvpuoPrepareComplete(TInt aError) { setError(aError); + TRAPD(err, m_player->SetDisplayWindowL(m_wsSession, m_screenDevice, diff --git a/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.h b/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.h index 581632e57f..80d741b8c0 100644 --- a/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.h +++ b/plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.h @@ -71,8 +71,8 @@ public: ~S60VideoPlayerSession(); //From S60MediaPlayerSession - bool isVideoAvailable() const; - bool isAudioAvailable() const; + bool isVideoAvailable(); + bool isAudioAvailable(); void setVideoRenderer(QObject *renderer); //From MVideoLoadingObserver |