diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2015-06-09 10:16:34 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2015-06-09 10:20:58 +0100 |
commit | 6ed7ea73cf3a036e67bc52ae2812d138fb2e2d91 (patch) | |
tree | b7fe465b2de8df0b41bdd4d64c0097beae2d7080 /tools | |
parent | 90bbb830d9e4497bf79b66dc0b250e66af9246e1 (diff) | |
download | gst-plugins-base-6ed7ea73cf3a036e67bc52ae2812d138fb2e2d91.tar.gz gst-plugins-base-6ed7ea73cf3a036e67bc52ae2812d138fb2e2d91.tar.xz |
tools: gst-play: add shortcuts to switch audio/subtitle/video tracks
Diffstat (limited to 'tools')
-rw-r--r-- | tools/gst-play-1.0.1 | 9 | ||||
-rw-r--r-- | tools/gst-play.c | 88 |
2 files changed, 96 insertions, 1 deletions
diff --git a/tools/gst-play-1.0.1 b/tools/gst-play-1.0.1 index 6d215d326..1ccae9db0 100644 --- a/tools/gst-play-1.0.1 +++ b/tools/gst-play-1.0.1 @@ -59,6 +59,15 @@ Reverse playback direction .B t Cycle through trick modes .TP 8 +.B a +Switch audio track +.TP 8 +.B s +Switch subtitle track +.TP 8 +.B v +Switch video track +.TP 8 .B > Skip to next item in playlist .TP 8 diff --git a/tools/gst-play.c b/tools/gst-play.c index 2902df3c7..52f6d7164 100644 --- a/tools/gst-play.c +++ b/tools/gst-play.c @@ -31,6 +31,7 @@ #include <gst/audio/audio.h> #include <gst/video/video.h> #include <gst/pbutils/pbutils.h> +#include <gst/tag/tag.h> #include <gst/math-compat.h> #include <stdlib.h> #include <stdio.h> @@ -55,6 +56,14 @@ typedef enum GST_PLAY_TRICK_MODE_LAST } GstPlayTrickMode; +typedef enum +{ + GST_PLAY_TRACK_TYPE_INVALID = 0, + GST_PLAY_TRACK_TYPE_AUDIO, + GST_PLAY_TRACK_TYPE_VIDEO, + GST_PLAY_TRACK_TYPE_SUBTITLE +} GstPlayTrackType; + typedef struct { gchar **uris; @@ -866,6 +875,66 @@ play_switch_trick_mode (GstPlay * play) } static void +play_cycle_track_selection (GstPlay * play, GstPlayTrackType track_type) +{ + const gchar *prop_cur, *prop_n, *prop_get, *name; + gint cur = -1, n = -1; + + switch (track_type) { + case GST_PLAY_TRACK_TYPE_AUDIO: + prop_get = "get-audio-tags"; + prop_cur = "current-audio"; + prop_n = "n-audio"; + name = "audio"; + break; + case GST_PLAY_TRACK_TYPE_VIDEO: + prop_get = "get-video-tags"; + prop_cur = "current-video"; + prop_n = "n-video"; + name = "video"; + break; + case GST_PLAY_TRACK_TYPE_SUBTITLE: + prop_get = "get-text-tags"; + prop_cur = "current-text"; + prop_n = "n-text"; + name = "subtitle"; + break; + default: + return; + } + + g_object_get (play->playbin, prop_cur, &cur, prop_n, &n, NULL); + + if (n < 1) { + g_print ("No %s tracks.\n", name); + } else if (n == 1) { + g_print ("No other %s tracks to switch to.\n", name); + } else { + gchar *lcode = NULL, *lname = NULL; + const gchar *lang = NULL; + GstTagList *tags = NULL; + + cur = (cur + 1) % n; + g_signal_emit_by_name (play->playbin, prop_get, cur, &tags); + if (tags != NULL) { + if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lcode)) + lang = gst_tag_get_language_name (lcode); + else if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_NAME, &lname)) + lang = lname; + gst_tag_list_unref (tags); + } + if (lang != NULL) + g_print ("Switching to %s track %d of %d (%s).\n", name, cur + 1, n, + lang); + else + g_print ("Switching to %s track %d of %d.\n", name, cur + 1, n); + g_object_set (play->playbin, prop_cur, cur, NULL); + g_free (lcode); + g_free (lname); + } +} + +static void print_keyboard_help (void) { static struct @@ -886,6 +955,9 @@ print_keyboard_help (void) "-", N_("decrease playback rate")}, { "d", N_("change playback direction")}, { "t", N_("enable/disable trick modes")}, { + "a", N_("change audio track")}, { + "v", N_("change video track")}, { + "s", N_("change subtitle track")}, { "k", N_("show keyboard shortcuts")},}; guint i, chars_to_pad, desc_len, max_desc_len = 0; @@ -910,8 +982,13 @@ static void keyboard_cb (const gchar * key_input, gpointer user_data) { GstPlay *play = (GstPlay *) user_data; + gchar key = '\0'; + + /* only want to switch/case on single char, not first char of string */ + if (key_input[0] != '\0' && key_input[1] == '\0') + key = g_ascii_tolower (key_input[0]); - switch (g_ascii_tolower (key_input[0])) { + switch (key) { case 'k': print_keyboard_help (); break; @@ -962,6 +1039,15 @@ keyboard_cb (const gchar * key_input, gpointer user_data) g_main_loop_quit (play->loop); break; } + case 'a': + play_cycle_track_selection (play, GST_PLAY_TRACK_TYPE_AUDIO); + break; + case 'v': + play_cycle_track_selection (play, GST_PLAY_TRACK_TYPE_VIDEO); + break; + case 's': + play_cycle_track_selection (play, GST_PLAY_TRACK_TYPE_SUBTITLE); + break; /* fall through */ default: if (strcmp (key_input, GST_PLAY_KB_ARROW_RIGHT) == 0) { |