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
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;
/* 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;
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;
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;
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;
#endif
}
-
if (gst_omx_component_get_state (self->dec,
GST_CLOCK_TIME_NONE) != OMX_StateIdle)
return FALSE;
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