File indexing completed on 2024-12-01 04:21:26

0001 /*
0002     Copyright (C) 2007-2008 Tanguy Krotoff <tkrotoff@gmail.com>
0003     Copyright (C) 2008 Lukas Durfina <lukas.durfina@gmail.com>
0004     Copyright (C) 2009 Fathi Boudra <fabo@kde.org>
0005     Copyright (C) 2009-2011 vlc-phonon AUTHORS <kde-multimedia@kde.org>
0006 
0007     This library is free software; you can redistribute it and/or
0008     modify it under the terms of the GNU Lesser General Public
0009     License as published by the Free Software Foundation; either
0010     version 2.1 of the License, or (at your option) any later version.
0011 
0012     This library is distributed in the hope that it will be useful,
0013     but WITHOUT ANY WARRANTY; without even the implied warranty of
0014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015     Lesser General Public License for more details.
0016 
0017     You should have received a copy of the GNU Lesser General Public
0018     License along with this library.  If not, see <http://www.gnu.org/licenses/>.
0019 */
0020 
0021 #ifndef PHONON_STREAMREADER_H
0022 #define PHONON_STREAMREADER_H
0023 
0024 #include <phonon/mediasource.h>
0025 #include <phonon/streaminterface.h>
0026 
0027 #include <stdint.h>
0028 
0029 #include <QtCore/QMutex>
0030 #include <QtCore/QWaitCondition>
0031 
0032 #ifndef QT_NO_PHONON_ABSTRACTMEDIASTREAM
0033 
0034 namespace Phonon
0035 {
0036 
0037 class MediaSource;
0038 
0039 namespace VLC
0040 {
0041 
0042 class Media;
0043 class MediaObject;
0044 
0045 /** \brief Class for supporting custom data streams to the backend
0046  *
0047  * This class receives data from a Phonon MediaSource that is a stream.
0048  * When data is requested, it fetches it from the media source and passes it further.
0049  * MediaObject uses this class to pass stream data to libVLC.
0050  *
0051  * It implements Phonon::StreamInterface, necessary for the connection with an
0052  * Phonon::AbstractMediaStream owned by the Phonon::MediaSource. See the Phonon
0053  * documentation for details.
0054  *
0055  * There are callbacks implemented in streamhooks.cpp, for libVLC.
0056  */
0057 class StreamReader : public QObject, public Phonon::StreamInterface
0058 {
0059     Q_OBJECT
0060     Q_INTERFACES(Phonon::StreamInterface)
0061 public:
0062     explicit StreamReader(MediaObject *parent);
0063     ~StreamReader();
0064 
0065     void addToMedia(Media *media);
0066 
0067     void lock();
0068     void unlock();
0069 
0070     static int readCallback(void *data, const char *cookie,
0071                             int64_t *dts, int64_t *pts, unsigned *flags, // krazy:exclude=typedefs
0072                             size_t *bufferSize, void **buffer);
0073 
0074     static int readDoneCallback(void *data, const char *cookie,
0075                                 size_t bufferSize, void *buffer);
0076 
0077     static int seekCallback(void *data, const uint64_t pos);
0078 
0079     quint64 currentBufferSize() const;
0080     void writeData(const QByteArray &data) override;
0081     quint64 currentPos() const;
0082     void setCurrentPos(qint64 pos);
0083 
0084     /**
0085      * Requests data from this stream. The stream requests data from the
0086      * Phonon::MediaSource's abstract media stream with the needData() signal.
0087      * If the requested data is available, it is copied into the buffer.
0088      *
0089      * \param pos Position in the stream
0090      * \param length Length of the data requested
0091      * \param buffer A buffer to put the data
0092      */
0093     bool read(quint64 offset, int *length, char *buffer);
0094 
0095     void endOfData() override;
0096     void setStreamSize(qint64 newSize) override;
0097     qint64 streamSize() const;
0098     void setStreamSeekable(bool seekable) override;
0099     bool streamSeekable() const;
0100 
0101 Q_SIGNALS:
0102     void streamSeekableChanged(bool seekable);
0103 
0104 protected:
0105     QByteArray m_buffer;
0106     quint64 m_pos;
0107     quint64 m_size;
0108     bool m_eos;
0109     bool m_seekable;
0110     bool m_unlocked;
0111     QMutex m_mutex;
0112     QWaitCondition m_waitingForData;
0113     MediaObject *m_mediaObject;
0114 };
0115 
0116 }
0117 }
0118 
0119 #endif //QT_NO_PHONON_ABSTRACTMEDIASTREAM
0120 
0121 #endif // PHONON_STREAMREADER_H