From 921937874790a816fd62974785d14764e94fa1e5 Mon Sep 17 00:00:00 2001 From: Markus Ongyerth Date: Wed, 2 Oct 2019 21:32:16 +0200 Subject: [PATCH 2/3] Add aspect-ratio commandline option Add a new commandline option to pass in a forced aspect ration the player will keep no mather what. --- data/interfaces/parole.ui | 2 +- src/gst/parole-gst.c | 27 +++++++++++++++++-- src/main.c | 7 +++++ src/parole-player.c | 55 ++++++++++++++++++++++++++------------- src/parole-player.h | 3 +++ 5 files changed, 73 insertions(+), 21 deletions(-) diff --git a/data/interfaces/parole.ui b/data/interfaces/parole.ui index 3363f15..90b8f6d 100644 --- a/data/interfaces/parole.ui +++ b/data/interfaces/parole.ui @@ -382,7 +382,7 @@ - + True False _Aspect Ratio diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c index c20baed..2300206 100644 --- a/src/gst/parole-gst.c +++ b/src/gst/parole-gst.c @@ -128,6 +128,7 @@ struct ParoleGstPrivate { gchar* custom_subtitles; ParoleAspectRatio aspect_ratio; + ParoleAspectRatio force_aspect_ratio; gulong state_change_id; /* @@ -155,7 +156,8 @@ enum { PROP_0, PROP_VOLUME, PROP_CONF_OBJ, - PROP_ENABLE_TAGS + PROP_ENABLE_TAGS, + PROP_FORCE_ASPECT_RATIO }; static gpointer parole_gst_object = NULL; @@ -298,7 +300,12 @@ parole_gst_get_video_output_size(ParoleGst *gst, gint *ret_w, gint *ret_h) { if ( has_video ) { if ( video_w != 0 && video_h != 0 ) { - switch ( gst->priv->aspect_ratio ) { + ParoleAspectRatio aspect_ratio; + if (gst->priv->force_aspect_ratio > PAROLE_ASPECT_RATIO_NONE) + aspect_ratio = gst->priv->force_aspect_ratio; + else + aspect_ratio = gst->priv->aspect_ratio; + switch ( aspect_ratio ) { case PAROLE_ASPECT_RATIO_NONE: return; case PAROLE_ASPECT_RATIO_AUTO: @@ -1810,6 +1817,9 @@ static void parole_gst_get_property(GObject *object, case PROP_ENABLE_TAGS: g_value_set_boolean(value, gst->priv->enable_tags); break; + case PROP_FORCE_ASPECT_RATIO: + g_value_set_enum(value, gst->priv->force_aspect_ratio); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1828,6 +1838,9 @@ static void parole_gst_set_property(GObject *object, case PROP_ENABLE_TAGS: gst->priv->enable_tags = g_value_get_boolean(value); break; + case PROP_FORCE_ASPECT_RATIO: + gst->priv->force_aspect_ratio = g_value_get_enum(value); + break; case PROP_VOLUME: parole_gst_set_volume(gst, g_value_get_double(value)); break; @@ -2121,6 +2134,15 @@ parole_gst_class_init(ParoleGstClass *klass) { NULL, NULL, TRUE, G_PARAM_READWRITE)); + g_object_class_install_property(object_class, + PROP_FORCE_ASPECT_RATIO, + g_param_spec_enum("force-aspect-ratio", + NULL, + NULL, + GST_ENUM_TYPE_ASPECT_RATIO, + PAROLE_ASPECT_RATIO_NONE, + G_PARAM_READWRITE)); + } static void @@ -2131,6 +2153,7 @@ parole_gst_init(ParoleGst *gst) { gst->priv->target = GST_STATE_VOID_PENDING; gst->priv->media_state = PAROLE_STATE_STOPPED; gst->priv->aspect_ratio = PAROLE_ASPECT_RATIO_NONE; + gst->priv->force_aspect_ratio = PAROLE_ASPECT_RATIO_NONE; g_mutex_init(&gst->priv->lock); gst->priv->stream = parole_stream_new(); gst->priv->tick_id = 0; diff --git a/src/main.c b/src/main.c index 2d716df..7bd7948 100644 --- a/src/main.c +++ b/src/main.c @@ -221,6 +221,7 @@ int main(int argc, char **argv) { gboolean enqueue = FALSE; gchar *client_id = NULL; gboolean no_controls = FALSE; + gint aspect_ratio = 0; /* Command-line options */ GOptionEntry option_entries[] = { @@ -256,6 +257,8 @@ int main(int argc, char **argv) { &version, N_("Print version information and exit"), NULL }, { "sm-client-id", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &client_id, NULL, NULL }, + { "aspect-ratio", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, + &aspect_ratio, N_("Aspect ratio"), NULL }, {G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, N_("Media to play"), NULL}, { NULL, }, @@ -343,6 +346,10 @@ int main(int argc, char **argv) { player = parole_player_new(client_id); g_free(client_id); + if (aspect_ratio > 0 && + aspect_ratio <= 5) + parole_player_aspect_ratio(player, aspect_ratio); + if (no_controls) parole_player_no_controls(player); diff --git a/src/parole-player.c b/src/parole-player.c index 62eda90..9e5ec40 100644 --- a/src/parole-player.c +++ b/src/parole-player.c @@ -363,6 +363,7 @@ struct ParolePlayerPrivate { gboolean embedded; gboolean full_screen; gboolean no_controls; + gint force_aspect_ratio; gboolean mini_mode; /* Remembered window sizes */ gint last_h, last_w; @@ -399,6 +400,7 @@ struct ParolePlayerPrivate { GtkWidget *repeat_menu_item; GtkWidget *shuffle_menu_item; GtkWidget *revealer; + GtkWidget *aspect_ratio_menu; /* Infobar */ GtkWidget *infobar; @@ -477,39 +479,45 @@ void parole_show_shortcuts(GtkWidget *widget, ParolePlayer *player) { } void ratio_none_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_NONE, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_NONE, + NULL); } void ratio_auto_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_AUTO, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_AUTO, + NULL); } void ratio_square_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_SQUARE, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_SQUARE, + NULL); } void ratio_4_3_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_4_3, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_4_3, + NULL); } void ratio_16_9_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_16_9, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_16_9, + NULL); } void ratio_20_9_toggled_cb(GtkWidget *widget, ParolePlayer *player) { - g_object_set(G_OBJECT(player->priv->conf), - "aspect-ratio", PAROLE_ASPECT_RATIO_DVB, - NULL); + if (player->priv->force_aspect_ratio == PAROLE_ASPECT_RATIO_NONE) + g_object_set(G_OBJECT(player->priv->conf), + "aspect-ratio", PAROLE_ASPECT_RATIO_DVB, + NULL); } void parole_player_widget_activate_action(GtkWidget *widget, GSimpleAction *action) { @@ -3083,6 +3091,15 @@ parole_player_set_wm_opacity_hint(GtkWidget *widget) { 1); } +void +parole_player_aspect_ratio(ParolePlayer *player, gint aspect_ratio) { + gtk_widget_set_sensitive(player->priv->aspect_ratio_menu, FALSE); + + g_object_set(G_OBJECT(player->priv->gst), + "force-aspect-ratio", aspect_ratio, + NULL); +} + static void parole_player_init(ParolePlayer *player) { /* Builder */ @@ -3180,6 +3197,7 @@ parole_player_init(ParolePlayer *player) { player->priv->exit = FALSE; player->priv->full_screen = FALSE; player->priv->no_controls = FALSE; + player->priv->force_aspect_ratio = PAROLE_ASPECT_RATIO_NONE; player->priv->buffering = FALSE; player->priv->row = NULL; player->priv->wait_for_gst_disc_info = FALSE; @@ -3651,6 +3669,7 @@ parole_player_init(ParolePlayer *player) { #endif parole_gst_set_default_aspect_ratio(player, builder); + player->priv->aspect_ratio_menu = GTK_WIDGET(gtk_builder_get_object(builder, "aspect-ratio-menu")); /* * Gst signals diff --git a/src/parole-player.h b/src/parole-player.h index e728314..5cc5baf 100644 --- a/src/parole-player.h +++ b/src/parole-player.h @@ -77,6 +77,9 @@ void parole_player_full_screen (ParolePlayer *p void parole_player_no_controls (ParolePlayer *player); +void parole_player_aspect_ratio (ParolePlayer *player, + gint aspect_ratio); + GSimpleAction *parole_player_get_action(ParolePlayerAction action); -- 2.21.0