1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the Qt API. It exists purely as an
9// implementation detail. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13//
14
15#ifndef QFFMPEGMEDIAPLAYER_H
16#define QFFMPEGMEDIAPLAYER_H
17
18#include <QtMultimedia/private/qplatformmediaplayer_p.h>
19#include <qmediametadata.h>
20#include <qtimer.h>
21#include <qpointer.h>
22#include <qfuture.h>
23#include <QtFFmpegMediaPluginImpl/private/qffmpeg_p.h>
24#include <QtFFmpegMediaPluginImpl/private/qffmpegmediadataholder_p.h>
25
26QT_BEGIN_NAMESPACE
27
28namespace QFFmpeg {
29class CancelToken;
30
31class PlaybackEngine;
32} // namespace QFFmpeg
33
34class QPlatformAudioOutput;
35
36class QFFmpegMediaPlayer : public QObject, public QPlatformMediaPlayer
37{
38 Q_OBJECT
39public:
40 QFFmpegMediaPlayer(QMediaPlayer *player);
41 ~QFFmpegMediaPlayer() override;
42
43 qint64 duration() const override;
44
45 void setPosition(qint64 position) override;
46
47 float bufferProgress() const override;
48
49 QMediaTimeRange availablePlaybackRanges() const override;
50
51 qreal playbackRate() const override;
52 void setPlaybackRate(qreal rate) override;
53
54 QUrl media() const override;
55 const QIODevice *mediaStream() const override;
56 void setMedia(const QUrl &media, QIODevice *stream) override;
57
58 void play() override;
59 void pause() override;
60 void stop() override;
61
62 void setAudioOutput(QPlatformAudioOutput *) override;
63
64 void setAudioBufferOutput(QAudioBufferOutput *) override;
65
66 QMediaMetaData metaData() const override;
67
68 void setVideoSink(QVideoSink *sink) override;
69 QVideoSink *videoSink() const;
70
71 int trackCount(TrackType) override;
72 QMediaMetaData trackMetaData(TrackType type, int streamNumber) override;
73 int activeTrack(TrackType) override;
74 void setActiveTrack(TrackType, int streamNumber) override;
75 void setLoops(int loops) override;
76
77 PitchCompensationAvailability pitchCompensationAvailability() const override;
78 void setPitchCompensation(bool enabled) override;
79 bool pitchCompensation() const override;
80
81private:
82 void runPlayback();
83 void handleIncorrectMedia(QMediaPlayer::MediaStatus status);
84 void setMediaAsync(QFFmpeg::MediaDataHolder::Maybe mediaDataHolder,
85 const std::shared_ptr<QFFmpeg::CancelToken> &cancelToken);
86
87 void mediaStatusChanged(QMediaPlayer::MediaStatus);
88
89private slots:
90 void updatePosition();
91 void endOfStream();
92 void error(QMediaPlayer::Error error, const QString &errorString)
93 {
94 QPlatformMediaPlayer::error(error, errorString);
95 }
96 void onLoopChanged();
97 void onBuffered();
98
99private:
100 QTimer m_positionUpdateTimer;
101 QMediaPlayer::PlaybackState m_requestedStatus = QMediaPlayer::StoppedState;
102
103 using PlaybackEngine = QFFmpeg::PlaybackEngine;
104
105 std::unique_ptr<PlaybackEngine> m_playbackEngine;
106 QPlatformAudioOutput *m_audioOutput = nullptr;
107 QPointer<QAudioBufferOutput> m_audioBufferOutput;
108 QPointer<QVideoSink> m_videoSink;
109
110 QUrl m_url;
111 QPointer<QIODevice> m_device;
112 float m_playbackRate = 1.;
113 float m_bufferProgress = 0.f;
114 QFuture<void> m_loadMedia;
115 std::shared_ptr<QFFmpeg::CancelToken> m_cancelToken; // For interrupting ongoing
116 // network connection attempt
117
118 bool m_pitchCompensation = true;
119};
120
121QT_END_NAMESPACE
122
123
124#endif // QMEDIAPLAYERCONTROL_H
125
126

source code of qtmultimedia/src/plugins/multimedia/ffmpeg/qffmpegmediaplayer_p.h