mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-24 16:18:16 +00:00
omx: Let base classes handle EOS
https://bugzilla.gnome.org//show_bug.cgi?id=734774
This commit is contained in:
parent
19d77004d2
commit
d75334456d
8 changed files with 22 additions and 177 deletions
|
@ -50,8 +50,7 @@ static gboolean gst_omx_audio_dec_set_format (GstAudioDecoder * decoder,
|
||||||
static void gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard);
|
static void gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard);
|
||||||
static GstFlowReturn gst_omx_audio_dec_handle_frame (GstAudioDecoder * decoder,
|
static GstFlowReturn gst_omx_audio_dec_handle_frame (GstAudioDecoder * decoder,
|
||||||
GstBuffer * buffer);
|
GstBuffer * buffer);
|
||||||
static GstFlowReturn gst_omx_audio_dec_drain (GstOMXAudioDec * self,
|
static GstFlowReturn gst_omx_audio_dec_drain (GstOMXAudioDec * self);
|
||||||
gboolean is_eos);
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -701,7 +700,6 @@ gst_omx_audio_dec_start (GstAudioDecoder * decoder)
|
||||||
self = GST_OMX_AUDIO_DEC (decoder);
|
self = GST_OMX_AUDIO_DEC (decoder);
|
||||||
|
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -726,7 +724,6 @@ gst_omx_audio_dec_stop (GstAudioDecoder * decoder)
|
||||||
|
|
||||||
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
self->eos = FALSE;
|
|
||||||
|
|
||||||
g_mutex_lock (&self->drain_lock);
|
g_mutex_lock (&self->drain_lock);
|
||||||
self->draining = FALSE;
|
self->draining = FALSE;
|
||||||
|
@ -781,7 +778,7 @@ gst_omx_audio_dec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Need to disable and drain decoder");
|
GST_DEBUG_OBJECT (self, "Need to disable and drain decoder");
|
||||||
|
|
||||||
gst_omx_audio_dec_drain (self, FALSE);
|
gst_omx_audio_dec_drain (self);
|
||||||
gst_omx_audio_dec_flush (decoder, FALSE);
|
gst_omx_audio_dec_flush (decoder, FALSE);
|
||||||
gst_omx_port_set_flushing (out_port, 5 * GST_SECOND, TRUE);
|
gst_omx_port_set_flushing (out_port, 5 * GST_SECOND, TRUE);
|
||||||
|
|
||||||
|
@ -972,7 +969,6 @@ gst_omx_audio_dec_flush (GstAudioDecoder * decoder, gboolean hard)
|
||||||
|
|
||||||
/* Reset our state */
|
/* Reset our state */
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
GST_DEBUG_OBJECT (self, "Flush finished");
|
GST_DEBUG_OBJECT (self, "Flush finished");
|
||||||
|
@ -1001,13 +997,6 @@ gst_omx_audio_dec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
|
||||||
if (inbuf)
|
if (inbuf)
|
||||||
gst_buffer_ref (inbuf);
|
gst_buffer_ref (inbuf);
|
||||||
|
|
||||||
if (self->eos) {
|
|
||||||
GST_WARNING_OBJECT (self, "Got frame after EOS");
|
|
||||||
if (inbuf)
|
|
||||||
gst_buffer_unref (inbuf);
|
|
||||||
return GST_FLOW_EOS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
if (inbuf)
|
if (inbuf)
|
||||||
gst_buffer_unref (inbuf);
|
gst_buffer_unref (inbuf);
|
||||||
|
@ -1021,7 +1010,7 @@ gst_omx_audio_dec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inbuf == NULL)
|
if (inbuf == NULL)
|
||||||
return gst_omx_audio_dec_drain (self, TRUE);
|
return gst_omx_audio_dec_drain (self);
|
||||||
|
|
||||||
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
|
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
|
||||||
duration = GST_BUFFER_DURATION (inbuf);
|
duration = GST_BUFFER_DURATION (inbuf);
|
||||||
|
@ -1272,7 +1261,7 @@ release_error:
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_omx_audio_dec_drain (GstOMXAudioDec * self, gboolean is_eos)
|
gst_omx_audio_dec_drain (GstOMXAudioDec * self)
|
||||||
{
|
{
|
||||||
GstOMXAudioDecClass *klass;
|
GstOMXAudioDecClass *klass;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
|
@ -1289,14 +1278,6 @@ gst_omx_audio_dec_drain (GstOMXAudioDec * self, gboolean is_eos)
|
||||||
}
|
}
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
|
|
||||||
/* Don't send EOS buffer twice, this doesn't work */
|
|
||||||
if (self->eos) {
|
|
||||||
GST_DEBUG_OBJECT (self, "Component is EOS already");
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
if (is_eos)
|
|
||||||
self->eos = TRUE;
|
|
||||||
|
|
||||||
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
||||||
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
|
@ -76,9 +76,6 @@ struct _GstOMXAudioDec
|
||||||
/* TRUE if EOS buffers shouldn't be forwarded */
|
/* TRUE if EOS buffers shouldn't be forwarded */
|
||||||
gboolean draining;
|
gboolean draining;
|
||||||
|
|
||||||
/* TRUE if upstream is EOS */
|
|
||||||
gboolean eos;
|
|
||||||
|
|
||||||
GstFlowReturn downstream_flow_ret;
|
GstFlowReturn downstream_flow_ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,6 @@ static gboolean gst_omx_audio_enc_start (GstAudioEncoder * encoder);
|
||||||
static gboolean gst_omx_audio_enc_stop (GstAudioEncoder * encoder);
|
static gboolean gst_omx_audio_enc_stop (GstAudioEncoder * encoder);
|
||||||
static gboolean gst_omx_audio_enc_set_format (GstAudioEncoder * encoder,
|
static gboolean gst_omx_audio_enc_set_format (GstAudioEncoder * encoder,
|
||||||
GstAudioInfo * info);
|
GstAudioInfo * info);
|
||||||
static gboolean gst_omx_audio_enc_sink_event (GstAudioEncoder * encoder,
|
|
||||||
GstEvent * event);
|
|
||||||
static GstFlowReturn gst_omx_audio_enc_handle_frame (GstAudioEncoder *
|
static GstFlowReturn gst_omx_audio_enc_handle_frame (GstAudioEncoder *
|
||||||
encoder, GstBuffer * buffer);
|
encoder, GstBuffer * buffer);
|
||||||
static void gst_omx_audio_enc_flush (GstAudioEncoder * encoder);
|
static void gst_omx_audio_enc_flush (GstAudioEncoder * encoder);
|
||||||
|
@ -82,8 +80,6 @@ gst_omx_audio_enc_class_init (GstOMXAudioEncClass * klass)
|
||||||
GST_DEBUG_FUNCPTR (gst_omx_audio_enc_set_format);
|
GST_DEBUG_FUNCPTR (gst_omx_audio_enc_set_format);
|
||||||
audio_encoder_class->handle_frame =
|
audio_encoder_class->handle_frame =
|
||||||
GST_DEBUG_FUNCPTR (gst_omx_audio_enc_handle_frame);
|
GST_DEBUG_FUNCPTR (gst_omx_audio_enc_handle_frame);
|
||||||
audio_encoder_class->sink_event =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_omx_audio_enc_sink_event);
|
|
||||||
|
|
||||||
klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER;
|
klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER;
|
||||||
klass->cdata.default_sink_template_caps = "audio/x-raw, "
|
klass->cdata.default_sink_template_caps = "audio/x-raw, "
|
||||||
|
@ -592,7 +588,6 @@ gst_omx_audio_enc_start (GstAudioEncoder * encoder)
|
||||||
self = GST_OMX_AUDIO_ENC (encoder);
|
self = GST_OMX_AUDIO_ENC (encoder);
|
||||||
|
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -617,7 +612,6 @@ gst_omx_audio_enc_stop (GstAudioEncoder * encoder)
|
||||||
|
|
||||||
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
self->eos = FALSE;
|
|
||||||
|
|
||||||
g_mutex_lock (&self->drain_lock);
|
g_mutex_lock (&self->drain_lock);
|
||||||
self->draining = FALSE;
|
self->draining = FALSE;
|
||||||
|
@ -887,7 +881,7 @@ gst_omx_audio_enc_flush (GstAudioEncoder * encoder)
|
||||||
/* Start the srcpad loop again */
|
/* Start the srcpad loop again */
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
self->eos = FALSE;
|
self->started = FALSE;
|
||||||
gst_pad_start_task (GST_AUDIO_ENCODER_SRC_PAD (self),
|
gst_pad_start_task (GST_AUDIO_ENCODER_SRC_PAD (self),
|
||||||
(GstTaskFunction) gst_omx_audio_enc_loop, encoder, NULL);
|
(GstTaskFunction) gst_omx_audio_enc_loop, encoder, NULL);
|
||||||
}
|
}
|
||||||
|
@ -906,11 +900,6 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
|
||||||
|
|
||||||
self = GST_OMX_AUDIO_ENC (encoder);
|
self = GST_OMX_AUDIO_ENC (encoder);
|
||||||
|
|
||||||
if (self->eos) {
|
|
||||||
GST_WARNING_OBJECT (self, "Got frame after EOS");
|
|
||||||
return GST_FLOW_EOS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
return self->downstream_flow_ret;
|
return self->downstream_flow_ret;
|
||||||
}
|
}
|
||||||
|
@ -1085,77 +1074,6 @@ release_error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_omx_audio_enc_sink_event (GstAudioEncoder * encoder, GstEvent * event)
|
|
||||||
{
|
|
||||||
GstOMXAudioEnc *self;
|
|
||||||
GstOMXAudioEncClass *klass;
|
|
||||||
OMX_ERRORTYPE err;
|
|
||||||
|
|
||||||
self = GST_OMX_AUDIO_ENC (encoder);
|
|
||||||
klass = GST_OMX_AUDIO_ENC_GET_CLASS (self);
|
|
||||||
|
|
||||||
if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
|
|
||||||
GstOMXBuffer *buf;
|
|
||||||
GstOMXAcquireBufferReturn acq_ret;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Sending EOS to the component");
|
|
||||||
|
|
||||||
/* Don't send EOS buffer twice, this doesn't work */
|
|
||||||
if (self->eos) {
|
|
||||||
GST_DEBUG_OBJECT (self, "Component is already EOS");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
self->eos = TRUE;
|
|
||||||
|
|
||||||
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
|
||||||
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
|
||||||
|
|
||||||
/* Insert a NULL into the queue to signal EOS */
|
|
||||||
g_mutex_lock (&self->enc->lock);
|
|
||||||
g_queue_push_tail (&self->enc_out_port->pending_buffers, NULL);
|
|
||||||
g_mutex_unlock (&self->enc->lock);
|
|
||||||
g_mutex_lock (&self->enc->messages_lock);
|
|
||||||
g_cond_broadcast (&self->enc->messages_cond);
|
|
||||||
g_mutex_unlock (&self->enc->messages_lock);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure to release the base class stream lock, otherwise
|
|
||||||
* _loop() can't call _finish_frame() and we might block forever
|
|
||||||
* because no input buffers are released */
|
|
||||||
GST_AUDIO_ENCODER_STREAM_UNLOCK (self);
|
|
||||||
|
|
||||||
/* Send an EOS buffer to the component and let the base
|
|
||||||
* class drop the EOS event. We will send it later when
|
|
||||||
* the EOS buffer arrives on the output port. */
|
|
||||||
acq_ret = gst_omx_port_acquire_buffer (self->enc_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;
|
|
||||||
err = gst_omx_port_release_buffer (self->enc_in_port, buf);
|
|
||||||
if (err != OMX_ErrorNone) {
|
|
||||||
GST_ERROR_OBJECT (self, "Failed to send EOS to component: %s (0x%08x)",
|
|
||||||
gst_omx_error_to_string (err), err);
|
|
||||||
} else {
|
|
||||||
GST_DEBUG_OBJECT (self, "Sent EOS to the component");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
GST_ERROR_OBJECT (self, "Failed to acquire buffer for EOS: %d", acq_ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_AUDIO_ENCODER_STREAM_LOCK (self);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
|
gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
|
||||||
{
|
{
|
||||||
|
@ -1174,12 +1092,6 @@ gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
|
||||||
}
|
}
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
|
|
||||||
/* Don't send EOS buffer twice, this doesn't work */
|
|
||||||
if (self->eos) {
|
|
||||||
GST_DEBUG_OBJECT (self, "Component is EOS already");
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
||||||
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
|
@ -60,9 +60,6 @@ struct _GstOMXAudioEnc
|
||||||
|
|
||||||
GstClockTime last_upstream_ts;
|
GstClockTime last_upstream_ts;
|
||||||
|
|
||||||
/* TRUE if upstream is EOS */
|
|
||||||
gboolean eos;
|
|
||||||
|
|
||||||
/* Draining state */
|
/* Draining state */
|
||||||
GMutex drain_lock;
|
GMutex drain_lock;
|
||||||
GCond drain_cond;
|
GCond drain_cond;
|
||||||
|
|
|
@ -75,8 +75,7 @@ static GstFlowReturn gst_omx_video_dec_finish (GstVideoDecoder * decoder);
|
||||||
static gboolean gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec,
|
static gboolean gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec,
|
||||||
GstQuery * query);
|
GstQuery * query);
|
||||||
|
|
||||||
static GstFlowReturn gst_omx_video_dec_drain (GstOMXVideoDec * self,
|
static GstFlowReturn gst_omx_video_dec_drain (GstOMXVideoDec * self);
|
||||||
gboolean is_eos);
|
|
||||||
|
|
||||||
static OMX_ERRORTYPE gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec *
|
static OMX_ERRORTYPE gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec *
|
||||||
self);
|
self);
|
||||||
|
@ -1654,7 +1653,6 @@ gst_omx_video_dec_start (GstVideoDecoder * decoder)
|
||||||
self = GST_OMX_VIDEO_DEC (decoder);
|
self = GST_OMX_VIDEO_DEC (decoder);
|
||||||
|
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1688,7 +1686,6 @@ gst_omx_video_dec_stop (GstVideoDecoder * decoder)
|
||||||
|
|
||||||
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
self->eos = FALSE;
|
|
||||||
|
|
||||||
g_mutex_lock (&self->drain_lock);
|
g_mutex_lock (&self->drain_lock);
|
||||||
self->draining = FALSE;
|
self->draining = FALSE;
|
||||||
|
@ -1862,7 +1859,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Need to disable and drain decoder");
|
GST_DEBUG_OBJECT (self, "Need to disable and drain decoder");
|
||||||
|
|
||||||
gst_omx_video_dec_drain (self, FALSE);
|
gst_omx_video_dec_drain (self);
|
||||||
gst_omx_video_dec_flush (decoder);
|
gst_omx_video_dec_flush (decoder);
|
||||||
gst_omx_port_set_flushing (out_port, 5 * GST_SECOND, TRUE);
|
gst_omx_port_set_flushing (out_port, 5 * GST_SECOND, TRUE);
|
||||||
|
|
||||||
|
@ -2067,15 +2064,7 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder)
|
||||||
if (gst_omx_component_get_state (self->dec, 0) == OMX_StateLoaded)
|
if (gst_omx_component_get_state (self->dec, 0) == OMX_StateLoaded)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* 0) Wait until the srcpad loop is stopped,
|
/* 0) Pause the components */
|
||||||
* unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks
|
|
||||||
* caused by using this lock from inside the loop function */
|
|
||||||
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
|
||||||
gst_pad_stop_task (GST_VIDEO_DECODER_SRC_PAD (decoder));
|
|
||||||
GST_DEBUG_OBJECT (self, "Flushing -- task stopped");
|
|
||||||
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
|
||||||
|
|
||||||
/* 1) Pause the components */
|
|
||||||
if (gst_omx_component_get_state (self->dec, 0) == OMX_StateExecuting) {
|
if (gst_omx_component_get_state (self->dec, 0) == OMX_StateExecuting) {
|
||||||
gst_omx_component_set_state (self->dec, OMX_StatePause);
|
gst_omx_component_set_state (self->dec, OMX_StatePause);
|
||||||
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE);
|
||||||
|
@ -2089,6 +2078,14 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* 1) Wait until the srcpad loop is stopped,
|
||||||
|
* unlock GST_VIDEO_DECODER_STREAM_LOCK to prevent deadlocks
|
||||||
|
* caused by using this lock from inside the loop function */
|
||||||
|
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
||||||
|
gst_pad_stop_task (GST_VIDEO_DECODER_SRC_PAD (decoder));
|
||||||
|
GST_DEBUG_OBJECT (self, "Flushing -- task stopped");
|
||||||
|
GST_VIDEO_DECODER_STREAM_LOCK (self);
|
||||||
|
|
||||||
/* 2) Flush the ports */
|
/* 2) Flush the ports */
|
||||||
GST_DEBUG_OBJECT (self, "flushing ports");
|
GST_DEBUG_OBJECT (self, "flushing ports");
|
||||||
gst_omx_port_set_flushing (self->dec_in_port, 5 * GST_SECOND, TRUE);
|
gst_omx_port_set_flushing (self->dec_in_port, 5 * GST_SECOND, TRUE);
|
||||||
|
@ -2135,7 +2132,6 @@ gst_omx_video_dec_flush (GstVideoDecoder * decoder)
|
||||||
|
|
||||||
/* Reset our state */
|
/* Reset our state */
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
GST_DEBUG_OBJECT (self, "Flush finished");
|
GST_DEBUG_OBJECT (self, "Flush finished");
|
||||||
|
@ -2162,12 +2158,6 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Handling frame");
|
GST_DEBUG_OBJECT (self, "Handling frame");
|
||||||
|
|
||||||
if (self->eos) {
|
|
||||||
GST_WARNING_OBJECT (self, "Got frame after EOS");
|
|
||||||
gst_video_codec_frame_unref (frame);
|
|
||||||
return GST_FLOW_EOS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!self->started) {
|
if (!self->started) {
|
||||||
if (!GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame)) {
|
if (!GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame)) {
|
||||||
gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame);
|
gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame);
|
||||||
|
@ -2434,11 +2424,11 @@ gst_omx_video_dec_finish (GstVideoDecoder * decoder)
|
||||||
|
|
||||||
self = GST_OMX_VIDEO_DEC (decoder);
|
self = GST_OMX_VIDEO_DEC (decoder);
|
||||||
|
|
||||||
return gst_omx_video_dec_drain (self, TRUE);
|
return gst_omx_video_dec_drain (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_omx_video_dec_drain (GstOMXVideoDec * self, gboolean is_eos)
|
gst_omx_video_dec_drain (GstOMXVideoDec * self)
|
||||||
{
|
{
|
||||||
GstOMXVideoDecClass *klass;
|
GstOMXVideoDecClass *klass;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
|
@ -2455,14 +2445,6 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self, gboolean is_eos)
|
||||||
}
|
}
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
|
|
||||||
/* Don't send EOS buffer twice, this doesn't work */
|
|
||||||
if (self->eos) {
|
|
||||||
GST_DEBUG_OBJECT (self, "Component is EOS already");
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
if (is_eos)
|
|
||||||
self->eos = TRUE;
|
|
||||||
|
|
||||||
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
||||||
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
|
@ -74,9 +74,6 @@ struct _GstOMXVideoDec
|
||||||
/* TRUE if EOS buffers shouldn't be forwarded */
|
/* TRUE if EOS buffers shouldn't be forwarded */
|
||||||
gboolean draining;
|
gboolean draining;
|
||||||
|
|
||||||
/* TRUE if upstream is EOS */
|
|
||||||
gboolean eos;
|
|
||||||
|
|
||||||
GstFlowReturn downstream_flow_ret;
|
GstFlowReturn downstream_flow_ret;
|
||||||
#ifdef USE_OMX_TARGET_RPI
|
#ifdef USE_OMX_TARGET_RPI
|
||||||
GstOMXComponent *egl_render;
|
GstOMXComponent *egl_render;
|
||||||
|
|
|
@ -83,8 +83,7 @@ static gboolean gst_omx_video_enc_propose_allocation (GstVideoEncoder * encoder,
|
||||||
static GstCaps *gst_omx_video_enc_getcaps (GstVideoEncoder * encoder,
|
static GstCaps *gst_omx_video_enc_getcaps (GstVideoEncoder * encoder,
|
||||||
GstCaps * filter);
|
GstCaps * filter);
|
||||||
|
|
||||||
static GstFlowReturn gst_omx_video_enc_drain (GstOMXVideoEnc * self,
|
static GstFlowReturn gst_omx_video_enc_drain (GstOMXVideoEnc * self);
|
||||||
gboolean at_eos);
|
|
||||||
|
|
||||||
static GstFlowReturn gst_omx_video_enc_handle_output_frame (GstOMXVideoEnc *
|
static GstFlowReturn gst_omx_video_enc_handle_output_frame (GstOMXVideoEnc *
|
||||||
self, GstOMXPort * port, GstOMXBuffer * buf, GstVideoCodecFrame * frame);
|
self, GstOMXPort * port, GstOMXBuffer * buf, GstVideoCodecFrame * frame);
|
||||||
|
@ -882,7 +881,6 @@ gst_omx_video_enc_start (GstVideoEncoder * encoder)
|
||||||
self = GST_OMX_VIDEO_ENC (encoder);
|
self = GST_OMX_VIDEO_ENC (encoder);
|
||||||
|
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -907,7 +905,6 @@ gst_omx_video_enc_stop (GstVideoEncoder * encoder)
|
||||||
|
|
||||||
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
self->downstream_flow_ret = GST_FLOW_FLUSHING;
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
self->eos = FALSE;
|
|
||||||
|
|
||||||
if (self->input_state)
|
if (self->input_state)
|
||||||
gst_video_codec_state_unref (self->input_state);
|
gst_video_codec_state_unref (self->input_state);
|
||||||
|
@ -951,7 +948,7 @@ gst_omx_video_enc_set_format (GstVideoEncoder * encoder,
|
||||||
*/
|
*/
|
||||||
if (needs_disable) {
|
if (needs_disable) {
|
||||||
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
GST_DEBUG_OBJECT (self, "Need to disable and drain encoder");
|
||||||
gst_omx_video_enc_drain (self, FALSE);
|
gst_omx_video_enc_drain (self);
|
||||||
gst_omx_port_set_flushing (self->enc_out_port, 5 * GST_SECOND, TRUE);
|
gst_omx_port_set_flushing (self->enc_out_port, 5 * GST_SECOND, TRUE);
|
||||||
|
|
||||||
/* Wait until the srcpad loop is finished,
|
/* Wait until the srcpad loop is finished,
|
||||||
|
@ -1206,7 +1203,6 @@ gst_omx_video_enc_flush (GstVideoEncoder * encoder)
|
||||||
|
|
||||||
/* Start the srcpad loop again */
|
/* Start the srcpad loop again */
|
||||||
self->last_upstream_ts = 0;
|
self->last_upstream_ts = 0;
|
||||||
self->eos = FALSE;
|
|
||||||
self->downstream_flow_ret = GST_FLOW_OK;
|
self->downstream_flow_ret = GST_FLOW_OK;
|
||||||
gst_pad_start_task (GST_VIDEO_ENCODER_SRC_PAD (self),
|
gst_pad_start_task (GST_VIDEO_ENCODER_SRC_PAD (self),
|
||||||
(GstTaskFunction) gst_omx_video_enc_loop, encoder, NULL);
|
(GstTaskFunction) gst_omx_video_enc_loop, encoder, NULL);
|
||||||
|
@ -1394,12 +1390,6 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "Handling frame");
|
GST_DEBUG_OBJECT (self, "Handling frame");
|
||||||
|
|
||||||
if (self->eos) {
|
|
||||||
GST_WARNING_OBJECT (self, "Got frame after EOS");
|
|
||||||
gst_video_codec_frame_unref (frame);
|
|
||||||
return GST_FLOW_EOS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
if (self->downstream_flow_ret != GST_FLOW_OK) {
|
||||||
gst_video_codec_frame_unref (frame);
|
gst_video_codec_frame_unref (frame);
|
||||||
return self->downstream_flow_ret;
|
return self->downstream_flow_ret;
|
||||||
|
@ -1606,11 +1596,11 @@ gst_omx_video_enc_finish (GstVideoEncoder * encoder)
|
||||||
|
|
||||||
self = GST_OMX_VIDEO_ENC (encoder);
|
self = GST_OMX_VIDEO_ENC (encoder);
|
||||||
|
|
||||||
return gst_omx_video_enc_drain (self, TRUE);
|
return gst_omx_video_enc_drain (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_omx_video_enc_drain (GstOMXVideoEnc * self, gboolean at_eos)
|
gst_omx_video_enc_drain (GstOMXVideoEnc * self)
|
||||||
{
|
{
|
||||||
GstOMXVideoEncClass *klass;
|
GstOMXVideoEncClass *klass;
|
||||||
GstOMXBuffer *buf;
|
GstOMXBuffer *buf;
|
||||||
|
@ -1627,14 +1617,6 @@ gst_omx_video_enc_drain (GstOMXVideoEnc * self, gboolean at_eos)
|
||||||
}
|
}
|
||||||
self->started = FALSE;
|
self->started = FALSE;
|
||||||
|
|
||||||
/* Don't send EOS buffer twice, this doesn't work */
|
|
||||||
if (self->eos) {
|
|
||||||
GST_DEBUG_OBJECT (self, "Component is EOS already");
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
|
||||||
if (at_eos)
|
|
||||||
self->eos = TRUE;
|
|
||||||
|
|
||||||
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
if ((klass->cdata.hacks & GST_OMX_HACK_NO_EMPTY_EOS_BUFFER)) {
|
||||||
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
GST_WARNING_OBJECT (self, "Component does not support empty EOS buffers");
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
|
@ -67,9 +67,6 @@ struct _GstOMXVideoEnc
|
||||||
/* TRUE if EOS buffers shouldn't be forwarded */
|
/* TRUE if EOS buffers shouldn't be forwarded */
|
||||||
gboolean draining;
|
gboolean draining;
|
||||||
|
|
||||||
/* TRUE if upstream is EOS */
|
|
||||||
gboolean eos;
|
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
guint32 control_rate;
|
guint32 control_rate;
|
||||||
guint32 target_bitrate;
|
guint32 target_bitrate;
|
||||||
|
|
Loading…
Reference in a new issue