Skip to content

Commit 862207b

Browse files
committed
Use avcodec_get_supported_config() if possible
Supress warnings.
1 parent b388f05 commit 862207b

File tree

4 files changed

+124
-23
lines changed

4 files changed

+124
-23
lines changed

src/codec.cpp

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,43 @@ AVMediaType Codec::type() const
6464

6565
std::deque<Rational> Codec::supportedFramerates() const
6666
{
67-
deque<Rational> frameRates;
6867
if (!m_raw)
69-
return frameRates;
70-
array_to_container(m_raw->supported_framerates, frameRates, [](const Rational& rate) {
68+
return {};
69+
deque<Rational> frameRates;
70+
const AVRational *frameRatesRaw = nullptr;
71+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
72+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_FRAME_RATE, 0, reinterpret_cast<const void**>(&frameRatesRaw), nullptr);
73+
#else
74+
frameRatesRaw = m_raw->supported_framerates;
75+
#endif
76+
77+
if (!frameRatesRaw)
78+
return {};
79+
80+
array_to_container(frameRatesRaw, frameRates, [](const Rational& rate) {
7181
return rate == Rational();
7282
});
7383
return frameRates;
7484
}
7585

7686
std::deque<PixelFormat> Codec::supportedPixelFormats() const
7787
{
78-
deque<PixelFormat> pixFmts;
7988
if (!m_raw)
80-
return pixFmts;
89+
return {};
90+
91+
deque<PixelFormat> pixFmts;
92+
const enum AVPixelFormat *pixFmtsRaw = nullptr;
8193

82-
array_to_container(m_raw->pix_fmts, pixFmts, [](PixelFormat pixFmt) {
94+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
95+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_PIX_FORMAT, 0, reinterpret_cast<const void**>(&pixFmtsRaw), nullptr);
96+
#else
97+
pixFmtsRaw = m_raw->pix_fmts;
98+
#endif
99+
100+
if (!pixFmtsRaw)
101+
return {};
102+
103+
array_to_container(pixFmtsRaw, pixFmts, [](PixelFormat pixFmt) {
83104
return pixFmt == AV_PIX_FMT_NONE;
84105
});
85106

@@ -88,11 +109,22 @@ std::deque<PixelFormat> Codec::supportedPixelFormats() const
88109

89110
std::deque<int> Codec::supportedSamplerates() const
90111
{
91-
deque<int> sampleRates;
92112
if (!m_raw)
93-
return sampleRates;
113+
return {};
114+
115+
deque<int> sampleRates;
116+
const int *sampleRatesRaw = nullptr;
94117

95-
array_to_container(m_raw->supported_samplerates, sampleRates, [](int sampleRate) {
118+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
119+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_SAMPLE_RATE, 0, reinterpret_cast<const void**>(&sampleRatesRaw), nullptr);
120+
#else
121+
sampleRatesRaw = m_raw->supported_samplerates;
122+
#endif
123+
124+
if (!sampleRatesRaw)
125+
return {};
126+
127+
array_to_container(sampleRatesRaw, sampleRates, [](int sampleRate) {
96128
return sampleRate == 0;
97129
});
98130

@@ -101,11 +133,22 @@ std::deque<int> Codec::supportedSamplerates() const
101133

102134
std::deque<SampleFormat> Codec::supportedSampleFormats() const
103135
{
104-
deque<SampleFormat> sampleFmts;
105136
if (!m_raw)
106-
return sampleFmts;
137+
return {};
107138

108-
array_to_container(m_raw->sample_fmts, sampleFmts, [](SampleFormat sampleFmt) {
139+
deque<SampleFormat> sampleFmts;
140+
const enum AVSampleFormat *sampleFmtsRaw = nullptr;
141+
142+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
143+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, reinterpret_cast<const void**>(&sampleFmtsRaw), nullptr);
144+
#else
145+
sampleFmtsRaw = m_raw->sample_fmts;
146+
#endif
147+
148+
if (!sampleFmtsRaw)
149+
return {};
150+
151+
array_to_container(sampleFmtsRaw, sampleFmts, [](SampleFormat sampleFmt) {
109152
return sampleFmt == AV_SAMPLE_FMT_NONE;
110153
});
111154

@@ -114,12 +157,24 @@ std::deque<SampleFormat> Codec::supportedSampleFormats() const
114157

115158
std::deque<uint64_t> Codec::supportedChannelLayouts() const
116159
{
117-
deque<uint64_t> channelLayouts;
118160
if (!m_raw)
119-
return channelLayouts;
161+
return {};
162+
163+
deque<uint64_t> channelLayouts;
120164

121165
#if API_NEW_CHANNEL_LAYOUT
122-
array_to_container(m_raw->ch_layouts, channelLayouts, [](auto& layout) {
166+
const AVChannelLayout *channelLayoutsRaw = nullptr;
167+
168+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
169+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0, reinterpret_cast<const void**>(&channelLayoutsRaw), nullptr);
170+
#else
171+
channelLayoutsRaw = m_raw->ch_layouts;
172+
#endif
173+
174+
if (!channelLayoutsRaw)
175+
return {};
176+
177+
array_to_container(channelLayoutsRaw, channelLayouts, [](auto& layout) {
123178
static const AVChannelLayout zeroed{};
124179
return !memcmp(&layout, &zeroed, sizeof(zeroed));
125180
}, [](auto &layout) {
@@ -137,11 +192,19 @@ std::deque<uint64_t> Codec::supportedChannelLayouts() const
137192
#if API_NEW_CHANNEL_LAYOUT
138193
std::deque<ChannelLayoutView> Codec::supportedChannelLayouts2() const
139194
{
140-
deque<ChannelLayoutView> channelLayouts;
141195
if (!m_raw)
142-
return channelLayouts;
196+
return {};
197+
198+
deque<ChannelLayoutView> channelLayouts;
199+
const AVChannelLayout *channelLayoutsRaw = nullptr;
200+
201+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
202+
avcodec_get_supported_config(nullptr, m_raw, AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0, reinterpret_cast<const void**>(&channelLayoutsRaw), nullptr);
203+
#else
204+
channelLayoutsRaw = m_raw->ch_layouts;
205+
#endif
143206

144-
array_to_container(m_raw->ch_layouts, channelLayouts, [](const auto& layout) {
207+
array_to_container(channelLayoutsRaw, channelLayouts, [](const auto& layout) {
145208
return layout.nb_channels == 0;
146209
});
147210

src/codeccontext.cpp

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,23 @@ int avcodec_encode_audio_legacy(AVCodecContext *avctx, AVPacket *avpkt,
168168

169169
namespace av {
170170

171+
namespace codec_context::internal {
172+
const int *get_supported_samplerates(const struct AVCodec *codec)
173+
{
174+
const int *sampleRates = nullptr;
175+
176+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
177+
avcodec_get_supported_config(nullptr, codec,
178+
AV_CODEC_CONFIG_SAMPLE_RATE, 0,
179+
reinterpret_cast<const void**>(&sampleRates), nullptr);
180+
#else
181+
sampleRates = codec->supported_samplerates;
182+
#endif
183+
184+
return sampleRates;
185+
}
186+
187+
} // codec_context::internal
171188

172189
VideoDecoderContext::VideoDecoderContext(VideoDecoderContext &&other)
173190
: Parent(std::move(other))
@@ -383,10 +400,24 @@ void CodecContext2::setCodec(const Codec &codec, bool resetDefaults, Direction d
383400
m_raw->codec = codec.raw();
384401

385402
if (!codec.isNull()) {
386-
if (codec.raw()->pix_fmts != 0)
387-
m_raw->pix_fmt = *(codec.raw()->pix_fmts); // assign default value
388-
if (codec.raw()->sample_fmts != 0)
389-
m_raw->sample_fmt = *(codec.raw()->sample_fmts);
403+
const enum AVPixelFormat *pixFmts = nullptr;
404+
const enum AVSampleFormat *sampleFmts = nullptr;
405+
406+
#if USE_AVCODEC_GET_SUPPORTED_CONFIG
407+
avcodec_get_supported_config(nullptr, codec.raw(),
408+
AV_CODEC_CONFIG_PIX_FORMAT, 0,
409+
reinterpret_cast<const void**>(&pixFmts), nullptr);
410+
avcodec_get_supported_config(nullptr, codec.raw(),
411+
AV_CODEC_CONFIG_SAMPLE_FORMAT, 0,
412+
reinterpret_cast<const void**>(&sampleFmts), nullptr);
413+
#else
414+
pixFmts = codec.raw()->pix_fmts;
415+
sampleFmts = codec.raw()->sample_fmts;
416+
#endif
417+
if (pixFmts)
418+
m_raw->pix_fmt = *(pixFmts); // assign default value
419+
if (sampleFmts)
420+
m_raw->sample_fmt = *(sampleFmts);
390421
}
391422
}
392423

src/codeccontext.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ int get_channels(const AVCodecContext *obj);
2525
uint64_t get_channel_layout_mask(const AVCodecContext *obj);
2626
}
2727

28+
namespace codec_context::internal {
29+
const int *get_supported_samplerates(const struct AVCodec *codec);
30+
}
31+
2832
class CodecContext2 : public FFWrapperPtr<AVCodecContext>, public noncopyable
2933
{
3034
protected:
@@ -524,7 +528,7 @@ class AudioCodecContext : public CodecContextBase<Clazz, _direction, AVMEDIA_TYP
524528
{
525529
if (!isValid())
526530
return;
527-
int sr = guessValue(sampleRate, m_raw->codec->supported_samplerates, EqualComparator<int>(0));
531+
int sr = guessValue(sampleRate, codec_context::internal::get_supported_samplerates(m_raw->codec), EqualComparator<int>(0));
528532
if (sr != sampleRate)
529533
{
530534
fflog(AV_LOG_INFO, "Guess sample rate %d instead unsupported %d\n", sr, sampleRate);

src/ffmpeg.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ extern "C"
1313
#include <libswscale/swscale.h>
1414
#include <libswresample/swresample.h>
1515
#include <libavformat/version.h>
16+
#include <libavcodec/version.h>
1617
}
1718

1819
extern "C" {
@@ -64,6 +65,8 @@ inline AVMediaType avfilter_pad_get_type(AVFilterPad *pads, int pad_idx)
6465
#define NO_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR >= 60)
6566
#define DEPRECATED_INIT_PACKET (LIBAVCODEC_VERSION_MAJOR >= 58)
6667

68+
#define USE_AVCODEC_GET_SUPPORTED_CONFIG (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100))
69+
6770
template<typename T>
6871
struct FFWrapperPtr
6972
{

0 commit comments

Comments
 (0)