From 1cb902edb51d8f5d95f910b79b9b4c208550a7b6 Mon Sep 17 00:00:00 2001 From: Gwang Yoon Hwang Date: Wed, 20 Jan 2016 03:10:38 +0900 Subject: [PATCH] omxvideodec : Use gstglmemoryegl for the RPi Modified to use gstglmemoryegl to avoid texture creation/copy operations at the glupload. --- omx/gstomxvideodec.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index ec97731..c9d60ff 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -38,7 +38,7 @@ #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) #include -#include +#include #endif #if defined (USE_OMX_TARGET_RPI) && defined(__GNUC__) @@ -125,7 +125,7 @@ gst_omx_video_dec_class_init (GstOMXVideoDecClass * klass) klass->cdata.type = GST_OMX_COMPONENT_TYPE_FILTER; klass->cdata.default_src_template_caps = #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) - GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, + GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA") "; " #endif "video/x-raw, " @@ -596,8 +596,8 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) gst_structure_free (config); #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL) - eglimage = self->eglimage && (allocator - && g_strcmp0 (allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0); + eglimage = self->eglimage + && (allocator && GST_IS_GL_MEMORY_EGL_ALLOCATOR (allocator)); #else /* TODO: Implement something that works for other targets too */ eglimage = FALSE; @@ -640,12 +640,12 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) for (i = 0; i < min; i++) { GstBuffer *buffer; GstMemory *mem; + GstGLMemoryEGL *gl_mem; if (gst_buffer_pool_acquire_buffer (pool, &buffer, ¶ms) != GST_FLOW_OK || gst_buffer_n_memory (buffer) != 1 || !(mem = gst_buffer_peek_memory (buffer, 0)) - || g_strcmp0 (mem->allocator->mem_type, - GST_EGL_IMAGE_MEMORY_TYPE) != 0) { + || !GST_IS_GL_MEMORY_EGL_ALLOCATOR (mem->allocator)) { GST_INFO_OBJECT (self, "Failed to allocated %d-th EGLImage", i); g_list_free_full (buffers, (GDestroyNotify) gst_buffer_unref); g_list_free (images); @@ -656,13 +656,13 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self) err = OMX_ErrorUndefined; goto done; } - + gl_mem = (GstGLMemoryEGL *)mem; buffers = g_list_append (buffers, buffer); - gst_egl_image_memory_set_orientation (mem, + gst_gl_memory_egl_set_orientation (gl_mem, GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_FLIP); - images = g_list_append (images, gst_egl_image_memory_get_image (mem)); + images = g_list_append (images, gst_gl_memory_egl_get_image (gl_mem)); if (egl_display == EGL_NO_DISPLAY) - egl_display = gst_egl_image_memory_get_display (mem); + egl_display = gst_gl_memory_egl_get_display (gl_mem); } GST_DEBUG_OBJECT (self, "Allocated %d EGLImages successfully", min); @@ -954,14 +954,14 @@ gst_omx_video_dec_reconfigure_output_port (GstOMXVideoDec * self) gst_caps_unref (state->caps); state->caps = gst_video_info_to_caps (&state->info); gst_caps_set_features (state->caps, 0, - gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, NULL)); + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL)); /* try to negotiate with caps feature */ if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) { GST_DEBUG_OBJECT (self, "Failed to negotiate with feature %s", - GST_CAPS_FEATURE_MEMORY_EGL_IMAGE); + GST_CAPS_FEATURE_MEMORY_GL_MEMORY); if (state->caps) gst_caps_replace (&state->caps, NULL); @@ -2554,7 +2554,7 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) gst_query_parse_nth_allocation_param (query, i, &allocator, ¶ms); if (allocator) { - if (g_strcmp0 (allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0) { + if (GST_IS_GL_MEMORY_EGL_ALLOCATOR (allocator)) { found = TRUE; gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); while (gst_query_get_n_allocation_params (query) > 1) @@ -2572,7 +2572,7 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query) * and if allocator is not of type memory EGLImage then fails */ if (feature && gst_caps_features_contains (feature, - GST_CAPS_FEATURE_MEMORY_EGL_IMAGE) && !found) { + GST_CAPS_FEATURE_MEMORY_GL_MEMORY) && !found) { return FALSE; } } -- 2.5.0