$OpenBSD: patch-plugins_decoder_ffmpeg_k3bffmpegwrapper_cpp,v 1.3 2012/05/05 07:49:28 ajacoutot Exp $

Update for newer FFmpeg API.

--- plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp.orig	Fri Nov  2 05:55:03 2007
+++ plugins/decoder/ffmpeg/k3bffmpegwrapper.cpp	Thu May  3 16:03:20 2012
@@ -18,8 +18,8 @@
 #include "k3bffmpegwrapper.h"
 
 extern "C" {
-#include <ffmpeg/avcodec.h>
-#include <ffmpeg/avformat.h>
+#include <libavcodec/avcodec.h>
+#include <libavformat/avformat.h>
 }
 
 #include <string.h>
@@ -43,8 +43,9 @@ class K3bFFMpegFile::Private (public)
 
   K3b::Msf length;
 
-  // for decoding
-  char outputBuffer[AVCODEC_MAX_AUDIO_FRAME_SIZE];
+  // for decoding. ffmpeg requires 16-byte alignment.
+  char outputBuffer[AVCODEC_MAX_AUDIO_FRAME_SIZE + 15];
+  char* alignedOutputBuffer;
   char* outputBufferPos;
   int outputBufferSize;
   AVPacket packet;
@@ -59,6 +60,8 @@ K3bFFMpegFile::K3bFFMpegFile( const QString& filename 
   d = new Private;
   d->formatContext = 0;
   d->codec = 0;
+  int offset = 0x10 - (reinterpret_cast<intptr_t>(&d->outputBuffer) & 0xf);
+  d->alignedOutputBuffer = &d->outputBuffer[offset];
 }
 
 
@@ -95,7 +98,14 @@ bool K3bFFMpegFile::open()
 #else
   AVCodecContext* codecContext =  d->formatContext->streams[0]->codec;
 #endif
-  if( codecContext->codec_type != CODEC_TYPE_AUDIO ) {
+
+  if( codecContext->codec_type != 
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 64, 0)
+        AVMEDIA_TYPE_AUDIO)
+#else
+        CODEC_TYPE_AUDIO)
+#endif
+  {
     kdDebug() << "(K3bFFMpegFile) not a simple audio stream: " << m_filename << endl;
     return false;
   }
@@ -194,7 +204,11 @@ QString K3bFFMpegFile::typeComment() const
     return i18n("Windows Media v1");
   case CODEC_ID_WMAV2:
     return i18n("Windows Media v2");
+#if LIBAVCODEC_VERSION_MAJOR < 52
   case CODEC_ID_MP3LAME:
+#else
+  case CODEC_ID_MP3:
+#endif
     return i18n("MPEG 1 Layer III");
   case CODEC_ID_AAC:
     return i18n("Advanced Audio Coding (AAC)");
@@ -207,30 +221,39 @@ QString K3bFFMpegFile::typeComment() const
 QString K3bFFMpegFile::title() const
 {
   // FIXME: is this UTF8 or something??
-  if( d->formatContext->title[0] != '\0' )
-    return QString::fromLocal8Bit( d->formatContext->title );
+  AVDictionaryEntry *ade = av_dict_get( d->formatContext->metadata, "TITLE", NULL, 0 );
+  if( ade == NULL )
+    return QString();
+  if( ade->value != '\0' )
+    return QString::fromLocal8Bit( ade->value );
   else
-    return QString::null;
+    return QString();
 }
 
 
 QString K3bFFMpegFile::author() const
 {
   // FIXME: is this UTF8 or something??
-  if( d->formatContext->author[0] != '\0' )
-    return QString::fromLocal8Bit( d->formatContext->author );
+  AVDictionaryEntry *ade = av_dict_get( d->formatContext->metadata, "ARTIST", NULL, 0 );
+  if( ade == NULL )
+    return QString();
+  if( ade->value != '\0' )
+    return QString::fromLocal8Bit( ade->value );
   else
-    return QString::null;
+    return QString();
 }
 
 
 QString K3bFFMpegFile::comment() const
 {
   // FIXME: is this UTF8 or something??
-  if( d->formatContext->comment[0] != '\0' )
-    return QString::fromLocal8Bit( d->formatContext->comment );
+  AVDictionaryEntry *ade = av_dict_get( d->formatContext->metadata, "COMMENT", NULL, 0 );
+  if( ade == NULL )
+    return QString();
+  if( ade->value != '\0' )
+    return QString::fromLocal8Bit( ade->value );
   else
-    return QString::null;
+    return QString();
 }
 
 
@@ -285,15 +308,31 @@ int K3bFFMpegFile::fillOutputBuffer()
       return 0;
     }
 
-    d->outputBufferPos = d->outputBuffer;
+    d->outputBufferPos = d->alignedOutputBuffer;
+    d->outputBufferSize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
 
+#if LIBAVCODEC_VERSION_MAJOR < 52
+      int len = avcodec_decode_audio(
+#else
+   #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 64, 0)
+      int len = avcodec_decode_audio3(
+   #else
+      int len = avcodec_decode_audio2(
+   #endif
+#endif
+
 #ifdef FFMPEG_BUILD_PRE_4629
-    int len = avcodec_decode_audio( &d->formatContext->streams[0]->codec,
+          &d->formatContext->streams[0]->codec,
 #else
-    int len = avcodec_decode_audio( d->formatContext->streams[0]->codec,
+          d->formatContext->streams[0]->codec,
 #endif
-				    (short*)d->outputBuffer, &d->outputBufferSize,
-				    d->packetData, d->packetSize );
+          (short*)d->alignedOutputBuffer,
+          &d->outputBufferSize,
+#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 64, 0)
+          &d->packet );
+#else
+          d->packetData, d->packetSize );
+#endif
 
     d->packetSize -= len;
     d->packetData += len;
