PonyPlayer
demuxer.hpp
浏览该文件的文档.
1//
2// Created by ColorsWind on 2022/5/6.
3//
4#pragma once
5
6#include <QObject>
7#include <utility>
9#include "audioformat.hpp"
10
14class Demuxer : public QObject {
15 Q_OBJECT
17private:
18 DemuxDispatcherBase *m_worker = nullptr;
19 DecodeDispatcher *m_forward = nullptr;
20 ReverseDecodeDispatcher *m_backward = nullptr;
21
22 QThread *m_affinityThread = nullptr;
23 std::mutex m_workerLock;
24public:
25
26
27 explicit Demuxer(QObject *parent) : QObject(nullptr) {
28 m_affinityThread = new QThread;
29 m_affinityThread->setObjectName(PonyPlayer::DECODER);
30 this->moveToThread(m_affinityThread);
31 m_affinityThread->start();
32 }
33
34 ~Demuxer() override {
35 qDebug() << "Destroy Demuxer";
36 m_affinityThread->quit();
37 }
38
40
42 std::unique_lock lock(m_workerLock);
43 return m_worker->getPicture();
44 }
45
47
48 qreal frontPicture() {
49 std::unique_lock lock(m_workerLock);
50 return m_worker->frontPicture();
51 }
52
53 PONY_THREAD_SAFE int skipPicture(const std::function<bool(qreal)> &predicate) {
54 std::unique_lock lock(m_workerLock);
55 return m_worker->skipPicture(predicate);
56 }
57
59
61 std::unique_lock lock(m_workerLock);
62 return m_worker->getSample();
63 }
64
65
67
68 qreal frontSample() {
69 std::unique_lock lock(m_workerLock);
70 return m_worker->frontSample();
71 }
72
73 PONY_THREAD_SAFE int skipSample(const std::function<bool(qreal)> &predicate) {
74 std::unique_lock lock(m_workerLock);
75 return m_worker->skipSample(predicate);
76 }
77
78
80
81 qreal audioDuration() {
82 std::unique_lock lock(m_workerLock);
83 return m_forward ? m_forward->getAudionLength() : 0.0;
84 }
85
87
88 qreal videoDuration() {
89 std::unique_lock lock(m_workerLock);
90 return m_forward ? m_forward->getVideoLength() : 0.0;
91 }
92
94
95 QStringList getTracks() {
96 std::unique_lock lock(m_workerLock);
97 if (m_forward) {
98 return m_forward->getTracks();
99 } else {
100 return {u"没有打开的文件"_qs};
101 }
102 }
103
108 PONY_THREAD_SAFE bool isBackward() {
109 std::unique_lock lock(m_workerLock);
110 return dynamic_cast<ReverseDecodeDispatcher *>(m_worker);
111 }
112
113
114 PONY_THREAD_SAFE bool hasVideo() {
115 std::unique_lock lock(m_workerLock);
116 return m_forward && m_forward->hasVideo();
117 }
118
119
120
125 PONY_CONDITION("OpenFileResult")
126 PONY_THREAD_SAFE void pause() {
127 std::unique_lock lock(m_workerLock);
128 m_worker->statePause();
129 }
130
131 PONY_THREAD_SAFE bool isFileOpen() {
132 std::unique_lock lock(m_workerLock);
133 return m_worker != nullptr;
134 }
135
140 PONY_GUARD_BY(FRAME) void flush() {
141 std::unique_lock lock(m_workerLock);
142 m_worker->flush();
143 }
144
148 PONY_THREAD_SAFE void start() {
149 std::unique_lock lock(m_workerLock);
150 qDebug() << "Start Decoder";
151 m_worker->stateResume();
152 }
153
154 void setEnableAudio(bool enable) {
155 m_worker->setEnableAudio(enable);
156 }
157
159 std::unique_lock lock(m_workerLock);
160 if (m_worker) {
161 return m_worker->getAudioInputFormat();
162 } else {
164 }
165
166 }
167
173 std::unique_lock lock(m_workerLock);
174 m_forward->setAudioOutputFormat(format);
175 m_backward->setAudioOutputFormat(std::move(format));
176 }
177
178
179public slots:
180
193 void seek(qreal secs) {
194 m_worker->seek(secs);
195 }
196
203 m_forward->setAudioIndex(index);
204 }
205
210 void openFile(const std::string &fn) {
211 qDebug() << "Demuxer Open file" << QString::fromUtf8(fn);
212 // call on video decoder thread
213 std::unique_lock lock(m_workerLock);
214 if (m_worker) {
215 qWarning() << "Already open file:" << m_worker->filename.c_str();
217 return;
218 }
220 try {
221 m_forward = new DecodeDispatcher(fn, result, DEFAULT_STREAM_INDEX, DEFAULT_STREAM_INDEX, this);
222 m_backward = new ReverseDecodeDispatcher(fn, this);
223 m_worker = m_forward;
224 } catch (std::runtime_error &ex) {
225 qWarning() << "Error opening file:" << ex.what();
226 m_worker = nullptr;
227 m_backward = nullptr;
228 m_forward = nullptr;
229 emit openFileResult(result, QPrivateSignal());
230 return;
231 }
232 lock.unlock();
233 m_worker->stateResume();
234 emit openFileResult(result, QPrivateSignal());
235 qDebug() << "Open file success.";
236 }
237
238
246 void backward() {
247 std::unique_lock lock(m_workerLock);
248 m_worker = m_backward;
249 m_forward->flush();
250 }
251
259 void forward() {
260 std::unique_lock lock(m_workerLock);
261 m_worker = m_forward;
262 m_backward->flush();
263 };
264
265 void close() {
266 std::unique_lock lock(m_workerLock);
267 if (m_worker) {
268 qDebug() << "Close file" << m_worker->filename.c_str();
269 m_worker = nullptr;
270 if (m_forward) {
271 m_forward->statePause();
272 m_forward->deleteLater();
273 m_forward = nullptr;
274 }
275 if (m_backward) {
276 m_backward->statePause();
277 m_backward->deleteLater();
278 m_backward = nullptr;
279 }
280 } else {
281 qWarning() << "Try to close file while no file has been opened.";
282 }
283 }
284
285 void setTrack(int i) {
286 std::unique_lock lock(m_workerLock);
287 m_worker->setTrack(i);
288 }
289
290
291 void test_onWork() {
292 m_worker->test_onWork();
293 }
294
295signals:
296
297 void openFileResult(PonyPlayer::OpenFileResultType result, QPrivateSignal);
298};
299
Definition: frame.hpp:145
解码器调度器, 将Packet分配给解码器进一步解码成Frame 这个类是RAII的
Definition: dispatcher.hpp:151
qreal getAudionLength() const
Definition: dispatcher.hpp:292
QStringList getTracks()
Definition: dispatcher.hpp:309
void setAudioIndex(StreamIndex i)
Definition: dispatcher.hpp:320
bool hasVideo() override
Definition: dispatcher.hpp:329
void setAudioOutputFormat(PonyAudioFormat format) override
Definition: dispatcher.hpp:343
qreal getVideoLength() const
Definition: dispatcher.hpp:296
void statePause() override
Definition: dispatcher.hpp:234
void flush() override
Definition: dispatcher.hpp:240
Definition: dispatcher.hpp:81
virtual PONY_THREAD_SAFE qreal frontSample()
Definition: dispatcher.hpp:130
virtual void statePause()
Definition: dispatcher.hpp:108
const std::string filename
Definition: dispatcher.hpp:84
virtual void setTrack(int i)
Definition: dispatcher.hpp:134
virtual PONY_THREAD_SAFE VideoFrameRef getPicture()
Definition: dispatcher.hpp:122
virtual void seek(qreal secs)
Definition: dispatcher.hpp:120
virtual int skipPicture(const std::function< bool(qreal)> &function)
Definition: dispatcher.hpp:126
virtual void test_onWork()=0
virtual void stateResume()
Definition: dispatcher.hpp:116
virtual PonyAudioFormat getAudioInputFormat()=0
virtual void flush()
Definition: dispatcher.hpp:112
virtual int skipSample(const std::function< bool(qreal)> &function)
Definition: dispatcher.hpp:132
virtual PONY_THREAD_SAFE qreal frontPicture()
Definition: dispatcher.hpp:124
virtual void setEnableAudio(bool enable)
Definition: dispatcher.hpp:138
virtual PONY_THREAD_SAFE AudioFrame getSample()
Definition: dispatcher.hpp:128
Definition: demuxer.hpp:14
PONY_THREAD_SAFE int skipSample(const std::function< bool(qreal)> &predicate)
Definition: demuxer.hpp:73
PONY_GUARD_BY(FRAME) void flush()
Definition: demuxer.hpp:140
PONY_THREAD_SAFE int skipPicture(const std::function< bool(qreal)> &predicate)
Definition: demuxer.hpp:53
qreal frontPicture()
Definition: demuxer.hpp:48
void setAudioIndex(StreamIndex index)
Definition: demuxer.hpp:202
void close()
Definition: demuxer.hpp:265
PONY_THREAD_SAFE void start()
Definition: demuxer.hpp:148
qreal frontSample()
Definition: demuxer.hpp:68
void forward()
Definition: demuxer.hpp:259
~Demuxer() override
Definition: demuxer.hpp:34
qreal videoDuration()
Definition: demuxer.hpp:88
AudioFrame getSample()
Definition: demuxer.hpp:60
void test_onWork()
Definition: demuxer.hpp:291
Demuxer(QObject *parent)
Definition: demuxer.hpp:27
PonyAudioFormat getInputFormat()
Definition: demuxer.hpp:158
void seek(qreal secs)
Definition: demuxer.hpp:193
void openFileResult(PonyPlayer::OpenFileResultType result, QPrivateSignal)
PONY_THREAD_SAFE bool isFileOpen()
Definition: demuxer.hpp:131
PONY_THREAD_SAFE bool isBackward()
Definition: demuxer.hpp:108
void setTrack(int i)
Definition: demuxer.hpp:285
void openFile(const std::string &fn)
Definition: demuxer.hpp:210
QStringList getTracks()
Definition: demuxer.hpp:95
void backward()
Definition: demuxer.hpp:246
VideoFrameRef getPicture()
Definition: demuxer.hpp:41
void setOutputFormat(PonyAudioFormat format)
Definition: demuxer.hpp:172
PONY_THREAD_SAFE void pause()
Definition: demuxer.hpp:126
void setEnableAudio(bool enable)
Definition: demuxer.hpp:154
PONY_THREAD_SAFE bool hasVideo()
Definition: demuxer.hpp:114
qreal audioDuration()
Definition: demuxer.hpp:81
Definition: audioformat.hpp:97
反向解码器调度器
Definition: dispatcher.hpp:386
void setAudioOutputFormat(PonyAudioFormat format) override
Definition: dispatcher.hpp:543
PONY_THREAD_SAFE void statePause() override
Definition: dispatcher.hpp:479
PONY_THREAD_SAFE void flush() override
Definition: dispatcher.hpp:485
Definition: frame.hpp:47
constexpr const StreamIndex DEFAULT_STREAM_INDEX
Definition: dispatcher.hpp:76
unsigned int StreamIndex
Definition: dispatcher.hpp:75
OpenFileResultType
Definition: dispatcher.hpp:32
@ FAILED
打开文件失败
Definition: dispatcher.hpp:33
constexpr PonyThread MAIN
Definition: ponyplayer.h:47
constexpr PonyThread DECODER
Definition: ponyplayer.h:46
const PonyAudioFormat DEFAULT_AUDIO_FORMAT
Definition: audioformat.hpp:164
constexpr PonyThread FRAME
Definition: ponyplayer.h:50
#define PONY_CONDITION(description)
Definition: ponyplayer.h:94
#define PONY_THREAD_AFFINITY(thread)
Definition: ponyplayer.h:95