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 | |
31 | QT_BEGIN_NAMESPACE |
32 | |
33 | class QMediaMetaData; |
34 | |
35 | namespace QGst { |
36 | |
37 | using QGstDiscovererHandle = QGstImpl::QGstHandleHelper<GstDiscoverer>::UniqueHandle; |
38 | using QGstDiscovererInfoHandle = QGstImpl::QGstHandleHelper<GstDiscovererInfo>::UniqueHandle; |
39 | using QGstDiscovererAudioInfoHandle = |
40 | QGstImpl::QGstHandleHelper<GstDiscovererAudioInfo>::UniqueHandle; |
41 | using QGstDiscovererVideoInfoHandle = |
42 | QGstImpl::QGstHandleHelper<GstDiscovererVideoInfo>::UniqueHandle; |
43 | using QGstDiscovererSubtitleInfoHandle = |
44 | QGstImpl::QGstHandleHelper<GstDiscovererSubtitleInfo>::UniqueHandle; |
45 | using QGstDiscovererStreamInfoHandle = |
46 | QGstImpl::QGstHandleHelper<GstDiscovererStreamInfo>::UniqueHandle; |
47 | |
48 | struct QGstDiscovererStreamInfo |
49 | { |
50 | int streamNumber{}; |
51 | QString streamID; |
52 | QGstTagListHandle tags; |
53 | QGstCaps caps; |
54 | }; |
55 | |
56 | struct 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 | |
68 | struct 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 | |
79 | struct QGstDiscovererSubtitleInfo : QGstDiscovererStreamInfo |
80 | { |
81 | QLocale::Language language{}; |
82 | }; |
83 | |
84 | struct QGstDiscovererContainerInfo : QGstDiscovererStreamInfo |
85 | { |
86 | QGstTagListHandle tags; |
87 | }; |
88 | |
89 | struct 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. |
105 | class QGstDiscoverer |
106 | { |
107 | public: |
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 | |
114 | private: |
115 | QMaybe<QGstDiscovererInfo, QUniqueGErrorHandle> discover(const char *); |
116 | QGstDiscovererHandle m_instance; |
117 | }; |
118 | |
119 | QMediaMetaData toContainerMetadata(const QGstDiscovererInfo &); |
120 | QMediaMetaData toStreamMetadata(const QGstDiscovererVideoInfo &); |
121 | QMediaMetaData toStreamMetadata(const QGstDiscovererAudioInfo &); |
122 | QMediaMetaData toStreamMetadata(const QGstDiscovererSubtitleInfo &); |
123 | |
124 | } // namespace QGst |
125 | |
126 | QT_END_NAMESPACE |
127 | |
128 | #endif // QGST_DISCOVERER_P_H |
129 | |