From c63365c80f4c72bba346e08927f5a25a93dbf7c8 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Fri, 7 May 2021 18:22:06 +0200 Subject: [PATCH] gtk: Add "video-aspect-ratio-override" property Allow front-ends to override the pixel aspect ratio found inside the video file itself, or most likely, missing from the video file. This is a long-standing feature of totem. Part-of: --- .../docs/gst_plugins_cache.json | 14 ++++++++ .../gst-plugins-good/ext/gtk/gstgtkbasesink.c | 32 ++++++++++++++++++ .../gst-plugins-good/ext/gtk/gstgtkbasesink.h | 4 +++ .../ext/gtk/gtkgstbasewidget.c | 33 +++++++++++++++++-- .../ext/gtk/gtkgstbasewidget.h | 1 + 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-good/docs/gst_plugins_cache.json b/subprojects/gst-plugins-good/docs/gst_plugins_cache.json index 324d0f3a3e..bd7c939aaa 100644 --- a/subprojects/gst-plugins-good/docs/gst_plugins_cache.json +++ b/subprojects/gst-plugins-good/docs/gst_plugins_cache.json @@ -7215,6 +7215,20 @@ "type": "GstFraction", "writable": true }, + "video-aspect-ratio-override": { + "blurb": "The pixel aspect ratio of the video (0/1 = follow stream)", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "0/1", + "max": "2147483647/1", + "min": "0/2147483647", + "mutable": "null", + "readable": true, + "type": "GstFraction", + "writable": true + }, "widget": { "blurb": "The GtkWidget to place in the widget hierarchy (must only be get from the GTK main thread)", "conditionally-available": false, diff --git a/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.c b/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.c index ff98dae817..1375d1cfba 100644 --- a/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.c +++ b/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.c @@ -37,6 +37,8 @@ GST_DEBUG_CATEGORY (gst_debug_gtk_base_sink); #define DEFAULT_FORCE_ASPECT_RATIO TRUE #define DEFAULT_DISPLAY_PAR_N 0 #define DEFAULT_DISPLAY_PAR_D 1 +#define DEFAULT_VIDEO_PAR_N 0 +#define DEFAULT_VIDEO_PAR_D 1 #define DEFAULT_IGNORE_ALPHA TRUE static void gst_gtk_base_sink_finalize (GObject * object); @@ -68,6 +70,7 @@ enum PROP_WIDGET, PROP_FORCE_ASPECT_RATIO, PROP_PIXEL_ASPECT_RATIO, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, PROP_IGNORE_ALPHA, }; @@ -117,6 +120,21 @@ gst_gtk_base_sink_class_init (GstGtkBaseSinkClass * klass) 0, G_MAXINT, G_MAXINT, 1, DEFAULT_DISPLAY_PAR_N, DEFAULT_DISPLAY_PAR_D, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstGtkBaseSink:video-aspect-ratio-override: + * + * The pixel aspect ratio of the video (0/1 = follow stream) + * + * Since: 1.20 + */ + g_object_class_install_property (gobject_class, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, + gst_param_spec_fraction ("video-aspect-ratio-override", + "Video Pixel Aspect Ratio", + "The pixel aspect ratio of the video (0/1 = follow stream)", 0, + G_MAXINT, G_MAXINT, 1, DEFAULT_VIDEO_PAR_N, DEFAULT_VIDEO_PAR_D, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_IGNORE_ALPHA, g_param_spec_boolean ("ignore-alpha", "Ignore Alpha", "When enabled, alpha will be ignored and converted to black", @@ -141,6 +159,8 @@ gst_gtk_base_sink_init (GstGtkBaseSink * gtk_sink) gtk_sink->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO; gtk_sink->par_n = DEFAULT_DISPLAY_PAR_N; gtk_sink->par_d = DEFAULT_DISPLAY_PAR_D; + gtk_sink->video_par_n = DEFAULT_VIDEO_PAR_N; + gtk_sink->video_par_d = DEFAULT_VIDEO_PAR_D; gtk_sink->ignore_alpha = DEFAULT_IGNORE_ALPHA; } @@ -200,6 +220,10 @@ gst_gtk_base_sink_get_widget (GstGtkBaseSink * gtk_sink) gtk_sink->bind_pixel_aspect_ratio = g_object_bind_property (gtk_sink, "pixel-aspect-ratio", gtk_sink->widget, "pixel-aspect-ratio", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + gtk_sink->bind_video_aspect_ratio = + g_object_bind_property (gtk_sink, "video-aspect-ratio-override", + gtk_sink->widget, "video-aspect-ratio-override", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); gtk_sink->bind_ignore_alpha = g_object_bind_property (gtk_sink, "ignore-alpha", gtk_sink->widget, "ignore-alpha", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); @@ -253,6 +277,10 @@ gst_gtk_base_sink_get_property (GObject * object, guint prop_id, case PROP_PIXEL_ASPECT_RATIO: gst_value_set_fraction (value, gtk_sink->par_n, gtk_sink->par_d); break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gst_value_set_fraction (value, gtk_sink->video_par_n, + gtk_sink->video_par_d); + break; case PROP_IGNORE_ALPHA: g_value_set_boolean (value, gtk_sink->ignore_alpha); break; @@ -276,6 +304,10 @@ gst_gtk_base_sink_set_property (GObject * object, guint prop_id, gtk_sink->par_n = gst_value_get_fraction_numerator (value); gtk_sink->par_d = gst_value_get_fraction_denominator (value); break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gtk_sink->video_par_n = gst_value_get_fraction_numerator (value); + gtk_sink->video_par_d = gst_value_get_fraction_denominator (value); + break; case PROP_IGNORE_ALPHA: gtk_sink->ignore_alpha = g_value_get_boolean (value); break; diff --git a/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.h b/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.h index 314a0f295d..a592436f28 100644 --- a/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.h +++ b/subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.h @@ -65,6 +65,10 @@ struct _GstGtkBaseSink gint par_d; GBinding *bind_pixel_aspect_ratio; + gint video_par_n; + gint video_par_d; + GBinding *bind_video_aspect_ratio; + gboolean ignore_alpha; GBinding *bind_ignore_alpha; diff --git a/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.c b/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.c index 8cc67b31d6..db2c7b52d0 100644 --- a/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.c +++ b/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.c @@ -32,6 +32,8 @@ GST_DEBUG_CATEGORY (gst_debug_gtk_base_widget); #define DEFAULT_FORCE_ASPECT_RATIO TRUE #define DEFAULT_DISPLAY_PAR_N 0 #define DEFAULT_DISPLAY_PAR_D 1 +#define DEFAULT_VIDEO_PAR_N 0 +#define DEFAULT_VIDEO_PAR_D 1 #define DEFAULT_IGNORE_ALPHA TRUE enum @@ -40,6 +42,7 @@ enum PROP_FORCE_ASPECT_RATIO, PROP_PIXEL_ASPECT_RATIO, PROP_IGNORE_ALPHA, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, }; static gboolean @@ -55,8 +58,14 @@ _calculate_par (GtkGstBaseWidget * widget, GstVideoInfo * info) if (width == 0 || height == 0) return FALSE; - par_n = GST_VIDEO_INFO_PAR_N (info); - par_d = GST_VIDEO_INFO_PAR_D (info); + /* get video's PAR */ + if (widget->video_par_n != 0 && widget->video_par_d != 0) { + par_n = widget->video_par_n; + par_d = widget->video_par_d; + } else { + par_n = GST_VIDEO_INFO_PAR_N (info); + par_d = GST_VIDEO_INFO_PAR_D (info); + } if (!par_n) par_n = 1; @@ -214,6 +223,11 @@ gtk_gst_base_widget_set_property (GObject * object, guint prop_id, gtk_widget->par_d = gst_value_get_fraction_denominator (value); _update_par (gtk_widget); break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gtk_widget->video_par_n = gst_value_get_fraction_numerator (value); + gtk_widget->video_par_d = gst_value_get_fraction_denominator (value); + _update_par (gtk_widget); + break; case PROP_IGNORE_ALPHA: gtk_widget->ignore_alpha = g_value_get_boolean (value); break; @@ -236,6 +250,10 @@ gtk_gst_base_widget_get_property (GObject * object, guint prop_id, case PROP_PIXEL_ASPECT_RATIO: gst_value_set_fraction (value, gtk_widget->par_n, gtk_widget->par_d); break; + case PROP_VIDEO_ASPECT_RATIO_OVERRIDE: + gst_value_set_fraction (value, gtk_widget->video_par_n, + gtk_widget->video_par_d); + break; case PROP_IGNORE_ALPHA: g_value_set_boolean (value, gtk_widget->ignore_alpha); break; @@ -458,6 +476,15 @@ gtk_gst_base_widget_class_init (GtkGstBaseWidgetClass * klass) DEFAULT_DISPLAY_PAR_D, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING)); + g_object_class_install_property (gobject_klass, + PROP_VIDEO_ASPECT_RATIO_OVERRIDE, + gst_param_spec_fraction ("video-aspect-ratio-override", + "Video Pixel Aspect Ratio", + "The pixel aspect ratio of the video (0/1 = follow stream)", 0, + G_MAXINT, G_MAXINT, 1, DEFAULT_VIDEO_PAR_N, DEFAULT_VIDEO_PAR_D, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_PLAYING)); + g_object_class_install_property (gobject_klass, PROP_IGNORE_ALPHA, g_param_spec_boolean ("ignore-alpha", "Ignore Alpha", "When enabled, alpha will be ignored and converted to black", @@ -484,6 +511,8 @@ gtk_gst_base_widget_init (GtkGstBaseWidget * widget) widget->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO; widget->par_n = DEFAULT_DISPLAY_PAR_N; widget->par_d = DEFAULT_DISPLAY_PAR_D; + widget->video_par_n = DEFAULT_VIDEO_PAR_N; + widget->video_par_d = DEFAULT_VIDEO_PAR_D; widget->ignore_alpha = DEFAULT_IGNORE_ALPHA; gst_video_info_init (&widget->v_info); diff --git a/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.h b/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.h index c10ed38730..6967560795 100644 --- a/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.h +++ b/subprojects/gst-plugins-good/ext/gtk/gtkgstbasewidget.h @@ -47,6 +47,7 @@ struct _GtkGstBaseWidget /* properties */ gboolean force_aspect_ratio; gint par_n, par_d; + gint video_par_n, video_par_d; gboolean ignore_alpha; gint display_width;