summaryrefslogtreecommitdiffstats
path: root/source/kde/patch/k3b/k3b-ffmpeg3.patch
blob: 9c5ac4205f793cc749e2bc3e4b7789b5af76c7aa (plain) (blame)
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