Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qffmpegframe_p.h
Go to the documentation of this file.
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#ifndef QFFMPEGFRAME_P_H
5#define QFFMPEGFRAME_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qffmpeg_p.h"
21#include "QtCore/qsharedpointer.h"
22#include "qpointer.h"
23#include "qobject.h"
24
25#include <optional>
26
28
29namespace QFFmpeg {
30
31struct Frame
32{
33 struct Data
34 {
37 {
39 if (frame->pts != AV_NOPTS_VALUE)
40 pts = codec.toUs(frame->pts);
41 else
42 pts = codec.toUs(frame->best_effort_timestamp);
43
44 if (auto frameDuration = getAVFrameDuration(*frame)) {
45 duration = codec.toUs(frameDuration);
46 } else {
47 const auto &avgFrameRate = codec.stream()->avg_frame_rate;
48 duration = mul(qint64(1000000), { avgFrameRate.den, avgFrameRate.num }).value_or(0);
49 }
50 }
56
59 std::optional<Codec> codec;
62 qint64 pts = -1;
65 };
66 Frame() = default;
67
69 quint64 sourceIndex)
70 : d(new Data(offset, std::move(f), codec, pts, sourceIndex))
71 {
72 }
74 quint64 sourceIndex)
75 : d(new Data(offset, text, pts, duration, sourceIndex))
76 {
77 }
78 bool isValid() const { return !!d; }
79
80 AVFrame *avFrame() const { return data().frame.get(); }
81 AVFrameUPtr takeAVFrame() { return std::move(data().frame); }
82 const Codec *codec() const { return data().codec ? &data().codec.value() : nullptr; }
83 qint64 pts() const { return data().pts; }
84 qint64 duration() const { return data().duration; }
85 qint64 end() const { return data().pts + data().duration; }
86 QString text() const { return data().text; }
87 quint64 sourceId() const { return data().sourceId; };
88 const LoopOffset &loopOffset() const { return data().loopOffset; };
89 qint64 absolutePts() const { return pts() + loopOffset().pos; }
90 qint64 absoluteEnd() const { return end() + loopOffset().pos; }
91
92private:
93 Data &data() const
94 {
95 Q_ASSERT(d);
96 return *d;
97 }
98
99private:
100 QExplicitlySharedDataPointer<Data> d;
101};
102
103} // namespace QFFmpeg
104
106
108
109#endif // QFFMPEGFRAME_P_H
\inmodule QtCore
Definition qatomic.h:112
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
int64_t getAVFrameDuration(const AVFrame &frame)
Definition qffmpeg_p.h:91
std::unique_ptr< AVFrame, AVDeleter< decltype(&av_frame_free), &av_frame_free > > AVFrameUPtr
Definition qffmpeg_p.h:134
std::optional< qint64 > mul(qint64 a, AVRational b)
Definition qffmpeg_p.h:39
Combined button and popup list for selecting options.
#define Q_DECLARE_METATYPE(TYPE)
Definition qmetatype.h:1525
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat f
GLenum GLuint GLintptr offset
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
unsigned long long quint64
Definition qtypes.h:61
long long qint64
Definition qtypes.h:60
QFrame frame
[0]
Data(const LoopOffset &offset, const QString &text, qint64 pts, qint64 duration, quint64 sourceId)
std::optional< Codec > codec
Data(const LoopOffset &offset, AVFrameUPtr f, const Codec &codec, qint64, quint64 sourceId)
AVFrameUPtr takeAVFrame()
quint64 sourceId() const
qint64 absolutePts() const
QString text() const
const LoopOffset & loopOffset() const
qint64 duration() const
AVFrame * avFrame() const
qint64 end() const
Frame(const LoopOffset &offset, AVFrameUPtr f, const Codec &codec, qint64 pts, quint64 sourceIndex)
bool isValid() const
const Codec * codec() const
qint64 absoluteEnd() const
Frame(const LoopOffset &offset, const QString &text, qint64 pts, qint64 duration, quint64 sourceIndex)
qint64 pts() const
Frame()=default