omxvideodec: Use correct timestamp, duration and filled length for the EOS buffers

This commit is contained in:
Sebastian Dröge 2011-12-06 12:47:12 +01:00
parent bd60f141e9
commit 05ad3343bf
2 changed files with 16 additions and 0 deletions

View file

@ -899,6 +899,7 @@ gst_omx_video_dec_start (GstBaseVideoDecoder * decoder)
self = GST_OMX_VIDEO_DEC (decoder); self = GST_OMX_VIDEO_DEC (decoder);
self->last_upstream_ts = 0;
self->eos = FALSE; self->eos = FALSE;
self->downstream_flow_ret = GST_FLOW_OK; self->downstream_flow_ret = GST_FLOW_OK;
ret = ret =
@ -1243,6 +1244,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder)
gst_omx_port_set_flushing (self->out_port, FALSE); gst_omx_port_set_flushing (self->out_port, FALSE);
/* Start the srcpad loop again */ /* Start the srcpad loop again */
self->last_upstream_ts = 0;
self->eos = FALSE; self->eos = FALSE;
self->downstream_flow_ret = GST_FLOW_OK; self->downstream_flow_ret = GST_FLOW_OK;
gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self), gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self),
@ -1383,11 +1385,13 @@ gst_omx_video_dec_handle_frame (GstBaseVideoDecoder * decoder,
buf->omx_buf->nTimeStamp = buf->omx_buf->nTimeStamp =
gst_util_uint64_scale (timestamp + timestamp_offset, gst_util_uint64_scale (timestamp + timestamp_offset,
OMX_TICKS_PER_SECOND, GST_SECOND); OMX_TICKS_PER_SECOND, GST_SECOND);
self->last_upstream_ts = timestamp + timestamp_offset;
} }
if (duration != GST_CLOCK_TIME_NONE) { if (duration != GST_CLOCK_TIME_NONE) {
buf->omx_buf->nTickCount = buf->omx_buf->nTickCount =
gst_util_uint64_scale (buf->omx_buf->nFilledLen, duration, gst_util_uint64_scale (buf->omx_buf->nFilledLen, duration,
GST_BUFFER_SIZE (frame->sink_buffer)); GST_BUFFER_SIZE (frame->sink_buffer));
self->last_upstream_ts += duration;
} }
if (offset == 0) { if (offset == 0) {
@ -1482,6 +1486,11 @@ gst_omx_video_dec_finish (GstBaseVideoDecoder * decoder)
* the EOS buffer arrives on the output port. */ * the EOS buffer arrives on the output port. */
acq_ret = gst_omx_port_acquire_buffer (self->in_port, &buf); acq_ret = gst_omx_port_acquire_buffer (self->in_port, &buf);
if (acq_ret == GST_OMX_ACQUIRE_BUFFER_OK) { 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; buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
gst_omx_port_release_buffer (self->in_port, buf); gst_omx_port_release_buffer (self->in_port, buf);
GST_DEBUG_OBJECT (self, "Sent EOS to the component"); GST_DEBUG_OBJECT (self, "Sent EOS to the component");
@ -1532,6 +1541,11 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self)
g_mutex_lock (self->drain_lock); g_mutex_lock (self->drain_lock);
self->draining = TRUE; 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; buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
gst_omx_port_release_buffer (self->in_port, buf); gst_omx_port_release_buffer (self->in_port, buf);
GST_DEBUG_OBJECT (self, "Waiting until component is drained"); GST_DEBUG_OBJECT (self, "Waiting until component is drained");

View file

@ -59,6 +59,8 @@ struct _GstOMXVideoDec
* the first buffer */ * the first buffer */
gboolean started; gboolean started;
GstClockTime last_upstream_ts;
/* Draining state */ /* Draining state */
GMutex *drain_lock; GMutex *drain_lock;
GCond *drain_cond; GCond *drain_cond;