1
Description: Port to libav 0.7 API
2
Author: Colin Watson <cjwatson@ubuntu.com>
4
Last-Update: 2011-08-21
6
Index: b/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
7
===================================================================
8
--- a/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
9
+++ b/plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp
11
char* outputBufferPos;
17
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT( 52, 31, 0 )
18
+ QString getMetadataEntry( const char* ) const;
25
int offset = 0x10 - (reinterpret_cast<intptr_t>(&d->outputBuffer) & 0xf);
26
d->alignedOutputBuffer = &d->outputBuffer[offset];
36
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT( 53, 2, 0 )
37
int err = ::av_open_input_file( &d->formatContext, m_filename.toLocal8Bit(), 0, 0, 0 );
39
+ int err = ::avformat_open_input( &d->formatContext, m_filename.toLocal8Bit(), 0, 0 );
42
kDebug() << "(K3bFFMpegFile) unable to open " << m_filename << " with error " << err;
46
::AVCodecContext* codecContext = d->formatContext->streams[0]->codec;
48
- if( codecContext->codec_type != CODEC_TYPE_AUDIO ) {
49
+#if LIBAVCODEC_VERSION_MAJOR < 53
50
+ if( codecContext->codec_type != CODEC_TYPE_AUDIO )
52
+ if( codecContext->codec_type != AVMEDIA_TYPE_AUDIO )
55
kDebug() << "(K3bFFMpegFile) not a simple audio stream: " << m_filename;
61
// dump some debugging info
62
+#if LIBAVFORMAT_VERSION_MAJOR < 53
63
::dump_format( d->formatContext, 0, m_filename.toLocal8Bit(), 0 );
65
+ ::av_dump_format( d->formatContext, 0, m_filename.toLocal8Bit(), 0 );
71
void K3bFFMpegFile::close()
73
d->outputBufferSize = 0;
76
+ ::av_free_packet( &d->packet );
79
#ifdef FFMPEG_BUILD_PRE_4629
84
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT( 52, 31, 0 )
85
+QString K3bFFMpegFile::Private::getMetadataEntry( const char* key ) const
87
+#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT( 51, 5, 0 )
88
+ const ::AVMetadataTag* entry =
89
+ ::av_metadata_get( formatContext->metadata, key, 0, 0 );
91
+ const ::AVDictionaryEntry* entry =
92
+ ::av_dict_get( formatContext->metadata, key, 0, 0 );
94
+ if( entry->value[0] != '\0' )
95
+ return QString::fromLocal8Bit( entry->value );
101
QString K3bFFMpegFile::title() const
103
// FIXME: is this UTF8 or something??
104
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT( 52, 31, 0 )
105
if( d->formatContext->title[0] != '\0' )
106
return QString::fromLocal8Bit( d->formatContext->title );
110
+ return d->getMetadataEntry( "title" );
115
QString K3bFFMpegFile::author() const
117
// FIXME: is this UTF8 or something??
118
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT( 52, 31, 0 )
119
if( d->formatContext->author[0] != '\0' )
120
return QString::fromLocal8Bit( d->formatContext->author );
123
+#elif LIBAVFORMAT_VERSION_INT < AV_VERSION_INT( 52, 50, 0 )
124
+ return d->getMetadataEntry( "author" );
126
+ return d->getMetadataEntry( "artist" );
131
QString K3bFFMpegFile::comment() const
133
// FIXME: is this UTF8 or something??
134
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT( 52, 31, 0 )
135
if( d->formatContext->comment[0] != '\0' )
136
return QString::fromLocal8Bit( d->formatContext->comment );
140
+ return d->getMetadataEntry( "comment" );
145
@@ -275,24 +322,22 @@
149
-// fill d->packetData with data to decode
150
+// fill d->packet.data with data to decode
151
int K3bFFMpegFile::readPacket()
153
- if( d->packetSize <= 0 ) {
154
+ if( d->packet.size <= 0 ) {
155
::av_init_packet( &d->packet );
157
if( ::av_read_frame( d->formatContext, &d->packet ) < 0 ) {
160
- d->packetSize = d->packet.size;
161
- d->packetData = d->packet.data;
164
- return d->packetSize;
165
+ return d->packet.size;
169
-// decode data in d->packetData and fill d->outputBuffer
170
+// decode data in d->packet.data and fill d->outputBuffer
171
int K3bFFMpegFile::fillOutputBuffer()
173
// decode if the output buffer is empty
176
#if LIBAVCODEC_VERSION_MAJOR < 52
177
int len = ::avcodec_decode_audio(
179
+#elif LIBAVCODEC_VERSION_MAJOR < 53
180
int len = ::avcodec_decode_audio2(
182
+ int len = ::avcodec_decode_audio3(
184
#ifdef FFMPEG_BUILD_PRE_4629
185
&d->formatContext->streams[0]->codec,
186
@@ -318,17 +365,22 @@
188
(short*)d->alignedOutputBuffer,
189
&d->outputBufferSize,
190
- d->packetData, d->packetSize );
191
+#if LIBAVCODEC_VERSION_MAJOR < 53
192
+ d->packet.data, d->packet.size
198
- if( d->packetSize <= 0 || len < 0 )
199
+ if( d->packet.size <= 0 || len < 0 )
200
::av_free_packet( &d->packet );
202
kDebug() << "(K3bFFMpegFile) decoding failed for " << m_filename;
206
- d->packetSize -= len;
207
- d->packetData += len;
208
+ d->packet.size -= len;
209
+ d->packet.data += len;
212
// if it is still empty try again
214
bool K3bFFMpegFile::seek( const K3b::Msf& msf )
216
d->outputBufferSize = 0;
218
+ d->packet.size = 0;
220
double seconds = (double)msf.totalFrames()/75.0;
221
quint64 timestamp = (quint64)(seconds * (double)AV_TIME_BASE);