public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] gentoo-x86 commit in media-plugins/gst-plugins-ffmpeg/files: 0.10.13_p201211-ffmpeg2.patch 0.10.13_p201211-planaraudio.patch
@ 2013-08-06 15:34 Alexis Ballier (aballier)
  0 siblings, 0 replies; only message in thread
From: Alexis Ballier (aballier) @ 2013-08-06 15:34 UTC (permalink / raw
  To: gentoo-commits

aballier    13/08/06 15:34:36

  Added:                0.10.13_p201211-ffmpeg2.patch
                        0.10.13_p201211-planaraudio.patch
  Log:
  Attempt to fix planar audio support. Fix build with FFmpeg 2.0, bug #476528.
  
  (Portage version: 2.2.0_alpha194/cvs/Linux x86_64, signed Manifest commit with key 160F534A)

Revision  Changes    Path
1.1                  media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-ffmpeg2.patch?rev=1.1&content-type=text/plain

Index: 0.10.13_p201211-ffmpeg2.patch
===================================================================
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcfg.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcfg.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcfg.c
@@ -171,13 +171,10 @@ gst_ffmpeg_idct_algo_get_type (void)
       {FF_IDCT_INT, "JPEG reference Integer", "int"},
       {FF_IDCT_SIMPLE, "Simple", "simple"},
       {FF_IDCT_SIMPLEMMX, "Simple MMX", "simplemmx"},
-      {FF_IDCT_LIBMPEG2MMX, "LIBMPEG2MMX", "libmpeg2mmx"},
       {FF_IDCT_ARM, "ARM", "arm"},
       {FF_IDCT_ALTIVEC, "ALTIVEC", "altivec"},
       {FF_IDCT_SH4, "SH4", "sh4"},
       {FF_IDCT_SIMPLEARM, "SIMPLEARM", "simplearm"},
-      {FF_IDCT_H264, "H264", "h264"},
-      {FF_IDCT_VP3, "VP3", "vp3"},
       {FF_IDCT_IPP, "IPP", "ipp"},
       {FF_IDCT_XVIDMMX, "XVIDMMX", "xvidmmx"},
       {0, NULL, NULL},
@@ -274,9 +271,6 @@ gst_ffmpeg_flags_get_type (void)
           "global-headers"},
       {CODEC_FLAG_AC_PRED, "H263 Advanced Intra Coding / MPEG4 AC prediction",
           "aic"},
-      {CODEC_FLAG_CBP_RD, "Rate Distoration Optimization for CBP", "cbp-rd"},
-      {CODEC_FLAG_QP_RD, "Rate Distoration Optimization for QP selection",
-          "qp-rd"},
       {CODEC_FLAG_CLOSED_GOP, "Closed GOP", "closedgop"},
       {0, NULL, NULL},
     };
@@ -580,18 +574,6 @@ gst_ffmpeg_cfg_init (void)
       -100, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   gst_ffmpeg_add_pspec (pspec, max_key_interval, FALSE, mpeg, NULL);
 
-  pspec = g_param_spec_int ("luma-elim-threshold",
-      "Luma Elimination Threshold",
-      "Luma Single Coefficient Elimination Threshold",
-      -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-  gst_ffmpeg_add_pspec (pspec, config.luma_elim_threshold, FALSE, mpeg, NULL);
-
-  pspec = g_param_spec_int ("chroma-elim-threshold",
-      "Chroma Elimination Threshold",
-      "Chroma Single Coefficient Elimination Threshold",
-      -99, 99, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-  gst_ffmpeg_add_pspec (pspec, config.chroma_elim_threshold, FALSE, mpeg, NULL);
-
   pspec = g_param_spec_float ("lumi-masking", "Luminance Masking",
       "Luminance Masking", -1.0f, 1.0f, 0.0f,
       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcodecmap.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c
@@ -572,13 +572,11 @@ gst_ffmpeg_codecid_to_caps (enum AVCodec
           break;
       }
 
-      /* FIXME: context->sub_id must be filled in during decoding */
       caps =
           gst_ff_vid_caps_new (context, codec_id, encode,
           "video/x-pn-realvideo", "systemstream", G_TYPE_BOOLEAN, FALSE,
           "rmversion", G_TYPE_INT, version, NULL);
       if (context) {
-        gst_caps_set_simple (caps, "format", G_TYPE_INT, context->sub_id, NULL);
         if (context->extradata_size >= 8) {
           gst_caps_set_simple (caps,
               "subformat", G_TYPE_INT, GST_READ_UINT32_BE (context->extradata),
@@ -2559,18 +2557,6 @@ gst_ffmpeg_caps_with_codecid (enum AVCod
     }
       break;
 
-    case AV_CODEC_ID_RV10:
-    case AV_CODEC_ID_RV20:
-    case AV_CODEC_ID_RV30:
-    case AV_CODEC_ID_RV40:
-    {
-      gint format;
-
-      if (gst_structure_get_int (str, "format", &format))
-        context->sub_id = format;
-
-      break;
-    }
     case AV_CODEC_ID_COOK:
     case AV_CODEC_ID_RA_288:
     case AV_CODEC_ID_RA_144:
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegenc.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c
@@ -572,7 +572,6 @@ gst_ffmpegenc_setcaps (GstPad * pad, Gst
   ffmpegenc->context->coder_type = 0;
   ffmpegenc->context->context_model = 0;
   ffmpegenc->context->scenechange_threshold = 0;
-  ffmpegenc->context->inter_threshold = 0;
 
   /* and last but not least the pass; CBR, 2-pass, etc */
   ffmpegenc->context->flags |= ffmpegenc->pass;
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegdec.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c
@@ -2082,7 +2082,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
     const GstTSInfo * dec_info, GstBuffer ** outbuf, GstFlowReturn * ret)
 {
   gint len = -1, got_frame;
-  gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+  gint have_data = 0;
   GstClockTime out_timestamp, out_duration;
   gint64 out_offset;
   AVPacket packet;
@@ -2101,21 +2101,22 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
       goto beach;
   }
 
-  *outbuf =
-      new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE,
-      GST_PAD_CAPS (ffmpegdec->srcpad));
-
   gst_avpacket_init (&packet, data, size);
   len = avcodec_decode_audio4 (ffmpegdec->context, frame, &got_frame, &packet);
   GST_DEBUG_OBJECT (ffmpegdec,
       "Decode audio: ret=%d, got_frame=%d", len, got_frame);
   if (!got_frame) {
-      gst_buffer_unref (*outbuf);
-      *outbuf = NULL;
       len = -1;
       goto beach;
   }
-  if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), AVCODEC_MAX_AUDIO_FRAME_SIZE);
+
+  int obuf_size = av_samples_get_buffer_size(NULL, ffmpegdec->context->channels, frame->nb_samples, frame->format, 0);
+
+  *outbuf=
+      new_aligned_buffer (obuf_size,
+      GST_PAD_CAPS (ffmpegdec->srcpad));
+
+  if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), obuf_size);
 
   if (len >= 0 && have_data > 0) {
     GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer");



1.1                  media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/media-plugins/gst-plugins-ffmpeg/files/0.10.13_p201211-planaraudio.patch?rev=1.1&content-type=text/plain

Index: 0.10.13_p201211-planaraudio.patch
===================================================================
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegcodecmap.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegcodecmap.c
@@ -1925,6 +1925,10 @@ gst_ffmpeg_smpfmt_to_caps (enum AVSample
   gboolean integer = TRUE;
   gboolean signedness = FALSE;
 
+#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(51,46,0)
+  sample_fmt = av_get_packed_sample_fmt (sample_fmt);
+#endif
+
   switch (sample_fmt) {
     case AV_SAMPLE_FMT_S16:
       signedness = TRUE;
@@ -2009,7 +2013,7 @@ gst_ffmpeg_codectype_to_audio_caps (AVCo
 
     ctx.channels = -1;
     caps = gst_caps_new_empty ();
-    for (i = 0; i <= AV_SAMPLE_FMT_DBL; i++) {
+    for (i = 0; i < AV_SAMPLE_FMT_NB; i++) {
       temp =
           gst_ffmpeg_smpfmt_to_caps (i, encode ? &ctx : NULL, codec_id, encode);
       if (temp != NULL) {
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegutils.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegutils.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegutils.c
@@ -47,6 +47,9 @@ gint
 av_smp_format_depth (enum AVSampleFormat smp_fmt)
 {
   gint depth = -1;
+#if LIBAVUTIL_VERSION_INT > AV_VERSION_INT(51,46,0)
+  smp_fmt = av_get_packed_sample_fmt (smp_fmt);
+#endif
   switch (smp_fmt) {
     case AV_SAMPLE_FMT_U8:
       depth = 1;
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegdec.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegdec.c
@@ -2044,16 +2044,49 @@ out_of_segment:
   }
 }
 
+static void copy_samples_planar(unsigned bps, 
+    unsigned nb_samples,
+    unsigned nb_channels,
+    unsigned char *dst,
+    unsigned char **src)
+{
+  unsigned s, c, o = 0;
+
+  for (s = 0; s < nb_samples; s++) {
+      for (c = 0; c < nb_channels; c++) {
+          memcpy(dst, src[c] + o, bps);
+	   dst += bps;
+      }
+      o += bps;
+  }
+}
+
+static int copy_samples(AVCodecContext *avc, AVFrame *frame,
+	unsigned char *buf, int max_size)
+{
+	int channels = avc->channels;
+	int sample_size = av_get_bytes_per_sample(avc->sample_fmt);
+	int size = channels * sample_size * frame->nb_samples;
+	if (size > max_size) {
+		return -1;
+	}
+	if (av_sample_fmt_is_planar(avc->sample_fmt))
+		copy_samples_planar(sample_size, frame->nb_samples, channels, buf, frame->extended_data);
+	else memcpy(buf, frame->data[0], size);
+	return size;
+}
+
 static gint
 gst_ffmpegdec_audio_frame (GstFFMpegDec * ffmpegdec,
     AVCodec * in_plugin, guint8 * data, guint size,
     const GstTSInfo * dec_info, GstBuffer ** outbuf, GstFlowReturn * ret)
 {
-  gint len = -1;
+  gint len = -1, got_frame;
   gint have_data = AVCODEC_MAX_AUDIO_FRAME_SIZE;
   GstClockTime out_timestamp, out_duration;
   gint64 out_offset;
   AVPacket packet;
+  AVFrame *frame;
 
   GST_DEBUG_OBJECT (ffmpegdec,
       "size:%d, offset:%" G_GINT64_FORMAT ", ts:%" GST_TIME_FORMAT ", dur:%"
@@ -2061,15 +2094,28 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
       dec_info->offset, GST_TIME_ARGS (dec_info->timestamp),
       GST_TIME_ARGS (dec_info->duration), GST_TIME_ARGS (ffmpegdec->next_out));
 
+  frame = avcodec_alloc_frame();
+  if (!frame) {
+      *outbuf = NULL;
+      len = -1;
+      goto beach;
+  }
+
   *outbuf =
       new_aligned_buffer (AVCODEC_MAX_AUDIO_FRAME_SIZE,
       GST_PAD_CAPS (ffmpegdec->srcpad));
 
   gst_avpacket_init (&packet, data, size);
-  len = avcodec_decode_audio3 (ffmpegdec->context,
-      (int16_t *) GST_BUFFER_DATA (*outbuf), &have_data, &packet);
+  len = avcodec_decode_audio4 (ffmpegdec->context, frame, &got_frame, &packet);
   GST_DEBUG_OBJECT (ffmpegdec,
-      "Decode audio: len=%d, have_data=%d", len, have_data);
+      "Decode audio: ret=%d, got_frame=%d", len, got_frame);
+  if (!got_frame) {
+      gst_buffer_unref (*outbuf);
+      *outbuf = NULL;
+      len = -1;
+      goto beach;
+  }
+  if (len >= 0) have_data = copy_samples(ffmpegdec->context, frame, GST_BUFFER_DATA (*outbuf), AVCODEC_MAX_AUDIO_FRAME_SIZE);
 
   if (len >= 0 && have_data > 0) {
     GST_DEBUG_OBJECT (ffmpegdec, "Creating output buffer");
@@ -2145,6 +2191,7 @@ gst_ffmpegdec_audio_frame (GstFFMpegDec
   }
 
 beach:
+  av_free(frame);
   GST_DEBUG_OBJECT (ffmpegdec, "return flow %d, out %p, len %d",
       *ret, *outbuf, len);
   return len;
Index: gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c
===================================================================
--- gst-ffmpeg-0.10.13_p201211.orig/ext/ffmpeg/gstffmpegenc.c
+++ gst-ffmpeg-0.10.13_p201211/ext/ffmpeg/gstffmpegenc.c
@@ -843,12 +843,30 @@ gst_ffmpegenc_chain_video (GstPad * pad,
   return gst_pad_push (ffmpegenc->srcpad, outbuf);
 }
 
+static void copy_samples_to_planar(unsigned bps, 
+    unsigned nb_samples,
+    unsigned nb_channels,
+    unsigned char *dst,
+    unsigned char *src)
+{
+  unsigned s, c, o = 0;
+
+  for (s = 0; s < nb_samples; s++) {
+      for (c = 0; c < nb_channels; c++) {
+          memcpy(dst + nb_samples * c, src + o, bps);
+      	   o += bps;
+      }
+      dst += bps;
+  }
+}
+
 static GstFlowReturn
 gst_ffmpegenc_encode_audio (GstFFMpegEnc * ffmpegenc, guint8 * audio_in,
     guint in_size, guint max_size, GstClockTime timestamp,
     GstClockTime duration, gboolean discont)
 {
   GstBuffer *outbuf;
+  GstBuffer *inbuf2;
   AVCodecContext *ctx;
   guint8 *audio_out;
   gint res;
@@ -864,7 +882,18 @@ gst_ffmpegenc_encode_audio (GstFFMpegEnc
   if (ffmpegenc->buffer_size != max_size)
     ffmpegenc->buffer_size = max_size;
 
+  if (av_sample_fmt_is_planar(ctx->sample_fmt)) {
+  	guint8 * audio_in2;
+	inbuf2 = gst_buffer_new_and_alloc (in_size + FF_MIN_BUFFER_SIZE);
+	audio_in2 = GST_BUFFER_DATA (inbuf2);
+	copy_samples_to_planar(av_get_bytes_per_sample(ctx->sample_fmt), in_size / (av_get_bytes_per_sample(ctx->sample_fmt) * ctx->channels),
+		ctx->channels, audio_in2, audio_in);
+	audio_in = audio_in2;
+  }
   res = avcodec_encode_audio (ctx, audio_out, max_size, (short *) audio_in);
+  if (av_sample_fmt_is_planar(ctx->sample_fmt)) {
+    gst_buffer_unref (inbuf2);
+  }
 
   if (res < 0) {
     GST_ERROR_OBJECT (ffmpegenc, "Failed to encode buffer: %d", res);





^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2013-08-06 15:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-06 15:34 [gentoo-commits] gentoo-x86 commit in media-plugins/gst-plugins-ffmpeg/files: 0.10.13_p201211-ffmpeg2.patch 0.10.13_p201211-planaraudio.patch Alexis Ballier (aballier)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox