Sophie

Sophie

distrib > Mageia > 3 > x86_64 > media > core-release-src > by-pkgid > 0ac8624a435ad2cc722f53413ceabecd > files > 3

gstreamer0.10-ffmpeg-0.10.13-11.mga3.src.rpm

diff -up gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegcodecmap.c.planar-audio gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegcodecmap.c
--- gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegcodecmap.c.planar-audio	2013-02-11 22:28:42.510045677 +0100
+++ gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegcodecmap.c	2013-02-11 22:28:42.607044642 +0100
@@ -1872,21 +1872,25 @@ gst_ffmpeg_smpfmt_to_caps (enum AVSample
 
   switch (sample_fmt) {
     case AV_SAMPLE_FMT_S16:
+    case AV_SAMPLE_FMT_S16P:
       signedness = TRUE;
       bpp = 16;
       break;
 
     case AV_SAMPLE_FMT_S32:
+    case AV_SAMPLE_FMT_S32P:
       signedness = TRUE;
       bpp = 32;
       break;
 
     case AV_SAMPLE_FMT_FLT:
+    case AV_SAMPLE_FMT_FLTP:
       integer = FALSE;
       bpp = 32;
       break;
 
     case AV_SAMPLE_FMT_DBL:
+    case AV_SAMPLE_FMT_DBLP:
       integer = FALSE;
       bpp = 64;
       break;
diff -up gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegdec.c.planar-audio gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegdec.c
--- gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegdec.c.planar-audio	2013-02-11 22:28:42.518045593 +0100
+++ gst-ffmpeg-0.10.13/ext/ffmpeg/gstffmpegdec.c	2013-02-12 01:37:27.009104390 +0100
@@ -2128,6 +2128,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
   GstClockTime out_timestamp, out_duration;
   gint64 out_offset;
   AVPacket packet;
+  uint8_t * av_out_buf;
 
   GST_DEBUG_OBJECT (ffmpegdec,
       "size:%d, offset:%" G_GINT64_FORMAT ", ts:%" GST_TIME_FORMAT ", dur:%"
@@ -2139,9 +2140,19 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
       new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE,
       GST_PAD_CAPS (ffmpegdec->srcpad));
 
+  if ( (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_S16P)
+    || (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_S32P)
+    || (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_FLTP)
+    || (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_DBLP) )
+  {
+  	av_out_buf = av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE); // broken ):
+  }
+  else
+    av_out_buf = (uint8_t *)GST_BUFFER_DATA (*outbuf);
+
   gst_avpacket_init (&packet, data, size);
   len = avcodec_decode_audio3 (ffmpegdec->context,
-      (int16_t *) GST_BUFFER_DATA (*outbuf), &have_data, &packet);
+      (int16_t *) av_out_buf, &have_data, &packet);
   GST_DEBUG_OBJECT (ffmpegdec,
       "Decode audio: len=%d, have_data=%d", len, have_data);
 
@@ -2153,6 +2164,39 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
       len = -1;
       goto beach;
     }
+#define PLANAR2SCALAR(SAMPLETYPE) \
+      int num_samples = have_data/(sizeof(SAMPLETYPE)*ffmpegdec->context->channels); \
+      SAMPLETYPE const *in[16]; /* 16 channels is enough for everyone ): */ \
+      SAMPLETYPE * out = (SAMPLETYPE *)GST_BUFFER_DATA (*outbuf); \
+      int i; \
+      int j; \
+      \
+      for (i = 0; i < ffmpegdec->context->channels; ++i) \
+        in[i] = ((SAMPLETYPE *)av_out_buf) + i * num_samples; \
+      for (i = 0; i < num_samples; ++i) \
+      { \
+        for (j = 0; j < ffmpegdec->context->channels; ++j) \
+          out[i * ffmpegdec->context->channels + j] = in[j][i]; \
+      } \
+      av_free(av_out_buf);
+
+    if (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_S16P)
+    {
+      PLANAR2SCALAR(uint16_t)
+    }
+    else if (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_FLTP)
+    {
+      PLANAR2SCALAR(float)
+    }
+    else if (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_S32P)
+    {
+      PLANAR2SCALAR(uint32_t)
+    }
+    else if (ffmpegdec->context->sample_fmt == AV_SAMPLE_FMT_DBLP)
+    {
+      PLANAR2SCALAR(double)
+    }
+#undef PLANAR2SCALAR
 
     /* Buffer size */
     GST_BUFFER_SIZE (*outbuf) = have_data;