summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Nolvi <markus.nolvi@digia.com>2010-09-15 13:23:03 +0300
committerMica <qt-info@nokia.com>2010-09-22 16:15:15 +0300
commit5f7e3a79a3567a9b9b6262d4e4c2f80505983762 (patch)
tree7b60ff0c9e51461022c8d511e408574e03a88ede
parent8011b82c16fd2a948ec4d21782d218554ac39822 (diff)
Symbian: Implemented QStreamControl for s60 backend + some needed
refactoring
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/mediaplayer_s60.pri6
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.cpp4
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60audioplayersession.h4
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.cpp107
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediametadataprovider.h12
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.cpp13
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayercontrol.h14
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.cpp50
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayerservice.h9
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.cpp97
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediaplayersession.h11
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.cpp125
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60mediastreamcontrol.h79
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.cpp34
-rw-r--r--plugins/multimedia/symbian/mmf/mediaplayer/s60videoplayersession.h4
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