mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 04:00:37 +00:00
eglglessink: Draft set_render_rectangle() from the xOverlay interface
This commit is contained in:
parent
f8b69a7c7f
commit
90d5b76dc5
2 changed files with 52 additions and 3 deletions
|
@ -183,8 +183,7 @@ static const char *frag_AYUV_prog = {
|
||||||
|
|
||||||
/* Input capabilities.
|
/* Input capabilities.
|
||||||
*
|
*
|
||||||
* OpenGL ES Standard does not mandate YUV support
|
* Note: OpenGL ES Standard does not mandate YUV support.
|
||||||
* so we are going to stick to RGB for the time being
|
|
||||||
*/
|
*/
|
||||||
static GstStaticPadTemplate gst_eglglessink_sink_template_factory =
|
static GstStaticPadTemplate gst_eglglessink_sink_template_factory =
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
|
@ -266,6 +265,8 @@ static void gst_eglglessink_init_interfaces (GType type);
|
||||||
static void gst_eglglessink_expose (GstXOverlay * overlay);
|
static void gst_eglglessink_expose (GstXOverlay * overlay);
|
||||||
static void gst_eglglessink_set_window_handle (GstXOverlay * overlay,
|
static void gst_eglglessink_set_window_handle (GstXOverlay * overlay,
|
||||||
guintptr id);
|
guintptr id);
|
||||||
|
static void gst_eglglessink_set_render_rectangle (GstXOverlay *overlay, gint x,
|
||||||
|
gint y, gint width, gint height);
|
||||||
|
|
||||||
/* Custom Buffer funcs */
|
/* Custom Buffer funcs */
|
||||||
static void gst_eglglesbuffer_destroy (GstEglGlesBuffer * eglglessink);
|
static void gst_eglglesbuffer_destroy (GstEglGlesBuffer * eglglessink);
|
||||||
|
@ -949,6 +950,7 @@ gst_eglglessink_xoverlay_init (GstXOverlayClass * iface)
|
||||||
{
|
{
|
||||||
iface->set_window_handle = gst_eglglessink_set_window_handle;
|
iface->set_window_handle = gst_eglglessink_set_window_handle;
|
||||||
iface->expose = gst_eglglessink_expose;
|
iface->expose = gst_eglglessink_expose;
|
||||||
|
iface->set_render_rectangle = gst_eglglessink_set_render_rectangle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1482,6 +1484,36 @@ HANDLE_ERROR:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Drafted */
|
||||||
|
static void
|
||||||
|
gst_eglglessink_set_render_rectangle (GstXOverlay *overlay, gint x, gint y,
|
||||||
|
gint width, gint height)
|
||||||
|
{
|
||||||
|
GstEglGlesSink *eglglessink = GST_EGLGLESSINK (overlay);
|
||||||
|
|
||||||
|
g_return_if_fail (GST_IS_EGLGLESSINK (eglglessink));
|
||||||
|
|
||||||
|
g_mutex_lock (eglglessink->flow_lock);
|
||||||
|
|
||||||
|
if (width == -1 && height == -1) {
|
||||||
|
/* This is the set_defaults condition according to
|
||||||
|
* the xOverlay interface docs
|
||||||
|
*/
|
||||||
|
eglglessink->display_region.w = 0;
|
||||||
|
eglglessink->display_region.h = 0;
|
||||||
|
} else {
|
||||||
|
g_mutex_lock (eglglessink->flow_lock);
|
||||||
|
eglglessink->display_region.x = x;
|
||||||
|
eglglessink->display_region.y = y;
|
||||||
|
eglglessink->display_region.w = width;
|
||||||
|
eglglessink->display_region.h = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_mutex_unlock (eglglessink->flow_lock);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Rendering and display */
|
/* Rendering and display */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
|
@ -1560,7 +1592,23 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
if (got_gl_error ("glTexImage2D"))
|
if (got_gl_error ("glTexImage2D"))
|
||||||
goto HANDLE_ERROR;
|
goto HANDLE_ERROR;
|
||||||
|
|
||||||
glViewport (0, 0, w, h);
|
/* If no one has set a display rectangle on us initialize
|
||||||
|
* a sane default. According to the docs on the xOverlay
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
eglglessink->display_region.x = 0;
|
||||||
|
eglglessink->display_region.y = 0;
|
||||||
|
eglglessink->display_region.w = eglglessink->surface_width;
|
||||||
|
eglglessink->display_region.h = eglglessink->surface_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
glViewport (eglglessink->display_region.x, eglglessink->display_region.y,
|
||||||
|
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"))
|
||||||
|
|
|
@ -126,6 +126,7 @@ struct _GstEglGlesSink
|
||||||
* the platform supported fmts. Right now we just add one
|
* the platform supported fmts. Right now we just add one
|
||||||
* format/caps at init.
|
* format/caps at init.
|
||||||
*/
|
*/
|
||||||
|
GstVideoRectangle display_region;
|
||||||
GList *supported_fmts;
|
GList *supported_fmts;
|
||||||
GstEglGlesImageFmt *selected_fmt;
|
GstEglGlesImageFmt *selected_fmt;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue