summaryrefslogtreecommitdiff
path: root/media-sound/cmus/files/cmus-2.8.0-ffmpeg-deprecations.patch
blob: 941f47e3d499aa11ef2ea30b4240a89f6d5ebed8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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