11template<IDemuxDecoder::DecoderType type>
46 if (frame) av_frame_free(&frame);
65 return static_cast<double>(
stream->duration) * av_q2d(
stream->time_base);
71 if (frame) av_frame_free(&frame);
77 bool accept(AVPacket *pkt, std::atomic<bool> &interrupt)
override {
78 int ret = avcodec_send_packet(
codecCtx, pkt);
83 while(ret >= 0 && !interrupt) {
112 }
else if (ret == AVERROR(EAGAIN)) {
163 qDebug() <<
"getPicture: get EOF";
167 double pts =
static_cast<double>(frame->pts) * av_q2d(
stream->time_base);
168 return {frame,
true, pts};
172 return frameQueue->viewFront<qreal>([
this](AVFrame * frame) {
174 return static_cast<qreal
>(frame->pts) * av_q2d(
stream->time_base);
176 return std::numeric_limits<qreal>::quiet_NaN();
181 int skip(
const std::function<
bool(qreal)> &predicate)
override {
182 return frameQueue->skip([
this, predicate](AVFrame *frame){
183 return frame && predicate(
static_cast<qreal
>(frame->pts) * av_q2d(
stream->time_base));
184 }, [](AVFrame *frame) { av_frame_free(&frame); });
190 SwrContext *swrCtx =
nullptr;
191 uint8_t *audioOutBuf =
nullptr;
192 AVFrame * sampleFrameBuf =
nullptr;
198 throw std::runtime_error(
"Cannot alloc audioOutBuf");
200 sampleFrameBuf = av_frame_alloc();
204 if (sampleFrameBuf) { av_frame_free(&sampleFrameBuf); }
205 if (audioOutBuf) { av_freep(&audioOutBuf); }
206 if (swrCtx) { swr_free(&swrCtx); }
211 int left = 0, right = len-sampleSize;
212 while (left < right) {
213 for (
int i = 0; i < sampleSize; i++)
214 std::swap(samples[left+i], samples[right+i]);
224 auto *frame = std::forward<AVFrame *>(
frameQueue->remove(
true));
226 qDebug() <<
"getSample: get EOF";
230 const_cast<const uint8_t **
>(frame->data), frame->nb_samples);
232 int out_size = av_samples_get_buffer_size(
nullptr, targetFmt.
getChannelCount(),
236 double pts =
static_cast<double>(frame->pts) * av_q2d(
stream->time_base) +
237 static_cast<double>(len)/44100;
238 reverseSample(audioOutBuf, out_size);
240 av_frame_free(&frame);
241 return {
reinterpret_cast<std::byte *
>(audioOutBuf), out_size, pts};
250 if (swrCtx) { swr_free(&swrCtx); }
251 this->swrCtx = swr_alloc_set_opts(swrCtx, av_get_default_channel_layout(format.
getChannelCount()),
256 if (!swrCtx || swr_init(swrCtx) < 0) {
257 throw std::runtime_error(
"Cannot initialize swrCtx");
Definition: frame.hpp:145
Definition: decoders.hpp:105
AVFrame * frameBuf
Definition: decoders.hpp:110
AVCodecContext * codecCtx
Definition: decoders.hpp:109
AVStream * stream
Definition: decoders.hpp:108
Definition: decoders.hpp:22
virtual qreal getLastPts()
Definition: decoders.hpp:88
virtual void pushFrameStack()
Definition: decoders.hpp:86
void reverseSample(uint8_t *samples, int len)
Definition: backward.hpp:209
void setOutputFormat(const PonyAudioFormat &format) override
Definition: backward.hpp:248
~ReverseDecoderImpl() override
Definition: backward.hpp:203
PonyAudioFormat getInputFormat() override
Definition: backward.hpp:244
ReverseDecoderImpl(AVStream *vs, TwinsBlockQueue< AVFrame * > *queue)
Definition: backward.hpp:195
PONY_THREAD_SAFE AudioFrame getSample() override
Definition: backward.hpp:220
ReverseDecoderImpl(AVStream *vs, TwinsBlockQueue< AVFrame * > *queue)
Definition: backward.hpp:157
qreal viewFront() override
Definition: backward.hpp:171
int skip(const std::function< bool(qreal)> &predicate) override
Definition: backward.hpp:181
VideoFrameRef getPicture() override
Definition: backward.hpp:160
Definition: backward.hpp:12
ReverseDecoderImpl(AVStream *vs, TwinsBlockQueue< AVFrame * > *queue)
Definition: backward.hpp:23
void pushFrameStack() override
Definition: backward.hpp:32
bool accept(AVPacket *pkt, std::atomic< bool > &interrupt) override
Definition: backward.hpp:77
qreal from
Definition: backward.hpp:19
qreal viewFront() override
Definition: backward.hpp:140
~ReverseDecoderImpl() override
Definition: backward.hpp:68
qreal nextSegment() override
Definition: backward.hpp:58
qreal next
Definition: backward.hpp:20
qreal lastPts
Definition: backward.hpp:18
void flushFFmpegBuffers() override
Definition: backward.hpp:124
void clearFrameStack() override
Definition: backward.hpp:43
void setOutputFormat(const PonyAudioFormat &format) override
Definition: backward.hpp:146
PONY_THREAD_SAFE void setEnable(bool b) override
Definition: backward.hpp:136
int skip(const std::function< bool(qreal)> &predicate) override
Definition: backward.hpp:148
qreal getLastPts() override
Definition: backward.hpp:39
AudioFrame getSample() override
Definition: backward.hpp:132
TwinsBlockQueue< AVFrame * > * frameQueue
Definition: backward.hpp:15
void setStart(qreal secs) override
Definition: backward.hpp:52
std::vector< AVFrame * > * frameStack
Definition: backward.hpp:16
VideoFrameRef getPicture() override
Definition: backward.hpp:128
const qreal interval
Definition: backward.hpp:14
IDemuxDecoder * m_follower
Definition: backward.hpp:17
void setFollower(IDemuxDecoder *follower) override
Definition: backward.hpp:28
double duration() override
Definition: backward.hpp:64
PonyAudioFormat getInputFormat() override
Definition: backward.hpp:144
联动队列. 用于单生产者多队列, 单消费者通信.
Definition: twins_queue.hpp:17
constexpr auto Common
Definition: decoders.hpp:141
constexpr auto Video
Definition: decoders.hpp:140
constexpr auto Audio
Definition: decoders.hpp:139
const int MAX_AUDIO_FRAME_SIZE
Definition: helper.hpp:15
const int ERROR_EOF
Definition: helper.hpp:14
QString ffmpegErrToString(int err)
Definition: helper.hpp:21
const PonySampleFormat Int16
Definition: audioformat.hpp:160
#define ILLEGAL_STATE(msg)
Definition: ponyplayer.h:40
#define NOT_IMPLEMENT_YET
Definition: ponyplayer.h:39