[0.6.119] support force resume during buffering 89/183789/3 accepted/tizen/unified/20180720.060702 submit/tizen/20180719.054941
authorEunhae Choi <eunhae1.choi@samsung.com>
Wed, 11 Jul 2018 05:35:18 +0000 (14:35 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Tue, 17 Jul 2018 07:24:12 +0000 (16:24 +0900)
Change-Id: Ie0a511c9e8bede693fd687c07805c8ec7dc55003

packaging/libmm-player.spec
src/include/mm_player_ini.h
src/include/mm_player_streaming.h
src/mm_player_common_priv.c
src/mm_player_priv.c [changed mode: 0755->0644]
src/mm_player_streaming.c

index 5de62e061e5f8d0a9e3eb540367e937d1edb2369..e9308fdeabd45f50c8611ab30b61aac7c3fe15aa 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.118
+Version:    0.6.119
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 88982d680b076527ef69f8baeacf117913e89617..7eefa14693ed09ae593e54418214303374de7bfc 100644 (file)
@@ -92,7 +92,7 @@ typedef struct __mm_player_ini {
        guint http_ring_buffer_size;
        gdouble http_buffering_limit;
        guint http_max_size_bytes;
-       gint http_buffering_time;
+       gint http_buffering_time; /* ms */
        gint http_timeout;
 
        /* audio effect */
index b400b1a554f22e2027226b2045603b871ec2b15d..079eb2e10e67476ddc03c5cce28d76c21a1f536e 100644 (file)
@@ -47,7 +47,7 @@
 #define DEFAULT_ADAPTIVE_PLAYING_TIME (3*1000) /* ms */
 
 #define DEFAULT_BUFFERING_TIME (3*1000) /* ms */
-#define DEFAULT_BUFFER_LOW_PERCENT 1.0      /* 1%       */
+#define DEFAULT_BUFFER_LOW_PERCENT 1.0      /* 1%, Low threshold for starting buffering */
 #define DEFAULT_BUFFER_HIGH_PERCENT 99.0    /* 15%      */
 #define DEFAULT_RING_BUFFER_SIZE (20*1024*1024) /* 20MBytes */
 
@@ -93,7 +93,15 @@ typedef enum {
        MUXED_BUFFER_TYPE_MEM_QUEUE, /* push mode in queue2 */
        MUXED_BUFFER_TYPE_MEM_RING_BUFFER, /* pull mode in queue2 */
        MUXED_BUFFER_TYPE_FILE, /* pull mode in queue2 */
-} muxed_buffer_type_e;
+       MUXED_BUFFER_TYPE_MAX,
+} MuxedBufferType;
+
+typedef enum {
+       MM_PLAYER_BUFFERING_DEFAULT = 0x00,
+       MM_PLAYER_BUFFERING_IN_PROGRESS = 0x01,
+       MM_PLAYER_BUFFERING_ABORT = 0x02,
+       MM_PLAYER_BUFFERING_COMPLETE = 0x04,
+} MMPlayerBufferingState;
 
 typedef struct {
        MMPlayerBufferingMode mode;
@@ -126,13 +134,11 @@ typedef struct {
        streaming_requirement_t buffering_req;
        streaming_default_t default_val;
 
-       gboolean        is_buffering;
-       gboolean        is_buffering_done;      /* get info from bus sync callback */
+       MMPlayerBufferingState buffering_state;
        gboolean        is_adaptive_streaming;
        gboolean        is_pd_mode;
 
        gint            buffering_percent;
-
        guint           buffer_max_bitrate;
        guint           buffer_avg_bitrate;
        gboolean        need_update;
@@ -152,12 +158,11 @@ void __mm_player_streaming_set_queue2(mm_player_streaming_t* streamer,
                                                                                gint buffering_time,
                                                                                gdouble low_percent,
                                                                                gdouble high_percent,
-                                                                               muxed_buffer_type_e type,
+                                                                               MuxedBufferType type,
                                                                                gchar* file_path,
                                                                                guint64 content_size);
 void __mm_player_streaming_set_multiqueue(mm_player_streaming_t* streamer,
                                                                                GstElement* buffer,
-                                                                               gboolean use_buffering,
                                                                                gint buffering_time,
                                                                                gdouble low_percent,
                                                                                gdouble high_percent);
index 64c1a29cf6f2ba54eece9f4104aa2afdb82bba02..4003a5deb6d61efb3503904b99c5b7ac41118bf7 100644 (file)
@@ -546,9 +546,9 @@ __mmplayer_check_useful_message(mm_player_t *player, GstMessage * message)
                        break;
                }
 
-               if ((player->streamer) && (player->streamer->is_buffering == TRUE)) {
+               if ((player->streamer) && (player->streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS)) {
                        LOGD("[%s] Buffering DONE is detected !!\n", GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
-                       player->streamer->is_buffering_done = TRUE;
+                       player->streamer->buffering_state |= MM_PLAYER_BUFFERING_COMPLETE;
                }
 
                MMPLAYER_CMD_UNLOCK(player);
old mode 100755 (executable)
new mode 100644 (file)
index 50ef0be..f11b2b3
@@ -764,12 +764,7 @@ __mmplayer_update_buffer_setting(mm_player_t *player, GstMessage *buffering_msg)
        } else if (MMPLAYER_IS_HTTP_STREAMING(player))
                data_size = player->http_content_size;
 
-       __mm_player_streaming_buffering(player->streamer,
-                                                                               buffering_msg,
-                                                                               data_size,
-                                                                               player->last_position,
-                                                                               player->duration);
-
+       __mm_player_streaming_buffering(player->streamer, buffering_msg, data_size, player->last_position, player->duration);
        __mm_player_streaming_sync_property(player->streamer, player->pipeline->mainbin[MMPLAYER_M_AUTOPLUG].gst);
 
        return;
@@ -795,14 +790,14 @@ __mmplayer_handle_buffering_message(mm_player_t* player)
        target_state = MMPLAYER_TARGET_STATE(player);
        pending_state = MMPLAYER_PENDING_STATE(player);
 
-       LOGD("player state : prev %s, current %s, pending %s, target %s, buffering %d",
+       LOGD("player state : prev %s, current %s, pending %s, target %s, buffering state 0x%X",
                MMPLAYER_STATE_GET_NAME(prev_state),
                MMPLAYER_STATE_GET_NAME(current_state),
                MMPLAYER_STATE_GET_NAME(pending_state),
                MMPLAYER_STATE_GET_NAME(target_state),
-               player->streamer->is_buffering);
+               player->streamer->buffering_state);
 
-       if (!player->streamer->is_buffering) {
+       if (!(player->streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS)) {
                /* NOTE : if buffering has done, player has to go to target state. */
                switch (target_state) {
                case MM_PLAYER_STATE_PAUSED:
@@ -1216,7 +1211,7 @@ __mmplayer_gst_callback(GstMessage *msg, gpointer data)
                        int bRet = MM_ERROR_NONE;
 
                        if (!(player->pipeline && player->pipeline->mainbin)) {
-                               LOGE("player pipeline handle is null");
+                               LOGE("Pipeline is not initialized");
                                break;
                        }
 
@@ -1241,24 +1236,50 @@ __mmplayer_gst_callback(GstMessage *msg, gpointer data)
                                MMPLAYER_CMD_LOCK(player);
                        }
 
-                       /* ignore the prev buffering message */
-                       if ((player->streamer) && (player->streamer->is_buffering == FALSE)
-                               && (player->streamer->is_buffering_done == TRUE)) {
+                       if (!player->streamer) {
+                               LOGW("Pipeline is shutting down");
+                               MMPLAYER_CMD_UNLOCK(player);
+                               break;
+                       }
+
+                       /* ignore the remained buffering message till getting 100% msg */
+                       if (player->streamer->buffering_state == MM_PLAYER_BUFFERING_COMPLETE) {
                                gint buffer_percent = 0;
 
                                gst_message_parse_buffering(msg, &buffer_percent);
 
                                if (buffer_percent == MAX_BUFFER_PERCENT) {
                                        LOGD("Ignored all the previous buffering msg!(got %d%%)\n", buffer_percent);
-                                       player->streamer->is_buffering_done = FALSE;
+                                       player->streamer->buffering_state = MM_PLAYER_BUFFERING_DEFAULT;
                                }
                                MMPLAYER_CMD_UNLOCK(player);
                                break;
                        }
 
+                       /* ignore the remained buffering message */
+                       if (player->streamer->buffering_state == MM_PLAYER_BUFFERING_ABORT) {
+                               gint buffer_percent = 0;
+
+                               gst_message_parse_buffering(msg, &buffer_percent);
+
+                               LOGD("force resume -last posted %d %%, new per %d %%",
+                                                       player->streamer->buffering_percent, buffer_percent);
+
+                               if (player->streamer->buffering_percent > buffer_percent) {
+                                       player->streamer->buffering_state = MM_PLAYER_BUFFERING_DEFAULT;
+                                       player->streamer->buffering_req.is_pre_buffering = FALSE;
+
+                                       LOGD("force resume - need to enter the buffering mode again - %d %%", buffer_percent);
+                               } else {
+                                       LOGD("force resume - ignored the remained buffering msg!");
+                                       MMPLAYER_CMD_UNLOCK(player);
+                                       break;
+                               }
+                       }
+
                        __mmplayer_update_buffer_setting(player, msg);
 
-                       bRet = __mmplayer_handle_buffering_message(player);
+                       bRet = __mmplayer_handle_buffering_message(player); /* playback control */
 
                        if (bRet == MM_ERROR_NONE) {
                                msg_param.connection.buffering = player->streamer->buffering_percent;
@@ -1670,7 +1691,7 @@ __mmplayer_gst_callback(GstMessage *msg, gpointer data)
                                        if ((MMPLAYER_IS_HTTP_STREAMING(player)) &&
                                                (player->streamer) &&
                                                (player->streamer->streaming_buffer_type == BUFFER_TYPE_MUXED) &&
-                                               (player->streamer->is_buffering == FALSE)) {
+                                               !(player->streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS)) {
                                                GstQuery *query = NULL;
                                                gboolean busy = FALSE;
                                                gint percent = 0;
@@ -1685,10 +1706,8 @@ __mmplayer_gst_callback(GstMessage *msg, gpointer data)
                                                                GST_ELEMENT_NAME(player->streamer->buffer_handle[BUFFER_TYPE_MUXED].buffer), percent);
                                                }
 
-                                               if (percent >= 100) {
-                                                       player->streamer->is_buffering = FALSE;
+                                               if (percent >= 100)
                                                        __mmplayer_handle_buffering_message(player);
-                                               }
                                        }
 
                                        async_done = TRUE;
@@ -1741,9 +1760,10 @@ __mmplayer_gst_handle_duration(mm_player_t* player, GstMessage* msg)
                        LOGD("data total size of http content: %"G_GINT64_FORMAT, bytes);
                        player->http_content_size = (bytes > 0) ? (bytes) : (0);
                }
-       } else
+       } else {
                /* handling audio clip which has vbr. means duration is keep changing */
                _mmplayer_update_content_attrs(player, ATTR_DURATION);
+       }
 
        MMPLAYER_FLEAVE();
 
@@ -3180,16 +3200,16 @@ __mmplayer_gst_decode_no_more_pads(GstElement *elem, gpointer data)
                if (!gst_element_query_duration(player->pipeline->mainbin[MMPLAYER_M_SRC].gst, GST_FORMAT_BYTES, &dur_bytes))
                        LOGE("fail to get duration.\n");
 
-               // enable use-buffering on queue2 instead of multiqueue(ex)audio only streaming
-               // use file information was already set on Q2 when it was created.
+               /* there is no mq, enable use-buffering on queue2 (ex) wav streaming
+                * use file information was already set on Q2 when it was created. */
                __mm_player_streaming_set_queue2(player->streamer,
                                                player->pipeline->mainbin[MMPLAYER_M_MUXED_S_BUFFER].gst,
-                                               TRUE,                                                           // use_buffering
+                                               TRUE,                               /* use_buffering */
                                                buffer_bytes,
                                                init_buffering_time,
-                                               1.0,                                                            // low percent
-                                               player->ini.http_buffering_limit,       // high percent
-                                               MUXED_BUFFER_TYPE_MEM_QUEUE,
+                                               1.0,                                /* low percent */
+                                               player->ini.http_buffering_limit,   /* high percent */
+                                               MUXED_BUFFER_TYPE_MAX,              /* use previous buffer type setting */
                                                NULL,
                                                ((dur_bytes > 0) ? ((guint64)dur_bytes) : 0));
        }
@@ -5056,7 +5076,7 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
        /* set size and timestamp */
        dataBlock = gst_buffer_peek_memory(buffer, 0);
        stream->length_total = gst_memory_get_sizes(dataBlock, NULL, NULL);
-       stream->timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/GST_MSECOND); /* nano sec -> mili sec */
+       stream->timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); /* nano sec -> mili sec */
 
        /* check zero-copy */
        if (player->set_mode.video_zc &&
@@ -9326,6 +9346,11 @@ _mmplayer_resume(MMHandleType hplayer)
        /* check current state */
        MMPLAYER_CHECK_STATE(player, MMPLAYER_COMMAND_RESUME);
 
+       if ((player->streamer) && (player->streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS)) {
+               LOGD("force resume even during buffering");
+               player->streamer->buffering_state = MM_PLAYER_BUFFERING_ABORT;
+       }
+
        ret = __gst_resume(player, async);
 
        if (ret != MM_ERROR_NONE)
@@ -9613,8 +9638,13 @@ __mmplayer_update_content_type_info(mm_player_t* player)
                }
        } else if (g_strrstr(player->type, "application/dash+xml")) {
                player->profile.uri_type = MM_PLAYER_URI_TYPE_DASH;
+               if (player->streamer) {
+                       player->streamer->is_adaptive_streaming = TRUE;
+                       player->streamer->buffering_req.mode = MM_PLAYER_BUFFERING_MODE_FIXED;
+               }
        }
 
+       LOGD("uri type : %d", player->profile.uri_type);
        MMPLAYER_FLEAVE();
 }
 
@@ -9784,7 +9814,7 @@ __mmplayer_try_to_plug_decodebin(mm_player_t* player, GstPad *srcpad, const GstC
 
                        LOGD("dur_bytes = %"G_GINT64_FORMAT, dur_bytes);
 
-                       muxed_buffer_type_e type = MUXED_BUFFER_TYPE_MEM_QUEUE;
+                       MuxedBufferType type = MUXED_BUFFER_TYPE_MEM_QUEUE;
 
                        if (dur_bytes > 0) {
                                if (MMPLAYER_USE_FILE_FOR_BUFFERING(player)) {
@@ -9797,20 +9827,19 @@ __mmplayer_try_to_plug_decodebin(mm_player_t* player, GstPad *srcpad, const GstC
                                dur_bytes = 0;
                        }
 
-                       /* NOTE : we cannot get any duration info from ts container in case of streaming */
-                       // if (!g_strrstr(GST_ELEMENT_NAME(sinkelement), "mpegtsdemux"))
+                       /* NOTE : in case of ts streaming, player cannot get the correct duration info *
+                        *        skip the pull mode(file or ring buffering) setting. */
                        if (!g_strrstr(player->type, "video/mpegts")) {
                                max_buffer_size_bytes = (type == MUXED_BUFFER_TYPE_FILE) ? (player->ini.http_max_size_bytes) : (5*1024*1024);
                                LOGD("max_buffer_size_bytes = %d", max_buffer_size_bytes);
 
-                               /* FIXME : pass ini setting directly. is this ok? */
                                __mm_player_streaming_set_queue2(player->streamer,
                                                                                                queue2,
                                                                                                FALSE,
                                                                                                max_buffer_size_bytes,
                                                                                                player->ini.http_buffering_time,
-                                                                                               1.0,                                                            // no meaning
-                                                                                               player->ini.http_buffering_limit,       // no meaning
+                                                                                               1.0,                                /* no meaning */
+                                                                                               player->ini.http_buffering_limit,   /* no meaning */
                                                                                                type,
                                                                                                player->http_file_buffering_path,
                                                                                                (guint64)dur_bytes);
@@ -9861,24 +9890,23 @@ __mmplayer_try_to_plug_decodebin(mm_player_t* player, GstPad *srcpad, const GstC
        mainbin[MMPLAYER_M_AUTOPLUG].gst = decodebin;
 
        /* set decodebin property about buffer in streaming playback. *
-        * in case of HLS/DASH, it does not need to have big buffer        *
+        * in case of HLS/DASH, it does not need to have big buffer   *
         * because it is kind of adaptive streaming.                  */
-       if (!MMPLAYER_IS_HTTP_PD(player) && MMPLAYER_IS_HTTP_STREAMING(player)) {
-               guint max_size_bytes = MAX_DECODEBIN_BUFFER_BYTES;
-               guint64 max_size_time = MAX_DECODEBIN_BUFFER_TIME;
+       if (!MMPLAYER_IS_HTTP_PD(player) &&
+           (MMPLAYER_IS_HTTP_STREAMING(player) || MMPLAYER_IS_HTTP_LIVE_STREAMING(player) || MMPLAYER_IS_DASH_STREAMING(player))) {
+           gdouble high_percent = 0.0;
+
                init_buffering_time = (init_buffering_time != 0) ? (init_buffering_time) : (player->ini.http_buffering_time);
+               high_percent = (gdouble)(init_buffering_time * 100) / GET_MAX_BUFFER_TIME(player->streamer);
 
-               if (MMPLAYER_IS_HTTP_LIVE_STREAMING(player)
-                       || MMPLAYER_IS_DASH_STREAMING(player)) {
-                       max_size_bytes = MAX_DECODEBIN_ADAPTIVE_BUFFER_BYTES;
-                       max_size_time = MAX_DECODEBIN_ADAPTIVE_BUFFER_TIME;
-               }
+               LOGD("decodebin setting - bytes: %d, time: %d ms, per: 1~%d",
+                       GET_MAX_BUFFER_BYTES(player->streamer), GET_MAX_BUFFER_TIME(player->streamer), (gint)high_percent);
 
                g_object_set(G_OBJECT(decodebin), "use-buffering", TRUE,
-                                                                                       "high-percent", (gint)player->ini.http_buffering_limit,
-                                                                                       "low-percent", 1,   // 1%
-                                                                                       "max-size-bytes", max_size_bytes,
-                                                                                       "max-size-time", (guint64)(max_size_time * GST_SECOND),
+                                                                                       "high-percent", (gint)high_percent,
+                                                                                       "low-percent", (gint)DEFAULT_BUFFER_LOW_PERCENT,
+                                                                                       "max-size-bytes", GET_MAX_BUFFER_BYTES(player->streamer),
+                                                                                       "max-size-time", (guint64)(GET_MAX_BUFFER_TIME(player->streamer) * GST_MSECOND),
                                                                                        "max-size-buffers", 0, NULL);  // disable or automatic
        }
 
@@ -11215,24 +11243,20 @@ __mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data
 
        if ((player->pipeline->mainbin[MMPLAYER_M_DEMUX].gst) &&
                (g_strrstr(GST_ELEMENT_NAME(element), "multiqueue"))) {
-               LOGD("plugged element is multiqueue. take it\n");
+               LOGD("plugged element is multiqueue. take it %s", GST_ELEMENT_NAME(element));
 
                player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].id = MMPLAYER_M_DEMUXED_S_BUFFER;
                player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst = element;
 
                if (!MMPLAYER_IS_HTTP_PD(player) &&
                        ((MMPLAYER_IS_HTTP_STREAMING(player)) ||
-                       (MMPLAYER_IS_HTTP_LIVE_STREAMING(player)))) {
+                       (MMPLAYER_IS_HTTP_LIVE_STREAMING(player)) ||
+                       (MMPLAYER_IS_DASH_STREAMING(player)))) {
                        /* in case of multiqueue, max bytes size is defined with fixed value in mm_player_streaming.h*/
-                       __mm_player_streaming_set_multiqueue(player->streamer,
-                               element,
-                               TRUE,
-                               player->ini.http_buffering_time,
-                               1.0,
-                               player->ini.http_buffering_limit);
-
+                       __mm_player_streaming_set_multiqueue(player->streamer, element, player->ini.http_buffering_time, 1.0, player->ini.http_buffering_limit);
                        __mm_player_streaming_sync_property(player->streamer, player->pipeline->mainbin[MMPLAYER_M_AUTOPLUG].gst);
                }
+
        }
 
        return;
index 239346120154718dd96404bed8945ccabb95f83e..d7b8fe00b6f7ce54b6d8179ec1ed73012dc9a3b0 100644 (file)
@@ -47,7 +47,7 @@ typedef struct {
 
 static void streaming_check_buffer_percent(gdouble in_low, gdouble in_high, gdouble *out_low, gdouble *out_high);
 static void streaming_set_buffer_percent(mm_player_streaming_t* streamer, BufferType type, gdouble low_percent, gdouble high_percent_byte, gdouble high_percent_time);
-static void streaming_set_queue2_queue_type(mm_player_streaming_t* streamer, muxed_buffer_type_e type, gchar * file_path, guint64 content_size);
+static void streaming_set_queue2_queue_type(mm_player_streaming_t* streamer, MuxedBufferType type, gchar * file_path, 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);
 static void streaming_get_current_bitrate_info(mm_player_streaming_t* streamer,
@@ -126,8 +126,7 @@ void __mm_player_streaming_initialize(mm_player_streaming_t* streamer)
        streamer->need_update = FALSE;
        streamer->need_sync = FALSE;
 
-       streamer->is_buffering = FALSE;
-       streamer->is_buffering_done = FALSE;
+       streamer->buffering_state = MM_PLAYER_BUFFERING_DEFAULT;
        streamer->is_adaptive_streaming = FALSE;
        streamer->is_pd_mode = FALSE;
 
@@ -161,8 +160,7 @@ void __mm_player_streaming_deinitialize(mm_player_streaming_t* streamer)
        streamer->need_update = FALSE;
        streamer->need_sync = FALSE;
 
-       streamer->is_buffering = FALSE;
-       streamer->is_buffering_done = FALSE;
+       streamer->buffering_state = MM_PLAYER_BUFFERING_DEFAULT;
        streamer->is_adaptive_streaming = FALSE;
        streamer->is_pd_mode = FALSE;
 
@@ -313,11 +311,11 @@ streaming_set_buffer_percent(mm_player_streaming_t* streamer,
 }
 
 static void
-streaming_set_queue2_queue_type(mm_player_streaming_t* streamer, muxed_buffer_type_e type, gchar * file_path, guint64 content_size)
+streaming_set_queue2_queue_type(mm_player_streaming_t* streamer, MuxedBufferType type, gchar * file_path, guint64 content_size)
 {
        streaming_buffer_t* buffer_handle = NULL;
-       guint64 storage_available_size = 0; //bytes
-       guint64 buffer_size = 0;  //bytes
+       guint64 storage_available_size = 0; /* bytes */
+       guint64 buffer_size = 0;  /* bytes */
        gchar file_buffer_name[MM_MAX_URL_LEN] = {0};
        struct statfs buf = {0};
        gchar* factory_name = NULL;
@@ -347,7 +345,7 @@ streaming_set_queue2_queue_type(mm_player_streaming_t* streamer, muxed_buffer_ty
                return;
        }
 
-       if ((type == MUXED_BUFFER_TYPE_MEM_QUEUE) || (!g_strrstr(factory_name, "queue2"))) {
+       if (type == MUXED_BUFFER_TYPE_MEM_QUEUE) {
                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"
@@ -451,7 +449,7 @@ void __mm_player_streaming_set_queue2(mm_player_streaming_t* streamer,
                                                                                gint buffering_time,
                                                                                gdouble low_percent,
                                                                                gdouble high_percent,
-                                                                               muxed_buffer_type_e type,
+                                                                               MuxedBufferType type,
                                                                                gchar* file_path,
                                                                                guint64 content_size)
 {
@@ -482,9 +480,11 @@ void __mm_player_streaming_set_queue2(mm_player_streaming_t* streamer,
                g_object_set(G_OBJECT(streamer->buffer_handle[BUFFER_TYPE_MUXED].buffer), "use-buffering", use_buffering, NULL);
        }
 
+       /* initial setting */
        streaming_set_buffer_size(streamer, BUFFER_TYPE_MUXED, buffering_bytes, buffering_time);
        streaming_set_buffer_percent(streamer, BUFFER_TYPE_MUXED, low_percent, high_percent, 0);
-       streaming_set_queue2_queue_type(streamer, type, file_path, content_size);
+       if (type < MUXED_BUFFER_TYPE_MAX)
+               streaming_set_queue2_queue_type(streamer, type, file_path, content_size);
 
        MMPLAYER_FLEAVE();
        return;
@@ -506,7 +506,6 @@ void __mm_player_streaming_sync_property(mm_player_streaming_t* streamer, GstEle
                                        "max-size-time", (guint64)(buffer_handle->buffering_time * GST_MSECOND),
                                        "low-percent", (gint)buffer_handle->buffer_low_percent,
                                        "high-percent", (gint)buffer_handle->buffer_high_percent, NULL);
-
        }
 
        streamer->need_sync = FALSE;
@@ -514,44 +513,34 @@ void __mm_player_streaming_sync_property(mm_player_streaming_t* streamer, GstEle
 
 void __mm_player_streaming_set_multiqueue(mm_player_streaming_t* streamer,
                                                                                GstElement* buffer,
-                                                                               gboolean use_buffering,
                                                                                gint buffering_time,
                                                                                gdouble low_percent,
                                                                                gdouble high_percent)
 {
        streaming_buffer_t* buffer_handle = NULL;
-       gint pre_buffering_time = 0;
 
        MMPLAYER_FENTER();
-       MMPLAYER_RETURN_IF_FAIL(streamer);
+       MMPLAYER_RETURN_IF_FAIL(streamer && buffer);
 
        buffer_handle = &(streamer->buffer_handle[BUFFER_TYPE_DEMUXED]);
-       pre_buffering_time = streamer->buffering_req.prebuffer_time;
 
-       if (buffer) {
-               buffer_handle->buffer = buffer;
+       buffer_handle->buffer = buffer;
 
-               if (use_buffering) {
-                       streamer->streaming_buffer_type = BUFFER_TYPE_DEMUXED;
+       streamer->streaming_buffer_type = BUFFER_TYPE_DEMUXED;
+       g_object_set(G_OBJECT(buffer_handle->buffer), "use-buffering", TRUE, NULL);
 
-                       // during prebuffering by requirement, buffer setting should not be changed.
-                       if (pre_buffering_time > 0)
-                               streamer->buffering_req.is_pre_buffering = TRUE;
-               }
 
-               g_object_set(G_OBJECT(buffer_handle->buffer), "use-buffering", use_buffering, NULL);
-       }
+       LOGD("pre_buffering: %d ms, during playing: %d ms\n", streamer->buffering_req.prebuffer_time, buffering_time);
 
-       LOGD("pre_buffering: %d ms, during playing: %d ms\n", pre_buffering_time, buffering_time);
-
-       if (pre_buffering_time <= 0) {
-               pre_buffering_time = GET_DEFAULT_PLAYING_TIME(streamer);
-               streamer->buffering_req.prebuffer_time = buffering_time;
-       }
+       if (streamer->buffering_req.prebuffer_time > 0)
+               streamer->buffering_req.is_pre_buffering = TRUE;
+       else
+               streamer->buffering_req.prebuffer_time = GET_DEFAULT_PLAYING_TIME(streamer);
 
-       high_percent = (gdouble)(pre_buffering_time * 100) / GET_MAX_BUFFER_TIME(streamer);
+       high_percent = (gdouble)(streamer->buffering_req.prebuffer_time * 100) / GET_MAX_BUFFER_TIME(streamer);
        LOGD("high_percent %2.3f %%\n", high_percent);
 
+       /* initial setting */
        streaming_set_buffer_size(streamer, BUFFER_TYPE_DEMUXED, GET_MAX_BUFFER_BYTES(streamer), GET_MAX_BUFFER_TIME(streamer));
        streaming_set_buffer_percent(streamer, BUFFER_TYPE_DEMUXED, low_percent, 0, high_percent);
 
@@ -840,7 +829,7 @@ streaming_update_buffer_setting(mm_player_streaming_t* streamer,
 
                if (streamer->buffering_req.rebuffer_time > 0)
                        expected_play_time = streamer->buffering_req.rebuffer_time;
-               else if ((position == 0) && (streamer->is_buffering))
+               else if ((position == 0) && (streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS))
                        expected_play_time = streamer->buffering_req.prebuffer_time;
 
                if (expected_play_time <= 0)
@@ -926,9 +915,8 @@ streaming_update_buffering_status(mm_player_streaming_t* streamer, GstMessage *b
        MMPLAYER_RETURN_IF_FAIL(buffering_msg);
 
        /* update when buffering has started. */
-       if (!streamer->is_buffering) {
-               streamer->is_buffering = TRUE;
-               streamer->is_buffering_done = FALSE;
+       if (!(streamer->buffering_state & MM_PLAYER_BUFFERING_IN_PROGRESS)) {
+               streamer->buffering_state = MM_PLAYER_BUFFERING_IN_PROGRESS;
                streamer->buffering_percent = -1;
 
                if (!streamer->buffering_req.is_pre_buffering) {
@@ -940,19 +928,22 @@ streaming_update_buffering_status(mm_player_streaming_t* streamer, GstMessage *b
        /* update buffer percent */
        gst_message_parse_buffering(buffering_msg, &buffer_percent);
 
+       /* LOGD("buffering per %d%% -> %d%%, state 0x%X", streamer->buffering_percent, buffer_percent, streamer->buffering_state); */
+
        if (streamer->buffering_percent < buffer_percent) {
-               LOGD("[%s] buffering %d%%....\n",
+               LOGD("[%s] buffering %d%%....",
                        GST_OBJECT_NAME(GST_MESSAGE_SRC(buffering_msg)), buffer_percent);
                streamer->buffering_percent = buffer_percent;
        }
 
-       if ((streamer->buffering_percent == MAX_BUFFER_PERCENT) || (streamer->is_buffering_done == TRUE)) {
-               streamer->is_buffering = FALSE;
+       if (streamer->buffering_percent == MAX_BUFFER_PERCENT) {
+               streamer->buffering_state = MM_PLAYER_BUFFERING_DEFAULT;
                streamer->buffering_req.is_pre_buffering = FALSE;
-               if (streamer->buffering_percent == MAX_BUFFER_PERCENT)
-                       streamer->is_buffering_done = FALSE;
-               else
-                       streamer->buffering_percent = MAX_BUFFER_PERCENT;
+       } else if (streamer->buffering_state & MM_PLAYER_BUFFERING_COMPLETE) {
+               streamer->buffering_state = MM_PLAYER_BUFFERING_COMPLETE; /* have to keep state to ignore remained msg till get 100% msg */
+               streamer->buffering_req.is_pre_buffering = FALSE;
+               streamer->buffering_percent = MAX_BUFFER_PERCENT;
+               LOGD("updated to the buffering 100%%.... (by force)");
        }
 }