mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
omxvideodec: Use correct timestamp, duration and filled length for the EOS buffers
This commit is contained in:
parent
bd60f141e9
commit
05ad3343bf
2 changed files with 16 additions and 0 deletions
|
@ -899,6 +899,7 @@ gst_omx_video_dec_start (GstBaseVideoDecoder * decoder)
|
|||
|
||||
self = GST_OMX_VIDEO_DEC (decoder);
|
||||
|
||||
self->last_upstream_ts = 0;
|
||||
self->eos = FALSE;
|
||||
self->downstream_flow_ret = GST_FLOW_OK;
|
||||
ret =
|
||||
|
@ -1243,6 +1244,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder)
|
|||
gst_omx_port_set_flushing (self->out_port, FALSE);
|
||||
|
||||
/* Start the srcpad loop again */
|
||||
self->last_upstream_ts = 0;
|
||||
self->eos = FALSE;
|
||||
self->downstream_flow_ret = GST_FLOW_OK;
|
||||
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 =
|
||||
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 (frame->sink_buffer));
|
||||
self->last_upstream_ts += duration;
|
||||
}
|
||||
|
||||
if (offset == 0) {
|
||||
|
@ -1482,6 +1486,11 @@ gst_omx_video_dec_finish (GstBaseVideoDecoder * decoder)
|
|||
* 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");
|
||||
|
@ -1532,6 +1541,11 @@ gst_omx_video_dec_drain (GstOMXVideoDec * 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");
|
||||
|
|
|
@ -59,6 +59,8 @@ struct _GstOMXVideoDec
|
|||
* the first buffer */
|
||||
gboolean started;
|
||||
|
||||
GstClockTime last_upstream_ts;
|
||||
|
||||
/* Draining state */
|
||||
GMutex *drain_lock;
|
||||
GCond *drain_cond;
|
||||
|
|
Loading…
Reference in a new issue