mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
omxvideoenc: Use correct timestamp, duration and filled length for the EOS buffers
This commit is contained in:
parent
0cb32a4ebd
commit
bd60f141e9
2 changed files with 16 additions and 0 deletions
|
@ -980,6 +980,7 @@ gst_omx_video_enc_start (GstBaseVideoEncoder * encoder)
|
||||||
|
|
||||||
self = GST_OMX_VIDEO_ENC (encoder);
|
self = GST_OMX_VIDEO_ENC (encoder);
|
||||||
|
|
||||||
|
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 =
|
||||||
|
@ -1181,6 +1182,7 @@ gst_omx_video_enc_reset (GstBaseVideoEncoder * encoder)
|
||||||
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),
|
||||||
|
@ -1448,6 +1450,7 @@ gst_omx_video_enc_handle_frame (GstBaseVideoEncoder * encoder,
|
||||||
if (timestamp != GST_CLOCK_TIME_NONE) {
|
if (timestamp != GST_CLOCK_TIME_NONE) {
|
||||||
buf->omx_buf->nTimeStamp =
|
buf->omx_buf->nTimeStamp =
|
||||||
gst_util_uint64_scale (timestamp, OMX_TICKS_PER_SECOND, GST_SECOND);
|
gst_util_uint64_scale (timestamp, OMX_TICKS_PER_SECOND, GST_SECOND);
|
||||||
|
self->last_upstream_ts = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
duration = frame->presentation_duration;
|
duration = frame->presentation_duration;
|
||||||
|
@ -1455,6 +1458,7 @@ gst_omx_video_enc_handle_frame (GstBaseVideoEncoder * encoder,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
id = g_slice_new0 (BufferIdentification);
|
id = g_slice_new0 (BufferIdentification);
|
||||||
|
@ -1533,6 +1537,11 @@ gst_omx_video_enc_finish (GstBaseVideoEncoder * encoder)
|
||||||
* 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");
|
||||||
|
@ -1583,6 +1592,11 @@ gst_omx_video_enc_drain (GstOMXVideoEnc * 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");
|
||||||
|
|
|
@ -58,6 +58,8 @@ struct _GstOMXVideoEnc
|
||||||
* 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;
|
||||||
|
|
Loading…
Reference in a new issue