mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-29 19:50:40 +00:00
eglglessink: Handle frame scaling to fill surface
This commit is contained in:
parent
90d5b76dc5
commit
8018681187
2 changed files with 33 additions and 10 deletions
|
@ -206,6 +206,7 @@ enum
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_SILENT,
|
PROP_SILENT,
|
||||||
PROP_CAN_CREATE_WINDOW,
|
PROP_CAN_CREATE_WINDOW,
|
||||||
|
PROP_KEEP_ASPECT_RATIO,
|
||||||
PROP_DEFAULT_HEIGHT,
|
PROP_DEFAULT_HEIGHT,
|
||||||
PROP_DEFAULT_WIDTH,
|
PROP_DEFAULT_WIDTH,
|
||||||
PROP_FORCE_RENDERING_SLOW
|
PROP_FORCE_RENDERING_SLOW
|
||||||
|
@ -1519,7 +1520,9 @@ static GstFlowReturn
|
||||||
gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
GstBuffer * buf)
|
GstBuffer * buf)
|
||||||
{
|
{
|
||||||
|
GstVideoRectangle frame, surface;
|
||||||
gint w, h;
|
gint w, h;
|
||||||
|
|
||||||
#ifdef EGL_FAST_RENDERING_POSSIBLE
|
#ifdef EGL_FAST_RENDERING_POSSIBLE
|
||||||
EGLImageKHR img = EGL_NO_IMAGE_KHR;
|
EGLImageKHR img = EGL_NO_IMAGE_KHR;
|
||||||
EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR,
|
EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR,
|
||||||
|
@ -1534,6 +1537,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
|
|
||||||
w = GST_VIDEO_SINK_WIDTH (eglglessink);
|
w = GST_VIDEO_SINK_WIDTH (eglglessink);
|
||||||
h = GST_VIDEO_SINK_HEIGHT (eglglessink);
|
h = GST_VIDEO_SINK_HEIGHT (eglglessink);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (eglglessink,
|
GST_DEBUG_OBJECT (eglglessink,
|
||||||
"Got good buffer %p. Sink geometry is %dx%d size %d", buf, w, h,
|
"Got good buffer %p. Sink geometry is %dx%d size %d", buf, w, h,
|
||||||
GST_BUFFER_SIZE (buf));
|
GST_BUFFER_SIZE (buf));
|
||||||
|
@ -1595,20 +1599,28 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
/* If no one has set a display rectangle on us initialize
|
/* If no one has set a display rectangle on us initialize
|
||||||
* a sane default. According to the docs on the xOverlay
|
* a sane default. According to the docs on the xOverlay
|
||||||
* interface we are supposed to fill the overlay 100%
|
* interface we are supposed to fill the overlay 100%
|
||||||
*
|
|
||||||
* XXX: If this is not desired just use calculated pos with
|
|
||||||
* lower left corner as 0,0 and w,h from the decoded frame.
|
|
||||||
*/
|
*/
|
||||||
if (!eglglessink->display_region.w || !eglglessink->display_region.h)
|
if (!eglglessink->display_region.w || !eglglessink->display_region.h)
|
||||||
{
|
{
|
||||||
|
/* XXX: Do we really want to lock here? */
|
||||||
|
if (!eglglessink->keep_aspect_ratio) {
|
||||||
eglglessink->display_region.x = 0;
|
eglglessink->display_region.x = 0;
|
||||||
eglglessink->display_region.y = 0;
|
eglglessink->display_region.y = 0;
|
||||||
eglglessink->display_region.w = eglglessink->surface_width;
|
eglglessink->display_region.w = eglglessink->surface_width;
|
||||||
eglglessink->display_region.h = eglglessink->surface_height;
|
eglglessink->display_region.h = eglglessink->surface_height;
|
||||||
|
} else {
|
||||||
|
/* XXX: Proly consider display pixel aspect ratio too? */
|
||||||
|
frame.w = w;
|
||||||
|
frame.h = h;
|
||||||
|
surface.w = eglglessink->surface_width;
|
||||||
|
surface.h = eglglessink->surface_height;
|
||||||
|
gst_video_sink_center_rect (frame, surface,
|
||||||
|
&eglglessink->display_region, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
glViewport (eglglessink->display_region.x, eglglessink->display_region.y,
|
glViewport (eglglessink->display_region.x, eglglessink->display_region.y,
|
||||||
eglglessink->display_region.w, eglglessink->display_region.h);
|
eglglessink->display_region.w, eglglessink->display_region.h);
|
||||||
|
}
|
||||||
|
|
||||||
glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
|
glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0);
|
||||||
if (got_gl_error ("glDrawElements"))
|
if (got_gl_error ("glDrawElements"))
|
||||||
|
@ -1804,6 +1816,9 @@ gst_eglglessink_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_FORCE_RENDERING_SLOW:
|
case PROP_FORCE_RENDERING_SLOW:
|
||||||
eglglessink->force_rendering_slow = g_value_get_boolean (value);
|
eglglessink->force_rendering_slow = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_KEEP_ASPECT_RATIO:
|
||||||
|
eglglessink->keep_aspect_ratio = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1836,6 +1851,9 @@ gst_eglglessink_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_FORCE_RENDERING_SLOW:
|
case PROP_FORCE_RENDERING_SLOW:
|
||||||
g_value_set_boolean (value, eglglessink->force_rendering_slow);
|
g_value_set_boolean (value, eglglessink->force_rendering_slow);
|
||||||
break;
|
break;
|
||||||
|
case PROP_KEEP_ASPECT_RATIO:
|
||||||
|
g_value_set_boolean (value, eglglessink->keep_aspect_ratio);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1891,6 +1909,9 @@ gst_eglglessink_class_init (GstEglGlesSinkClass * klass)
|
||||||
g_object_class_install_property (gobject_class, PROP_FORCE_RENDERING_SLOW,
|
g_object_class_install_property (gobject_class, PROP_FORCE_RENDERING_SLOW,
|
||||||
g_param_spec_boolean ("force_rendering_slow", "ForceRenderingSlow",
|
g_param_spec_boolean ("force_rendering_slow", "ForceRenderingSlow",
|
||||||
"Force slow rendering path?", FALSE, G_PARAM_READWRITE));
|
"Force slow rendering path?", FALSE, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_KEEP_ASPECT_RATIO,
|
||||||
|
g_param_spec_boolean ("keep_aspect_ratio", "KeepAspectRatio",
|
||||||
|
"Keep aspect ratio while scaling?", TRUE, G_PARAM_READWRITE));
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_DEFAULT_WIDTH,
|
g_object_class_install_property (gobject_class, PROP_DEFAULT_WIDTH,
|
||||||
g_param_spec_int ("window_default_width", "DefaultWidth",
|
g_param_spec_int ("window_default_width", "DefaultWidth",
|
||||||
|
@ -1918,6 +1939,7 @@ gst_eglglessink_init (GstEglGlesSink * eglglessink,
|
||||||
eglglessink->running = FALSE; /* XXX: unused */
|
eglglessink->running = FALSE; /* XXX: unused */
|
||||||
eglglessink->can_create_window = TRUE;
|
eglglessink->can_create_window = TRUE;
|
||||||
eglglessink->force_rendering_slow = FALSE;
|
eglglessink->force_rendering_slow = FALSE;
|
||||||
|
eglglessink->keep_aspect_ratio = TRUE;
|
||||||
eglglessink->flow_lock = g_mutex_new ();
|
eglglessink->flow_lock = g_mutex_new ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,6 +158,7 @@ struct _GstEglGlesSink
|
||||||
gboolean silent;
|
gboolean silent;
|
||||||
gboolean can_create_window;
|
gboolean can_create_window;
|
||||||
gboolean force_rendering_slow;
|
gboolean force_rendering_slow;
|
||||||
|
gboolean keep_aspect_ratio;
|
||||||
gint window_default_width;
|
gint window_default_width;
|
||||||
gint window_default_height;
|
gint window_default_height;
|
||||||
EGLint surface_width;
|
EGLint surface_width;
|
||||||
|
|
Loading…
Reference in a new issue