diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-03-11 10:04:10 +0100 |
---|---|---|
committer | Josep Torra <n770galaxy@gmail.com> | 2013-03-11 11:40:26 +0100 |
commit | b0c39ffe33563b6f0e5bf887cb5844236c9f8065 (patch) | |
tree | e6cbf73a164b763429138ab2058eaf80589f5b77 | |
parent | e30741bdb2664b50288462261eb58da6fe386a17 (diff) | |
download | gst-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.c | 51 | ||||
-rw-r--r-- | omx/gstomxvideodec.c | 50 | ||||
-rw-r--r-- | omx/gstomxvideoenc.c | 45 |
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"); |