GstImxEglVivSinkGLES2Renderer* gst_imx_egl_viv_sink_gles2_renderer_create(char const *native_display_name) { GstImxEglVivSinkGLES2Renderer *renderer; init_debug_category(); renderer = g_slice_alloc(sizeof(GstImxEglVivSinkGLES2Renderer)); renderer->window_handle = 0; renderer->window_width = 0; renderer->window_height = 0; renderer->event_handling = TRUE; renderer->display_ratio_n = 1; renderer->display_ratio_d = 1; renderer->video_info_updated = TRUE; renderer->fullscreen = FALSE; renderer->manual_x_coord = 0; renderer->manual_y_coord = 0; renderer->manual_width = 0; renderer->manual_height = 0; renderer->borderless = FALSE; renderer->current_frame = NULL; renderer->egl_platform = gst_imx_egl_viv_sink_egl_platform_create( native_display_name, gst_imx_egl_viv_sink_gles2_renderer_resize_callback, gst_imx_egl_viv_sink_gles2_renderer_render_frame, renderer ); if (renderer->egl_platform == NULL) { g_slice_free1(sizeof(GstImxEglVivSinkGLES2Renderer), renderer); return NULL; } renderer->thread_started = FALSE; renderer->force_aspect_ratio = TRUE; renderer->loop_flow_retval = GST_FLOW_OK; renderer->thread = NULL; g_mutex_init(&(renderer->mutex)); renderer->vertex_shader = 0; renderer->fragment_shader = 0; renderer->program = 0; renderer->vertex_buffer = 0; renderer->texture = 0; renderer->tex_uloc = -1; renderer->frame_rect_uloc = -1; renderer->uv_scale_uloc = -1; renderer->position_aloc = -1; renderer->texcoords_aloc = -1; renderer->viv_planes[0] = NULL; return renderer; }
GstImxEglVivSinkEGLPlatform* gst_imx_egl_viv_sink_egl_platform_create(G_GNUC_UNUSED gchar const *native_display_name, GstImxEglVivSinkWindowResizedEventCallback window_resized_event_cb, GstImxEglVivSinkWindowRenderFrameCallback render_frame_cb, gpointer user_context) { EGLint ver_major, ver_minor; GstImxEglVivSinkEGLPlatform* platform; init_debug_category(); platform = (GstImxEglVivSinkEGLPlatform *)g_new0(GstImxEglVivSinkEGLPlatform, 1); platform->window_resized_event_cb = window_resized_event_cb; platform->render_frame_cb = render_frame_cb; platform->user_context = user_context; if (pipe(platform->ctrl_pipe) == -1) { GST_ERROR("error creating POSIX pipe: %s", strerror(errno)); g_free(platform); goto cleanup; } platform->native_display = EGL_DEFAULT_DISPLAY; platform->egl_display = eglGetDisplay(platform->native_display); if (platform->egl_display == EGL_NO_DISPLAY) { GST_ERROR("eglGetDisplay failed: %s", gst_imx_egl_viv_sink_egl_platform_get_last_error_string()); goto cleanup; } if (!eglInitialize(platform->egl_display, &ver_major, &ver_minor)) { GST_ERROR("eglInitialize failed: %s", gst_imx_egl_viv_sink_egl_platform_get_last_error_string()); goto cleanup; } GST_INFO("Android EGL platform initialized, using EGL %d.%d", ver_major, ver_minor); return platform; cleanup: /* either both are set, or none is */ if (platform->ctrl_pipe[0] != -1) { close(platform->ctrl_pipe[0]); close(platform->ctrl_pipe[1]); } g_free(platform); return NULL; }
GstImxEglVivSinkEGLPlatform* gst_imx_egl_viv_sink_egl_platform_create(gchar const *native_display_name, GstImxEglVivSinkWindowResizedEventCallback window_resized_event_cb, gpointer user_context) { EGLint ver_major, ver_minor; GstImxEglVivSinkEGLPlatform* platform; Display *x11_display; init_debug_category(); platform = (GstImxEglVivSinkEGLPlatform *)g_new0(GstImxEglVivSinkEGLPlatform, 1); platform->window_resized_event_cb = window_resized_event_cb; platform->user_context = user_context; g_mutex_init(&(platform->mutex)); x11_display = XOpenDisplay(native_display_name); if (x11_display == NULL) { GST_ERROR("could not open X display"); g_free(platform); return NULL; } platform->native_display = (EGLNativeDisplayType)x11_display; platform->egl_display = eglGetDisplay(platform->native_display); if (platform->egl_display == EGL_NO_DISPLAY) { GST_ERROR("eglGetDisplay failed: %s", gst_imx_egl_viv_sink_egl_platform_get_last_error_string()); XCloseDisplay(x11_display); g_free(platform); return NULL; } if (!eglInitialize(platform->egl_display, &ver_major, &ver_minor)) { GST_ERROR("eglInitialize failed: %s", gst_imx_egl_viv_sink_egl_platform_get_last_error_string()); XCloseDisplay(x11_display); g_free(platform); return NULL; } GST_INFO("X11 EGL platform initialized, using EGL %d.%d", ver_major, ver_minor); return platform; }
GstImxEglVivTransEGLPlatform* gst_imx_egl_viv_trans_egl_platform_create(gchar const *native_display_name) { gint64 display_index; EGLint ver_major, ver_minor; GstImxEglVivTransEGLPlatform* platform; EGLNativeWindowType native_window; init_debug_category(); platform = (GstImxEglVivTransEGLPlatform *)g_new0(GstImxEglVivTransEGLPlatform, 1); if (native_display_name == NULL) display_index = 0; else display_index = g_ascii_strtoll(native_display_name, NULL, 10); platform->native_display = fbGetDisplayByIndex(display_index); platform->egl_display = eglGetDisplay(platform->native_display); if (platform->egl_display == EGL_NO_DISPLAY) { GST_ERROR("eglGetDisplay failed: %s with native_display_name:%s", gst_imx_egl_viv_trans_egl_platform_get_last_error_string(),native_display_name); goto cleanup; } if (!eglInitialize(platform->egl_display, &ver_major, &ver_minor)) { GST_ERROR("eglInitialize failed: %s", gst_imx_egl_viv_trans_egl_platform_get_last_error_string()); goto cleanup; } GST_INFO("FB EGL platform initialized, using EGL %d.%d", ver_major, ver_minor); return platform; cleanup: g_free(platform); return NULL; }