From 9877eb02381fd4c57059f9c77be03127c28d8f88 Mon Sep 17 00:00:00 2001 From: Niko E 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