1*4882a593SmuzhiyunFrom 0372b83dc2679de0e1a6ad5ede372ca85e6e1793 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Fri, 14 Jun 2019 12:02:05 +0800 4*4882a593SmuzhiyunSubject: [PATCH 06/11] playbin2: Add preferred audio/video sink 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUsing env "PLAYBIN2_PREFERRED_VIDEOSINK" and 7*4882a593Smuzhiyun"PLAYBIN2_PREFERRED_AUDIOSINK". 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun gst/playback/gstplaybin2.c | 31 +++++++++++++++++++++++++++++++ 12*4882a593Smuzhiyun 1 file changed, 31 insertions(+) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyundiff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c 15*4882a593Smuzhiyunindex f71b977..b0879db 100644 16*4882a593Smuzhiyun--- a/gst/playback/gstplaybin2.c 17*4882a593Smuzhiyun+++ b/gst/playback/gstplaybin2.c 18*4882a593Smuzhiyun@@ -204,6 +204,7 @@ 19*4882a593Smuzhiyun #include "config.h" 20*4882a593Smuzhiyun #endif 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun+#include <stdlib.h> 23*4882a593Smuzhiyun #include <string.h> 24*4882a593Smuzhiyun #include <gst/gst.h> 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun@@ -480,6 +481,9 @@ struct _GstPlayBin 27*4882a593Smuzhiyun GList *contexts; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun gboolean is_live; 30*4882a593Smuzhiyun+ 31*4882a593Smuzhiyun+ const gchar *apreferred; 32*4882a593Smuzhiyun+ const gchar *vpreferred; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct _GstPlayBinClass 36*4882a593Smuzhiyun@@ -1585,6 +1589,9 @@ gst_play_bin_init (GstPlayBin * playbin) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun playbin->multiview_mode = GST_VIDEO_MULTIVIEW_FRAME_PACKING_NONE; 39*4882a593Smuzhiyun playbin->multiview_flags = GST_VIDEO_MULTIVIEW_FLAGS_NONE; 40*4882a593Smuzhiyun+ 41*4882a593Smuzhiyun+ playbin->apreferred = g_getenv ("PLAYBIN2_PREFERRED_AUDIOSINK"); 42*4882a593Smuzhiyun+ playbin->vpreferred = g_getenv ("PLAYBIN2_PREFERRED_VIDEOSINK"); 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun static void 46*4882a593Smuzhiyun@@ -4722,6 +4729,7 @@ autoplug_select_cb (GstElement * decodebin, GstPad * pad, 47*4882a593Smuzhiyun GSequence *ave_seq = NULL; 48*4882a593Smuzhiyun GSequenceIter *seq_iter; 49*4882a593Smuzhiyun gboolean created_sink = FALSE; 50*4882a593Smuzhiyun+ const gchar *preferred = NULL; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun playbin = group->playbin; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun@@ -4784,6 +4792,29 @@ autoplug_select_cb (GstElement * decodebin, GstPad * pad, 55*4882a593Smuzhiyun ave_list = g_list_prepend (ave_list, NULL); 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun+ if (isaudiodec) 59*4882a593Smuzhiyun+ preferred = playbin->apreferred; 60*4882a593Smuzhiyun+ else if (isvideodec) 61*4882a593Smuzhiyun+ preferred = playbin->vpreferred; 62*4882a593Smuzhiyun+ 63*4882a593Smuzhiyun+ if (preferred) { 64*4882a593Smuzhiyun+ for (l = ave_list; l; l = l->next) { 65*4882a593Smuzhiyun+ ave = (GstAVElement *) l->data; 66*4882a593Smuzhiyun+ 67*4882a593Smuzhiyun+ if (ave && ave->sink && 68*4882a593Smuzhiyun+ !strcmp (preferred, GST_OBJECT_NAME (ave->sink))) { 69*4882a593Smuzhiyun+ GST_DEBUG_OBJECT (playbin, 70*4882a593Smuzhiyun+ "Preferred sink '%s' for decoder '%s'", 71*4882a593Smuzhiyun+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (ave->sink)), 72*4882a593Smuzhiyun+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory))); 73*4882a593Smuzhiyun+ 74*4882a593Smuzhiyun+ ave_list = g_list_delete_link (ave_list, l); 75*4882a593Smuzhiyun+ ave_list = g_list_prepend (ave_list, ave); 76*4882a593Smuzhiyun+ break; 77*4882a593Smuzhiyun+ } 78*4882a593Smuzhiyun+ } 79*4882a593Smuzhiyun+ } 80*4882a593Smuzhiyun+ 81*4882a593Smuzhiyun /* if it is a decoder and we don't have a fixed sink, then find out 82*4882a593Smuzhiyun * the matching audio/video sink from GstAVElements list */ 83*4882a593Smuzhiyun for (l = ave_list; l; l = l->next) { 84*4882a593Smuzhiyun-- 85*4882a593Smuzhiyun2.20.1 86*4882a593Smuzhiyun 87