/**************************************************************************** ** ** 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$ ** GNU Lesser General Public License Usage ** 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. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef DIRECTSHOWPLAYERSERVICE_H #define DIRECTSHOWPLAYERSERVICE_H #include "qmediaplayer.h" #include "qmediaresource.h" #include "qmediaservice.h" #include "qmediatimerange.h" #include "directshoweventloop.h" #include "directshowglobal.h" #include #include #include #include class DirectShowAudioEndpointControl; class DirectShowMetaDataControl; class DirectShowPlayerControl; class DirectShowVideoRendererControl; #ifndef Q_WS_SIMULATOR class Vmr9VideoWindowControl; #endif QT_BEGIN_NAMESPACE class QMediaContent; QT_END_NAMESPACE QT_USE_NAMESPACE class DirectShowPlayerService : public QMediaService { Q_OBJECT public: enum StreamType { AudioStream = 0x01, VideoStream = 0x02 }; DirectShowPlayerService(QObject *parent = 0); ~DirectShowPlayerService(); QMediaControl* requestControl(const char *name); void releaseControl(QMediaControl *control); void load(const QMediaContent &media, QIODevice *stream); void play(); void pause(); void stop(); qint64 position() const; QMediaTimeRange availablePlaybackRanges() const; void seek(qint64 position); void setRate(qreal rate); int bufferStatus() const; void setAudioOutput(IBaseFilter *filter); void setVideoOutput(IBaseFilter *filter); protected: void customEvent(QEvent *event); private Q_SLOTS: void videoOutputChanged(); private: void releaseGraph(); void updateStatus(); int findStreamTypes(IBaseFilter *source) const; int findStreamType(IPin *pin) const; bool isConnected(IBaseFilter *filter, PIN_DIRECTION direction) const; IBaseFilter *getConnected(IBaseFilter *filter, PIN_DIRECTION direction) const; void run(); void doSetUrlSource(QMutexLocker *locker); void doSetStreamSource(QMutexLocker *locker); void doRender(QMutexLocker *locker); void doFinalizeLoad(QMutexLocker *locker); void doSetRate(QMutexLocker *locker); void doSeek(QMutexLocker *locker); void doPlay(QMutexLocker *locker); void doPause(QMutexLocker *locker); void doStop(QMutexLocker *locker); void doReleaseAudioOutput(QMutexLocker *locker); void doReleaseVideoOutput(QMutexLocker *locker); void doReleaseGraph(QMutexLocker *locker); void graphEvent(QMutexLocker *locker); enum Task { Shutdown = 0x0001, SetUrlSource = 0x0002, SetStreamSource = 0x0004, SetSource = SetUrlSource | SetStreamSource, SetAudioOutput = 0x0008, SetVideoOutput = 0x0010, SetOutputs = SetAudioOutput | SetVideoOutput, Render = 0x0020, FinalizeLoad = 0x0040, SetRate = 0x0080, Seek = 0x0100, Play = 0x0200, Pause = 0x0400, Stop = 0x0800, ReleaseGraph = 0x1000, ReleaseAudioOutput = 0x2000, ReleaseVideoOutput = 0x4000, ReleaseFilters = ReleaseGraph | ReleaseAudioOutput | ReleaseVideoOutput }; enum Event { FinalizedLoad = QEvent::User, Error, RateChange, Started, Paused, DurationChange, StatusChange, EndOfMedia, PositionChange }; enum GraphStatus { NoMedia, Loading, Loaded, InvalidMedia }; DirectShowPlayerControl *m_playerControl; DirectShowMetaDataControl *m_metaDataControl; DirectShowVideoRendererControl *m_videoRendererControl; #ifndef Q_WS_SIMULATOR Vmr9VideoWindowControl *m_videoWindowControl; #endif DirectShowAudioEndpointControl *m_audioEndpointControl; QThread *m_taskThread; DirectShowEventLoop *m_loop; int m_pendingTasks; int m_executingTask; int m_executedTasks; HANDLE m_taskHandle; HANDLE m_eventHandle; GraphStatus m_graphStatus; QMediaPlayer::Error m_error; QIODevice *m_stream; IFilterGraph2 *m_graph; IBaseFilter *m_source; IBaseFilter *m_audioOutput; IBaseFilter *m_videoOutput; int m_streamTypes; qreal m_rate; qint64 m_position; qint64 m_duration; bool m_buffering; bool m_seekable; bool m_atEnd; QMediaTimeRange m_playbackRange; QUrl m_url; QMediaResourceList m_resources; QString m_errorString; QMutex m_mutex; friend class DirectShowPlayerServiceThread; }; #endif