omxaudioenc: Use correct timestamp, duration and filled length for the EOS buffers
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 6 Dec 2011 11:47:25 +0000 (12:47 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 6 Dec 2011 11:47:25 +0000 (12:47 +0100)
omx/gstomxaudioenc.c
omx/gstomxaudioenc.h

index a8207c9..04f6646 100644 (file)
@@ -622,6 +622,7 @@ gst_omx_audio_enc_start (GstAudioEncoder * encoder)
 
   self = GST_OMX_AUDIO_ENC (encoder);
 
+  self->last_upstream_ts = 0;
   self->eos = FALSE;
   self->downstream_flow_ret = GST_FLOW_OK;
   ret =
@@ -849,6 +850,7 @@ gst_omx_audio_enc_flush (GstAudioEncoder * encoder)
   gst_omx_port_set_flushing (self->out_port, FALSE);
 
   /* Start the srcpad loop again */
+  self->last_upstream_ts = 0;
   self->downstream_flow_ret = GST_FLOW_OK;
   self->eos = FALSE;
   gst_pad_start_task (GST_AUDIO_ENCODER_SRC_PAD (self),
@@ -942,14 +944,15 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
       buf->omx_buf->nTimeStamp =
           gst_util_uint64_scale (timestamp + timestamp_offset,
           OMX_TICKS_PER_SECOND, GST_SECOND);
+      self->last_upstream_ts = timestamp + timestamp_offset;
     }
     if (duration != GST_CLOCK_TIME_NONE) {
       buf->omx_buf->nTickCount =
           gst_util_uint64_scale (buf->omx_buf->nFilledLen, duration,
           GST_BUFFER_SIZE (inbuf));
+      self->last_upstream_ts += duration;
     }
 
-
     offset += buf->omx_buf->nFilledLen;
     self->started = TRUE;
     gst_omx_port_release_buffer (self->in_port, buf);
@@ -1016,6 +1019,11 @@ gst_omx_audio_enc_event (GstAudioEncoder * encoder, GstEvent * event)
      * the EOS buffer arrives on the output port. */
     acq_ret = gst_omx_port_acquire_buffer (self->in_port, &buf);
     if (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK) {
+      buf->omx_buf->nFilledLen = 0;
+      buf->omx_buf->nTimeStamp =
+          gst_util_uint64_scale (self->last_upstream_ts, OMX_TICKS_PER_SECOND,
+          GST_SECOND);
+      buf->omx_buf->nTickCount = 0;
       buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
       gst_omx_port_release_buffer (self->in_port, buf);
       GST_DEBUG_OBJECT (self, "Sent EOS to the component");
@@ -1069,6 +1077,11 @@ gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
 
   g_mutex_lock (self->drain_lock);
   self->draining = TRUE;
+  buf->omx_buf->nFilledLen = 0;
+  buf->omx_buf->nTimeStamp =
+      gst_util_uint64_scale (self->last_upstream_ts, OMX_TICKS_PER_SECOND,
+      GST_SECOND);
+  buf->omx_buf->nTickCount = 0;
   buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
   gst_omx_port_release_buffer (self->in_port, buf);
   GST_DEBUG_OBJECT (self, "Waiting until component is drained");
index c325faf..28828f7 100644 (file)
@@ -58,6 +58,8 @@ struct _GstOMXAudioEnc
    * the first buffer */
   gboolean started;
 
+  GstClockTime last_upstream_ts;
+
   /* TRUE if upstream is EOS */
   gboolean eos;