summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2013-03-11 10:04:10 +0100
committerJosep Torra <n770galaxy@gmail.com>2013-03-11 11:40:26 +0100
commitb0c39ffe33563b6f0e5bf887cb5844236c9f8065 (patch)
treee6cbf73a164b763429138ab2058eaf80589f5b77
parente30741bdb2664b50288462261eb58da6fe386a17 (diff)
downloadgst-omx-b0c39ffe33563b6f0e5bf887cb5844236c9f8065.tar.gz
omx: Catch errors when releasing buffers to a port and handle them
Conflicts: omx/gstomxvideodec.c
-rw-r--r--omx/gstomxaudioenc.c51
-rw-r--r--omx/gstomxvideodec.c50
-rw-r--r--omx/gstomxvideoenc.c45
3 files changed, 122 insertions, 24 deletions
diff --git a/omx/gstomxaudioenc.c b/omx/gstomxaudioenc.c
index 7173b15..799b6d5 100644
--- a/omx/gstomxaudioenc.c
+++ b/omx/gstomxaudioenc.c
@@ -308,6 +308,7 @@ gst_omx_audio_enc_loop (GstOMXAudioEnc * self)
GstFlowReturn flow_ret = GST_FLOW_OK;
GstOMXAcquireBufferReturn acq_return;
gboolean is_eos;
+ OMX_ERRORTYPE err;
klass = GST_OMX_AUDIO_ENC_GET_CLASS (self);
@@ -323,7 +324,6 @@ gst_omx_audio_enc_loop (GstOMXAudioEnc * self)
GstAudioInfo *info =
gst_audio_encoder_get_audio_info (GST_AUDIO_ENCODER (self));
GstCaps *caps;
- OMX_ERRORTYPE err;
GST_DEBUG_OBJECT (self, "Port settings have changed, updating caps");
@@ -494,7 +494,9 @@ gst_omx_audio_enc_loop (GstOMXAudioEnc * self)
gst_flow_get_name (flow_ret));
}
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
self->downstream_flow_ret = flow_ret;
} else {
@@ -570,6 +572,18 @@ caps_failed:
self->started = FALSE;
return;
}
+release_error:
+ {
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase output buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ gst_pad_push_event (GST_AUDIO_ENCODER_SRC_PAD (self), gst_event_new_eos ());
+ gst_pad_pause_task (GST_AUDIO_ENCODER_SRC_PAD (self));
+ self->downstream_flow_ret = GST_FLOW_ERROR;
+ self->started = FALSE;
+ GST_AUDIO_ENCODER_STREAM_UNLOCK (self);
+ return;
+ }
}
static gboolean
@@ -862,6 +876,7 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
gsize size;
guint offset = 0;
GstClockTime timestamp, duration, timestamp_offset = 0;
+ OMX_ERRORTYPE err;
self = GST_OMX_AUDIO_ENC (encoder);
@@ -899,8 +914,6 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
GST_AUDIO_ENCODER_STREAM_LOCK (self);
goto flushing;
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
- OMX_ERRORTYPE err;
-
/* Reallocate all buffers */
err = gst_omx_port_set_enabled (port, FALSE);
if (err != OMX_ErrorNone) {
@@ -997,7 +1010,9 @@ gst_omx_audio_enc_handle_frame (GstAudioEncoder * encoder, GstBuffer * inbuf)
offset += buf->omx_buf->nFilledLen;
self->started = TRUE;
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
}
GST_DEBUG_OBJECT (self, "Passed frame to component");
@@ -1031,6 +1046,13 @@ reconfigure_error:
("Unable to reconfigure input port"));
return GST_FLOW_ERROR;
}
+release_error:
+ {
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase input buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ return GST_FLOW_ERROR;
+ }
}
static gboolean
@@ -1038,6 +1060,7 @@ 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);
@@ -1084,8 +1107,13 @@ gst_omx_audio_enc_sink_event (GstAudioEncoder * encoder, GstEvent * event)
GST_SECOND);
buf->omx_buf->nTickCount = 0;
buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
- gst_omx_port_release_buffer (self->enc_in_port, buf);
- GST_DEBUG_OBJECT (self, "Sent EOS to the component");
+ 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);
}
@@ -1104,6 +1132,7 @@ gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
GstOMXAudioEncClass *klass;
GstOMXBuffer *buf;
GstOMXAcquireBufferReturn acq_ret;
+ OMX_ERRORTYPE err;
GST_DEBUG_OBJECT (self, "Draining component");
@@ -1150,7 +1179,13 @@ gst_omx_audio_enc_drain (GstOMXAudioEnc * self)
GST_SECOND);
buf->omx_buf->nTickCount = 0;
buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
- gst_omx_port_release_buffer (self->enc_in_port, buf);
+ err = gst_omx_port_release_buffer (self->enc_in_port, buf);
+ if (err != OMX_ErrorNone) {
+ GST_ERROR_OBJECT (self, "Failed to drain component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err);
+ GST_AUDIO_ENCODER_STREAM_LOCK (self);
+ return GST_FLOW_ERROR;
+ }
GST_DEBUG_OBJECT (self, "Waiting until component is drained");
g_cond_wait (self->drain_cond, self->drain_lock);
GST_DEBUG_OBJECT (self, "Drained component");
diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
index 62ca923..e4796f2 100644
--- a/omx/gstomxvideodec.c
+++ b/omx/gstomxvideodec.c
@@ -672,6 +672,7 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
GstOMXAcquireBufferReturn acq_return;
GstClockTimeDiff deadline;
gboolean is_eos;
+ OMX_ERRORTYPE err;
klass = GST_OMX_VIDEO_DEC_GET_CLASS (self);
@@ -684,7 +685,6 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
if (!GST_PAD_CAPS (GST_VIDEO_DECODER_SRC_PAD (self)) ||
acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
- OMX_ERRORTYPE err;
GstVideoCodecState *state;
OMX_PARAM_PORTDEFINITIONTYPE port_def;
GstVideoFormat format;
@@ -872,8 +872,11 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
gst_flow_get_name (flow_ret));
}
- if (buf)
- gst_omx_port_release_buffer (port, buf);
+ if (buf) {
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
+ }
self->downstream_flow_ret = flow_ret;
} else {
@@ -966,6 +969,18 @@ caps_failed:
self->started = FALSE;
return;
}
+release_error:
+ {
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase output buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self), gst_event_new_eos ());
+ gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
+ self->downstream_flow_ret = GST_FLOW_ERROR;
+ self->started = FALSE;
+ GST_VIDEO_DECODER_STREAM_UNLOCK (self);
+ return;
+ }
}
static gboolean
@@ -1435,6 +1450,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
GstBuffer *codec_data = NULL;
guint offset = 0, size;
GstClockTime timestamp, duration, timestamp_offset = 0;
+ OMX_ERRORTYPE err;
self = GST_OMX_VIDEO_DEC (decoder);
klass = GST_OMX_VIDEO_DEC_GET_CLASS (self);
@@ -1484,8 +1500,6 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
GST_VIDEO_DECODER_STREAM_LOCK (self);
goto flushing;
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
- OMX_ERRORTYPE err;
-
/* Reallocate all buffers */
err = gst_omx_port_set_enabled (port, FALSE);
if (err != OMX_ErrorNone) {
@@ -1570,8 +1584,10 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
GST_BUFFER_DATA (codec_data), buf->omx_buf->nFilledLen);
self->started = TRUE;
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
gst_buffer_replace (&self->codec_data, NULL);
+ if (err != OMX_ErrorNone)
+ goto release_error;
/* Acquire new buffer for the actual frame */
continue;
}
@@ -1624,7 +1640,9 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
offset += buf->omx_buf->nFilledLen;
self->started = TRUE;
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
}
gst_video_codec_frame_unref (frame);
@@ -1682,6 +1700,14 @@ reconfigure_error:
("Unable to reconfigure input port"));
return GST_FLOW_ERROR;
}
+release_error:
+ {
+ gst_video_codec_frame_unref (frame);
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase input buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ return GST_FLOW_ERROR;
+ }
}
static GstFlowReturn
@@ -1700,6 +1726,7 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self, gboolean is_eos)
GstOMXVideoDecClass *klass;
GstOMXBuffer *buf;
GstOMXAcquireBufferReturn acq_ret;
+ OMX_ERRORTYPE err;
GST_DEBUG_OBJECT (self, "Draining component");
@@ -1748,7 +1775,14 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self, gboolean is_eos)
GST_SECOND);
buf->omx_buf->nTickCount = 0;
buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
- gst_omx_port_release_buffer (self->dec_in_port, buf);
+ err = gst_omx_port_release_buffer (self->dec_in_port, buf);
+ if (err != OMX_ErrorNone) {
+ GST_ERROR_OBJECT (self, "Failed to drain component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err);
+ GST_VIDEO_DECODER_STREAM_LOCK (self);
+ return GST_FLOW_ERROR;
+ }
+
GST_DEBUG_OBJECT (self, "Waiting until component is drained");
if (G_UNLIKELY (self->dec->hacks & GST_OMX_HACK_DRAIN_MAY_NOT_RETURN)) {
diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c
index 4ef49dd..5aeab96 100644
--- a/omx/gstomxvideoenc.c
+++ b/omx/gstomxvideoenc.c
@@ -731,6 +731,7 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
GstFlowReturn flow_ret = GST_FLOW_OK;
GstOMXAcquireBufferReturn acq_return;
gboolean is_eos;
+ OMX_ERRORTYPE err;
klass = GST_OMX_VIDEO_ENC_GET_CLASS (self);
@@ -745,7 +746,6 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
|| acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
GstCaps *caps;
GstVideoCodecState *state;
- OMX_ERRORTYPE err;
GST_DEBUG_OBJECT (self, "Port settings have changed, updating caps");
@@ -866,7 +866,9 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self)
gst_flow_get_name (flow_ret));
}
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
self->downstream_flow_ret = flow_ret;
} else {
@@ -944,6 +946,18 @@ caps_failed:
self->started = FALSE;
return;
}
+release_error:
+ {
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase output buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ gst_pad_push_event (GST_VIDEO_ENCODER_SRC_PAD (self), gst_event_new_eos ());
+ gst_pad_pause_task (GST_VIDEO_ENCODER_SRC_PAD (self));
+ self->downstream_flow_ret = GST_FLOW_ERROR;
+ self->started = FALSE;
+ GST_VIDEO_ENCODER_STREAM_UNLOCK (self);
+ return;
+ }
}
static gboolean
@@ -1514,6 +1528,7 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
GstOMXVideoEnc *self;
GstOMXPort *port;
GstOMXBuffer *buf;
+ OMX_ERRORTYPE err;
self = GST_OMX_VIDEO_ENC (encoder);
@@ -1549,8 +1564,6 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
GST_VIDEO_ENCODER_STREAM_LOCK (self);
goto flushing;
} else if (acq_ret == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE) {
- OMX_ERRORTYPE err;
-
/* Reallocate all buffers */
err = gst_omx_port_set_enabled (port, FALSE);
if (err != OMX_ErrorNone) {
@@ -1622,7 +1635,6 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
GST_DEBUG_OBJECT (self, "Handling frame");
if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) {
- OMX_ERRORTYPE err;
OMX_CONFIG_INTRAREFRESHVOPTYPE config;
GST_OMX_INIT_STRUCT (&config);
@@ -1666,14 +1678,16 @@ gst_omx_video_enc_handle_frame (GstVideoEncoder * encoder,
(GDestroyNotify) buffer_identification_free);
self->started = TRUE;
- gst_omx_port_release_buffer (port, buf);
+ err = gst_omx_port_release_buffer (port, buf);
+ if (err != OMX_ErrorNone)
+ goto release_error;
GST_DEBUG_OBJECT (self, "Passed frame to component");
}
gst_video_codec_frame_unref (frame);
- return self->downstream_flow_ret;;
+ return self->downstream_flow_ret;
full_buffer:
{
@@ -1720,6 +1734,14 @@ buffer_fill_error:
gst_video_codec_frame_unref (frame);
return GST_FLOW_ERROR;
}
+release_error:
+ {
+ gst_video_codec_frame_unref (frame);
+ GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
+ ("Failed to relase input buffer to component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err));
+ return GST_FLOW_ERROR;
+ }
}
static GstFlowReturn
@@ -1738,6 +1760,7 @@ gst_omx_video_enc_drain (GstOMXVideoEnc * self, gboolean at_eos)
GstOMXVideoEncClass *klass;
GstOMXBuffer *buf;
GstOMXAcquireBufferReturn acq_ret;
+ OMX_ERRORTYPE err;
GST_DEBUG_OBJECT (self, "Draining component");
@@ -1786,7 +1809,13 @@ gst_omx_video_enc_drain (GstOMXVideoEnc * self, gboolean at_eos)
GST_SECOND);
buf->omx_buf->nTickCount = 0;
buf->omx_buf->nFlags |= OMX_BUFFERFLAG_EOS;
- gst_omx_port_release_buffer (self->enc_in_port, buf);
+ err = gst_omx_port_release_buffer (self->enc_in_port, buf);
+ if (err != OMX_ErrorNone) {
+ GST_ERROR_OBJECT (self, "Failed to drain component: %s (0x%08x)",
+ gst_omx_error_to_string (err), err);
+ GST_VIDEO_ENCODER_STREAM_LOCK (self);
+ return GST_FLOW_ERROR;
+ }
GST_DEBUG_OBJECT (self, "Waiting until component is drained");
g_cond_wait (self->drain_cond, self->drain_lock);
GST_DEBUG_OBJECT (self, "Drained component");