1// Copyright (C) 2024 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 QGST_DISCOVERER_P_H
5#define QGST_DISCOVERER_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 <QtCore/qglobal.h>
19#include <QtCore/qlocale.h>
20#include <QtCore/qsize.h>
21
22#include <QtMultimedia/private/qmultimediautils_p.h>
23
24#include "qgst_p.h"
25#include "qgst_handle_types_p.h"
26
27#include <gst/pbutils/gstdiscoverer.h>
28
29#include <vector>
30
31QT_BEGIN_NAMESPACE
32
33class QMediaMetaData;
34
35namespace QGst {
36
37using QGstDiscovererHandle = QGstImpl::QGstHandleHelper<GstDiscoverer>::UniqueHandle;
38using QGstDiscovererInfoHandle = QGstImpl::QGstHandleHelper<GstDiscovererInfo>::UniqueHandle;
39using QGstDiscovererAudioInfoHandle =
40 QGstImpl::QGstHandleHelper<GstDiscovererAudioInfo>::UniqueHandle;
41using QGstDiscovererVideoInfoHandle =
42 QGstImpl::QGstHandleHelper<GstDiscovererVideoInfo>::UniqueHandle;
43using QGstDiscovererSubtitleInfoHandle =
44 QGstImpl::QGstHandleHelper<GstDiscovererSubtitleInfo>::UniqueHandle;
45using QGstDiscovererStreamInfoHandle =
46 QGstImpl::QGstHandleHelper<GstDiscovererStreamInfo>::UniqueHandle;
47
48struct QGstDiscovererStreamInfo
49{
50 int streamNumber{};
51 QString streamID;
52 QGstTagListHandle tags;
53 QGstCaps caps;
54};
55
56struct QGstDiscovererVideoInfo : QGstDiscovererStreamInfo
57{
58 QSize size;
59 int bitDepth{};
60 Fraction framerate{};
61 Fraction pixelAspectRatio{};
62 bool isInterlaced{};
63 int bitrate{};
64 int maxBitrate{};
65 bool isImage{};
66};
67
68struct QGstDiscovererAudioInfo : QGstDiscovererStreamInfo
69{
70 int channels{};
71 uint64_t channelMask{};
72 int sampleRate{};
73 int bitsPerSample{};
74 int bitrate{};
75 int maxBitrate{};
76 QLocale::Language language{};
77};
78
79struct QGstDiscovererSubtitleInfo : QGstDiscovererStreamInfo
80{
81 QLocale::Language language{};
82};
83
84struct QGstDiscovererContainerInfo : QGstDiscovererStreamInfo
85{
86 QGstTagListHandle tags;
87};
88
89struct QGstDiscovererInfo
90{
91 bool isLive{};
92 bool isSeekable{};
93 std::optional<std::chrono::nanoseconds> duration;
94
95 std::optional<QGstDiscovererContainerInfo> containerInfo;
96 QGstTagListHandle tags;
97 std::vector<QGstDiscovererVideoInfo> videoStreams;
98 std::vector<QGstDiscovererAudioInfo> audioStreams;
99 std::vector<QGstDiscovererSubtitleInfo> subtitleStreams;
100 std::vector<QGstDiscovererContainerInfo> containerStreams;
101};
102
103// For now we only perform synchronous discovery. Our future selves may want to perform the
104// discovery asynchronously.
105class QGstDiscoverer
106{
107public:
108 QGstDiscoverer();
109
110 QMaybe<QGstDiscovererInfo, QUniqueGErrorHandle> discover(const QString &uri);
111 QMaybe<QGstDiscovererInfo, QUniqueGErrorHandle> discover(const QUrl &);
112 QMaybe<QGstDiscovererInfo, QUniqueGErrorHandle> discover(QIODevice *);
113
114private:
115 QMaybe<QGstDiscovererInfo, QUniqueGErrorHandle> discover(const char *);
116 QGstDiscovererHandle m_instance;
117};
118
119QMediaMetaData toContainerMetadata(const QGstDiscovererInfo &);
120QMediaMetaData toStreamMetadata(const QGstDiscovererVideoInfo &);
121QMediaMetaData toStreamMetadata(const QGstDiscovererAudioInfo &);
122QMediaMetaData toStreamMetadata(const QGstDiscovererSubtitleInfo &);
123
124} // namespace QGst
125
126QT_END_NAMESPACE
127
128#endif // QGST_DISCOVERER_P_H
129

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qtmultimedia/src/plugins/multimedia/gstreamer/common/qgst_discoverer_p.h