GstCaps *caps; /* caps on which to stop decoding */
gchar *encoding; /* encoding of subtitles */
gboolean use_buffering; /* configure buffering on multiqueues */
+ gboolean force_sw_decoders;
gint low_percent;
gint high_percent;
guint max_size_bytes;
#define DEFAULT_SUBTITLE_ENCODING NULL
#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_FORCE_SW_DECODERS FALSE
#define DEFAULT_LOW_PERCENT 10
#define DEFAULT_HIGH_PERCENT 99
/* by default we use the automatic values above */
PROP_SUBTITLE_ENCODING,
PROP_SINK_CAPS,
PROP_USE_BUFFERING,
+ PROP_FORCE_SW_DECODERS,
PROP_LOW_PERCENT,
PROP_HIGH_PERCENT,
PROP_MAX_SIZE_BYTES,
DEFAULT_USE_BUFFERING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ * GstDecodeBin::force-sw-decoders:
+ *
+ * While auto-plugging, if set to %TRUE, those decoders within
+ * "Hardware" klass will be ignored. Otherwise they will be tried.
+ *
+ * Since: 1.18
+ */
+ g_object_class_install_property (gobject_klass, PROP_FORCE_SW_DECODERS,
+ g_param_spec_boolean ("force-sw-decoders", "Software Docoders Only",
+ "Use only sofware decoders to process streams",
+ DEFAULT_FORCE_SW_DECODERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
* GstDecodeBin:low-percent
*
* Low threshold percent for buffering to start.
gst_decode_bin_update_factories_list (GstDecodeBin * dbin)
{
guint cookie;
+ GList *factories, *tmp;
cookie = gst_registry_get_feature_list_cookie (gst_registry_get ());
if (!dbin->factories || dbin->factories_cookie != cookie) {
if (dbin->factories)
gst_plugin_feature_list_free (dbin->factories);
- dbin->factories =
+ factories =
gst_element_factory_list_get_elements
(GST_ELEMENT_FACTORY_TYPE_DECODABLE, GST_RANK_MARGINAL);
+
+ if (dbin->force_sw_decoders) {
+ /* filter out Hardware class elements */
+ dbin->factories = NULL;
+ for (tmp = factories; tmp; tmp = g_list_next (tmp)) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+ if (!gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_HARDWARE)) {
+ dbin->factories = g_list_prepend (dbin->factories, factory);
+ } else {
+ gst_object_unref (factory);
+ }
+ }
+ g_list_free (factories);
+ } else {
+ dbin->factories = factories;
+ }
+
dbin->factories =
g_list_sort (dbin->factories,
gst_playback_utils_compare_factories_func);
decode_bin->encoding = g_strdup (DEFAULT_SUBTITLE_ENCODING);
decode_bin->caps = gst_static_caps_get (&default_raw_caps);
decode_bin->use_buffering = DEFAULT_USE_BUFFERING;
+ decode_bin->force_sw_decoders = DEFAULT_FORCE_SW_DECODERS;
decode_bin->low_percent = DEFAULT_LOW_PERCENT;
decode_bin->high_percent = DEFAULT_HIGH_PERCENT;
case PROP_USE_BUFFERING:
dbin->use_buffering = g_value_get_boolean (value);
break;
+ case PROP_FORCE_SW_DECODERS:
+ dbin->force_sw_decoders = g_value_get_boolean (value);
+ break;
case PROP_LOW_PERCENT:
dbin->low_percent = g_value_get_int (value);
break;
case PROP_USE_BUFFERING:
g_value_set_boolean (value, dbin->use_buffering);
break;
+ case PROP_FORCE_SW_DECODERS:
+ g_value_set_boolean (value, dbin->force_sw_decoders);
+ break;
case PROP_LOW_PERCENT:
g_value_set_int (value, dbin->low_percent);
break;
if (playbin->curr_group) {
GST_SOURCE_GROUP_LOCK (playbin->curr_group);
if (playbin->curr_group->uridecodebin) {
- g_object_set (playbin->curr_group->uridecodebin, "download",
- (g_value_get_flags (value) & GST_PLAY_FLAG_DOWNLOAD) != 0, NULL);
+ guint flags = g_value_get_flags (value);
+ g_object_set (playbin->curr_group->uridecodebin,
+ "download", (flags & GST_PLAY_FLAG_DOWNLOAD) != 0,
+ "force-sw-decoders",
+ (flags & GST_PLAY_FLAG_FORCE_SW_DECODERS) != 0, NULL);
}
GST_SOURCE_GROUP_UNLOCK (playbin->curr_group);
}
}
static GList *
-create_decoders_list (GList * factory_list, GSequence * avelements)
+create_decoders_list (GList * factory_list, GSequence * avelements,
+ GstPlayFlags flags)
{
GList *dec_list = NULL, *tmp;
GList *ave_list = NULL;
gst_element_factory_list_is_type (factory,
GST_ELEMENT_FACTORY_TYPE_SINK)) {
dec_list = g_list_prepend (dec_list, gst_object_ref (factory));
- } else {
+ } else if (!(((flags & GST_PLAY_FLAG_FORCE_SW_DECODERS) != 0)
+ && gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_HARDWARE))) {
GSequenceIter *seq_iter;
seq_iter =
if (isaudiodeclist || isvideodeclist) {
GSequence **ave_list;
+ GstPlayFlags flags;
+
if (isaudiodeclist)
ave_list = &playbin->aelements;
else
ave_list = &playbin->velements;
+ flags = gst_play_bin_get_flags (playbin);
+
g_mutex_lock (&playbin->elements_lock);
/* sort factory_list based on the GstAVElement list priority */
- factory_list = create_decoders_list (factory_list, *ave_list);
+ factory_list = create_decoders_list (factory_list, *ave_list, flags);
g_mutex_unlock (&playbin->elements_lock);
}
"download", ((flags & GST_PLAY_FLAG_DOWNLOAD) != 0),
/* configure buffering of demuxed/parsed data */
"use-buffering", ((flags & GST_PLAY_FLAG_BUFFERING) != 0),
+ /* enable hardware-based elements */
+ "force-sw-decoders", ((flags & GST_PLAY_FLAG_FORCE_SW_DECODERS) != 0),
/* configure buffering parameters */
"buffer-duration", playbin->buffer_duration,
"buffer-size", playbin->buffer_size,
guint buffer_size; /* When buffering, buffer size (bytes) */
gboolean download;
gboolean use_buffering;
+ gboolean force_sw_decoders;
GstElement *source;
GstElement *queue;
#define DEFAULT_BUFFER_SIZE -1
#define DEFAULT_DOWNLOAD FALSE
#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_FORCE_SW_DECODERS FALSE
#define DEFAULT_EXPOSE_ALL_STREAMS TRUE
#define DEFAULT_RING_BUFFER_MAX_SIZE 0
PROP_BUFFER_DURATION,
PROP_DOWNLOAD,
PROP_USE_BUFFERING,
+ PROP_FORCE_SW_DECODERS,
PROP_EXPOSE_ALL_STREAMS,
PROP_RING_BUFFER_MAX_SIZE
};
gst_uri_decode_bin_update_factories_list (GstURIDecodeBin * dec)
{
guint32 cookie;
+ GList *factories, *tmp;
cookie = gst_registry_get_feature_list_cookie (gst_registry_get ());
if (!dec->factories || dec->factories_cookie != cookie) {
if (dec->factories)
gst_plugin_feature_list_free (dec->factories);
- dec->factories =
+ factories =
gst_element_factory_list_get_elements
(GST_ELEMENT_FACTORY_TYPE_DECODABLE, GST_RANK_MARGINAL);
+
+ if (dec->force_sw_decoders) {
+ /* filter out Hardware class elements */
+ dec->factories = NULL;
+ for (tmp = factories; tmp; tmp = g_list_next (tmp)) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+ if (!gst_element_factory_list_is_type (factory,
+ GST_ELEMENT_FACTORY_TYPE_HARDWARE)) {
+ dec->factories = g_list_prepend (dec->factories, factory);
+ } else {
+ gst_object_unref (factory);
+ }
+ }
+ g_list_free (factories);
+ } else {
+ dec->factories = factories;
+ }
+
dec->factories =
g_list_sort (dec->factories, gst_playback_utils_compare_factories_func);
dec->factories_cookie = cookie;
DEFAULT_USE_BUFFERING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ * GstURIDecodeBin::force-sw-decoders:
+ *
+ * While auto-plugging, if set to %TRUE, those decoders within
+ * "Hardware" klass will be ignored. Otherwise they will be tried.
+ *
+ * Since: 1.18
+ */
+ g_object_class_install_property (gobject_class, PROP_FORCE_SW_DECODERS,
+ g_param_spec_boolean ("force-sw-decoders", "Software Docoders Only",
+ "Use only sofware decoders to process streams",
+ DEFAULT_FORCE_SW_DECODERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
* GstURIDecodeBin::expose-all-streams:
*
* Expose streams of unknown type.
dec->buffer_size = DEFAULT_BUFFER_SIZE;
dec->download = DEFAULT_DOWNLOAD;
dec->use_buffering = DEFAULT_USE_BUFFERING;
+ dec->force_sw_decoders = DEFAULT_FORCE_SW_DECODERS;
dec->expose_allstreams = DEFAULT_EXPOSE_ALL_STREAMS;
dec->ring_buffer_max_size = DEFAULT_RING_BUFFER_MAX_SIZE;
case PROP_USE_BUFFERING:
dec->use_buffering = g_value_get_boolean (value);
break;
+ case PROP_FORCE_SW_DECODERS:
+ dec->force_sw_decoders = g_value_get_boolean (value);
+ break;
case PROP_EXPOSE_ALL_STREAMS:
dec->expose_allstreams = g_value_get_boolean (value);
break;
case PROP_USE_BUFFERING:
g_value_set_boolean (value, dec->use_buffering);
break;
+ case PROP_FORCE_SW_DECODERS:
+ g_value_set_boolean (value, dec->force_sw_decoders);
+ break;
case PROP_EXPOSE_ALL_STREAMS:
g_value_set_boolean (value, dec->expose_allstreams);
break;
"unknown-type", G_CALLBACK (unknown_type_cb), decoder);
}
+ g_object_set (decodebin, "force-sw-decoders", decoder->force_sw_decoders,
+ NULL);
+
/* configure caps if we have any */
if (decoder->caps)
g_object_set (decodebin, "caps", decoder->caps, NULL);