You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/media-sound/cmus/files/cmus-2.8.0-ffmpeg-deprecati...

125 lines
3.8 KiB

From 9877eb02381fd4c57059f9c77be03127c28d8f88 Mon Sep 17 00:00:00 2001
From: Niko E <nefthy@users.noreply.github.com>
Date: Mon, 11 Feb 2019 09:09:21 +0100
Subject: [PATCH] Fixes ffmpeg deprecations (#861)
- av_register_all is no longer needed since 4.0
- AVStream::codec is deprecated since 3.1
- avcodec_decode_audio4 is deprecated since 3.1
---
ip/ffmpeg.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/ip/ffmpeg.c b/ip/ffmpeg.c
index eaad5c4f..418a37f8 100644
--- a/ip/ffmpeg.c
+++ b/ip/ffmpeg.c
@@ -128,9 +128,11 @@ static void ffmpeg_init(void)
av_log_set_level(AV_LOG_QUIET);
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 18, 100)
/* We could register decoders explicitly to save memory, but we have to
* be careful about compatibility. */
av_register_all();
+#endif
}
static int ffmpeg_open(struct input_plugin_data *ip_data)
@@ -143,6 +145,9 @@ static int ffmpeg_open(struct input_plugin_data *ip_data)
AVCodec *codec;
AVCodecContext *cc = NULL;
AVFormatContext *ic = NULL;
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ AVCodecParameters *cp = NULL;
+#endif
SwrContext *swr = NULL;
ffmpeg_init();
@@ -162,11 +167,20 @@ static int ffmpeg_open(struct input_plugin_data *ip_data)
}
for (i = 0; i < ic->nb_streams; i++) {
+
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ cp = ic->streams[i]->codecpar;
+ if (cp->codec_type == AVMEDIA_TYPE_AUDIO) {
+ stream_index = i;
+ break;
+ }
+#else
cc = ic->streams[i]->codec;
if (cc->codec_type == AVMEDIA_TYPE_AUDIO) {
stream_index = i;
break;
}
+#endif
}
if (stream_index == -1) {
@@ -175,7 +189,13 @@ static int ffmpeg_open(struct input_plugin_data *ip_data)
break;
}
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ codec = avcodec_find_decoder(cp->codec_id);
+ cc = avcodec_alloc_context3(codec);
+ avcodec_parameters_to_context(cc, cp);
+#else
codec = avcodec_find_decoder(cc->codec_id);
+#endif
if (!codec) {
d_print("codec not found: %d, %s\n", cc->codec_id, avcodec_get_name(cc->codec_id));
err = -IP_ERROR_UNSUPPORTED_FILE_TYPE;
@@ -196,6 +216,9 @@ static int ffmpeg_open(struct input_plugin_data *ip_data)
if (err < 0) {
/* Clean up. cc is never opened at this point. (See above assumption.) */
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ avcodec_free_context(&cc);
+#endif
avformat_close_input(&ic);
return err;
}
@@ -207,6 +230,9 @@ static int ffmpeg_open(struct input_plugin_data *ip_data)
priv->input = ffmpeg_input_create();
if (priv->input == NULL) {
avcodec_close(cc);
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ avcodec_free_context(&cc);
+#endif
avformat_close_input(&ic);
free(priv);
return -IP_ERROR_INTERNAL;
@@ -252,6 +278,9 @@ static int ffmpeg_close(struct input_plugin_data *ip_data)
struct ffmpeg_private *priv = ip_data->private;
avcodec_close(priv->codec_context);
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ avcodec_free_context(&priv->codec_context);
+#endif
avformat_close_input(&priv->input_context);
swr_free(&priv->swr);
ffmpeg_input_free(priv->input);
@@ -305,7 +334,20 @@ static int ffmpeg_fill_buffer(AVFormatContext *ic, AVCodecContext *cc, struct ff
AVPacket avpkt;
av_new_packet(&avpkt, input->curr_pkt_size);
memcpy(avpkt.data, input->curr_pkt_buf, input->curr_pkt_size);
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 48, 101)
+ if (avcodec_send_packet(cc, &avpkt) == 0) {
+ got_frame = !avcodec_receive_frame(cc, frame);
+ if (got_frame)
+ len = input->curr_pkt_size;
+ else
+ len = 0;
+ } else {
+ got_frame = 0;
+ len = 0;
+ }
+#else
len = avcodec_decode_audio4(cc, frame, &got_frame, &avpkt);
+#endif
#if LIBAVCODEC_VERSION_MAJOR >= 56
av_packet_unref(&avpkt);
#else