Set multiqueue max-size-time when local playback
[platform/core/multimedia/libmm-player.git] / src / mm_player_gst.c
index cefa10e..14447fc 100644 (file)
@@ -487,7 +487,7 @@ static gboolean
 __mmplayer_handle_streaming_error(mmplayer_t *player, GstMessage *message)
 {
        LOGD("\n");
-       MMMessageParamType msg_param;
+       MMMessageParamType msg_param = {0, };
        gchar *msg_src_element = NULL;
        GstStructure *s = NULL;
        guint error_id = 0;
@@ -743,7 +743,7 @@ __mmplayer_gst_extract_tag_from_msg(mmplayer_t *player, GstMessage *msg)
                        if (!gst_buffer_map(buffer, &info, GST_MAP_READ)) {\
                                LOGD("failed to get image data from tag");\
                                gst_sample_unref(sample);\
-                               return FALSE;\
+                               break;\
                        } \
                        SECURE_LOGD("update album cover data : %p, size : %zu", info.data, info.size);\
                        MMPLAYER_FREEIF(player->album_art);\
@@ -2400,9 +2400,6 @@ __mmplayer_gst_create_es_decoder(mmplayer_t *player, mmplayer_stream_type_e type
                return FALSE;
        }
 
-       mainbin[elem_id].id = elem_id;
-       mainbin[elem_id].gst = decodebin;
-
        /* raw pad handling signal */
        _mmplayer_add_signal_connection(player, G_OBJECT(decodebin), MM_PLAYER_SIGNAL_TYPE_AUTOPLUG, "pad-added",
                                                                                G_CALLBACK(_mmplayer_gst_decode_pad_added), (gpointer)player);
@@ -2443,6 +2440,10 @@ __mmplayer_gst_create_es_decoder(mmplayer_t *player, mmplayer_stream_type_e type
        gst_object_unref(GST_OBJECT(sinkpad));
 
        gst_element_sync_state_with_parent(decodebin);
+
+       mainbin[elem_id].id = elem_id;
+       mainbin[elem_id].gst = decodebin;
+
        MMPLAYER_FLEAVE();
        return TRUE;
 
@@ -2450,11 +2451,10 @@ ERROR:
        if (sinkpad)
                gst_object_unref(GST_OBJECT(sinkpad));
 
-       if (mainbin[elem_id].gst) {
-               gst_element_set_state(mainbin[elem_id].gst, GST_STATE_NULL);
-               gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), mainbin[elem_id].gst);
-               gst_object_unref(mainbin[elem_id].gst);
-               mainbin[elem_id].gst = NULL;
+       if (decodebin) {
+               gst_element_set_state(decodebin, GST_STATE_NULL);
+               if (!gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), decodebin))
+                       gst_object_unref(decodebin);
        }
 
        MMPLAYER_FLEAVE();
@@ -2588,15 +2588,15 @@ __mmplayer_gst_create_es_path(mmplayer_t *player, mmplayer_stream_type_e type, G
 ERROR:
        if (mainbin[src_id].gst) {
                gst_element_set_state(mainbin[src_id].gst, GST_STATE_NULL);
-               gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), mainbin[src_id].gst);
-               gst_object_unref(mainbin[src_id].gst);
+               if (!gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), mainbin[src_id].gst))
+                       gst_object_unref(mainbin[src_id].gst);
                mainbin[src_id].gst = NULL;
        }
 
        if (mainbin[queue_id].gst) {
                gst_element_set_state(mainbin[queue_id].gst, GST_STATE_NULL);
-               gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), mainbin[queue_id].gst);
-               gst_object_unref(mainbin[queue_id].gst);
+               if (!gst_bin_remove(GST_BIN(mainbin[MMPLAYER_M_PIPE].gst), mainbin[queue_id].gst))
+                       gst_object_unref(mainbin[queue_id].gst);
                mainbin[queue_id].gst = NULL;
        }
 
@@ -2801,7 +2801,7 @@ __mmplayer_gst_make_rtsp_src(mmplayer_t *player)
        return element;
 }
 
-void __mmplayer_http_src_setup(GstElement *source, gpointer data)
+static void __mmplayer_http_src_setup(GstElement *source, gpointer data)
 {
 #define HTTP_SOURCE_BLOCK_SIZE (64 * 1024)
 
@@ -2817,29 +2817,24 @@ void __mmplayer_http_src_setup(GstElement *source, gpointer data)
 
        LOGD("source element %s", GST_ELEMENT_NAME(source));
 
-       /* get profile attribute */
        attrs = MMPLAYER_GET_ATTRS(player);
        if (!attrs) {
                LOGE("failed to get content attribute");
                return;
        }
 
-       /* get attribute */
        mm_attrs_get_string_by_name(attrs, "streaming_cookie", &cookies);
        mm_attrs_get_string_by_name(attrs, "streaming_user_agent", &user_agent);
 
        if (player->ini.http_timeout != DEFAULT_HTTP_TIMEOUT)
                http_timeout = player->ini.http_timeout;
 
-       /* get attribute */
        SECURE_LOGD("cookies : %s", cookies);
        SECURE_LOGD("user_agent :  %s", user_agent);
        LOGD("timeout : %d", http_timeout);
 
-       /* setting property to streaming source */
        g_object_set(G_OBJECT(source), "timeout", http_timeout, "blocksize", (unsigned long)(HTTP_SOURCE_BLOCK_SIZE), NULL);
 
-       /* parsing cookies */
        if ((cookie_list = _mmplayer_get_cookie_list((const char *)cookies))) {
                g_object_set(G_OBJECT(source), "cookies", cookie_list, NULL);
                g_strfreev(cookie_list);
@@ -2852,6 +2847,31 @@ void __mmplayer_http_src_setup(GstElement *source, gpointer data)
        return;
 }
 
+static void __mmplayer_rtsp_src_setup(GstElement *source, gpointer data)
+{
+       mmplayer_t *player = (mmplayer_t *)data;
+       gchar *user_agent = NULL;
+       MMHandleType attrs = 0;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_IF_FAIL(player);
+
+       attrs = MMPLAYER_GET_ATTRS(player);
+       if (!attrs) {
+               LOGE("failed to get content attribute");
+               return;
+       }
+
+       mm_attrs_get_string_by_name(attrs, "streaming_user_agent", &user_agent);
+
+       SECURE_LOGD("user_agent : %s", user_agent);
+
+       if (user_agent)
+               g_object_set(G_OBJECT(source), "user-agent", user_agent, NULL);
+
+       MMPLAYER_FLEAVE();
+}
+
 static void
 __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, gpointer data)
 {
@@ -2869,16 +2889,7 @@ __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, g
        if (MMPLAYER_IS_HTTP_STREAMING(player)) {
                __mmplayer_http_src_setup(source, data);
        } else if (MMPLAYER_IS_RTSP_STREAMING(player)) {
-               gchar *user_agent = NULL;
-
-               /* get attribute */
-               mm_attrs_get_string_by_name(player->attrs, "streaming_user_agent", &user_agent);
-
-               SECURE_LOGD("user_agent : %s", user_agent);
-
-               /* setting property to streaming source */
-               if (user_agent)
-                       g_object_set(G_OBJECT(source), "user-agent", user_agent, NULL);
+               __mmplayer_rtsp_src_setup(source, data);
        } else if (MMPLAYER_IS_SMOOTH_STREAMING(player)) {
                g_object_set(G_OBJECT(source), "timeout", DEFAULT_HTTP_TIMEOUT, NULL);
        } else if (player->profile.uri_type == MM_PLAYER_URI_TYPE_MEM) {
@@ -2886,10 +2897,12 @@ __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, g
                        "size", (gint64)player->profile.input_mem.len, "blocksize", 20480, NULL);
 
                _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "seek-data",
-                                                                               G_CALLBACK(__mmplayer_gst_appsrc_seek_data_mem), (gpointer)&player->profile.input_mem);
+                                               G_CALLBACK(__mmplayer_gst_appsrc_seek_data_mem), (gpointer)&player->profile.input_mem);
                _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "need-data",
-                                                                               G_CALLBACK(__mmplayer_gst_appsrc_feed_data_mem), (gpointer)&player->profile.input_mem);
+                                               G_CALLBACK(__mmplayer_gst_appsrc_feed_data_mem), (gpointer)&player->profile.input_mem);
        }
+       gst_object_unref (source);
+
        MMPLAYER_FLEAVE();
 }
 
@@ -3030,6 +3043,37 @@ __mmplayer_gst_decode_request_resource(GstElement * uridecodebin, GstStreamColle
        return TRUE;
 }
 
+static GstElement *
+__mmplayer_gst_find_child_element(GstBin *bin, const gchar *element_name)
+{
+       GstIterator *iter = NULL;
+       GValue item = {0, };
+       GstElement *ch_element = NULL;
+       GstElementFactory *ch_factory = NULL;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(bin && element_name, NULL);
+
+       iter = gst_bin_iterate_recurse(bin);
+       if (iter != NULL) {
+               while (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) {
+                       ch_element = g_value_get_object(&item);
+                       ch_factory = gst_element_get_factory(ch_element);
+                       LOGD("children factory %s", GST_OBJECT_NAME(ch_factory));
+                       if (g_strrstr(GST_OBJECT_NAME(ch_factory), element_name)) {
+                               LOGD("Find %s element", element_name);
+                               break;
+                       }
+                       ch_element = NULL;
+                       g_value_reset(&item);
+               }
+               gst_iterator_free(iter);
+       }
+
+       MMPLAYER_FLEAVE();
+       return ch_element;
+}
+
 static void
 __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *element, gpointer data)
 {
@@ -3088,38 +3132,25 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el
                                                                                        (guint64)dur_bytes); /* no meaning at the moment */
                        return;
                }
+       }
 
-               /* update mq setting */
-               if (g_strrstr(factory_name, "parsebin") && (!mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst)) {
-                       GstIterator *iter = NULL;
-                       GValue item = {0, };
-                       GstElement *ch_element = NULL;
-                       GstElementFactory *ch_factory = NULL;
-
-                       iter = gst_bin_iterate_recurse(child);
-                       if (iter != NULL) {
-                               while (gst_iterator_next(iter, &item) == GST_ITERATOR_OK) {
-                                       ch_element = g_value_get_object(&item);
-                                       ch_factory = gst_element_get_factory(ch_element);
-                                       LOGD("children factory %s", GST_OBJECT_NAME(ch_factory));
-                                       if (g_strrstr(GST_OBJECT_NAME(ch_factory), "multiqueue")) {
-                                               LOGD("get multiqueue");
-                                               player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].id = MMPLAYER_M_DEMUXED_S_BUFFER;
-                                               player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst = ch_element;
-
-                                               /* in case of multiqueue, max bytes size is defined with fixed value in mm_player_streaming.h */
-                                               _mm_player_streaming_set_multiqueue(player->streamer, ch_element);
-                                               g_value_reset(&item);
-                                               break;
-                                       }
-                                       g_value_reset(&item);
+       if (g_strrstr(factory_name, "parsebin")) {
+               if ((!MMPLAYER_IS_RTSP_STREAMING(player)) && (!mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst)) {
+                       GstElement *ch_element = __mmplayer_gst_find_child_element(child, "multiqueue");
+                       if (ch_element) {
+                               player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].id = MMPLAYER_M_DEMUXED_S_BUFFER;
+                               player->pipeline->mainbin[MMPLAYER_M_DEMUXED_S_BUFFER].gst = ch_element;
+
+                               /* in case of multiqueue, max bytes size is defined with fixed value in mm_player_streaming.h */
+                               if (MMPLAYER_IS_STREAMING(player)) {
+                                       _mm_player_streaming_set_multiqueue(player->streamer, ch_element);
+                               } else {
+                                       g_object_set(G_OBJECT(ch_element),
+                                                                                       "max-size-time", (guint64)(5 * GST_SECOND),
+                                                                                       "use-interleave", FALSE, NULL);
                                }
-                               gst_iterator_free(iter);
                        }
                }
-       }
-
-       if (g_strrstr(factory_name, "parsebin")) {
                int video_codec_type = 0;
                int audio_codec_type = 0;