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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
From 52d3d64863d2fab4128f524870851f18f5cae1fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Old=C5=99ich=20Jedli=C4=8Dka?= <oldium.pro@seznam.cz>
Date: Sat, 14 Feb 2015 15:31:07 +0100
Subject: [PATCH] Fixed compilation with newer ffmpeg/libav.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Oldřich Jedlička <oldium.pro@seznam.cz>
---
plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp | 60 ++++++++++++++++++++++++-----
1 file changed, 50 insertions(+), 10 deletions(-)
diff --git a/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp b/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
index 5451fd3..2f80fd6 100644
--- a/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
+++ b/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
@@ -86,8 +86,12 @@ public:
K3b::Msf length;
// for decoding. ffmpeg requires 16-byte alignment.
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+ ::AVFrame* frame;
+#else
char outputBuffer[AVCODEC_MAX_AUDIO_FRAME_SIZE + 15];
char* alignedOutputBuffer;
+#endif
char* outputBufferPos;
int outputBufferSize;
::AVPacket packet;
@@ -102,14 +106,29 @@ K3bFFMpegFile::K3bFFMpegFile( const QString& filename )
d = new Private;
d->formatContext = 0;
d->codec = 0;
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+# if LIBAVCODEC_BUILD < AV_VERSION_INT(55,28,1)
+ d->frame = avcodec_alloc_frame();
+# else
+ d->frame = av_frame_alloc();
+# endif
+#else
int offset = 0x10 - (reinterpret_cast<intptr_t>(&d->outputBuffer) & 0xf);
d->alignedOutputBuffer = &d->outputBuffer[offset];
+#endif
}
K3bFFMpegFile::~K3bFFMpegFile()
{
close();
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+# if LIBAVCODEC_BUILD < AV_VERSION_INT(55,28,1)
+ av_free(d->frame);
+# else
+ av_frame_free(&d->frame);
+# endif
+#endif
delete d;
}
@@ -326,26 +345,36 @@ int K3bFFMpegFile::fillOutputBuffer()
return 0;
}
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+ int gotFrame = 0;
+ int len = ::avcodec_decode_audio4(
+#else
d->outputBufferPos = d->alignedOutputBuffer;
d->outputBufferSize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
-
-#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO3
+# ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO3
int len = ::avcodec_decode_audio3(
-#else
-# ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO2
- int len = ::avcodec_decode_audio2(
# else
+# ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO2
+ int len = ::avcodec_decode_audio2(
+# else
int len = ::avcodec_decode_audio(
+# endif
# endif
#endif
FFMPEG_CODEC(d->formatContext->streams[0]),
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+ d->frame,
+ &gotFrame,
+ &d->packet );
+#else
(short*)d->alignedOutputBuffer,
&d->outputBufferSize,
-#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO3
+# ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO3
&d->packet );
-#else
+# else
d->packetData, d->packetSize );
+# endif
#endif
if( d->packetSize <= 0 || len < 0 )
@@ -355,6 +384,17 @@ int K3bFFMpegFile::fillOutputBuffer()
return -1;
}
+#ifdef HAVE_FFMPEG_AVCODEC_DECODE_AUDIO4
+ if ( gotFrame ) {
+ d->outputBufferSize = ::av_samples_get_buffer_size(
+ NULL,
+ FFMPEG_CODEC(d->formatContext->streams[0])->channels,
+ d->frame->nb_samples,
+ FFMPEG_CODEC(d->formatContext->streams[0])->sample_fmt,
+ 1 );
+ d->outputBufferPos = reinterpret_cast<char*>( d->frame->data[0] );
+ }
+#endif
d->packetSize -= len;
d->packetData += len;
}
@@ -420,9 +460,9 @@ K3bFFMpegFile* K3bFFMpegWrapper::open( const QString& filename ) const
// mp3 being one of them sadly. Most importantly: allow the libsndfile decoder to do
// its thing.
//
- if( file->type() == CODEC_ID_WMAV1 ||
- file->type() == CODEC_ID_WMAV2 ||
- file->type() == CODEC_ID_AAC )
+ if( file->type() == AV_CODEC_ID_WMAV1 ||
+ file->type() == AV_CODEC_ID_WMAV2 ||
+ file->type() == AV_CODEC_ID_AAC )
#endif
return file;
}
--
2.0.5
|