typedef struct {
guint buffering_bytes; // bytes
gint buffering_time; // ms
- gdouble percent_byte;
- gdouble percent_time;
+ gdouble watermark_byte;
+ gdouble watermark_time;
} streaming_buffer_info_t;
-static void streaming_set_buffer_percent(mm_player_streaming_t *streamer, BufferType type, gdouble high_percent_byte, gdouble high_percent_time);
+static void streaming_set_buffer_watermark(mm_player_streaming_t *streamer, BufferType type, gdouble high_watermark_byte, gdouble high_watermark_time);
static void streaming_set_queue2_queue_type(mm_player_streaming_t *streamer, MuxedBufferType type, guint64 content_size);
static void streaming_set_buffer_size(mm_player_streaming_t *streamer, BufferType type, guint buffering_bytes, gint buffering_time);
static void streaming_update_buffering_status(mm_player_streaming_t *streamer, GstMessage *buffering_msg, gint64 position);
buffer_handle->buffering_bytes = DEFAULT_BUFFER_SIZE_BYTES;
buffer_handle->buffering_time = DEFAULT_BUFFERING_TIME;
- buffer_handle->buffer_high_percent = DEFAULT_BUFFER_HIGH_PERCENT;
+ buffer_handle->buffer_high_watermark = DEFAULT_BUFFER_HIGH_WATERMARK;
buffer_handle->is_live = FALSE;
}
return;
}
-static void streaming_set_buffer_percent(mm_player_streaming_t *streamer,
- BufferType type, gdouble high_percent_byte, gdouble high_percent_time)
+static void streaming_set_buffer_watermark(mm_player_streaming_t *streamer,
+ BufferType type, gdouble high_watermark_byte, gdouble high_watermark_time)
{
- gdouble high_percent = 0.0;
+ gdouble high_watermark = 0.0;
streaming_buffer_t *buffer_handle = NULL;
gchar *factory_name = NULL;
}
if (type == BUFFER_TYPE_MUXED)
- high_percent = high_percent_byte;
+ high_watermark = high_watermark_byte;
else
- high_percent = MAX(high_percent_time, high_percent_byte);
+ high_watermark = MAX(high_watermark_time, high_watermark_byte);
- if (high_percent <= MIN_BUFFER_PERCENT || high_percent >= MAX_BUFFER_PERCENT)
- high_percent = DEFAULT_BUFFER_HIGH_PERCENT;
+ if (high_watermark <= MIN_BUFFER_WATERMARK || high_watermark >= MAX_BUFFER_WATERMARK)
+ high_watermark = DEFAULT_BUFFER_HIGH_WATERMARK;
/* if use-buffering is disabled, this settings do not have any meaning. */
- LOGD("target buffer elem : %s (~ %2.3f)",
- GST_ELEMENT_NAME(buffer_handle->buffer), high_percent);
+ LOGD("target buffer elem : %s (~ %1.3f)",
+ GST_ELEMENT_NAME(buffer_handle->buffer), high_watermark);
- if ((high_percent == DEFAULT_BUFFER_HIGH_PERCENT) ||
- (buffer_handle->buffer_high_percent != high_percent))
- g_object_set(G_OBJECT(buffer_handle->buffer), "high-percent", (gint)high_percent, NULL);
+ if ((high_watermark == DEFAULT_BUFFER_HIGH_WATERMARK) ||
+ (buffer_handle->buffer_high_watermark != high_watermark))
+ g_object_set(G_OBJECT(buffer_handle->buffer), "high-watermark", high_watermark, NULL);
- buffer_handle->buffer_high_percent = high_percent;
+ buffer_handle->buffer_high_watermark = high_watermark;
MMPLAYER_FLEAVE();
return;
{
streaming_buffer_t *buffer_handle = NULL;
guint64 buffer_size = 0; /* bytes */
- gchar *factory_name = NULL;
MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(streamer);
return;
}
- factory_name = GST_OBJECT_NAME(gst_element_get_factory(buffer_handle->buffer));
- if (!factory_name) {
- LOGE("Fail to get factory name!");
- return;
- }
-
- LOGD("target buffer elem : %s", GST_ELEMENT_NAME(buffer_handle->buffer));
-
- if (!g_strrstr(factory_name, "queue2")) {
- LOGD("only queue2 can use file buffer. not decodebin2 or multiQ");
- return;
- }
-
- if (type == MUXED_BUFFER_TYPE_MEM_QUEUE) {
+ if (type == MUXED_BUFFER_TYPE_MEM_QUEUE) { /* ts */
LOGD("use memory queue for buffering. streaming is played on push-based. \n"
"buffering position would not be updated.\n"
"buffered data would be flushed after played.\n"
return;
}
+ /* @see ini->http_ring_buffer_size */
buffer_size = (guint64)((streamer->ring_buffer_size > 0) ? (streamer->ring_buffer_size) : DEFAULT_RING_BUFFER_SIZE_BYTES);
- LOGW("[Queue2] set ring buffer size: %"G_GUINT64_FORMAT, buffer_size);
+ LOGW("ring buffer size: %"G_GUINT64_FORMAT, buffer_size);
g_object_set(G_OBJECT(buffer_handle->buffer), "ring-buffer-max-size", buffer_size, NULL);
MMPLAYER_FLEAVE();
buffering_time = GET_CURRENT_BUFFERING_TIME(buffer_handle);
g_object_set(G_OBJECT(buffer_handle->buffer),
- "max-size-bytes", MAX_BUFFER_SIZE_BYTES, /* mq size is fixed, control it with high/low percent value*/
+ "max-size-bytes", MAX_BUFFER_SIZE_BYTES, /* mq size is fixed, control it with high/low watermark value*/
"max-size-time", (guint64)(buffering_time * GST_MSECOND),
"max-size-buffers", 0, NULL); /* disable */
MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(streamer && buffer);
- LOGD("use queue2 buffering %d", use_buffering);
+ LOGD("use buffering %d, type %d, content_size %"G_GUINT64_FORMAT, use_buffering, type, content_size);
streamer->buffer_handle[BUFFER_TYPE_MUXED].buffer = buffer;
LOGD("buffer time: %d ms, buffer bytes: %d", queue_size_time, queue_size_bytes);
streaming_set_buffer_size(streamer, BUFFER_TYPE_MUXED, queue_size_bytes, queue_size_time);
- streaming_set_buffer_percent(streamer, BUFFER_TYPE_MUXED, DEFAULT_BUFFER_HIGH_PERCENT, 0);
+ streaming_set_buffer_watermark(streamer, BUFFER_TYPE_MUXED, DEFAULT_BUFFER_HIGH_WATERMARK, 0);
MMPLAYER_FLEAVE();
return;
g_object_set(G_OBJECT(decodebin),
"max-size-bytes", buffer_handle->buffering_bytes,
"max-size-time", (guint64)(buffer_handle->buffering_time * GST_MSECOND),
- "high-percent", (gint)buffer_handle->buffer_high_percent, NULL);
+ "high-percent", (gint)(buffer_handle->buffer_high_watermark * 100), NULL);
}
streamer->need_sync = FALSE;
void __mm_player_streaming_set_multiqueue(mm_player_streaming_t *streamer, GstElement *buffer)
{
streaming_buffer_t *buffer_handle = NULL;
- gdouble high_percent = 0.0;
+ gdouble high_watermark = 0.0;
MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(streamer && buffer);
if (streamer->buffering_req.prebuffer_time <= MIN_BUFFERING_TIME)
streamer->buffering_req.prebuffer_time = DEFAULT_PREBUFFERING_TIME;
- high_percent = (gdouble)(streamer->buffering_req.prebuffer_time * 100) / MAX_BUFFER_SIZE_TIME;
- LOGD("high_percent %2.3f %%", high_percent);
+ high_watermark = (gdouble)(streamer->buffering_req.prebuffer_time * 100) / MAX_BUFFER_SIZE_TIME;
+ LOGD("high_watermark %1.3f %%", high_watermark);
/* initial setting */
streaming_set_buffer_size(streamer, BUFFER_TYPE_DEMUXED, MAX_BUFFER_SIZE_BYTES, MAX_BUFFER_SIZE_TIME);
- streaming_set_buffer_percent(streamer, BUFFER_TYPE_DEMUXED, 0, high_percent);
+ streaming_set_buffer_watermark(streamer, BUFFER_TYPE_DEMUXED, 0, high_watermark);
streamer->need_sync = TRUE;
guint buffering_bytes = 0;
gint buffering_time = 0;
- gdouble per_byte = 0.0;
- gdouble per_time = 0.0;
+ gdouble wm_byte = 0.0;
+ gdouble wm_time = 0.0;
MMPLAYER_RETURN_IF_FAIL(streamer);
MMPLAYER_RETURN_IF_FAIL(buffer_info);
LOGD("buffering time: %d ms, out rate: %d", buffering_time, byte_out_rate);
if ((buffering_time > 0) && (byte_out_rate > 0)) {
- buffering_bytes = (guint)GET_NEW_BUFFERING_BYTE((gdouble)(byte_out_rate * buffering_time) / 1000);
+ guint max_size_byte = GET_MAX_BYTE_BUFFER_SIZE(streamer->streaming_buffer_type);
+ buffering_bytes = (guint)GET_NEW_BUFFERING_BYTE((gdouble)(byte_out_rate * buffering_time) / 1000, max_size_byte);
} else {
if (buffering_time <= 0)
buffering_time = GET_CURRENT_BUFFERING_TIME(buffer_handle);
buffering_bytes = GET_CURRENT_BUFFERING_BYTE(buffer_handle);
}
- GET_PERCENT(buffering_time, GET_CURRENT_BUFFERING_TIME(buffer_handle), buffer_handle->buffer_high_percent, per_time);
- GET_PERCENT(buffering_bytes, GET_CURRENT_BUFFERING_BYTE(buffer_handle), buffer_handle->buffer_high_percent, per_byte);
+ GET_WATERMARK(buffering_time, GET_CURRENT_BUFFERING_TIME(buffer_handle), buffer_handle->buffer_high_watermark, wm_time);
+ GET_WATERMARK(buffering_bytes, GET_CURRENT_BUFFERING_BYTE(buffer_handle), buffer_handle->buffer_high_watermark, wm_byte);
- LOGD("bytes %d, time %d, per_byte %f, per_time %f", buffering_bytes, buffering_time, per_byte, per_time);
+ LOGD("bytes %d, time %d, wm_byte %f, wm_time %f", buffering_bytes, buffering_time, wm_byte, wm_time);
(*buffer_info).buffering_bytes = buffering_bytes;
(*buffer_info).buffering_time = buffering_time;
- (*buffer_info).percent_byte = per_byte;
- (*buffer_info).percent_time = per_time;
+ (*buffer_info).watermark_byte = wm_byte;
+ (*buffer_info).watermark_time = wm_time;
}
static void streaming_handle_adaptive_buffering_mode(mm_player_streaming_t *streamer,
gint buffering_bytes = 0;
gint adj_buffering_bytes = 0;
gint buffer_buffering_time = 0;
- gdouble per_byte = 0.0;
- gdouble per_time = 0.0;
+ gdouble wm_byte = 0.0;
+ gdouble wm_time = 0.0;
gdouble portion = 0.0;
gint default_buffering_time = 0;
buffer_handle = &(streamer->buffer_handle[streamer->streaming_buffer_type]);
if (bitrate_info.byte_in_rate < bitrate_info.byte_out_rate) {
+ guint max_size_byte = GET_MAX_BYTE_BUFFER_SIZE(streamer->streaming_buffer_type);
portion = (double)(expected_play_time * GST_MSECOND) / (double)content_info.duration;
- buffering_bytes = GET_NEW_BUFFERING_BYTE(((double)content_info.content_size * portion) \
- * (1 - (double)bitrate_info.byte_in_rate / (double)bitrate_info.byte_out_rate));
+ buffering_bytes = GET_NEW_BUFFERING_BYTE(
+ (((double)content_info.content_size * portion) *
+ (1 - (double)bitrate_info.byte_in_rate / (double)bitrate_info.byte_out_rate)), max_size_byte);
} else {
/* buffering_bytes will be set as streamer->default_val.buffering_time *
* receiving rate is bigger than avg content bitrate
}
if (buffer_buffering_time < default_buffering_time) {
+ guint max_size_byte = GET_MAX_BYTE_BUFFER_SIZE(streamer->streaming_buffer_type);
+
LOGD("adjusted time: %d -> %d ms", buffer_buffering_time, default_buffering_time);
LOGD("adjusted bytes : %d or %d or %d",
buffering_bytes,
streamer->default_val.buffering_monitor = TRUE;
buffer_buffering_time = default_buffering_time;
- adj_buffering_bytes = GET_NEW_BUFFERING_BYTE(bitrate_info.byte_out_rate * (gint)ceil((gdouble)buffer_buffering_time / 1000));
+ adj_buffering_bytes = GET_NEW_BUFFERING_BYTE(
+ (bitrate_info.byte_out_rate * (gint)ceil((gdouble)buffer_buffering_time / 1000)), max_size_byte);
buffering_bytes = MAX(buffering_bytes, adj_buffering_bytes);
}
- GET_PERCENT(buffering_bytes, GET_CURRENT_BUFFERING_BYTE(buffer_handle), buffer_handle->buffer_high_percent, per_byte);
- GET_PERCENT(buffer_buffering_time, GET_CURRENT_BUFFERING_TIME(buffer_handle), buffer_handle->buffer_high_percent, per_time);
+ GET_WATERMARK(buffering_bytes, GET_CURRENT_BUFFERING_BYTE(buffer_handle), buffer_handle->buffer_high_watermark, wm_byte);
+ GET_WATERMARK(buffer_buffering_time, GET_CURRENT_BUFFERING_TIME(buffer_handle), buffer_handle->buffer_high_watermark, wm_time);
- LOGD("monitor %d, bytes %d, time %d, per_byte %f, per_time %f",
+ LOGD("monitor %d, bytes %d, time %d, wm_byte %f, wm_time %f",
streamer->default_val.buffering_monitor,
- buffering_bytes, buffer_buffering_time, per_byte, per_time);
+ buffering_bytes, buffer_buffering_time, wm_byte, wm_time);
(*buffer_info).buffering_bytes = buffering_bytes;
(*buffer_info).buffering_time = buffer_buffering_time;
- (*buffer_info).percent_byte = per_byte;
- (*buffer_info).percent_time = per_time;
+ (*buffer_info).watermark_byte = wm_byte;
+ (*buffer_info).watermark_time = wm_time;
}
buffer_info.buffering_bytes = buffer_handle->buffering_bytes;
buffer_info.buffering_time = buffer_handle->buffering_time;
- buffer_info.percent_byte = buffer_handle->buffer_high_percent;
- buffer_info.percent_time = buffer_handle->buffer_high_percent;
+ buffer_info.watermark_byte = buffer_handle->buffer_high_watermark;
+ buffer_info.watermark_time = buffer_handle->buffer_high_watermark;
content_info.position = position;
content_info.duration = duration;
streaming_set_buffer_size(streamer, streamer->streaming_buffer_type, buffer_info.buffering_bytes, buffer_info.buffering_time);
}
- streaming_set_buffer_percent(streamer, streamer->streaming_buffer_type, buffer_info.percent_byte, buffer_info.percent_time);
+ streaming_set_buffer_watermark(streamer, streamer->streaming_buffer_type, buffer_info.watermark_byte, buffer_info.watermark_time);
- LOGD("buffer setting: size %d, time %d, per %f",
+ LOGD("buffer setting: size %d, time %d, watermark %f",
GET_CURRENT_BUFFERING_BYTE(buffer_handle),
GET_CURRENT_BUFFERING_TIME(buffer_handle),
- buffer_handle->buffer_high_percent);
+ buffer_handle->buffer_high_watermark);
streamer->need_sync = TRUE;
}