Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosformatsinfo.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 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
5
6#include <QtMultimedia/qimagecapture.h>
7
8#include <multimedia/player_framework/native_avcapability.h>
9#include <multimedia/player_framework/native_avcodec_base.h>
10
12
13namespace {
14
15bool codecAvailable(const char *mime, bool encoder)
16{
17 return mime && OH_AVCodec_GetCapability(mime, encoder) != nullptr;
18}
19
20QMediaFormat::AudioCodec audioCodecIfAvailable(QMediaFormat::AudioCodec codec, bool encoder)
21{
22 const char *mime = nullptr;
23 switch (codec) {
24 case QMediaFormat::AudioCodec::AAC: mime = OH_AVCODEC_MIMETYPE_AUDIO_AAC; break;
25 case QMediaFormat::AudioCodec::MP3: mime = OH_AVCODEC_MIMETYPE_AUDIO_MPEG; break;
26 case QMediaFormat::AudioCodec::FLAC: mime = OH_AVCODEC_MIMETYPE_AUDIO_FLAC; break;
27 case QMediaFormat::AudioCodec::Vorbis: mime = OH_AVCODEC_MIMETYPE_AUDIO_VORBIS; break;
28 case QMediaFormat::AudioCodec::Opus: mime = OH_AVCODEC_MIMETYPE_AUDIO_OPUS; break;
29 case QMediaFormat::AudioCodec::Wave:
30 // WAVE / PCM is always supported by the muxer/demuxer; no codec query needed.
31 return codec;
32 default:
33 break;
34 }
35 return codecAvailable(mime, encoder) ? codec : QMediaFormat::AudioCodec::Unspecified;
36}
37
38QMediaFormat::VideoCodec videoCodecIfAvailable(QMediaFormat::VideoCodec codec, bool encoder)
39{
40 const char *mime = nullptr;
41 switch (codec) {
42 case QMediaFormat::VideoCodec::H264: mime = OH_AVCODEC_MIMETYPE_VIDEO_AVC; break;
43 case QMediaFormat::VideoCodec::H265: mime = OH_AVCODEC_MIMETYPE_VIDEO_HEVC; break;
44 case QMediaFormat::VideoCodec::MPEG4: mime = OH_AVCODEC_MIMETYPE_VIDEO_MPEG4; break;
45 default:
46 break;
47 }
48 return codecAvailable(mime, encoder) ? codec : QMediaFormat::VideoCodec::Unspecified;
49}
50
51void pruneUnspecified(QList<QPlatformMediaFormatInfo::CodecMap> &maps)
52{
53 for (auto &m : maps) {
54 m.audio.removeAll(QMediaFormat::AudioCodec::Unspecified);
55 m.video.removeAll(QMediaFormat::VideoCodec::Unspecified);
56 }
57 erase_if(maps, [](const QPlatformMediaFormatInfo::CodecMap &m) {
58 return m.audio.isEmpty() && m.video.isEmpty();
59 });
60}
61
62} // namespace
63
64QOhosFormatsInfo::QOhosFormatsInfo()
65{
66 // Decoders — what we can play back via OH_AVPlayer.
67 {
68 const auto aac = audioCodecIfAvailable(QMediaFormat::AudioCodec::AAC, false);
69 const auto mp3 = audioCodecIfAvailable(QMediaFormat::AudioCodec::MP3, false);
70 const auto flac = audioCodecIfAvailable(QMediaFormat::AudioCodec::FLAC, false);
71 const auto vorbis = audioCodecIfAvailable(QMediaFormat::AudioCodec::Vorbis, false);
72 const auto opus = audioCodecIfAvailable(QMediaFormat::AudioCodec::Opus, false);
73 const auto wav = audioCodecIfAvailable(QMediaFormat::AudioCodec::Wave, false);
74
75 const auto h264 = videoCodecIfAvailable(QMediaFormat::VideoCodec::H264, false);
76 const auto h265 = videoCodecIfAvailable(QMediaFormat::VideoCodec::H265, false);
77 const auto mpeg4 = videoCodecIfAvailable(QMediaFormat::VideoCodec::MPEG4, false);
78
79 decoders = {
80 { QMediaFormat::AAC, { aac }, {} },
81 { QMediaFormat::MP3, { mp3 }, {} },
82 { QMediaFormat::FLAC, { flac }, {} },
83 { QMediaFormat::Wave, { wav }, {} },
84 { QMediaFormat::Mpeg4Audio, { mp3, aac, flac, vorbis }, {} },
85 { QMediaFormat::MPEG4, { mp3, aac, flac, vorbis }, { h264, h265, mpeg4 } },
86 { QMediaFormat::Ogg, { opus, vorbis, flac }, {} },
87 };
88 pruneUnspecified(decoders);
89 }
90
91 // Encoders — what OH_AVRecorder will accept.
92 {
93 const auto aac = audioCodecIfAvailable(QMediaFormat::AudioCodec::AAC, true);
94 const auto mp3 = audioCodecIfAvailable(QMediaFormat::AudioCodec::MP3, true);
95 const auto wav = audioCodecIfAvailable(QMediaFormat::AudioCodec::Wave, true);
96
97 const auto h264 = videoCodecIfAvailable(QMediaFormat::VideoCodec::H264, true);
98 const auto h265 = videoCodecIfAvailable(QMediaFormat::VideoCodec::H265, true);
99 const auto mpeg4 = videoCodecIfAvailable(QMediaFormat::VideoCodec::MPEG4, true);
100
101 encoders = {
102 { QMediaFormat::AAC, { aac }, {} },
103 { QMediaFormat::MP3, { mp3 }, {} },
104 { QMediaFormat::Wave, { wav }, {} },
105 { QMediaFormat::Mpeg4Audio, { aac }, {} },
106 { QMediaFormat::MPEG4, { aac, mp3 }, { h264, h265, mpeg4 } },
107 };
108 pruneUnspecified(encoders);
109 }
110
111 imageFormats << QImageCapture::JPEG;
112}
113
114QOhosFormatsInfo::~QOhosFormatsInfo() = default;
115
116QT_END_NAMESPACE
Combined button and popup list for selecting options.
QMediaFormat::VideoCodec videoCodecIfAvailable(QMediaFormat::VideoCodec codec, bool encoder)
QMediaFormat::AudioCodec audioCodecIfAvailable(QMediaFormat::AudioCodec codec, bool encoder)
void pruneUnspecified(QList< QPlatformMediaFormatInfo::CodecMap > &maps)
bool codecAvailable(const char *mime, bool encoder)