4#ifndef QFFMPEGFRAME_P_H
5#define QFFMPEGFRAME_P_H
18#include <QtFFmpegMediaPluginImpl/private/qffmpeg_p.h>
19#include <QtFFmpegMediaPluginImpl/private/qffmpegcodeccontext_p.h>
20#include <QtFFmpegMediaPluginImpl/private/qffmpegplaybackutils_p.h>
21#include <QtFFmpegMediaPluginImpl/private/qffmpegtime_p.h>
22#include <QtCore/qobject.h>
23#include <QtCore/qpointer.h>
24#include <QtCore/qshareddata.h>
36 Data(
const LoopOffset &offset, AVFrameUPtr f,
const CodecContext &codecContext,
37 const PlaybackEngineObjectID &sourceID)
44 if (frame->pts != AV_NOPTS_VALUE)
45 startTime = codecContext.toTrackPosition(AVStreamPosition(frame->pts));
47 startTime = codecContext.toTrackPosition(
48 AVStreamPosition(frame->best_effort_timestamp));
50 if (
auto frameDuration = getAVFrameDuration(*frame)) {
51 duration = codecContext.toTrackDuration(AVStreamDuration(frameDuration));
54 if (codecContext.context()->codec_type == AVMEDIA_TYPE_AUDIO) {
55 if (frame->sample_rate)
56 duration = TrackDuration(qint64(1000000) * frame->nb_samples
57 / frame->sample_rate);
59 duration = TrackDuration(0);
62 const auto &avgFrameRate = codecContext.stream()->avg_frame_rate;
63 duration = TrackDuration(
64 mul(qint64(1000000), { avgFrameRate.den, avgFrameRate.num })
69 Data(
const LoopOffset &offset,
const QString &text, TrackPosition pts,
70 TrackDuration duration,
const PlaybackEngineObjectID &sourceID)
86 Frame(
const LoopOffset &offset, AVFrameUPtr f,
const CodecContext &codecContext,
87 const PlaybackEngineObjectID &sourceId)
91 Frame(
const LoopOffset &offset,
const QString &text, TrackPosition pts, TrackDuration duration,
92 const PlaybackEngineObjectID &sourceId)
102 return data().codecContext ? &data().codecContext.value() :
nullptr;
112 return startTime() + loopOffset().loopStartTimeUs.asDuration();
116 return endTime() + loopOffset().loopStartTimeUs.asDuration();
127 QExplicitlySharedDataPointer<Data> d;
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType
QT_END_NAMESPACE Q_DECLARE_METATYPE(QFFmpeg::Frame)
PlaybackEngineObjectID sourceID
Data(const LoopOffset &offset, AVFrameUPtr f, const CodecContext &codecContext, const PlaybackEngineObjectID &sourceID)
std::optional< CodecContext > codecContext
Data(const LoopOffset &offset, const QString &text, TrackPosition pts, TrackDuration duration, const PlaybackEngineObjectID &sourceID)
TrackPosition absoluteEnd() const
AVFrameUPtr takeAVFrame()
TrackPosition startTime() const
TrackPosition endTime() const
const PlaybackEngineObjectID & sourceID() const
const LoopOffset & loopOffset() const
AVFrame * avFrame() const
Frame(const LoopOffset &offset, AVFrameUPtr f, const CodecContext &codecContext, const PlaybackEngineObjectID &sourceId)
const CodecContext * codecContext() const
TrackPosition absolutePts() const
TrackDuration duration() const
Frame(const LoopOffset &offset, const QString &text, TrackPosition pts, TrackDuration duration, const PlaybackEngineObjectID &sourceId)