PROP_0,
PROP_FRAGMENTS_CACHE,
- PROP_BITRATE_LIMIT,
PROP_LAST
};
#define DEFAULT_FRAGMENTS_CACHE 1
#define DEFAULT_FAILED_COUNT 3
-#define DEFAULT_BITRATE_LIMIT 0.8
/* GObject */
static void gst_hls_demux_set_property (GObject * object, guint prop_id,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED));
#endif
- g_object_class_install_property (gobject_class, PROP_BITRATE_LIMIT,
- g_param_spec_float ("bitrate-limit",
- "Bitrate limit in %",
- "Limit of the available bitrate to use when switching to alternates.",
- 0, 1, DEFAULT_BITRATE_LIMIT,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
element_class->change_state = GST_DEBUG_FUNCPTR (gst_hls_demux_change_state);
gst_element_class_add_pad_template (element_class,
demux->do_typefind = TRUE;
- /* Properties */
- demux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
}
static void
gst_hls_demux_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
- GstHLSDemux *demux = GST_HLS_DEMUX (object);
-
switch (prop_id) {
case PROP_FRAGMENTS_CACHE:
break;
- case PROP_BITRATE_LIMIT:
- demux->bitrate_limit = g_value_get_float (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gst_hls_demux_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec)
{
- GstHLSDemux *demux = GST_HLS_DEMUX (object);
-
switch (prop_id) {
case PROP_FRAGMENTS_CACHE:
g_value_set_uint (value, 1);
break;
- case PROP_BITRATE_LIMIT:
- g_value_set_float (value, demux->bitrate_limit);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
hlsdemux->new_playlist = TRUE;
hlsdemux->do_typefind = TRUE;
/* TODO why not continue using the same? that was being used up to now? */
- gst_hls_demux_change_playlist (hlsdemux, bitrate * hlsdemux->bitrate_limit,
- NULL);
+ gst_hls_demux_change_playlist (hlsdemux, bitrate, NULL);
}
GST_M3U8_CLIENT_LOCK (hlsdemux->client);
if (demux->segment.rate != 1.0)
return FALSE;
- gst_hls_demux_change_playlist (hlsdemux, bitrate * hlsdemux->bitrate_limit,
- &changed);
+ gst_hls_demux_change_playlist (hlsdemux, bitrate, &changed);
if (changed)
gst_hls_demux_setup_streams (GST_ADAPTIVE_DEMUX_CAST (hlsdemux));
return changed;
gboolean do_typefind; /* Whether we need to typefind the next buffer */
gboolean new_playlist; /* Whether a new playlist is about to start and pads should be switched */
- /* Properties */
- gfloat bitrate_limit; /* limit of the available bitrate to use */
/* Streaming task */
gint64 next_download;
PROP_0,
PROP_MAX_QUEUE_SIZE_BUFFERS,
- PROP_BITRATE_LIMIT,
PROP_LAST
};
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED));
#endif
- g_object_class_install_property (gobject_class, PROP_BITRATE_LIMIT,
- g_param_spec_float ("bitrate-limit",
- "Bitrate limit in %",
- "Limit of the available bitrate to use when switching to alternates.",
- 0, 1, DEFAULT_BITRATE_LIMIT,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
gstadaptivedemux_class->process_manifest = gst_mss_demux_process_manifest;
gstadaptivedemux_class->is_live = gst_mss_demux_is_live;
gstadaptivedemux_class->get_duration = gst_mss_demux_get_duration;
gst_mss_demux_init (GstMssDemux * mssdemux)
{
mssdemux->data_queue_max_size = DEFAULT_MAX_QUEUE_SIZE_BUFFERS;
- mssdemux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
gst_adaptive_demux_set_stream_struct_size (GST_ADAPTIVE_DEMUX_CAST (mssdemux),
sizeof (GstMssDemuxStream));
case PROP_MAX_QUEUE_SIZE_BUFFERS:
mssdemux->data_queue_max_size = g_value_get_uint (value);
break;
- case PROP_BITRATE_LIMIT:
- mssdemux->bitrate_limit = g_value_get_float (value);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_MAX_QUEUE_SIZE_BUFFERS:
g_value_set_uint (value, mssdemux->data_queue_max_size);
break;
- case PROP_BITRATE_LIMIT:
- g_value_set_float (value, mssdemux->bitrate_limit);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gst_mss_demux_stream_select_bitrate (GstAdaptiveDemuxStream * stream,
guint64 bitrate)
{
- GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (stream->demux);
GstMssDemuxStream *mssstream = (GstMssDemuxStream *) stream;
gboolean ret = FALSE;
- bitrate *= mssdemux->bitrate_limit;
-
GST_DEBUG_OBJECT (stream->pad,
"Using stream download bitrate %" G_GUINT64_FORMAT, bitrate);
/* properties */
guint data_queue_max_size;
- gfloat bitrate_limit;
};
struct _GstMssDemuxClass {
#define DEFAULT_FAILED_COUNT 3
#define DEFAULT_LOOKBACK_FRAGMENTS 3
#define DEFAULT_CONNECTION_SPEED 0
+#define DEFAULT_BITRATE_LIMIT 0.8
enum
{
PROP_0,
PROP_LOOKBACK_FRAGMENTS,
PROP_CONNECTION_SPEED,
+ PROP_BITRATE_LIMIT,
PROP_LAST
};
GST_DEBUG_OBJECT (demux, "Connection speed set to %u",
demux->connection_speed);
break;
+ case PROP_BITRATE_LIMIT:
+ demux->bitrate_limit = g_value_get_float (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_CONNECTION_SPEED:
g_value_set_uint (value, demux->connection_speed / 1000);
break;
+ case PROP_BITRATE_LIMIT:
+ g_value_set_float (value, demux->bitrate_limit);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
" fragments)", 0, G_MAXUINT / 1000, DEFAULT_CONNECTION_SPEED,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /* FIXME 2.0: rename this property to bandwidth-usage or any better name */
+ g_object_class_install_property (gobject_class, PROP_BITRATE_LIMIT,
+ g_param_spec_float ("bitrate-limit",
+ "Bitrate limit in %",
+ "Limit of the available bitrate to use when switching to alternates.",
+ 0, 1, DEFAULT_BITRATE_LIMIT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gstelement_class->change_state = gst_adaptive_demux_change_state;
gstbin_class->handle_message = gst_adaptive_demux_handle_message;
/* Properties */
demux->num_lookback_fragments = DEFAULT_LOOKBACK_FRAGMENTS;
+ demux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
demux->connection_speed = DEFAULT_CONNECTION_SPEED;
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
return demux->connection_speed;
}
+ stream->current_download_rate *= demux->bitrate_limit;
+ GST_DEBUG_OBJECT (demux, "Bitrate after bitrate limit (%0.2f): %"
+ G_GUINT64_FORMAT, demux->bitrate_limit, stream->current_download_rate);
+
return stream->current_download_rate;
}
gint64 download_chunk_start_time;
gint64 download_total_time;
gint64 download_total_bytes;
- gint current_download_rate;
+ guint64 current_download_rate;
/* Per fragment download information */
guint64 fragment_total_time;
gchar *manifest_uri;
gchar *manifest_base_uri;
+ /* Properties */
guint num_lookback_fragments;
+ gfloat bitrate_limit; /* limit of the available bitrate to use */
guint connection_speed;
gboolean have_group_id;