adaptivedemux: add connection-speed property
Allows to set a bitrate directly instead of measuring it internally based on the received chunks. The connection-speed was removed from mssdemux and hlsdemux as it is now in the base class
This commit is contained in:
parent
34c9c86ab7
commit
e9ab79dc36
@ -63,14 +63,12 @@ enum
|
|||||||
|
|
||||||
PROP_FRAGMENTS_CACHE,
|
PROP_FRAGMENTS_CACHE,
|
||||||
PROP_BITRATE_LIMIT,
|
PROP_BITRATE_LIMIT,
|
||||||
PROP_CONNECTION_SPEED,
|
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_FRAGMENTS_CACHE 1
|
#define DEFAULT_FRAGMENTS_CACHE 1
|
||||||
#define DEFAULT_FAILED_COUNT 3
|
#define DEFAULT_FAILED_COUNT 3
|
||||||
#define DEFAULT_BITRATE_LIMIT 0.8
|
#define DEFAULT_BITRATE_LIMIT 0.8
|
||||||
#define DEFAULT_CONNECTION_SPEED 0
|
|
||||||
|
|
||||||
/* GObject */
|
/* GObject */
|
||||||
static void gst_hls_demux_set_property (GObject * object, guint prop_id,
|
static void gst_hls_demux_set_property (GObject * object, guint prop_id,
|
||||||
@ -177,12 +175,6 @@ gst_hls_demux_class_init (GstHLSDemuxClass * klass)
|
|||||||
0, 1, DEFAULT_BITRATE_LIMIT,
|
0, 1, DEFAULT_BITRATE_LIMIT,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED,
|
|
||||||
g_param_spec_uint ("connection-speed", "Connection Speed",
|
|
||||||
"Network connection speed in kbps (0 = unknown)",
|
|
||||||
0, G_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
element_class->change_state = GST_DEBUG_FUNCPTR (gst_hls_demux_change_state);
|
element_class->change_state = GST_DEBUG_FUNCPTR (gst_hls_demux_change_state);
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
@ -232,7 +224,6 @@ gst_hls_demux_init (GstHLSDemux * demux)
|
|||||||
|
|
||||||
/* Properties */
|
/* Properties */
|
||||||
demux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
|
demux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
|
||||||
demux->connection_speed = DEFAULT_CONNECTION_SPEED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -247,9 +238,6 @@ gst_hls_demux_set_property (GObject * object, guint prop_id,
|
|||||||
case PROP_BITRATE_LIMIT:
|
case PROP_BITRATE_LIMIT:
|
||||||
demux->bitrate_limit = g_value_get_float (value);
|
demux->bitrate_limit = g_value_get_float (value);
|
||||||
break;
|
break;
|
||||||
case PROP_CONNECTION_SPEED:
|
|
||||||
demux->connection_speed = g_value_get_uint (value) * 1000;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -269,9 +257,6 @@ gst_hls_demux_get_property (GObject * object, guint prop_id, GValue * value,
|
|||||||
case PROP_BITRATE_LIMIT:
|
case PROP_BITRATE_LIMIT:
|
||||||
g_value_set_float (value, demux->bitrate_limit);
|
g_value_set_float (value, demux->bitrate_limit);
|
||||||
break;
|
break;
|
||||||
case PROP_CONNECTION_SPEED:
|
|
||||||
g_value_set_uint (value, demux->connection_speed / 1000);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -488,13 +473,13 @@ gst_hls_demux_process_manifest (GstAdaptiveDemux * demux, GstBuffer * buf)
|
|||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
/* TODO seems like something that could be simplified */
|
/* TODO seems like something that could be simplified */
|
||||||
if (hlsdemux->connection_speed == 0) {
|
if (demux->connection_speed == 0) {
|
||||||
GST_M3U8_CLIENT_LOCK (hlsdemux->client);
|
GST_M3U8_CLIENT_LOCK (hlsdemux->client);
|
||||||
child = hlsdemux->client->main->current_variant->data;
|
child = hlsdemux->client->main->current_variant->data;
|
||||||
GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
|
GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
|
||||||
} else {
|
} else {
|
||||||
GList *tmp = gst_m3u8_client_get_playlist_for_bitrate (hlsdemux->client,
|
GList *tmp = gst_m3u8_client_get_playlist_for_bitrate (hlsdemux->client,
|
||||||
hlsdemux->connection_speed);
|
demux->connection_speed);
|
||||||
|
|
||||||
child = GST_M3U8 (tmp->data);
|
child = GST_M3U8 (tmp->data);
|
||||||
}
|
}
|
||||||
@ -1074,11 +1059,6 @@ gst_hls_demux_change_playlist (GstHLSDemux * demux, guint max_bitrate,
|
|||||||
|
|
||||||
stream = adaptive_demux->streams->data;
|
stream = adaptive_demux->streams->data;
|
||||||
|
|
||||||
/* If user specifies a connection speed never use a playlist with a bandwidth
|
|
||||||
* superior than it */
|
|
||||||
if (demux->connection_speed != 0 && max_bitrate > demux->connection_speed)
|
|
||||||
max_bitrate = demux->connection_speed;
|
|
||||||
|
|
||||||
previous_variant = demux->client->main->current_variant;
|
previous_variant = demux->client->main->current_variant;
|
||||||
current_variant = gst_m3u8_client_get_playlist_for_bitrate (demux->client,
|
current_variant = gst_m3u8_client_get_playlist_for_bitrate (demux->client,
|
||||||
max_bitrate);
|
max_bitrate);
|
||||||
|
@ -76,7 +76,6 @@ struct _GstHLSDemux
|
|||||||
|
|
||||||
/* Properties */
|
/* Properties */
|
||||||
gfloat bitrate_limit; /* limit of the available bitrate to use */
|
gfloat bitrate_limit; /* limit of the available bitrate to use */
|
||||||
guint connection_speed; /* Network connection speed in kbps (0 = unknown) */
|
|
||||||
|
|
||||||
/* Streaming task */
|
/* Streaming task */
|
||||||
gint64 next_download;
|
gint64 next_download;
|
||||||
|
@ -77,7 +77,6 @@
|
|||||||
|
|
||||||
GST_DEBUG_CATEGORY (mssdemux_debug);
|
GST_DEBUG_CATEGORY (mssdemux_debug);
|
||||||
|
|
||||||
#define DEFAULT_CONNECTION_SPEED 0
|
|
||||||
#define DEFAULT_MAX_QUEUE_SIZE_BUFFERS 0
|
#define DEFAULT_MAX_QUEUE_SIZE_BUFFERS 0
|
||||||
#define DEFAULT_BITRATE_LIMIT 0.8
|
#define DEFAULT_BITRATE_LIMIT 0.8
|
||||||
|
|
||||||
@ -85,7 +84,6 @@ enum
|
|||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
|
||||||
PROP_CONNECTION_SPEED,
|
|
||||||
PROP_MAX_QUEUE_SIZE_BUFFERS,
|
PROP_MAX_QUEUE_SIZE_BUFFERS,
|
||||||
PROP_BITRATE_LIMIT,
|
PROP_BITRATE_LIMIT,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
@ -166,12 +164,6 @@ gst_mss_demux_class_init (GstMssDemuxClass * klass)
|
|||||||
gobject_class->set_property = gst_mss_demux_set_property;
|
gobject_class->set_property = gst_mss_demux_set_property;
|
||||||
gobject_class->get_property = gst_mss_demux_get_property;
|
gobject_class->get_property = gst_mss_demux_get_property;
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED,
|
|
||||||
g_param_spec_uint ("connection-speed", "Connection Speed",
|
|
||||||
"Network connection speed in kbps (0 = unknown)",
|
|
||||||
0, G_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
|
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
||||||
|
|
||||||
#ifndef GST_REMOVE_DEPRECATED
|
#ifndef GST_REMOVE_DEPRECATED
|
||||||
g_object_class_install_property (gobject_class, PROP_MAX_QUEUE_SIZE_BUFFERS,
|
g_object_class_install_property (gobject_class, PROP_MAX_QUEUE_SIZE_BUFFERS,
|
||||||
g_param_spec_uint ("max-queue-size-buffers", "Max queue size in buffers",
|
g_param_spec_uint ("max-queue-size-buffers", "Max queue size in buffers",
|
||||||
@ -250,14 +242,6 @@ gst_mss_demux_set_property (GObject * object, guint prop_id,
|
|||||||
GstMssDemux *mssdemux = GST_MSS_DEMUX (object);
|
GstMssDemux *mssdemux = GST_MSS_DEMUX (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_SPEED:
|
|
||||||
GST_OBJECT_LOCK (mssdemux);
|
|
||||||
mssdemux->connection_speed = g_value_get_uint (value) * 1000;
|
|
||||||
mssdemux->update_bitrates = TRUE;
|
|
||||||
GST_DEBUG_OBJECT (mssdemux, "Connection speed set to %" G_GUINT64_FORMAT,
|
|
||||||
mssdemux->connection_speed);
|
|
||||||
GST_OBJECT_UNLOCK (mssdemux);
|
|
||||||
break;
|
|
||||||
case PROP_MAX_QUEUE_SIZE_BUFFERS:
|
case PROP_MAX_QUEUE_SIZE_BUFFERS:
|
||||||
mssdemux->data_queue_max_size = g_value_get_uint (value);
|
mssdemux->data_queue_max_size = g_value_get_uint (value);
|
||||||
break;
|
break;
|
||||||
@ -277,9 +261,6 @@ gst_mss_demux_get_property (GObject * object, guint prop_id, GValue * value,
|
|||||||
GstMssDemux *mssdemux = GST_MSS_DEMUX (object);
|
GstMssDemux *mssdemux = GST_MSS_DEMUX (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CONNECTION_SPEED:
|
|
||||||
g_value_set_uint (value, mssdemux->connection_speed / 1000);
|
|
||||||
break;
|
|
||||||
case PROP_MAX_QUEUE_SIZE_BUFFERS:
|
case PROP_MAX_QUEUE_SIZE_BUFFERS:
|
||||||
g_value_set_uint (value, mssdemux->data_queue_max_size);
|
g_value_set_uint (value, mssdemux->data_queue_max_size);
|
||||||
break;
|
break;
|
||||||
@ -416,11 +397,9 @@ gst_mss_demux_setup_streams (GstAdaptiveDemux * demux)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_INFO_OBJECT (mssdemux, "Changing max bitrate to %" G_GUINT64_FORMAT,
|
GST_INFO_OBJECT (mssdemux, "Changing max bitrate to %u",
|
||||||
mssdemux->connection_speed);
|
demux->connection_speed);
|
||||||
gst_mss_manifest_change_bitrate (mssdemux->manifest,
|
gst_mss_manifest_change_bitrate (mssdemux->manifest, demux->connection_speed);
|
||||||
mssdemux->connection_speed);
|
|
||||||
mssdemux->update_bitrates = FALSE;
|
|
||||||
|
|
||||||
for (iter = streams; iter; iter = g_slist_next (iter)) {
|
for (iter = streams; iter; iter = g_slist_next (iter)) {
|
||||||
GstPad *srcpad = NULL;
|
GstPad *srcpad = NULL;
|
||||||
@ -508,9 +487,6 @@ gst_mss_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream,
|
|||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
|
||||||
bitrate *= mssdemux->bitrate_limit;
|
bitrate *= mssdemux->bitrate_limit;
|
||||||
if (mssdemux->connection_speed) {
|
|
||||||
bitrate = MIN (mssdemux->connection_speed, bitrate);
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (stream->pad,
|
GST_DEBUG_OBJECT (stream->pad,
|
||||||
"Using stream download bitrate %" G_GUINT64_FORMAT, bitrate);
|
"Using stream download bitrate %" G_GUINT64_FORMAT, bitrate);
|
||||||
|
@ -70,10 +70,7 @@ struct _GstMssDemux {
|
|||||||
guint n_videos;
|
guint n_videos;
|
||||||
guint n_audios;
|
guint n_audios;
|
||||||
|
|
||||||
gboolean update_bitrates;
|
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
guint64 connection_speed; /* in bps */
|
|
||||||
guint data_queue_max_size;
|
guint data_queue_max_size;
|
||||||
gfloat bitrate_limit;
|
gfloat bitrate_limit;
|
||||||
};
|
};
|
||||||
|
@ -87,11 +87,13 @@ GST_DEBUG_CATEGORY (adaptivedemux_debug);
|
|||||||
#define MAX_DOWNLOAD_ERROR_COUNT 3
|
#define MAX_DOWNLOAD_ERROR_COUNT 3
|
||||||
#define DEFAULT_FAILED_COUNT 3
|
#define DEFAULT_FAILED_COUNT 3
|
||||||
#define DEFAULT_LOOKBACK_FRAGMENTS 3
|
#define DEFAULT_LOOKBACK_FRAGMENTS 3
|
||||||
|
#define DEFAULT_CONNECTION_SPEED 0
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_LOOKBACK_FRAGMENTS,
|
PROP_LOOKBACK_FRAGMENTS,
|
||||||
|
PROP_CONNECTION_SPEED,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -227,6 +229,11 @@ gst_adaptive_demux_set_property (GObject * object, guint prop_id,
|
|||||||
case PROP_LOOKBACK_FRAGMENTS:
|
case PROP_LOOKBACK_FRAGMENTS:
|
||||||
demux->num_lookback_fragments = g_value_get_uint (value);
|
demux->num_lookback_fragments = g_value_get_uint (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CONNECTION_SPEED:
|
||||||
|
demux->connection_speed = g_value_get_uint (value) * 1000;
|
||||||
|
GST_DEBUG_OBJECT (demux, "Connection speed set to %u",
|
||||||
|
demux->connection_speed);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -243,6 +250,9 @@ gst_adaptive_demux_get_property (GObject * object, guint prop_id,
|
|||||||
case PROP_LOOKBACK_FRAGMENTS:
|
case PROP_LOOKBACK_FRAGMENTS:
|
||||||
g_value_set_uint (value, demux->num_lookback_fragments);
|
g_value_set_uint (value, demux->num_lookback_fragments);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CONNECTION_SPEED:
|
||||||
|
g_value_set_uint (value, demux->connection_speed / 1000);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -277,6 +287,12 @@ gst_adaptive_demux_class_init (GstAdaptiveDemuxClass * klass)
|
|||||||
1, G_MAXUINT, DEFAULT_LOOKBACK_FRAGMENTS,
|
1, G_MAXUINT, DEFAULT_LOOKBACK_FRAGMENTS,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED,
|
||||||
|
g_param_spec_uint ("connection-speed", "Connection Speed",
|
||||||
|
"Network connection speed in kbps (0 = calculate from downloaded"
|
||||||
|
" fragments)", 0, G_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gstelement_class->change_state = gst_adaptive_demux_change_state;
|
gstelement_class->change_state = gst_adaptive_demux_change_state;
|
||||||
|
|
||||||
gstbin_class->handle_message = gst_adaptive_demux_handle_message;
|
gstbin_class->handle_message = gst_adaptive_demux_handle_message;
|
||||||
@ -323,7 +339,9 @@ gst_adaptive_demux_init (GstAdaptiveDemux * demux,
|
|||||||
gst_pad_set_chain_function (demux->sinkpad,
|
gst_pad_set_chain_function (demux->sinkpad,
|
||||||
GST_DEBUG_FUNCPTR (gst_adaptive_demux_sink_chain));
|
GST_DEBUG_FUNCPTR (gst_adaptive_demux_sink_chain));
|
||||||
|
|
||||||
|
/* Properties */
|
||||||
demux->num_lookback_fragments = DEFAULT_LOOKBACK_FRAGMENTS;
|
demux->num_lookback_fragments = DEFAULT_LOOKBACK_FRAGMENTS;
|
||||||
|
demux->connection_speed = DEFAULT_CONNECTION_SPEED;
|
||||||
|
|
||||||
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
|
||||||
}
|
}
|
||||||
@ -702,7 +720,8 @@ gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (first_segment)
|
if (first_segment)
|
||||||
demux->segment.start = demux->segment.position = demux->segment.time = min_pts;
|
demux->segment.start = demux->segment.position = demux->segment.time =
|
||||||
|
min_pts;
|
||||||
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
|
for (iter = demux->streams; iter; iter = g_list_next (iter)) {
|
||||||
GstAdaptiveDemuxStream *stream = iter->data;
|
GstAdaptiveDemuxStream *stream = iter->data;
|
||||||
|
|
||||||
@ -1260,6 +1279,12 @@ gst_adaptive_demux_stream_update_current_bitrate (GstAdaptiveDemux * demux,
|
|||||||
/* Conservative approach, make sure we don't upgrade too fast */
|
/* Conservative approach, make sure we don't upgrade too fast */
|
||||||
stream->current_download_rate = MIN (average_bitrate, fragment_bitrate);
|
stream->current_download_rate = MIN (average_bitrate, fragment_bitrate);
|
||||||
|
|
||||||
|
if (demux->connection_speed) {
|
||||||
|
GST_LOG_OBJECT (demux, "Connection-speed is set to %u kbps, using it",
|
||||||
|
demux->connection_speed / 1000);
|
||||||
|
return demux->connection_speed;
|
||||||
|
}
|
||||||
|
|
||||||
return stream->current_download_rate;
|
return stream->current_download_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,6 +192,7 @@ struct _GstAdaptiveDemux
|
|||||||
gchar *manifest_base_uri;
|
gchar *manifest_base_uri;
|
||||||
|
|
||||||
guint num_lookback_fragments;
|
guint num_lookback_fragments;
|
||||||
|
guint connection_speed;
|
||||||
|
|
||||||
gboolean have_group_id;
|
gboolean have_group_id;
|
||||||
guint group_id;
|
guint group_id;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user