From: Sejun Park Date: Wed, 8 Mar 2017 05:52:27 +0000 (+0900) Subject: Enabled dynamic port reconfiguration without no-component-reconfigure X-Git-Tag: accepted/tizen/unified/20170406.053543~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F48%2F117948%2F9;p=platform%2Fupstream%2Fgst-omx.git Enabled dynamic port reconfiguration without no-component-reconfigure Change-Id: Iddba0199399633268679f4243368a4911fedc043 --- diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index cce0852..7874971 100755 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -84,6 +84,10 @@ static OMX_ERRORTYPE gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * static OMX_ERRORTYPE gst_omx_video_dec_deallocate_output_buffers (GstOMXVideoDec * self); +#ifdef TIZEN_FEATURE_OMX +static gboolean gst_omx_video_dec_acquire_request_flush_buffer (GstOMXVideoDec * self, GstBuffer ** flush_request_buffer); +#endif + enum { PROP_0 @@ -1366,6 +1370,9 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) GstOMXAcquireBufferReturn acq_return; GstClockTimeDiff deadline; OMX_ERRORTYPE err; +#ifdef TIZEN_FEATURE_OMX + GstBuffer *flush_request_buffer = NULL; +#endif #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) port = self->eglimage ? self->egl_out_port : self->dec_out_port; @@ -1393,6 +1400,17 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self) /* Reallocate all buffers */ if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE && gst_omx_port_is_enabled (port)) { +#ifdef TIZEN_FEATURE_OMX + if(gst_omx_video_dec_acquire_request_flush_buffer (self, &flush_request_buffer)) { + flow_ret = gst_pad_push (GST_VIDEO_DECODER_SRC_PAD (self), flush_request_buffer); + + if (flow_ret != GST_FLOW_OK) { + gst_buffer_unref(flush_request_buffer); + flush_request_buffer = NULL; + goto reconfigure_error; + } + } +#endif err = gst_omx_port_set_enabled (port, FALSE); if (err != OMX_ErrorNone) goto reconfigure_error; @@ -2092,27 +2110,33 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, gst_omx_port_set_flushing (self->egl_out_port, 5 * GST_SECOND, TRUE); } #endif - if (gst_omx_port_set_enabled (self->dec_in_port, FALSE) != OMX_ErrorNone) return FALSE; - if (gst_omx_port_set_enabled (out_port, FALSE) != OMX_ErrorNone) - return FALSE; + if (gst_omx_port_wait_buffers_released (self->dec_in_port, 5 * GST_SECOND) != OMX_ErrorNone) return FALSE; - if (gst_omx_port_wait_buffers_released (out_port, - 1 * GST_SECOND) != OMX_ErrorNone) - return FALSE; + if (gst_omx_port_deallocate_buffers (self->dec_in_port) != OMX_ErrorNone) return FALSE; - if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone) - return FALSE; + if (gst_omx_port_wait_enabled (self->dec_in_port, 1 * GST_SECOND) != OMX_ErrorNone) return FALSE; - if (gst_omx_port_wait_enabled (out_port, 1 * GST_SECOND) != OMX_ErrorNone) +#ifndef TIZEN_FEATURE_OMX + if (gst_omx_port_set_enabled (out_port, FALSE) != OMX_ErrorNone) return FALSE; + if (gst_omx_port_wait_buffers_released (out_port, + 1 * GST_SECOND) != OMX_ErrorNone) + return FALSE; + + if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone) + return FALSE; + + if (gst_omx_port_wait_enabled (out_port, 1 * GST_SECOND) != OMX_ErrorNone) + return FALSE; +#endif #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) if (self->eglimage) { OMX_STATETYPE egl_state; @@ -2192,7 +2216,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, if (gst_omx_port_allocate_buffers (self->dec_in_port) != OMX_ErrorNone) return FALSE; #endif - +#ifndef TIZEN_FEATURE_OMX if ((klass->cdata.hacks & GST_OMX_HACK_NO_DISABLE_OUTPORT)) { if (gst_omx_port_set_enabled (self->dec_out_port, TRUE) != OMX_ErrorNone) return FALSE; @@ -2203,7 +2227,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, 5 * GST_SECOND) != OMX_ErrorNone) return FALSE; } - +#endif if (gst_omx_port_wait_enabled (self->dec_in_port, 5 * GST_SECOND) != OMX_ErrorNone) return FALSE; @@ -2261,7 +2285,6 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder, #endif } - if (gst_omx_component_get_state (self->dec, GST_CLOCK_TIME_NONE) != OMX_StateIdle) return FALSE; @@ -2830,3 +2853,42 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) return TRUE; } +#ifdef TIZEN_FEATURE_OMX +static gboolean +gst_omx_video_dec_acquire_request_flush_buffer (GstOMXVideoDec * self, GstBuffer ** flush_request_buffer) +{ + GstFlowReturn flow_ret = GST_FLOW_OK; + guint8 *dummy_data = NULL; + GstBuffer *buf = NULL; + MMVideoBuffer *mm_vbuffer = NULL; + + GST_DEBUG_OBJECT (self, "flush buffer request"); + + if (self->out_port_pool) { + if (gst_buffer_pool_is_active(self->out_port_pool)) { + dummy_data = g_malloc0(128*128); + buf = gst_buffer_new_wrapped(dummy_data, 128*128); + mm_vbuffer = g_malloc(sizeof(MMVideoBuffer)); + + mm_vbuffer->type = MM_VIDEO_BUFFER_TYPE_TBM_BO; + mm_vbuffer->size[0] = 0; + mm_vbuffer->flush_request = TRUE; + + gst_buffer_append_memory(buf, + gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, mm_vbuffer, sizeof(MMVideoBuffer), 0, + sizeof(MMVideoBuffer), mm_vbuffer, g_free)); + + *flush_request_buffer = buf; + + GST_DEBUG_OBJECT (self, "flush buffer requested"); + return TRUE; + } else { + GST_DEBUG_OBJECT (self, "the out port pool has not yet been activated"); + return FALSE; + } + } else { + GST_DEBUG_OBJECT (self, "the output port has not yet been activated"); + return FALSE; + } +} +#endif diff --git a/packaging/gst-omx.spec b/packaging/gst-omx.spec index 534677d..caa1578 100755 --- a/packaging/gst-omx.spec +++ b/packaging/gst-omx.spec @@ -1,6 +1,6 @@ Name: gst-omx Summary: GStreamer plug-in that allows communication with OpenMAX IL components -Version: 1.2.3 +Version: 1.2.4 Release: 1 License: LGPL-2.1+ Group: Multimedia/Framework