avdec: Use gst_audio_buffer_clip() instead of manual clipping
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 25 Oct 2012 11:11:43 +0000 (13:11 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 25 Oct 2012 12:07:21 +0000 (14:07 +0200)
ext/libav/gstavdec.c

index 82910994673e40a6116a778212e369e06e541ce0..9ca730d951f6b1f29e3f8d7d99f51e455fc36248 100644 (file)
@@ -559,77 +559,13 @@ gst_avpacket_init (AVPacket * packet, guint8 * data, guint size)
 /* returns TRUE if buffer is within segment, else FALSE.
  * if Buffer is on segment border, it's timestamp and duration will be clipped */
 static gboolean
-clip_audio_buffer (GstFFMpegAudDec * dec, GstBuffer * buf, GstClockTime in_ts,
-    GstClockTime in_dur)
+clip_audio_buffer (GstFFMpegAudDec * dec, GstBuffer ** buf)
 {
-  GstClockTime stop;
-  gint64 diff;
-  guint64 ctime, cstop;
-  gboolean res = TRUE;
-  gsize size, offset;
-
-  size = gst_buffer_get_size (buf);
-  offset = 0;
-
-  GST_LOG_OBJECT (dec,
-      "timestamp:%" GST_TIME_FORMAT ", duration:%" GST_TIME_FORMAT
-      ", size %" G_GSIZE_FORMAT, GST_TIME_ARGS (in_ts), GST_TIME_ARGS (in_dur),
-      size);
-
-  /* can't clip without TIME segment */
-  if (G_UNLIKELY (dec->segment.format != GST_FORMAT_TIME))
-    goto beach;
-
-  /* we need a start time */
-  if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (in_ts)))
-    goto beach;
-
-  /* trust duration */
-  stop = in_ts + in_dur;
-
-  res = gst_segment_clip (&dec->segment, GST_FORMAT_TIME, in_ts, stop, &ctime,
-      &cstop);
-  if (G_UNLIKELY (!res))
-    goto out_of_segment;
-
-  /* see if some clipping happened */
-  if (G_UNLIKELY ((diff = ctime - in_ts) > 0)) {
-    /* bring clipped time to bytes */
-    diff =
-        gst_util_uint64_scale_int (diff, dec->samplerate,
-        GST_SECOND) * (dec->depth * dec->channels);
-
-    GST_DEBUG_OBJECT (dec, "clipping start to %" GST_TIME_FORMAT " %"
-        G_GINT64_FORMAT " bytes", GST_TIME_ARGS (ctime), diff);
-
-    offset += diff;
-    size -= diff;
-  }
-  if (G_UNLIKELY ((diff = stop - cstop) > 0)) {
-    /* bring clipped time to bytes */
-    diff =
-        gst_util_uint64_scale_int (diff, dec->samplerate,
-        GST_SECOND) * (dec->depth * dec->channels);
-
-    GST_DEBUG_OBJECT (dec, "clipping stop to %" GST_TIME_FORMAT " %"
-        G_GINT64_FORMAT " bytes", GST_TIME_ARGS (cstop), diff);
-
-    size -= diff;
-  }
-  gst_buffer_resize (buf, offset, size);
-  GST_BUFFER_TIMESTAMP (buf) = ctime;
-  GST_BUFFER_DURATION (buf) = cstop - ctime;
-
-beach:
-  GST_LOG_OBJECT (dec, "%sdropping", (res ? "not " : ""));
-  return res;
+  *buf =
+      gst_audio_buffer_clip (*buf, &dec->segment, dec->samplerate,
+      dec->depth * dec->channels);
 
-  /* ERRORS */
-out_of_segment:
-  {
-    GST_LOG_OBJECT (dec, "out of segment");
-    goto beach;
-  }
+  return *buf != NULL;
 }
 
 static gint
@@ -719,11 +655,9 @@ gst_ffmpegauddec_audio_frame (GstFFMpegAudDec * ffmpegdec,
       ffmpegdec->next_out = out_pts + out_duration;
 
     /* now see if we need to clip the buffer against the segment boundaries. */
-    if (G_UNLIKELY (!clip_audio_buffer (ffmpegdec, *outbuf, out_pts,
-                out_duration)))
+    if (G_UNLIKELY (!clip_audio_buffer (ffmpegdec, outbuf)))
       goto clipped;
 
-
     /* Reorder channels to the GStreamer channel order */
     /* Only the width really matters here... and it's stored as depth */
     fmt =
@@ -747,7 +681,8 @@ beach:
 clipped:
   {
     GST_DEBUG_OBJECT (ffmpegdec, "buffer clipped");
-    gst_buffer_unref (*outbuf);
+    if (*outbuf)
+      gst_buffer_unref (*outbuf);
     *outbuf = NULL;
     goto beach;
   }