20#include <QtCore/qdebug.h>
21#include <QtMultimedia/private/qtaggedtime_p.h>
22#include <QtFFmpegMediaPluginImpl/private/qffmpeg_p.h>
30using namespace std::chrono_literals;
38struct UserTrackTimeTag;
43struct AVStreamTimeTag;
48struct AVContextTimeTag;
58 if (formatContext->start_time == AV_NOPTS_VALUE)
60 return AVContextDuration(formatContext->start_time);
65 return UserTrackPosition(trackPosition.get() / 1000);
70 return UserTrackDuration(trackDuration.get() / 1000);
75 return TrackDuration(contextDuration.get() * 1'000'000 / AV_TIME_BASE);
80 return TrackPosition(userTrackPosition.get() * 1000);
85 return TrackDuration(userTrackDuration.get() * 1000);
90 return TrackDuration(timeStampUs(streamDuration.get(), avStream->time_base).value_or(0));
94 const AVFormatContext *formatContext)
96 auto duration = toTrackDuration(streamPosition.asDuration(), avStream);
98 std::optional contextStart = contextStartOffset(formatContext);
100 duration -= toTrackDuration(*contextStart);
103 return duration.asTimePoint();
107 const AVFormatContext *formatContext)
109 return AVContextPosition(trackPosition.get() * AV_TIME_BASE / 1'000'000)
110 + contextStartOffset(formatContext).value_or(AVContextDuration::zero());
115 return debug <<
"TrackPosition{" << position.get() <<
"us}";
120 return debug <<
"TrackDuration{" << duration.get() <<
"us}";
125 return debug <<
"UserTrackPosition{" << position.get() <<
"ms}";
130 return debug <<
"UserTrackDuration{" << duration.get() <<
"ms}";
135 return debug <<
"AVStreamPosition{" << position.get() <<
"stream units}";
140 return debug <<
"AVStreamDuration{" << duration.get() <<
"stream units}";
UserTrackDuration toUserDuration(TrackDuration trackDuration)
QDebug operator<<(QDebug debug, const TrackPosition &position)
TrackDuration toTrackDuration(AVStreamDuration streamDuration, const AVStream *avStream)
AVContextPosition toContextPosition(TrackPosition trackPosition, const AVFormatContext *formatContext)
QT_MANGLE_NAMESPACE(QMacScreenCaptureStreamDelegate) QMacScreenCaptureStreamDelegate
std::optional< AVContextDuration > contextStartOffset(const AVFormatContext *formatContext)
std::chrono::steady_clock SteadyClock
TrackDuration toTrackDuration(AVContextDuration contextDuration)
UserTrackPosition toUserPosition(TrackPosition trackPosition)
TrackPosition toTrackPosition(AVStreamPosition streamPosition, const AVStream *avStream, const AVFormatContext *formatContext)
TrackPosition toTrackPosition(UserTrackPosition userTrackPosition)