mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +00:00
eglglessink: Correctly implement ::expose()
We don't need the past buffer for this, the old one is still available as texture and we just need to draw our rectangle again.
This commit is contained in:
parent
18e473307f
commit
2323c40f1b
1 changed files with 131 additions and 137 deletions
|
@ -1163,9 +1163,6 @@ gst_eglglessink_create_window (GstEglGlesSink * eglglessink, gint width,
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: Should implement (redisplay)
|
|
||||||
* We need at least the last buffer stored for this to work
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
gst_eglglessink_expose (GstXOverlay * overlay)
|
gst_eglglessink_expose (GstXOverlay * overlay)
|
||||||
{
|
{
|
||||||
|
@ -1178,7 +1175,6 @@ gst_eglglessink_expose (GstXOverlay * overlay)
|
||||||
/* Logic would be to get _render_and_display() to use
|
/* Logic would be to get _render_and_display() to use
|
||||||
* last seen buffer to render from when NULL it's
|
* last seen buffer to render from when NULL it's
|
||||||
* passed on */
|
* passed on */
|
||||||
GST_WARNING_OBJECT (eglglessink, "_expose() not implemented");
|
|
||||||
ret = gst_eglglessink_render_and_display (eglglessink, NULL);
|
ret = gst_eglglessink_render_and_display (eglglessink, NULL);
|
||||||
if (ret == GST_FLOW_ERROR)
|
if (ret == GST_FLOW_ERROR)
|
||||||
GST_ERROR_OBJECT (eglglessink, "Redisplay failed");
|
GST_ERROR_OBJECT (eglglessink, "Redisplay failed");
|
||||||
|
@ -1814,17 +1810,12 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!buf) {
|
|
||||||
GST_ERROR_OBJECT (eglglessink, "Null buffer, no past queue implemented");
|
|
||||||
goto HANDLE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
buf ? GST_BUFFER_SIZE (buf) : -1);
|
||||||
|
|
||||||
switch (eglglessink->rendering_path) {
|
switch (eglglessink->rendering_path) {
|
||||||
#ifdef EGL_FAST_RENDERING_POSSIBLE
|
#ifdef EGL_FAST_RENDERING_POSSIBLE
|
||||||
|
@ -1845,138 +1836,141 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
|
||||||
#endif
|
#endif
|
||||||
default: /* case GST_EGLGLESSINK_RENDER_SLOW */
|
default: /* case GST_EGLGLESSINK_RENDER_SLOW */
|
||||||
|
|
||||||
switch (eglglessink->selected_fmt->fmt) {
|
if (buf) {
|
||||||
case GST_EGLGLESSINK_IMAGE_RGB888:
|
switch (eglglessink->selected_fmt->fmt) {
|
||||||
glActiveTexture (GL_TEXTURE0);
|
case GST_EGLGLESSINK_IMAGE_RGB888:
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
|
||||||
break;
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
case GST_EGLGLESSINK_IMAGE_RGB565:
|
break;
|
||||||
glActiveTexture (GL_TEXTURE0);
|
case GST_EGLGLESSINK_IMAGE_RGB565:
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
GL_UNSIGNED_SHORT_5_6_5, GST_BUFFER_DATA (buf));
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
|
||||||
break;
|
GL_UNSIGNED_SHORT_5_6_5, GST_BUFFER_DATA (buf));
|
||||||
case GST_EGLGLESSINK_IMAGE_RGBA8888:
|
break;
|
||||||
switch (eglglessink->format) {
|
case GST_EGLGLESSINK_IMAGE_RGBA8888:
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
switch (eglglessink->format) {
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
glActiveTexture (GL_TEXTURE0);
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
||||||
break;
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
break;
|
||||||
glActiveTexture (GL_TEXTURE0);
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
|
||||||
break;
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
break;
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_Y444:
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
case GST_VIDEO_FORMAT_Y41B:{
|
case GST_VIDEO_FORMAT_Y42B:
|
||||||
gint coffset, cw, ch;
|
case GST_VIDEO_FORMAT_Y41B:{
|
||||||
|
gint coffset, cw, ch;
|
||||||
|
|
||||||
coffset =
|
coffset =
|
||||||
gst_video_format_get_component_offset (eglglessink->format, 0,
|
gst_video_format_get_component_offset (eglglessink->format,
|
||||||
w, h);
|
0, w, h);
|
||||||
cw = gst_video_format_get_component_width (eglglessink->format, 0,
|
cw = gst_video_format_get_component_width (eglglessink->format,
|
||||||
w);
|
0, w);
|
||||||
ch = gst_video_format_get_component_height (eglglessink->format,
|
ch = gst_video_format_get_component_height (eglglessink->format,
|
||||||
0, h);
|
0, h);
|
||||||
glActiveTexture (GL_TEXTURE0);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
||||||
cw, ch, 0, GL_LUMINANCE,
|
cw, ch, 0, GL_LUMINANCE,
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
||||||
coffset =
|
coffset =
|
||||||
gst_video_format_get_component_offset (eglglessink->format, 1,
|
gst_video_format_get_component_offset (eglglessink->format,
|
||||||
w, h);
|
1, w, h);
|
||||||
cw = gst_video_format_get_component_width (eglglessink->format, 1,
|
cw = gst_video_format_get_component_width (eglglessink->format,
|
||||||
w);
|
1, w);
|
||||||
ch = gst_video_format_get_component_height (eglglessink->format,
|
ch = gst_video_format_get_component_height (eglglessink->format,
|
||||||
1, h);
|
1, h);
|
||||||
glActiveTexture (GL_TEXTURE1);
|
glActiveTexture (GL_TEXTURE1);
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
||||||
cw, ch, 0, GL_LUMINANCE,
|
cw, ch, 0, GL_LUMINANCE,
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
||||||
coffset =
|
coffset =
|
||||||
gst_video_format_get_component_offset (eglglessink->format, 2,
|
gst_video_format_get_component_offset (eglglessink->format,
|
||||||
w, h);
|
2, w, h);
|
||||||
cw = gst_video_format_get_component_width (eglglessink->format, 2,
|
cw = gst_video_format_get_component_width (eglglessink->format,
|
||||||
w);
|
2, w);
|
||||||
ch = gst_video_format_get_component_height (eglglessink->format,
|
ch = gst_video_format_get_component_height (eglglessink->format,
|
||||||
2, h);
|
2, h);
|
||||||
glActiveTexture (GL_TEXTURE2);
|
glActiveTexture (GL_TEXTURE2);
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[2]);
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[2]);
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
||||||
cw, ch, 0, GL_LUMINANCE,
|
cw, ch, 0, GL_LUMINANCE,
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
|
||||||
|
w, h, 0, GL_LUMINANCE_ALPHA,
|
||||||
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
|
glActiveTexture (GL_TEXTURE1);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
|
||||||
|
GST_ROUND_UP_2 (w) / 2, h, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_NV12:
|
||||||
|
case GST_VIDEO_FORMAT_NV21:{
|
||||||
|
gint coffset, cw, ch;
|
||||||
|
|
||||||
|
coffset =
|
||||||
|
gst_video_format_get_component_offset (eglglessink->format,
|
||||||
|
0, w, h);
|
||||||
|
cw = gst_video_format_get_component_width (eglglessink->format,
|
||||||
|
0, w);
|
||||||
|
ch = gst_video_format_get_component_height (eglglessink->format,
|
||||||
|
0, h);
|
||||||
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
||||||
|
cw, ch, 0, GL_LUMINANCE,
|
||||||
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
||||||
|
|
||||||
|
coffset =
|
||||||
|
gst_video_format_get_component_offset (eglglessink->format,
|
||||||
|
(eglglessink->format == GST_VIDEO_FORMAT_NV12 ? 1 : 2), w,
|
||||||
|
h);
|
||||||
|
cw = gst_video_format_get_component_width (eglglessink->format,
|
||||||
|
1, w);
|
||||||
|
ch = gst_video_format_get_component_height (eglglessink->format,
|
||||||
|
1, h);
|
||||||
|
glActiveTexture (GL_TEXTURE1);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
||||||
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
|
||||||
|
cw, ch, 0, GL_LUMINANCE_ALPHA,
|
||||||
|
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
}
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
|
||||||
glActiveTexture (GL_TEXTURE0);
|
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
|
|
||||||
w, h, 0, GL_LUMINANCE_ALPHA,
|
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
|
||||||
glActiveTexture (GL_TEXTURE1);
|
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
|
|
||||||
GST_ROUND_UP_2 (w) / 2, h, 0, GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
|
||||||
case GST_VIDEO_FORMAT_NV21:{
|
|
||||||
gint coffset, cw, ch;
|
|
||||||
|
|
||||||
coffset =
|
if (got_gl_error ("glTexImage2D"))
|
||||||
gst_video_format_get_component_offset (eglglessink->format, 0,
|
goto HANDLE_ERROR;
|
||||||
w, h);
|
|
||||||
cw = gst_video_format_get_component_width (eglglessink->format, 0,
|
|
||||||
w);
|
|
||||||
ch = gst_video_format_get_component_height (eglglessink->format,
|
|
||||||
0, h);
|
|
||||||
glActiveTexture (GL_TEXTURE0);
|
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[0]);
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
|
|
||||||
cw, ch, 0, GL_LUMINANCE,
|
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
|
||||||
|
|
||||||
coffset =
|
|
||||||
gst_video_format_get_component_offset (eglglessink->format,
|
|
||||||
(eglglessink->format == GST_VIDEO_FORMAT_NV12 ? 1 : 2), w, h);
|
|
||||||
cw = gst_video_format_get_component_width (eglglessink->format, 1,
|
|
||||||
w);
|
|
||||||
ch = gst_video_format_get_component_height (eglglessink->format,
|
|
||||||
1, h);
|
|
||||||
glActiveTexture (GL_TEXTURE1);
|
|
||||||
glBindTexture (GL_TEXTURE_2D, eglglessink->texture[1]);
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA,
|
|
||||||
cw, ch, 0, GL_LUMINANCE_ALPHA,
|
|
||||||
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf) + coffset);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (got_gl_error ("glTexImage2D"))
|
|
||||||
goto HANDLE_ERROR;
|
|
||||||
|
|
||||||
/* 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%
|
||||||
|
|
Loading…
Reference in a new issue