mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-08 04:41:31 +00:00
[539/906] GstGLImageSink: fold multiple fields into one and use VIDEO_SINK_* for window width/height
replace the caps information with a GstVideoInfo place the window width/height information width VIDEO_SINK
This commit is contained in:
parent
84bf052181
commit
9f51f1721e
2 changed files with 37 additions and 37 deletions
|
@ -289,9 +289,6 @@ gst_glimage_sink_finalize (GObject * object)
|
|||
glimage_sink->par = NULL;
|
||||
}
|
||||
|
||||
if (glimage_sink->caps)
|
||||
gst_caps_unref (glimage_sink->caps);
|
||||
|
||||
g_free (glimage_sink->display_name);
|
||||
|
||||
GST_DEBUG ("finalized");
|
||||
|
@ -417,10 +414,8 @@ gst_glimage_sink_change_state (GstElement * element, GstStateChange transition)
|
|||
glimage_sink->window_id = 0;
|
||||
//but do not reset glimage_sink->new_window_id
|
||||
|
||||
glimage_sink->fps_n = 0;
|
||||
glimage_sink->fps_d = 1;
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = 0;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = 0;
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = 1;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = 1;
|
||||
}
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
|
@ -445,10 +440,11 @@ gst_glimage_sink_get_times (GstBaseSink * bsink, GstBuffer * buf,
|
|||
if (GST_BUFFER_DURATION_IS_VALID (buf))
|
||||
*end = *start + GST_BUFFER_DURATION (buf);
|
||||
else {
|
||||
if (glimagesink->fps_n > 0) {
|
||||
if (GST_VIDEO_INFO_FPS_N (&glimagesink->info) > 0) {
|
||||
*end = *start +
|
||||
gst_util_uint64_scale_int (GST_SECOND, glimagesink->fps_d,
|
||||
glimagesink->fps_n);
|
||||
gst_util_uint64_scale_int (GST_SECOND,
|
||||
GST_VIDEO_INFO_FPS_D (&glimagesink->info),
|
||||
GST_VIDEO_INFO_FPS_N (&glimagesink->info));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -461,7 +457,6 @@ gst_glimage_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
|
|||
gint width;
|
||||
gint height;
|
||||
gboolean ok;
|
||||
gint fps_n, fps_d;
|
||||
gint par_n, par_d;
|
||||
gint display_par_n, display_par_d;
|
||||
guint display_ratio_num, display_ratio_den;
|
||||
|
@ -498,11 +493,12 @@ gst_glimage_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
|
|||
gst_gl_display_set_client_data (glimage_sink->display,
|
||||
glimage_sink->client_data);
|
||||
|
||||
fps_n = GST_VIDEO_INFO_FPS_N (&vinfo);
|
||||
fps_d = GST_VIDEO_INFO_FPS_D (&vinfo);
|
||||
par_n = GST_VIDEO_INFO_PAR_N (&vinfo);
|
||||
par_d = GST_VIDEO_INFO_PAR_D (&vinfo);
|
||||
|
||||
if (!par_n)
|
||||
par_n = 1;
|
||||
|
||||
/* get display's PAR */
|
||||
if (glimage_sink->par) {
|
||||
display_par_n = gst_value_get_fraction_numerator (glimage_sink->par);
|
||||
|
@ -519,35 +515,31 @@ gst_glimage_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
|
|||
if (!ok)
|
||||
return FALSE;
|
||||
|
||||
GST_TRACE ("PAR: %u/%u DAR:%u/%u", par_n, par_d, display_par_n,
|
||||
display_par_d);
|
||||
|
||||
if (height % display_ratio_den == 0) {
|
||||
GST_DEBUG ("keeping video height");
|
||||
glimage_sink->window_width = (guint)
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = (guint)
|
||||
gst_util_uint64_scale_int (height, display_ratio_num,
|
||||
display_ratio_den);
|
||||
glimage_sink->window_height = height;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = height;
|
||||
} else if (width % display_ratio_num == 0) {
|
||||
GST_DEBUG ("keeping video width");
|
||||
glimage_sink->window_width = width;
|
||||
glimage_sink->window_height = (guint)
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = width;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = (guint)
|
||||
gst_util_uint64_scale_int (width, display_ratio_den, display_ratio_num);
|
||||
} else {
|
||||
GST_DEBUG ("approximating while keeping video height");
|
||||
glimage_sink->window_width = (guint)
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = (guint)
|
||||
gst_util_uint64_scale_int (height, display_ratio_num,
|
||||
display_ratio_den);
|
||||
glimage_sink->window_height = height;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = height;
|
||||
}
|
||||
GST_DEBUG ("scaling to %dx%d",
|
||||
glimage_sink->window_width, glimage_sink->window_height);
|
||||
GST_DEBUG ("scaling to %dx%d", GST_VIDEO_SINK_WIDTH (glimage_sink),
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink));
|
||||
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink) = width;
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink) = height;
|
||||
glimage_sink->width = width;
|
||||
glimage_sink->height = height;
|
||||
glimage_sink->fps_n = fps_n;
|
||||
glimage_sink->fps_d = fps_d;
|
||||
glimage_sink->par_n = par_n;
|
||||
glimage_sink->par_d = par_d;
|
||||
glimage_sink->info = vinfo;
|
||||
|
||||
if (!glimage_sink->window_id && !glimage_sink->new_window_id)
|
||||
gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (glimage_sink));
|
||||
|
@ -562,6 +554,8 @@ gst_glimage_sink_render (GstBaseSink * bsink, GstBuffer * buf)
|
|||
GstGLMeta *gl_meta;
|
||||
GstVideoMeta *v_meta;
|
||||
|
||||
GST_TRACE ("rendering buffer:%p", buf);
|
||||
|
||||
glimage_sink = GST_GLIMAGE_SINK (bsink);
|
||||
|
||||
if (!(v_meta = gst_buffer_get_video_meta (buf)))
|
||||
|
@ -582,13 +576,25 @@ gst_glimage_sink_render (GstBaseSink * bsink, GstBuffer * buf)
|
|||
//store current buffer
|
||||
glimage_sink->stored_buffer = gst_buffer_ref (buf);
|
||||
|
||||
GST_TRACE ("redisplay tex:%u of size:%ux%u, window size:%ux%u",
|
||||
gl_meta->memory->tex_id, v_meta->width, v_meta->height,
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink),
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink));
|
||||
|
||||
if (GST_VIDEO_SINK_WIDTH (glimage_sink) < 1
|
||||
|| GST_VIDEO_SINK_HEIGHT (glimage_sink) < 1) {
|
||||
goto redisplay_failed;
|
||||
}
|
||||
//redisplay opengl scene
|
||||
if (!gst_gl_display_redisplay (glimage_sink->display,
|
||||
gl_meta->memory->tex_id, v_meta->width, v_meta->height,
|
||||
glimage_sink->window_width, glimage_sink->window_height,
|
||||
GST_VIDEO_SINK_WIDTH (glimage_sink),
|
||||
GST_VIDEO_SINK_HEIGHT (glimage_sink),
|
||||
glimage_sink->keep_aspect_ratio))
|
||||
goto redisplay_failed;
|
||||
|
||||
GST_TRACE ("post redisplay");
|
||||
|
||||
return GST_FLOW_OK;
|
||||
|
||||
/* ERRORS */
|
||||
|
|
|
@ -58,13 +58,7 @@ struct _GstGLImageSink
|
|||
gulong new_window_id;
|
||||
|
||||
//caps
|
||||
GstCaps *caps;
|
||||
gint width;
|
||||
gint height;
|
||||
gint window_width;
|
||||
gint window_height;
|
||||
gint fps_n, fps_d;
|
||||
gint par_n, par_d;
|
||||
GstVideoInfo info;
|
||||
|
||||
GstGLDisplay *display;
|
||||
GstBuffer *stored_buffer;
|
||||
|
|
Loading…
Reference in a new issue