1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFFMPEG_P_H
#define QFFMPEG_P_H
#include <private/qtmultimediaglobal_p.h>
#include <qstring.h>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswresample/swresample.h>
#include <libavutil/avutil.h>
#include <libswscale/swscale.h>
}
#define QT_FFMPEG_OLD_CHANNEL_LAYOUT (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(59,24,100))
QT_BEGIN_NAMESPACE
namespace QFFmpeg
{
inline std::optional<qint64> mul(qint64 a, AVRational b)
{
return b.den != 0 ? (a * b.num + b.den / 2) / b.den : std::optional<qint64>{};
}
inline std::optional<qreal> mul(qreal a, AVRational b)
{
return b.den != 0 ? a * qreal(b.num) / qreal(b.den) : std::optional<qreal>{};
}
inline std::optional<qint64> timeStampMs(qint64 ts, AVRational base)
{
return mul(1'000 * ts, base);
}
inline std::optional<qint64> timeStampUs(qint64 ts, AVRational base)
{
return mul(1'000'000 * ts, base);
}
inline std::optional<float> toFloat(AVRational r)
{
return r.den != 0 ? float(r.num) / float(r.den) : std::optional<float>{};
}
inline QString err2str(int errnum)
{
char buffer[AV_ERROR_MAX_STRING_SIZE + 1] = {};
av_make_error_string(buffer, AV_ERROR_MAX_STRING_SIZE, errnum);
return QString::fromLocal8Bit(buffer);
}
struct AVFrameDeleter
{
void operator()(AVFrame *frame) const
{
if (frame)
av_frame_free(&frame);
}
};
using AVFrameUPtr = std::unique_ptr<AVFrame, AVFrameDeleter>;
inline AVFrameUPtr makeAVFrame()
{
return AVFrameUPtr(av_frame_alloc());
}
struct AVPacketDeleter
{
void operator()(AVPacket *packet) const
{
if (packet)
av_packet_free(&packet);
}
};
using AVPacketUPtr = std::unique_ptr<AVPacket, AVPacketDeleter>;
struct AVCodecContextDeleter
{
void operator()(AVCodecContext *context) const
{
if (context)
avcodec_free_context(&context);
}
};
using AVCodecContextUPtr = std::unique_ptr<AVCodecContext, AVCodecContextDeleter>;
QT_END_NAMESPACE
}
#endif
|