75 lines
2.6 KiB
Diff
75 lines
2.6 KiB
Diff
From 6d938d70b1d52634f8b0d88cb29da87f8d5b35a2 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Bernhard=20Rosenkr=C3=A4nzer?= <bero@lindev.ch>
|
|
Date: Mon, 17 Jan 2022 04:41:33 +0100
|
|
Subject: [PATCH] Port to ffmpeg 5.0
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Replace removed functionality like accessing the codec context
|
|
from an AVStream and avcodec_decode_audio4()
|
|
|
|
Signed-off-by: Bernhard Rosenkränzer <bero@lindev.ch>
|
|
---
|
|
src/audio/ffmpeg_audio_reader.h | 24 ++++++++++++++++++++++--
|
|
1 file changed, 22 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/audio/ffmpeg_audio_reader.h b/src/audio/ffmpeg_audio_reader.h
|
|
index 5550164..a3b8de7 100644
|
|
--- a/src/audio/ffmpeg_audio_reader.h
|
|
+++ b/src/audio/ffmpeg_audio_reader.h
|
|
@@ -74,7 +74,7 @@ class FFmpegAudioReader {
|
|
uint8_t *m_convert_buffer[1] = { nullptr };
|
|
int m_convert_buffer_nb_samples = 0;
|
|
|
|
- AVInputFormat *m_input_fmt = nullptr;
|
|
+ const AVInputFormat *m_input_fmt = nullptr;
|
|
AVDictionary *m_input_opts = nullptr;
|
|
|
|
AVFormatContext *m_format_ctx = nullptr;
|
|
@@ -153,7 +153,7 @@ inline bool FFmpegAudioReader::Open(const std::string &file_name) {
|
|
return false;
|
|
}
|
|
|
|
- AVCodec *codec;
|
|
+ const AVCodec *codec;
|
|
ret = av_find_best_stream(m_format_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
|
|
if (ret < 0) {
|
|
SetError("Could not find any audio stream in the file", ret);
|
|
@@ -161,7 +161,13 @@ inline bool FFmpegAudioReader::Open(const std::string &file_name) {
|
|
}
|
|
m_stream_index = ret;
|
|
|
|
+#if LIBAVCODEC_VERSION_MAJOR >= 59
|
|
+ const AVCodec *streamcodec = avcodec_find_decoder(m_format_ctx->streams[m_stream_index]->codecpar->codec_id);
|
|
+ m_codec_ctx = avcodec_alloc_context3(streamcodec);
|
|
+ avcodec_parameters_to_context(m_codec_ctx, m_format_ctx->streams[m_stream_index]->codecpar);
|
|
+#else
|
|
m_codec_ctx = m_format_ctx->streams[m_stream_index]->codec;
|
|
+#endif
|
|
m_codec_ctx->request_sample_fmt = AV_SAMPLE_FMT_S16;
|
|
|
|
ret = avcodec_open2(m_codec_ctx, codec, nullptr);
|
|
@@ -278,7 +284,21 @@ inline bool FFmpegAudioReader::Read(const int16_t **data, size_t *size) {
|
|
}
|
|
}
|
|
|
|
+#if LIBAVCODEC_VERSION_MAJOR < 59
|
|
ret = avcodec_decode_audio4(m_codec_ctx, m_frame, &m_got_frame, &m_packet);
|
|
+#else
|
|
+ ret = avcodec_receive_frame(m_codec_ctx, m_frame);
|
|
+ if (ret == 0)
|
|
+ m_got_frame = true;
|
|
+ if(ret == AVERROR(EAGAIN))
|
|
+ ret = 0;
|
|
+ if (ret == 0)
|
|
+ ret = avcodec_send_packet(m_codec_ctx, &m_packet);
|
|
+ if (ret == AVERROR(EAGAIN))
|
|
+ ret = 0;
|
|
+ if (ret >= 0)
|
|
+ ret = m_packet.size;
|
|
+#endif
|
|
if (ret < 0) {
|
|
if (m_decode_error) {
|
|
SetError("Error decoding audio frame", m_decode_error);
|