Esempio n. 1
0
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;
}
Esempio n. 4
0
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;
}