From 5b45cb0810e935c98bfba2349d774444237ce52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 25 Feb 2013 12:38:27 +0100 Subject: [PATCH] omx: Auto-detect the port indizes if possible --- omx/gstomx.c | 8 +++---- omx/gstomxaudioenc.c | 33 ++++++++++++++++++++++---- omx/gstomxvideodec.c | 56 ++++++++++++++++++++++++++++++++------------ omx/gstomxvideoenc.c | 33 ++++++++++++++++++++++---- 4 files changed, 103 insertions(+), 27 deletions(-) diff --git a/omx/gstomx.c b/omx/gstomx.c index 711079b5ec..16b4958762 100644 --- a/omx/gstomx.c +++ b/omx/gstomx.c @@ -2587,9 +2587,9 @@ _class_init (gpointer g_class, gpointer data) in_port_index = g_key_file_get_integer (config, element_name, "in-port-index", &err); if (err != NULL) { - GST_DEBUG ("No 'in-port-index' set for element '%s', assuming 0: %s", + GST_DEBUG ("No 'in-port-index' set for element '%s', auto-detecting: %s", element_name, err->message); - in_port_index = 0; + in_port_index = -1; g_error_free (err); } class_data->in_port_index = in_port_index; @@ -2598,9 +2598,9 @@ _class_init (gpointer g_class, gpointer data) out_port_index = g_key_file_get_integer (config, element_name, "out-port-index", &err); if (err != NULL) { - GST_DEBUG ("No 'out-port-index' set for element '%s', assuming 1: %s", + GST_DEBUG ("No 'out-port-index' set for element '%s', auto-detecting: %s", element_name, err->message); - out_port_index = 1; + out_port_index = -1; g_error_free (err); } class_data->out_port_index = out_port_index; diff --git a/omx/gstomxaudioenc.c b/omx/gstomxaudioenc.c index 0b707fb99a..c7a8309624 100644 --- a/omx/gstomxaudioenc.c +++ b/omx/gstomxaudioenc.c @@ -103,6 +103,7 @@ static gboolean gst_omx_audio_enc_open (GstOMXAudioEnc * self) { GstOMXAudioEncClass *klass = GST_OMX_AUDIO_ENC_GET_CLASS (self); + gint in_port_index, out_port_index; self->enc = gst_omx_component_new (GST_OBJECT_CAST (self), klass->cdata.core_name, @@ -117,10 +118,34 @@ gst_omx_audio_enc_open (GstOMXAudioEnc * self) GST_CLOCK_TIME_NONE) != OMX_StateLoaded) return FALSE; - self->enc_in_port = - gst_omx_component_add_port (self->enc, klass->cdata.in_port_index); - self->enc_out_port = - gst_omx_component_add_port (self->enc, klass->cdata.out_port_index); + in_port_index = klass->cdata.in_port_index; + out_port_index = klass->cdata.out_port_index; + + if (in_port_index == -1 || out_port_index == -1) { + OMX_PORT_PARAM_TYPE param; + OMX_ERRORTYPE err; + + GST_OMX_INIT_STRUCT (¶m); + + err = + gst_omx_component_get_parameter (self->enc, OMX_IndexParamAudioInit, + ¶m); + if (err != OMX_ErrorNone) { + GST_WARNING_OBJECT (self, "Couldn't get port information: %s (0x%08x)", + gst_omx_error_to_string (err), err); + /* Fallback */ + in_port_index = 0; + out_port_index = 1; + } else { + GST_DEBUG_OBJECT (self, "Detected %u ports, starting at %u", param.nPorts, + param.nStartPortNumber); + in_port_index = param.nStartPortNumber + 0; + out_port_index = param.nStartPortNumber + 1; + } + } + + self->enc_in_port = gst_omx_component_add_port (self->enc, in_port_index); + self->enc_out_port = gst_omx_component_add_port (self->enc, out_port_index); if (!self->enc_in_port || !self->enc_out_port) return FALSE; diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index ea318f8778..9a78463d58 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -127,6 +127,7 @@ gst_omx_video_dec_open (GstVideoDecoder * decoder) { GstOMXVideoDec *self = GST_OMX_VIDEO_DEC (decoder); GstOMXVideoDecClass *klass = GST_OMX_VIDEO_DEC_GET_CLASS (self); + gint in_port_index, out_port_index; GST_DEBUG_OBJECT (self, "Opening decoder"); @@ -143,10 +144,33 @@ gst_omx_video_dec_open (GstVideoDecoder * decoder) GST_CLOCK_TIME_NONE) != OMX_StateLoaded) return FALSE; - self->dec_in_port = - gst_omx_component_add_port (self->dec, klass->cdata.in_port_index); - self->dec_out_port = - gst_omx_component_add_port (self->dec, klass->cdata.out_port_index); + in_port_index = klass->cdata.in_port_index; + out_port_index = klass->cdata.out_port_index; + + if (in_port_index == -1 || out_port_index == -1) { + OMX_PORT_PARAM_TYPE param; + OMX_ERRORTYPE err; + + GST_OMX_INIT_STRUCT (¶m); + + err = + gst_omx_component_get_parameter (self->dec, OMX_IndexParamVideoInit, + ¶m); + if (err != OMX_ErrorNone) { + GST_WARNING_OBJECT (self, "Couldn't get port information: %s (0x%08x)", + gst_omx_error_to_string (err), err); + /* Fallback */ + in_port_index = 0; + out_port_index = 1; + } else { + GST_DEBUG_OBJECT (self, "Detected %u ports, starting at %u", param.nPorts, + param.nStartPortNumber); + in_port_index = param.nStartPortNumber + 0; + out_port_index = param.nStartPortNumber + 1; + } + } + self->dec_in_port = gst_omx_component_add_port (self->dec, in_port_index); + self->dec_out_port = gst_omx_component_add_port (self->dec, out_port_index); if (!self->dec_in_port || !self->dec_out_port) return FALSE; @@ -256,8 +280,8 @@ gst_omx_video_dec_change_state (GstElement * element, GstStateChange transition) return ret; ret = - GST_ELEMENT_CLASS (gst_omx_video_dec_parent_class)->change_state (element, - transition); + GST_ELEMENT_CLASS (gst_omx_video_dec_parent_class)->change_state + (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; @@ -369,8 +393,8 @@ _find_nearest_frame (GstOMXVideoDec * self, GstOMXBuffer * buf) } static gboolean -gst_omx_video_dec_fill_buffer (GstOMXVideoDec * self, GstOMXBuffer * inbuf, - GstBuffer * outbuf) +gst_omx_video_dec_fill_buffer (GstOMXVideoDec * self, + GstOMXBuffer * inbuf, GstBuffer * outbuf) { GstVideoCodecState *state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (self)); @@ -577,8 +601,8 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) GST_DEBUG_OBJECT (self, "Setting output state: format %s, width %d, height %d", - gst_video_format_to_string (format), port_def.format.video.nFrameWidth, - port_def.format.video.nFrameHeight); + gst_video_format_to_string (format), + port_def.format.video.nFrameWidth, port_def.format.video.nFrameHeight); state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (self), format, port_def.format.video.nFrameWidth, @@ -616,8 +640,8 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) } if (buf) { - GST_DEBUG_OBJECT (self, "Handling buffer: 0x%08x %lu", buf->omx_buf->nFlags, - buf->omx_buf->nTimeStamp); + GST_DEBUG_OBJECT (self, "Handling buffer: 0x%08x %lu", + buf->omx_buf->nFlags, buf->omx_buf->nTimeStamp); GST_VIDEO_DECODER_STREAM_LOCK (self); frame = _find_nearest_frame (self, buf); @@ -653,7 +677,8 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) flow_ret = gst_pad_push (GST_VIDEO_DECODER_SRC_PAD (self), outbuf); } else if (buf->omx_buf->nFilledLen > 0) { - if ((flow_ret = gst_video_decoder_allocate_output_frame (GST_VIDEO_DECODER + if ((flow_ret = + gst_video_decoder_allocate_output_frame (GST_VIDEO_DECODER (self), frame)) == GST_FLOW_OK) { /* FIXME: This currently happens because of a race condition too. * We first need to reconfigure the output port and then the input @@ -741,8 +766,9 @@ flow_error: gst_event_new_eos ()); gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self)); } else if (flow_ret == GST_FLOW_NOT_LINKED || flow_ret < GST_FLOW_EOS) { - GST_ELEMENT_ERROR (self, STREAM, FAILED, ("Internal data stream error."), - ("stream stopped, reason %s", gst_flow_get_name (flow_ret))); + GST_ELEMENT_ERROR (self, STREAM, FAILED, + ("Internal data stream error."), ("stream stopped, reason %s", + gst_flow_get_name (flow_ret))); gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self), gst_event_new_eos ()); diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c index 21c588cb27..967ccac0be 100644 --- a/omx/gstomxvideoenc.c +++ b/omx/gstomxvideoenc.c @@ -218,6 +218,7 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder) { GstOMXVideoEnc *self = GST_OMX_VIDEO_ENC (encoder); GstOMXVideoEncClass *klass = GST_OMX_VIDEO_ENC_GET_CLASS (self); + gint in_port_index, out_port_index; self->enc = gst_omx_component_new (GST_OBJECT_CAST (self), klass->cdata.core_name, @@ -232,10 +233,34 @@ gst_omx_video_enc_open (GstVideoEncoder * encoder) GST_CLOCK_TIME_NONE) != OMX_StateLoaded) return FALSE; - self->enc_in_port = - gst_omx_component_add_port (self->enc, klass->cdata.in_port_index); - self->enc_out_port = - gst_omx_component_add_port (self->enc, klass->cdata.out_port_index); + in_port_index = klass->cdata.in_port_index; + out_port_index = klass->cdata.out_port_index; + + if (in_port_index == -1 || out_port_index == -1) { + OMX_PORT_PARAM_TYPE param; + OMX_ERRORTYPE err; + + GST_OMX_INIT_STRUCT (¶m); + + err = + gst_omx_component_get_parameter (self->enc, OMX_IndexParamVideoInit, + ¶m); + if (err != OMX_ErrorNone) { + GST_WARNING_OBJECT (self, "Couldn't get port information: %s (0x%08x)", + gst_omx_error_to_string (err), err); + /* Fallback */ + in_port_index = 0; + out_port_index = 1; + } else { + GST_DEBUG_OBJECT (self, "Detected %u ports, starting at %u", param.nPorts, + param.nStartPortNumber); + in_port_index = param.nStartPortNumber + 0; + out_port_index = param.nStartPortNumber + 1; + } + } + + self->enc_in_port = gst_omx_component_add_port (self->enc, in_port_index); + self->enc_out_port = gst_omx_component_add_port (self->enc, out_port_index); if (!self->enc_in_port || !self->enc_out_port) return FALSE;