Move bin_add/link to prepare function. 81/93381/2 accepted/tizen/common/20161025.155106 submit/tizen/20161025.104308 submit/tizen_3.0_common/20161104.104000
authorSeokHoon Lee <andy.shlee@samsung.com>
Mon, 24 Oct 2016 04:44:33 +0000 (13:44 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Mon, 24 Oct 2016 04:52:15 +0000 (13:52 +0900)
Fix build error on 64bit platform.

[Version] 0.2.209
[Profile] Common
[Issue Type] Update
[Dependency module] N/A
[Dependency commit] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-mobile_20161019.4]

Signed-off-by: SeokHoon Lee <andy.shlee@samsung.com>
Change-Id: I4899ee0bf76d1c6bae718ee0d381aa32cb3d3efc

packaging/libmm-wfd.spec
src/mm_wfd_sink_ini.c
src/mm_wfd_sink_priv.c
src/mm_wfd_sink_util.c

index 0b10aedaeefc77f7960b242fb231d372dc299add..849480c19d37e004afe00bb084af0fe502e459f4 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
-Version:    0.2.208
+Version:    0.2.209
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 3ad0ea2859dd2daf70a62e971a5eceb750a79064..fbd7c10ec1e705db6a9f55e2b1a28523784ffb54 100644 (file)
@@ -548,9 +548,9 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path)
        /* video parameter*/
        wfd_sink_debug("wfd_video_formats.video_codec : %x\n", ini->wfd_video_formats.video_codec);
        wfd_sink_debug("wfd_video_formats.video_native_resolution : %x\n", ini->wfd_video_formats.video_native_resolution);
-       wfd_sink_debug("wfd_video_formats.video_cea_support : %llx\n", ini->wfd_video_formats.video_cea_support);
-       wfd_sink_debug("wfd_video_formats.video_vesa_support : %llx\n", ini->wfd_video_formats.video_vesa_support);
-       wfd_sink_debug("wfd_video_formats.video_hh_support : %llx\n", ini->wfd_video_formats.video_hh_support);
+       wfd_sink_debug("wfd_video_formats.video_cea_support : %"G_GINT64_MODIFIER"x\n", ini->wfd_video_formats.video_cea_support);
+       wfd_sink_debug("wfd_video_formats.video_vesa_support : %"G_GINT64_MODIFIER"x\n", ini->wfd_video_formats.video_vesa_support);
+       wfd_sink_debug("wfd_video_formats.video_hh_support : %"G_GINT64_MODIFIER"x\n", ini->wfd_video_formats.video_hh_support);
        wfd_sink_debug("wfd_video_formats.video_profile : %x\n", ini->wfd_video_formats.video_profile);
        wfd_sink_debug("wfd_video_formats.video_level : %x\n", ini->wfd_video_formats.video_level);
        wfd_sink_debug("wfd_video_formats.video_latency : %d\n", ini->wfd_video_formats.video_latency);
@@ -571,9 +571,9 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path)
        wfd_sink_debug("wfd2_video_formats.video_non_transcoding_support : %d\n", ini->wfd2_video_formats.video_non_transcoding_support);
 
        /* video h264 info*/
-       wfd_sink_debug("wfd2_video_h264_info.video_cea_support : %llx\n", ini->wfd2_video_h264_info.video_cea_support);
-       wfd_sink_debug("wfd2_video_h264_info.video_vesa_support : %llx\n", ini->wfd2_video_h264_info.video_vesa_support);
-       wfd_sink_debug("wfd2_video_h264_info.video_hh_support : %llx\n", ini->wfd2_video_h264_info.video_hh_support);
+       wfd_sink_debug("wfd2_video_h264_info.video_cea_support : %"G_GINT64_MODIFIER"x\n", ini->wfd2_video_h264_info.video_cea_support);
+       wfd_sink_debug("wfd2_video_h264_info.video_vesa_support : %"G_GINT64_MODIFIER"x\n", ini->wfd2_video_h264_info.video_vesa_support);
+       wfd_sink_debug("wfd2_video_h264_info.video_hh_support : %"G_GINT64_MODIFIER"x\n", ini->wfd2_video_h264_info.video_hh_support);
        wfd_sink_debug("wfd2_video_h264_info.video_profile : %x\n", ini->wfd2_video_h264_info.video_profile);
        wfd_sink_debug("wfd2_video_h264_info.video_level : %x\n", ini->wfd2_video_h264_info.video_level);
        wfd_sink_debug("wfd2_video_h264_info.video_latency : %d\n", ini->wfd2_video_h264_info.video_latency);
index 1a59aa27771136109376516357625f34ea1f800d..51b60a832c038a8bf01268b946238370b6125d87 100644 (file)
@@ -247,15 +247,15 @@ int _mm_wfd_sink_connect(mm_wfd_sink_t *wfd_sink, const char *uri)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(uri && strlen(uri) > strlen("rtsp://"),
-                                               MM_ERROR_WFD_INVALID_ARGUMENT);
+                                                               MM_ERROR_WFD_INVALID_ARGUMENT);
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_DEPAY].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_DEMUX].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_DEPAY].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_DEMUX].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check current wi-fi display sink state */
        MMWFDSINK_CHECK_STATE(wfd_sink, MM_WFD_SINK_COMMAND_CONNECT);
@@ -310,11 +310,11 @@ int _mm_wfd_sink_pause(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check current wi-fi display sink state */
        MMWFDSINK_CHECK_STATE(wfd_sink, MM_WFD_SINK_COMMAND_PAUSE);
@@ -333,11 +333,11 @@ int _mm_wfd_sink_resume(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check current wi-fi display sink state */
        MMWFDSINK_CHECK_STATE(wfd_sink, MM_WFD_SINK_COMMAND_RESUME);
@@ -356,11 +356,11 @@ int _mm_wfd_sink_disconnect(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_SRC].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check current wi-fi display sink state */
        MMWFDSINK_CHECK_STATE(wfd_sink, MM_WFD_SINK_COMMAND_DISCONNECT);
@@ -506,7 +506,7 @@ static int __mm_wfd_sink_init_gstreamer(mm_wfd_sink_t *wfd_sink)
        /* initializing gstreamer */
        if (!gst_init_check(argc, &argv, &err)) {
                wfd_sink_error("failed to initialize gstreamer: %s",
-                                       err ? err->message : "unknown error occurred");
+                                               err ? err->message : "unknown error occurred");
                if (err)
                        g_error_free(err);
 
@@ -531,31 +531,29 @@ _mm_wfd_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
        GstBusSyncReply ret = GST_BUS_PASS;
 
        wfd_sink_return_val_if_fail(message &&
-                                               GST_IS_MESSAGE(message) &&
-                                               GST_MESSAGE_SRC(message),
-                                               GST_BUS_DROP);
+                                                               GST_IS_MESSAGE(message) &&
+                                                               GST_MESSAGE_SRC(message),
+                                                               GST_BUS_DROP);
 
        wfd_sink_debug("get message %p, %s from %p, %s", message,
-                       GST_MESSAGE_TYPE_NAME(message), GST_MESSAGE_SRC(message), GST_MESSAGE_SRC_NAME(message));
+                                       GST_MESSAGE_TYPE_NAME(message), GST_MESSAGE_SRC(message), GST_MESSAGE_SRC_NAME(message));
 
        switch (GST_MESSAGE_TYPE(message)) {
-               case GST_MESSAGE_TAG:
-                       break;
-               case GST_MESSAGE_DURATION:
-                       break;
-               case GST_MESSAGE_STATE_CHANGED: {
-                               /* we only handle state change messages from pipeline */
-                               if (!GST_IS_PIPELINE(GST_MESSAGE_SRC(message)))
-                                       ret = GST_BUS_DROP;
-                       }
-                       break;
-               case GST_MESSAGE_ASYNC_DONE: {
-                               if (!GST_IS_PIPELINE(GST_MESSAGE_SRC(message)))
-                                       ret = GST_BUS_DROP;
-                       }
-                       break;
-               default:
-                       break;
+       case GST_MESSAGE_TAG:
+               break;
+       case GST_MESSAGE_DURATION:
+               break;
+       case GST_MESSAGE_STATE_CHANGED:
+               /* we only handle state change messages from pipeline */
+               if (!GST_IS_PIPELINE(GST_MESSAGE_SRC(message)))
+                       ret = GST_BUS_DROP;
+               break;
+       case GST_MESSAGE_ASYNC_DONE:
+               if (!GST_IS_PIPELINE(GST_MESSAGE_SRC(message)))
+                       ret = GST_BUS_DROP;
+               break;
+       default:
+               break;
        }
 
        return ret;
@@ -670,14 +668,14 @@ _mm_wfd_sink_msg_callback(GstBus *bus, GstMessage *msg, gpointer data)
                        if (wfd_sink->clock) {
                                if (wfd_sink->clock != clock)
                                        wfd_sink_debug("clock is changed! [%s] -->[%s]",
-                                                       GST_STR_NULL(GST_OBJECT_NAME(wfd_sink->clock)),
-                                                       GST_STR_NULL(GST_OBJECT_NAME(clock)));
+                                                                       GST_STR_NULL(GST_OBJECT_NAME(wfd_sink->clock)),
+                                                                       GST_STR_NULL(GST_OBJECT_NAME(clock)));
                                else
                                        wfd_sink_debug("same clock is selected again! [%s]",
-                                                       GST_STR_NULL(GST_OBJECT_NAME(clock)));
+                                                                       GST_STR_NULL(GST_OBJECT_NAME(clock)));
                        } else {
                                wfd_sink_debug("new clock [%s] was selected in the pipeline",
-                                                       (GST_STR_NULL(GST_OBJECT_NAME(clock))));
+                                                               (GST_STR_NULL(GST_OBJECT_NAME(clock))));
                        }
 
                        wfd_sink->clock = clock;
@@ -833,14 +831,14 @@ __mm_wfd_sink_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket,
 
                        if (!gst_bin_add(GST_BIN(bin), GST_ELEMENT(element->gst))) {
                                wfd_sink_error("failed to add element [%s] to bin [%s]",
-                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))),
-                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT_CAST(bin))));
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))),
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT_CAST(bin))));
                                return 0;
                        }
 
                        wfd_sink_debug("add element [%s] to bin [%s]",
-                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))),
-                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT_CAST(bin))));
+                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))),
+                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT_CAST(bin))));
 
                        successful_add_count++;
                }
@@ -872,13 +870,13 @@ __mm_wfd_sink_gst_element_link_bucket(GList *element_bucket)
                if (element && element->gst) {
                        if (gst_element_link(GST_ELEMENT(prv_element->gst), GST_ELEMENT(element->gst))) {
                                wfd_sink_debug("linking [%s] to [%s] success",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(prv_element->gst))),
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))));
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(prv_element->gst))),
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))));
                                successful_link_count++;
                        } else {
                                wfd_sink_error("linking [%s] to [%s] failed",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(prv_element->gst))),
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))));
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(prv_element->gst))),
+                                                               GST_STR_NULL(GST_ELEMENT_NAME(GST_ELEMENT(element->gst))));
                                return -1;
                        }
                }
@@ -1027,8 +1025,8 @@ static int __mm_wfd_sink_set_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkStateType s
 
        /* post state message to application */
        MMWFDSINK_POST_MESSAGE(wfd_sink,
-                                               MM_ERROR_NONE,
-                                               MMWFDSINK_CURRENT_STATE(wfd_sink));
+                                                       MM_ERROR_NONE,
+                                                       MMWFDSINK_CURRENT_STATE(wfd_sink));
 
        /* print state */
        MMWFDSINK_PRINT_STATE(wfd_sink);
@@ -1048,13 +1046,13 @@ __mm_wfd_sink_set_pipeline_state(mm_wfd_sink_t *wfd_sink, GstState state, gboole
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        wfd_sink_return_val_if_fail(state > GST_STATE_VOID_PENDING,
-                               MM_ERROR_WFD_INVALID_ARGUMENT);
+                                                               MM_ERROR_WFD_INVALID_ARGUMENT);
 
        wfd_sink_debug("try to set %s state ", gst_element_state_get_name(state));
 
@@ -1068,7 +1066,7 @@ __mm_wfd_sink_set_pipeline_state(mm_wfd_sink_t *wfd_sink, GstState state, gboole
                wfd_sink_debug("wait for changing state is completed ");
 
                result = gst_element_get_state(wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
-                                       &cur_state, &pending_state, wfd_sink->ini.state_change_timeout * GST_SECOND);
+                                                                               &cur_state, &pending_state, wfd_sink->ini.state_change_timeout * GST_SECOND);
                if (result == GST_STATE_CHANGE_FAILURE) {
                        wfd_sink_error("fail to get state within %d seconds....", wfd_sink->ini.state_change_timeout);
 
@@ -1080,8 +1078,8 @@ __mm_wfd_sink_set_pipeline_state(mm_wfd_sink_t *wfd_sink, GstState state, gboole
                }
 
                wfd_sink_debug("cur state is %s, pending state is %s",
-                                       gst_element_state_get_name(cur_state),
-                                       gst_element_state_get_name(pending_state));
+                                               gst_element_state_get_name(cur_state),
+                                               gst_element_state_get_name(pending_state));
        }
 
 
@@ -1099,9 +1097,9 @@ _mm_wfd_sink_reset_basetime(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_if_fail(wfd_sink &&
-                                       wfd_sink->pipeline &&
-                                       wfd_sink->pipeline->mainbin &&
-                                       wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
+                                                       wfd_sink->pipeline &&
+                                                       wfd_sink->pipeline->mainbin &&
+                                                       wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
        wfd_sink_return_if_fail(wfd_sink->need_to_reset_basetime);
 
 
@@ -1345,16 +1343,19 @@ ERROR:
 int
 __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **pad)
 {
+       GstElement *pipeline  = NULL;
        GstElement *v_decodebin  = NULL;
        GstElement *v_sinkbin  = NULL;
+       GstPad *srcpad = NULL;
+       GstPad *sinkpad = NULL;
 
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check video decodebin is linked */
        if (!wfd_sink->video_decodebin_is_linked) {
@@ -1379,45 +1380,152 @@ __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **pad)
                        goto ERROR;
                }
        }
-
-       /* set video decodebin state as READY */
+       /* add video decodebin to pipeline */
        if (wfd_sink->pipeline->v_decodebin && wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst) {
                v_decodebin = wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst;
-               if (GST_STATE(v_decodebin) <= GST_STATE_NULL) {
-                       wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(v_decodebin));
-                       if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(v_decodebin, GST_STATE_READY)) {
-                               wfd_sink_error("failed to set state(READY) to video decodebin");
+
+               pipeline = GST_ELEMENT_CAST(gst_element_get_parent(v_decodebin));
+               if (!pipeline) {
+                       pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
+
+                       if (GST_STATE(v_decodebin) <= GST_STATE_NULL) {
+                               wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(v_decodebin));
+                               if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(v_decodebin, GST_STATE_READY)) {
+                                       wfd_sink_error("failed to set state(READY) to video decodebin");
+                                       goto ERROR;
+                               }
+                       }
+
+                       wfd_sink_debug("try to add %s to %s",
+                                                       GST_ELEMENT_NAME(v_decodebin), GST_ELEMENT_NAME(pipeline));
+                       if (!gst_bin_add(GST_BIN(pipeline), GST_ELEMENT(v_decodebin))) {
+                               wfd_sink_error("failed to add %s to %s",
+                                                               GST_ELEMENT_NAME(v_decodebin), GST_ELEMENT_NAME(pipeline));
                                goto ERROR;
                        }
+
+                       wfd_sink_debug("need to sync state %s with its parent", GST_ELEMENT_NAME(v_decodebin));
+                       if (!gst_element_sync_state_with_parent(GST_ELEMENT(v_decodebin))) {
+                               wfd_sink_error("failed to sync %s state with parent", GST_ELEMENT_NAME(v_decodebin));
+                               goto ERROR;
+                       }
+               } else {
+                       wfd_sink_debug("%s is already added to %s",
+                                                       GST_ELEMENT_NAME(v_decodebin), GST_ELEMENT_NAME(pipeline));
+                       gst_object_unref(pipeline);
+                       pipeline = NULL;
                }
        } else {
                wfd_sink_warning("going on without video decodebin....");
        }
 
-       /* set video sinkbin state as READY */
+       /* add video sinkbin to pipeline */
        if (wfd_sink->pipeline->v_sinkbin && wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst) {
                v_sinkbin = wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst;
-               if (GST_STATE(v_sinkbin) <= GST_STATE_NULL) {
-                       wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(v_sinkbin));
-                       if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(v_sinkbin, GST_STATE_READY)) {
-                               wfd_sink_error("failed to set state(READY) to video sinkbin");
+
+               pipeline = GST_ELEMENT_CAST(gst_element_get_parent(v_sinkbin));
+               if (!pipeline) {
+                       pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
+
+                       /* prepare video sinkbin before adding */
+                       if (GST_STATE(v_sinkbin) <= GST_STATE_NULL) {
+                               wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(v_sinkbin));
+                               if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(v_sinkbin, GST_STATE_READY)) {
+                                       wfd_sink_error("failed to set state(READY) to video sinkbin");
+                                       goto ERROR;
+                               }
+                       }
+                       /* add video sinkbin to pipeline */
+                       wfd_sink_debug("try to  add %s to %s",
+                                                       GST_ELEMENT_NAME(v_sinkbin), GST_ELEMENT_NAME(pipeline));
+                       if (!gst_bin_add(GST_BIN(pipeline), GST_ELEMENT(v_sinkbin))) {
+                               wfd_sink_error("failed to add %s to %s",
+                                                               GST_ELEMENT_NAME(v_sinkbin), GST_ELEMENT_NAME(pipeline));
+                               goto ERROR;
+                       }
+
+                       /* sync state with parent */
+                       wfd_sink_debug("need to sync state %s with its parent", GST_ELEMENT_NAME(v_sinkbin));
+                       if (!gst_element_sync_state_with_parent(GST_ELEMENT(v_sinkbin))) {
+                               wfd_sink_error("failed to sync %s state with parent", GST_ELEMENT_NAME(v_sinkbin));
                                goto ERROR;
                        }
+               } else {
+                       wfd_sink_debug("%s is already added to %s",
+                                                       GST_ELEMENT_NAME(v_sinkbin), GST_ELEMENT_NAME(pipeline));
+                       gst_object_unref(pipeline);
+                       pipeline = NULL;
                }
        } else {
                wfd_sink_warning("going on without video sinkbin....");
        }
 
+
+       /* link video decodebin and sinkbin */
+       if (wfd_sink->pipeline->v_decodebin && wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst) {
+               v_decodebin = wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst;
+
+               if (pad)
+                       *pad = gst_element_get_static_pad(v_decodebin, "sink");
+
+               if (wfd_sink->pipeline->v_sinkbin && wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst) {
+
+                       v_sinkbin = wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst;
+
+                       srcpad = gst_element_get_static_pad(v_decodebin, "src");
+                       if (!srcpad) {
+                               wfd_sink_error("faied to get srcpad from %s", GST_ELEMENT_NAME(v_decodebin));
+                               goto ERROR;
+                       }
+
+                       if (!gst_pad_is_linked(srcpad)) {
+                               sinkpad = gst_element_get_static_pad(v_sinkbin, "sink");
+                               if (!sinkpad) {
+                                       wfd_sink_error("faied to get sinkpad from %s", GST_ELEMENT_NAME(v_sinkbin));
+                                       goto ERROR;
+                               }
+
+                               wfd_sink_debug("try to link %s:%s and %s:%s",
+                                                               GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                                               GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+                               if (GST_PAD_LINK_OK != gst_pad_link_full(srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING)) {
+                                       wfd_sink_error("failed to link %s:%s and %s:%s",
+                                                                       GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                                                       GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+                                       goto ERROR;
+                               }
+                               gst_object_unref(sinkpad);
+                               sinkpad = NULL;
+                       }
+                       gst_object_unref(srcpad);
+                       srcpad = NULL;
+               }
+       } else if (wfd_sink->pipeline->v_sinkbin && wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst) {
+               v_sinkbin = wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst;
+               if (pad)
+                       *pad = gst_element_get_static_pad(v_sinkbin, "sink");
+       }
+
        wfd_sink_debug_fleave();
 
        return MM_ERROR_NONE;
 
        /* ERRORS */
 ERROR:
+       if (sinkpad != NULL) {
+               gst_object_unref(sinkpad);
+               sinkpad = NULL;
+       }
+
+       if (srcpad != NULL) {
+               gst_object_unref(srcpad);
+               srcpad = NULL;
+       }
+
        /* need to notify to app */
        MMWFDSINK_POST_MESSAGE(wfd_sink,
-                                               MM_ERROR_WFD_INTERNAL,
-                                               MMWFDSINK_CURRENT_STATE(wfd_sink));
+                                                       MM_ERROR_WFD_INTERNAL,
+                                                       MMWFDSINK_CURRENT_STATE(wfd_sink));
 
        return MM_ERROR_WFD_INTERNAL;
 }
@@ -1605,8 +1713,8 @@ ERROR:
 
        /* need to notify to app */
        MMWFDSINK_POST_MESSAGE(wfd_sink,
-                                               MM_ERROR_WFD_INTERNAL,
-                                               MMWFDSINK_CURRENT_STATE(wfd_sink));
+                                                       MM_ERROR_WFD_INTERNAL,
+                                                       MMWFDSINK_CURRENT_STATE(wfd_sink));
 
        return MM_ERROR_WFD_INTERNAL;
 }
@@ -1614,14 +1722,19 @@ ERROR:
 int
 __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **pad)
 {
+       GstElement *pipeline  = NULL;
        GstElement *a_decodebin  = NULL;
        GstElement *a_sinkbin  = NULL;
+       GstPad *srcpad = NULL;
+       GstPad *sinkpad = NULL;
 
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        /* check audio decodebin is linked */
        if (!wfd_sink->audio_decodebin_is_linked) {
@@ -1647,44 +1760,159 @@ __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **pad)
                }
        }
 
-       /* set audio decodebin state as READY */
+       /* add audio decodebin to pipeline */
        if (wfd_sink->pipeline->a_decodebin && wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst) {
                a_decodebin = wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst;
-               if (GST_STATE(a_decodebin) <= GST_STATE_NULL) {
-                       wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(a_decodebin));
-                       if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(a_decodebin, GST_STATE_READY)) {
-                               wfd_sink_error("failed to set state(READY) to audio decodebin");
+
+               pipeline = GST_ELEMENT_CAST(gst_element_get_parent(a_decodebin));
+               if (!pipeline) {
+                       pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
+
+                       if (GST_STATE(a_decodebin) <= GST_STATE_NULL) {
+                               wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(a_decodebin));
+                               if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(a_decodebin, GST_STATE_READY)) {
+                                       wfd_sink_error("failed to set state(READY) to audio decodebin");
+                                       goto ERROR;
+                               }
+                       }
+
+                       wfd_sink_debug("try to add %s to %s",
+                                                       GST_ELEMENT_NAME(a_decodebin), GST_ELEMENT_NAME(pipeline));
+                       if (!gst_bin_add(GST_BIN(pipeline), GST_ELEMENT(a_decodebin))) {
+                               wfd_sink_error("failed to add %s to %s",
+                                                               GST_ELEMENT_NAME(a_decodebin), GST_ELEMENT_NAME(pipeline));
                                goto ERROR;
                        }
+
+                       wfd_sink_debug("need to sync state %s with its parent", GST_ELEMENT_NAME(a_decodebin));
+                       if (!gst_element_sync_state_with_parent(GST_ELEMENT(a_decodebin))) {
+                               wfd_sink_error("failed to sync %s state with parent", GST_ELEMENT_NAME(a_decodebin));
+                               goto ERROR;
+                       }
+               } else {
+                       wfd_sink_debug("%s is already added to %s",
+                                                       GST_ELEMENT_NAME(a_decodebin), GST_ELEMENT_NAME(pipeline));
+                       gst_object_unref(pipeline);
+                       pipeline = NULL;
                }
        } else {
                wfd_sink_warning("going on without audio decodebin....");
        }
 
-       /* set audio sinkbin state as READY */
+       /* add audio sinkbin to pipeline */
        if (wfd_sink->pipeline->a_sinkbin && wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst) {
                a_sinkbin = wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst;
-               if (GST_STATE(a_sinkbin) <= GST_STATE_NULL) {
-                       wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(a_sinkbin));
-                       if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(a_sinkbin , GST_STATE_READY)) {
-                               wfd_sink_error("failed to set state(READY) to audio sinkbin");
+
+               pipeline = GST_ELEMENT_CAST(gst_element_get_parent(a_sinkbin));
+               if (!pipeline) {
+                       pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
+
+                       /* prepare audio sinkbin before adding */
+                       if (GST_STATE(a_sinkbin) <= GST_STATE_NULL) {
+                               wfd_sink_debug("need to prepare %s", GST_ELEMENT_NAME(a_sinkbin));
+                               if (GST_STATE_CHANGE_FAILURE == gst_element_set_state(a_sinkbin, GST_STATE_READY)) {
+                                       wfd_sink_error("failed to set state(READY) to audio sinkbin");
+                                       goto ERROR;
+                               }
+                       }
+
+                       /* add audio sinkbin to pipeline */
+                       wfd_sink_debug("try to  add %s to %s",
+                                                       GST_ELEMENT_NAME(a_sinkbin), GST_ELEMENT_NAME(pipeline));
+                       if (!gst_bin_add(GST_BIN(pipeline), GST_ELEMENT(a_sinkbin))) {
+                               wfd_sink_error("failed to add %s to %s",
+                                                               GST_ELEMENT_NAME(a_sinkbin), GST_ELEMENT_NAME(pipeline));
+                               goto ERROR;
+                       }
+
+                       /* sync state with parent */
+                       wfd_sink_debug("need to sync state %s with its parent", GST_ELEMENT_NAME(a_sinkbin));
+                       if (!gst_element_sync_state_with_parent(GST_ELEMENT(a_sinkbin))) {
+                               wfd_sink_error("failed to sync %s state with parent", GST_ELEMENT_NAME(a_sinkbin));
                                goto ERROR;
                        }
+               } else {
+                       wfd_sink_debug("%s is already added to %s",
+                                                       GST_ELEMENT_NAME(a_sinkbin), GST_ELEMENT_NAME(pipeline));
+                       gst_object_unref(pipeline);
+                       pipeline = NULL;
                }
        } else {
                wfd_sink_warning("going on without audio sinkbin....");
        }
 
+
+       /* link audio decodebin and sinkbin */
+       if (wfd_sink->pipeline->a_decodebin && wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst) {
+               a_decodebin = wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst;
+
+               if (pad)
+                       *pad = gst_element_get_static_pad(a_decodebin, "sink");
+
+               if (wfd_sink->pipeline->a_sinkbin && wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst) {
+
+                       a_sinkbin = wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst;
+
+                       srcpad = gst_element_get_static_pad(a_decodebin, "src");
+                       if (!srcpad) {
+                               wfd_sink_error("faied to get srcpad from %s", GST_ELEMENT_NAME(a_decodebin));
+                               goto ERROR;
+                       }
+
+                       if (!gst_pad_is_linked(srcpad)) {
+                               sinkpad = gst_element_get_static_pad(a_sinkbin, "sink");
+                               if (!sinkpad) {
+                                       wfd_sink_error("faied to get sinkpad from %s", GST_ELEMENT_NAME(a_sinkbin));
+                                       goto ERROR;
+                               }
+
+                               wfd_sink_debug("try to link %s:%s and %s:%s",
+                                                               GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                                               GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+                               if (GST_PAD_LINK_OK != gst_pad_link_full(srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING)) {
+                                       wfd_sink_error("failed to link %s:%s and %s:%s",
+                                                                       GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                                                       GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+
+                                       goto ERROR;
+                               }
+                               gst_object_unref(sinkpad);
+                               sinkpad = NULL;
+                       }
+                       gst_object_unref(srcpad);
+                       srcpad = NULL;
+               }
+       } else if (wfd_sink->pipeline->a_sinkbin && wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst) {
+               a_sinkbin = wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst;
+               if (pad)
+                       *pad = gst_element_get_static_pad(a_sinkbin, "sink");
+       }
+
        wfd_sink_debug_fleave();
 
        return MM_ERROR_NONE;
 
        /* ERRORS */
 ERROR:
+       if (pipeline) {
+               gst_object_unref(pipeline);
+               pipeline = NULL;
+       }
+
+       if (sinkpad) {
+               gst_object_unref(sinkpad);
+               sinkpad = NULL;
+       }
+
+       if (srcpad) {
+               gst_object_unref(srcpad);
+               srcpad = NULL;
+       }
+
        /* need to notify to app */
        MMWFDSINK_POST_MESSAGE(wfd_sink,
-                                               MM_ERROR_WFD_INTERNAL,
-                                               MMWFDSINK_CURRENT_STATE(wfd_sink));
+                                                       MM_ERROR_WFD_INTERNAL,
+                                                       MMWFDSINK_CURRENT_STATE(wfd_sink));
 
        return MM_ERROR_WFD_INTERNAL;
 }
@@ -1707,10 +1935,10 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
 
        wfd_sink_return_val_if_fail(info, FALSE);
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->mainbin &&
-                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
-                                               GST_PAD_PROBE_DROP);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->mainbin &&
+                                                               wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst,
+                                                               GST_PAD_PROBE_DROP);
 
        if (!wfd_sink->clock) {
                wfd_sink_warning("pipeline did not select clock, yet");
@@ -1733,8 +1961,8 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                running_time = current_time - (start_time + base_time);
        } else {
                wfd_sink_debug("current time %"GST_TIME_FORMAT", start time %"GST_TIME_FORMAT
-                                       "  base time %"GST_TIME_FORMAT"", GST_TIME_ARGS(current_time),
-                                       GST_TIME_ARGS(start_time), GST_TIME_ARGS(base_time));
+                                               "  base time %"GST_TIME_FORMAT"", GST_TIME_ARGS(current_time),
+                                               GST_TIME_ARGS(start_time), GST_TIME_ARGS(base_time));
                return GST_PAD_PROBE_OK;
        }
 
@@ -1762,8 +1990,8 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                if (diff < 0) {
                        /* this buffer could be NOT rendered */
                        wfd_sink_debug("%s : diff time : -%" GST_TIME_FORMAT "",
-                                               GST_STR_NULL((GST_OBJECT_NAME(pad))),
-                                               GST_TIME_ARGS(GST_CLOCK_DIFF(render_time, running_time)));
+                                                       GST_STR_NULL((GST_OBJECT_NAME(pad))),
+                                                       GST_TIME_ARGS(GST_CLOCK_DIFF(render_time, running_time)));
                } else {
                        /* this buffer could be rendered */
                        /*wfd_sink_debug ("%s :diff time : %" GST_TIME_FORMAT "", */
@@ -1819,9 +2047,9 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                                }
                        } else {
                                wfd_sink_debug("there is no video buffer flow during %"GST_TIME_FORMAT
-                                                       " ~ %" GST_TIME_FORMAT"",
-                                                       GST_TIME_ARGS(wfd_sink->last_buffer_timestamp),
-                                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
+                                                               " ~ %" GST_TIME_FORMAT"",
+                                                               GST_TIME_ARGS(wfd_sink->last_buffer_timestamp),
+                                                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
                        }
 
                        /* check audio */
@@ -1842,9 +2070,9 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                                }
                        } else {
                                wfd_sink_debug("there is no audio buffer flow during %"GST_TIME_FORMAT
-                                                       " ~ %" GST_TIME_FORMAT"",
-                                                       GST_TIME_ARGS(wfd_sink->last_buffer_timestamp),
-                                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
+                                                               " ~ %" GST_TIME_FORMAT"",
+                                                               GST_TIME_ARGS(wfd_sink->last_buffer_timestamp),
+                                                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
                        }
 
                        /* selecet average_gap_diff between video and audio */
@@ -1878,8 +2106,8 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                        }
 
                        wfd_sink_debug("average diff gap difference beween audio:%s%lld and video:%s%lld ",
-                                               audio_minus_compensation ? "-" : "", audio_avgrage_gap_diff,
-                                               video_minus_compensation ? "-" : "", video_avgrage_gap_diff);
+                                                       audio_minus_compensation ? "-" : "", audio_avgrage_gap_diff,
+                                                       video_minus_compensation ? "-" : "", video_avgrage_gap_diff);
 
 
                        /* if calculated gap diff is larger than 1ms. need to compensate buffer timestamp */
@@ -1890,9 +2118,9 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                                        ts_offset += avgrage_gap_diff;
 
                                wfd_sink_debug("do timestamp compensation : %s%lld (ts-offset : %"
-                                               GST_TIME_FORMAT") at(%" GST_TIME_FORMAT")",
-                                               minus_compensation ? "-" : "", avgrage_gap_diff,
-                                               GST_TIME_ARGS(ts_offset), GST_TIME_ARGS(running_time));
+                                                               GST_TIME_FORMAT") at(%" GST_TIME_FORMAT")",
+                                                               minus_compensation ? "-" : "", avgrage_gap_diff,
+                                                               GST_TIME_ARGS(ts_offset), GST_TIME_ARGS(running_time));
 
                                if (wfd_sink->pipeline && wfd_sink->pipeline->a_sinkbin && wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_SINK].gst)
                                        g_object_set(G_OBJECT(wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_SINK].gst), "ts-offset", (gint64)ts_offset, NULL);
@@ -1900,7 +2128,7 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                                        g_object_set(G_OBJECT(wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_SINK].gst), "ts-offset", (gint64)ts_offset, NULL);
                        } else {
                                wfd_sink_debug("don't need to do timestamp compensation : %s%lld (ts-offset : %"GST_TIME_FORMAT ")",
-                                               minus_compensation ? "-" : "", avgrage_gap_diff, GST_TIME_ARGS(ts_offset));
+                                                               minus_compensation ? "-" : "", avgrage_gap_diff, GST_TIME_ARGS(ts_offset));
                        }
 
                        /* reset values*/
@@ -1912,7 +2140,7 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
                }
        } else {
                wfd_sink_debug("first update last buffer timestamp :%" GST_TIME_FORMAT,
-                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
+                                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
                wfd_sink->last_buffer_timestamp = GST_BUFFER_TIMESTAMP(buffer);
        }
 
@@ -1921,24 +2149,22 @@ _mm_wfd_sink_check_running_time(GstPad *pad, GstPadProbeInfo *info, gpointer u_d
 
 
 static void
-__mm_wfd_sink_demux_pad_added(GstElement *ele, GstPad *pad, gpointer data)
+__mm_wfd_sink_demux_pad_added(GstElement *demux, GstPad *pad, gpointer data)
 {
        mm_wfd_sink_t *wfd_sink = (mm_wfd_sink_t *)data;
        gchar *name = gst_pad_get_name(pad);
-       GstElement *pipeline = NULL;
-       GstElement *decodebin = NULL;
-       GstElement *sinkbin = NULL;
        GstPad *sinkpad = NULL;
        GstPad *srcpad = NULL;
 
        wfd_sink_debug_fenter();
 
        wfd_sink_return_if_fail(wfd_sink &&
-                                       wfd_sink->pipeline &&
-                                       wfd_sink->pipeline->mainbin &&
-                                       wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
+                                                       wfd_sink->pipeline &&
+                                                       wfd_sink->pipeline->mainbin &&
+                                                       wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst);
 
-       pipeline = wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst;
+       /* take srcpad from demuxer added pad */
+       srcpad = gst_object_ref(pad);
 
        /* take decodebin/sinkbin */
        if (name[0] == 'v') {
@@ -1947,129 +2173,44 @@ __mm_wfd_sink_demux_pad_added(GstElement *ele, GstPad *pad, gpointer data)
                MMWFDSINK_PAD_PROBE(wfd_sink, pad, NULL,  NULL);
 
                gst_pad_add_probe(pad,
-                                       GST_PAD_PROBE_TYPE_BUFFER,
-                                       _mm_wfd_sink_check_running_time,
-                                       (gpointer)wfd_sink,
-                                       NULL);
+                                               GST_PAD_PROBE_TYPE_BUFFER,
+                                               _mm_wfd_sink_check_running_time,
+                                               (gpointer)wfd_sink,
+                                               NULL);
 
                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_video_pipeline(wfd_sink, &sinkpad)) {
                        wfd_sink_error("failed to prepare video pipeline....");
                        goto ERROR;
                }
-
-               if (wfd_sink->pipeline->v_decodebin && wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst)
-                       decodebin = wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst;
-               if (wfd_sink->pipeline->v_sinkbin && wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst)
-                       sinkbin = wfd_sink->pipeline->v_sinkbin[WFD_SINK_V_S_BIN].gst;
        } else if (name[0] == 'a') {
                wfd_sink_debug("=========== >>>>>>>>>> Received AUDIO pad...");
 
                MMWFDSINK_PAD_PROBE(wfd_sink, pad, NULL,  NULL);
 
                gst_pad_add_probe(pad,
-                                       GST_PAD_PROBE_TYPE_BUFFER,
-                                       _mm_wfd_sink_check_running_time,
-                                       (gpointer)wfd_sink,
-                                       NULL);
+                                               GST_PAD_PROBE_TYPE_BUFFER,
+                                               _mm_wfd_sink_check_running_time,
+                                               (gpointer)wfd_sink,
+                                               NULL);
 
                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audio_pipeline(wfd_sink, &sinkpad)) {
                        wfd_sink_error("failed to prepare audio pipeline....");
                        goto ERROR;
                }
-
-               if (wfd_sink->pipeline->a_decodebin && wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst)
-                       decodebin = wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst;
-               if (wfd_sink->pipeline->a_sinkbin && wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst)
-                       sinkbin = wfd_sink->pipeline->a_sinkbin[WFD_SINK_A_S_BIN].gst;
        } else {
                wfd_sink_error("unexceptable pad is added!!!");
-               return;
-       }
-
-       srcpad = gst_object_ref(pad);
-
-       /* add decodebin and link */
-       if (decodebin) {
-               if (!gst_bin_add(GST_BIN(pipeline), decodebin)) {
-                       wfd_sink_error("failed to add %s to pipeline",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(decodebin)));
-                       goto ERROR;
-               }
-
-               sinkpad = gst_element_get_static_pad(decodebin, "sink");
-               if (!sinkpad) {
-                       wfd_sink_error("failed to get sink pad from %s",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(decodebin)));
-                       goto ERROR;
-               }
-
-               if (GST_PAD_LINK_OK != gst_pad_link(srcpad, sinkpad)) {
-                       wfd_sink_error("failed to link %s and %s",
-                                       GST_STR_NULL(GST_PAD_NAME(srcpad)),
-                                       GST_STR_NULL(GST_PAD_NAME(sinkpad)));
-                       goto ERROR;
-               }
-               gst_object_unref(GST_OBJECT(srcpad));
-               srcpad = NULL;
-               gst_object_unref(GST_OBJECT(sinkpad));
-               sinkpad = NULL;
-
-               srcpad = gst_element_get_static_pad(decodebin, "src");
-               if (!srcpad) {
-                       wfd_sink_error("failed to get src pad from %s",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(decodebin)));
-                       goto ERROR;
-               }
-       } else {
-               wfd_sink_warning("going on without decodebin...");
-       }
-
-       /* add sinkbin and link */
-       if (sinkbin) {
-               if (!gst_bin_add(GST_BIN(pipeline), sinkbin)) {
-                       wfd_sink_error("failed to add %s to pipeline",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(sinkbin)));
-                       goto ERROR;
-               }
-
-               sinkpad = gst_element_get_static_pad(sinkbin, "sink");
-               if (!sinkpad) {
-                       wfd_sink_error("failed to get sink pad from %s",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(sinkbin)));
-                       goto ERROR;
-               }
-
-               if (GST_PAD_LINK_OK != gst_pad_link(srcpad, sinkpad)) {
-                       wfd_sink_error("failed to link %s and %s",
-                                       GST_STR_NULL(GST_PAD_NAME(srcpad)),
-                                       GST_STR_NULL(GST_PAD_NAME(sinkpad)));
-                       goto ERROR;
-               }
-               gst_object_unref(GST_OBJECT(srcpad));
-               srcpad = NULL;
-               gst_object_unref(GST_OBJECT(sinkpad));
-               sinkpad = NULL;
-       } else {
-               wfd_sink_error("there is no sinkbin...");
                goto ERROR;
        }
 
-
-       /* run */
-       if (decodebin) {
-               if (!gst_element_sync_state_with_parent(GST_ELEMENT_CAST(decodebin))) {
-                       wfd_sink_error("failed to sync %s state with parent",
-                               GST_STR_NULL(GST_PAD_NAME(decodebin)));
-                       goto ERROR;
-               }
-       }
-
-       if (sinkbin) {
-               if (!gst_element_sync_state_with_parent(GST_ELEMENT_CAST(sinkbin))) {
-                       wfd_sink_error("failed to sync %s state with parent",
-                               GST_STR_NULL(GST_PAD_NAME(sinkbin)));
-                       goto ERROR;
-               }
+       /* link */
+       wfd_sink_debug("try to link %s:%s and %s:%s",
+                                       GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                       GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+       if (GST_PAD_LINK_OK != gst_pad_link_full(srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING)) {
+               wfd_sink_error("failed to link %s:%s and %s:%s",
+                                               GST_ELEMENT_NAME(GST_PAD_PARENT(srcpad)), GST_PAD_NAME(srcpad),
+                                               GST_ELEMENT_NAME(GST_PAD_PARENT(sinkpad)), GST_PAD_NAME(sinkpad));
+               goto ERROR;
        }
 
        if (name[0] == 'v') {
@@ -2178,10 +2319,10 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
                        }
 
                        wfd_sink_debug("audio_format : %s \n \t rate :  %d \n \t channels :  %d \n \t bitwidth :  %d \n \t      \n",
-                                               audio_format,
-                                               stream_info->audio_stream_info.sample_rate,
-                                               stream_info->audio_stream_info.channels,
-                                               stream_info->audio_stream_info.bitwidth);
+                                                       audio_format,
+                                                       stream_info->audio_stream_info.sample_rate,
+                                                       stream_info->audio_stream_info.channels,
+                                                       stream_info->audio_stream_info.bitwidth);
                }
        }
 
@@ -2213,10 +2354,10 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
                        }
 
                        wfd_sink_debug("video_format : %s \n \t width :  %d \n \t height :  %d \n \t frame_rate :  %d \n \t",
-                                               video_format,
-                                               stream_info->video_stream_info.width,
-                                               stream_info->video_stream_info.height,
-                                               stream_info->video_stream_info.frame_rate);
+                                                       video_format,
+                                                       stream_info->video_stream_info.width,
+                                                       stream_info->video_stream_info.height,
+                                                       stream_info->video_stream_info.frame_rate);
                }
        }
 
@@ -2226,7 +2367,7 @@ __mm_wfd_sink_update_stream_info(GstElement *wfdsrc, GstStructure *str, gpointer
 }
 
 static void __mm_wfd_sink_prepare_video_resolution(gint resolution, guint64 *CEA_resolution,
-                                                       guint64 *VESA_resolution, guint64 *HH_resolution)
+                                                                                                       guint64 *VESA_resolution, guint64 *HH_resolution)
 {
        if (resolution == MM_WFD_SINK_RESOLUTION_UNKNOWN) return;
 
@@ -2295,11 +2436,11 @@ static int __mm_wfd_sink_prepare_source(mm_wfd_sink_t *wfd_sink, GstElement *wfd
 
        /* set audio parameter for Wi-Fi Display session negotiation */
        wfd_audio_codecs = gst_structure_new("wfd_audio_codecs",
-                                       "audio_codec", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_codec,
-                                       "audio_latency", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_latency,
-                                       "audio_channels", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_channel,
-                                       "audio_sampling_frequency", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_sampling_frequency,
-                                       NULL);
+                                                                               "audio_codec", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_codec,
+                                                                               "audio_latency", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_latency,
+                                                                               "audio_channels", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_channel,
+                                                                               "audio_sampling_frequency", G_TYPE_UINT, wfd_sink->ini.wfd_audio_codecs.audio_sampling_frequency,
+                                                                               NULL);
 
        if (wfd_audio_codecs) {
                g_object_set(G_OBJECT(wfdsrc), "wfd-audio-codecs", wfd_audio_codecs, NULL);
@@ -2313,22 +2454,22 @@ static int __mm_wfd_sink_prepare_source(mm_wfd_sink_t *wfd_sink, GstElement *wfd
        HH_resolution =  wfd_sink->ini.wfd_video_formats.video_hh_support;
 
        __mm_wfd_sink_prepare_video_resolution(wfd_sink->supportive_resolution,
-                                                                               &CEA_resolution, &VESA_resolution, &HH_resolution);
+                                                                                       &CEA_resolution, &VESA_resolution, &HH_resolution);
        wfd_video_formats = gst_structure_new("wfd_video_formats",
-                                                       "video_codec", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_codec,
-                                                       "video_native_resolution", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_native_resolution,
-                                                       "video_cea_support", G_TYPE_UINT64, CEA_resolution,
-                                                       "video_vesa_support", G_TYPE_UINT64, VESA_resolution,
-                                                       "video_hh_support", G_TYPE_UINT64, HH_resolution,
-                                                       "video_profile", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_profile,
-                                                       "video_level", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_level,
-                                                       "video_latency", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_latency,
-                                                       "video_vertical_resolution", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_vertical_resolution,
-                                                       "video_horizontal_resolution", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_horizontal_resolution,
-                                                       "video_minimum_slicing", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_minimum_slicing,
-                                                       "video_slice_enc_param", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_slice_enc_param,
-                                                       "video_framerate_control_support", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_framerate_control_support,
-                                                       NULL);
+                                                                               "video_codec", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_codec,
+                                                                               "video_native_resolution", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_native_resolution,
+                                                                               "video_cea_support", G_TYPE_UINT64, CEA_resolution,
+                                                                               "video_vesa_support", G_TYPE_UINT64, VESA_resolution,
+                                                                               "video_hh_support", G_TYPE_UINT64, HH_resolution,
+                                                                               "video_profile", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_profile,
+                                                                               "video_level", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_level,
+                                                                               "video_latency", G_TYPE_UINT, wfd_sink->ini.wfd_video_formats.video_latency,
+                                                                               "video_vertical_resolution", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_vertical_resolution,
+                                                                               "video_horizontal_resolution", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_horizontal_resolution,
+                                                                               "video_minimum_slicing", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_minimum_slicing,
+                                                                               "video_slice_enc_param", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_slice_enc_param,
+                                                                               "video_framerate_control_support", G_TYPE_INT, wfd_sink->ini.wfd_video_formats.video_framerate_control_support,
+                                                                               NULL);
 
        if (wfd_video_formats) {
                g_object_set(G_OBJECT(wfdsrc), "wfd-video-formats", wfd_video_formats, NULL);
@@ -2344,9 +2485,9 @@ static int __mm_wfd_sink_prepare_source(mm_wfd_sink_t *wfd_sink, GstElement *wfd
                wfd_sink_debug("set hdcp version %d with %d port", hdcp_version, hdcp_port);
 
                wfd_content_protection = gst_structure_new("wfd_content_protection",
-                                                       "hdcp_version", G_TYPE_INT, hdcp_version,
-                                                       "hdcp_port_no", G_TYPE_INT, hdcp_port,
-                                                       NULL);
+                                                                                                       "hdcp_version", G_TYPE_INT, hdcp_version,
+                                                                                                       "hdcp_port_no", G_TYPE_INT, hdcp_port,
+                                                                                                       NULL);
 
                if (wfd_content_protection) {
                        g_object_set(G_OBJECT(wfdsrc), "wfd-content-protection", wfd_content_protection, NULL);
@@ -2358,11 +2499,11 @@ static int __mm_wfd_sink_prepare_source(mm_wfd_sink_t *wfd_sink, GstElement *wfd
        if (g_object_class_find_property(klass, "wfd2-audio-codecs")) {
                /* set audio parameter for Wi-Fi Display R2 session negotiation */
                wfd2_audio_codecs = gst_structure_new("wfd2-audio-codecs",
-                               "audio_codec", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_codec,
-                               "audio_lpcm_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_lpcm_mode,
-                               "audio_aac_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_aac_mode,
-                               "audio_ac3_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_ac3_mode,
-                               NULL);
+                                                                                       "audio_codec", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_codec,
+                                                                                       "audio_lpcm_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_lpcm_mode,
+                                                                                       "audio_aac_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_aac_mode,
+                                                                                       "audio_ac3_mode", G_TYPE_UINT, wfd_sink->ini.wfd2_audio_codecs.audio_ac3_mode,
+                                                                                       NULL);
 
                if (wfd2_audio_codecs) {
                        g_object_set(G_OBJECT(wfdsrc), "wfd2-audio-codecs", wfd2_audio_codecs, NULL);
@@ -2436,10 +2577,10 @@ static int __mm_wfd_sink_prepare_source(mm_wfd_sink_t *wfd_sink, GstElement *wfd
        }
 
        wfd_sink->update_stream_info_sig_id = g_signal_connect(wfdsrc, "update-media-info",
-                                               G_CALLBACK(__mm_wfd_sink_update_stream_info), wfd_sink);
+                                                                                                               G_CALLBACK(__mm_wfd_sink_update_stream_info), wfd_sink);
 
        wfd_sink->change_av_format_sig_id = g_signal_connect(wfdsrc, "change-av-format",
-                                               G_CALLBACK(__mm_wfd_sink_change_av_format), wfd_sink);
+                                                                                                               G_CALLBACK(__mm_wfd_sink_change_av_format), wfd_sink);
 
        wfd_sink_debug_fleave();
 
@@ -2454,7 +2595,7 @@ static int __mm_wfd_sink_prepare_demux(mm_wfd_sink_t *wfd_sink, GstElement *demu
        wfd_sink_return_val_if_fail(demux, MM_ERROR_WFD_NOT_INITIALIZED);
 
        g_signal_connect(demux, "pad-added",
-                       G_CALLBACK(__mm_wfd_sink_demux_pad_added),      wfd_sink);
+                                       G_CALLBACK(__mm_wfd_sink_demux_pad_added),      wfd_sink);
 
        wfd_sink_debug_fleave();
 
@@ -2487,7 +2628,7 @@ static void __mm_wfd_sink_prepare_queue(mm_wfd_sink_t *wfd_sink, GstElement *que
        g_object_set(G_OBJECT(queue), "max-size-buffers", 0, NULL);
        g_object_set(G_OBJECT(queue), "max-size-time", (guint64)3000000000ULL, NULL);
        g_signal_connect(queue, "overrun",
-               G_CALLBACK(__mm_wfd_sink_queue_overrun), wfd_sink);
+                                       G_CALLBACK(__mm_wfd_sink_queue_overrun), wfd_sink);
 
        wfd_sink_debug_fleave();
 
@@ -2649,10 +2790,10 @@ int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->a_decodebin &&
-                                               wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->a_decodebin &&
+                                                               wfd_sink->pipeline->a_decodebin[WFD_SINK_A_D_BIN].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        if (wfd_sink->audio_decodebin_is_linked) {
                wfd_sink_debug("audio decodebin is already linked... nothing to do");
@@ -2746,7 +2887,7 @@ int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink)
        sinkpad = gst_element_get_static_pad(GST_ELEMENT(first_element->gst), "sink");
        if (!sinkpad) {
                wfd_sink_error("failed to get sink pad from element(%s)",
-                       GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
                goto fail_to_link;
        }
 
@@ -2780,7 +2921,7 @@ int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink)
        srcpad = gst_element_get_static_pad(GST_ELEMENT(last_element->gst), "src");
        if (!srcpad) {
                wfd_sink_error("failed to get src pad from element(%s)",
-                       GST_STR_NULL(GST_ELEMENT_NAME(last_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(last_element->gst)));
                goto fail_to_link;
        }
 
@@ -2881,14 +3022,14 @@ static int  __mm_wfd_sink_destroy_audio_decodebin(mm_wfd_sink_t *wfd_sink)
                                parent = gst_element_get_parent(a_decodebin[i].gst);
                                if (!parent) {
                                        wfd_sink_debug("unref %s(current ref %d)",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_decodebin[i].gst)),
-                                                       ((GObject *) a_decodebin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_decodebin[i].gst)),
+                                                                       ((GObject *) a_decodebin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(a_decodebin[i].gst));
                                        a_decodebin[i].gst = NULL;
                                } else {
                                        wfd_sink_debug("%s has parent.(current ref %d)",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_decodebin[i].gst)),
-                                                       ((GObject *) a_decodebin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_decodebin[i].gst)),
+                                                                       ((GObject *) a_decodebin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(parent));
                                        parent = NULL;
                                }
@@ -2903,7 +3044,7 @@ static int  __mm_wfd_sink_destroy_audio_decodebin(mm_wfd_sink_t *wfd_sink)
 
        } else {
                wfd_sink_debug("audio decodebin has parent(%s), unref it ",
-                                       GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
+                                               GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
 
                gst_object_unref(GST_OBJECT(parent));
                parent = NULL;
@@ -2929,8 +3070,8 @@ int __mm_wfd_sink_create_audio_decodebin(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        if (wfd_sink->pipeline->a_decodebin != NULL) {
                wfd_sink_error("The audio decode bin is already created.");
@@ -3113,14 +3254,14 @@ static int  __mm_wfd_sink_destroy_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
                                parent = gst_element_get_parent(a_sinkbin[i].gst);
                                if (!parent) {
                                        wfd_sink_debug("unref %s(current ref %d)",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_sinkbin[i].gst)),
-                                                       ((GObject *) a_sinkbin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_sinkbin[i].gst)),
+                                                                       ((GObject *) a_sinkbin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(a_sinkbin[i].gst));
                                        a_sinkbin[i].gst = NULL;
                                } else {
                                        wfd_sink_debug("%s has parent.(current ref %d)",
-                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_sinkbin[i].gst)),
-                                                       ((GObject *) a_sinkbin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(a_sinkbin[i].gst)),
+                                                                       ((GObject *) a_sinkbin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(parent));
                                        parent = NULL;
                                }
@@ -3134,7 +3275,7 @@ static int  __mm_wfd_sink_destroy_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
                }
        } else {
                wfd_sink_debug("audio sinkbin has parent(%s), unref it ",
-                                       GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
+                                               GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
 
                gst_object_unref(GST_OBJECT(parent));
                parent = NULL;
@@ -3160,8 +3301,8 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        if (wfd_sink->pipeline->a_sinkbin != NULL) {
                wfd_sink_error("The audio sink bin is already created.");
@@ -3187,13 +3328,13 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
 
        /* create resampler */
        MMWFDSINK_CREATE_ELEMENT(a_sinkbin, WFD_SINK_A_S_RESAMPLER,
-                       wfd_sink->ini.name_of_audio_resampler, "audio_resampler", TRUE);
+                                                       wfd_sink->ini.name_of_audio_resampler, "audio_resampler", TRUE);
        MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_RESAMPLER].gst,  "sink");
        MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_RESAMPLER].gst,  "src");
 
        /* create volume */
        MMWFDSINK_CREATE_ELEMENT(a_sinkbin, WFD_SINK_A_S_VOLUME,
-                       wfd_sink->ini.name_of_audio_volume, "audio_volume", TRUE);
+                                                       wfd_sink->ini.name_of_audio_volume, "audio_volume", TRUE);
        MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_VOLUME].gst,  "sink");
        MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_VOLUME].gst,  "src");
 
@@ -3204,7 +3345,7 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
 
        /* create sink */
        MMWFDSINK_CREATE_ELEMENT(a_sinkbin, WFD_SINK_A_S_SINK,
-                       wfd_sink->ini.name_of_audio_sink, "audio_sink", TRUE);
+                                                       wfd_sink->ini.name_of_audio_sink, "audio_sink", TRUE);
        MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_SINK].gst,  "sink");
        if (a_sinkbin[WFD_SINK_A_S_SINK].gst) {
                if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audiosink(wfd_sink, a_sinkbin[WFD_SINK_A_S_SINK].gst)) {
@@ -3242,7 +3383,7 @@ int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink)
        pad = gst_element_get_static_pad(GST_ELEMENT(first_element->gst), "sink");
        if (!pad) {
                wfd_sink_error("failed to get sink pad from element(%s)",
-                       GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
                goto CREATE_ERROR;
        }
 
@@ -3325,10 +3466,10 @@ int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline &&
-                                               wfd_sink->pipeline->v_decodebin &&
-                                               wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline &&
+                                                               wfd_sink->pipeline->v_decodebin &&
+                                                               wfd_sink->pipeline->v_decodebin[WFD_SINK_V_D_BIN].gst,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        if (wfd_sink->video_decodebin_is_linked) {
                wfd_sink_debug("video decodebin is already linked... nothing to do");
@@ -3405,7 +3546,7 @@ int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink)
        sinkpad = gst_element_get_static_pad(GST_ELEMENT(first_element->gst), "sink");
        if (!sinkpad) {
                wfd_sink_error("failed to get sink pad from element(%s)",
-                       GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
                goto fail_to_link;
        }
 
@@ -3439,7 +3580,7 @@ int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink)
        srcpad = gst_element_get_static_pad(GST_ELEMENT(last_element->gst), "src");
        if (!srcpad) {
                wfd_sink_error("failed to get src pad from element(%s)",
-                       GST_STR_NULL(GST_ELEMENT_NAME(last_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(last_element->gst)));
                goto fail_to_link;
        }
 
@@ -3561,7 +3702,7 @@ static int __mm_wfd_sink_prepare_videosink(mm_wfd_sink_t *wfd_sink, GstElement *
                                        evas_object_geometry_get(obj, &wl_window_x, &wl_window_y, &wl_window_width, &wl_window_height);
 
                                        wfd_sink_debug("x[%d] y[%d] width[%d] height[%d]", wl_window_x, wl_window_y,
-                                                               wl_window_width, wl_window_height);
+                                                                       wl_window_width, wl_window_height);
 
                                        wl_window = elm_win_wl_window_get(obj);
                                        wl_surface = (struct wl_surface *) ecore_wl_window_surface_get(wl_window);
@@ -3595,7 +3736,7 @@ static int __mm_wfd_sink_prepare_videosink(mm_wfd_sink_t *wfd_sink, GstElement *
                                                                                                                                wl_surface_id);
                                        /* After setting window handle, set render rectangle */
                                        gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(video_sink),
-                                                                                                               wl_window_x, wl_window_y, wl_window_width, wl_window_height);
+                                                                                                                       wl_window_x, wl_window_y, wl_window_width, wl_window_height);
                                } else {
                                        wfd_sink_debug("display object is NULL!");
                                        return MM_ERROR_WFD_INTERNAL;
@@ -3666,14 +3807,14 @@ static int __mm_wfd_sink_destroy_video_decodebin(mm_wfd_sink_t *wfd_sink)
                                parent = gst_element_get_parent(v_decodebin[i].gst);
                                if (!parent) {
                                        wfd_sink_debug("unref %s(current ref %d)",
-                                                               GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[i].gst)),
-                                                               ((GObject *) v_decodebin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[i].gst)),
+                                                                       ((GObject *) v_decodebin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(v_decodebin[i].gst));
                                        v_decodebin[i].gst = NULL;
                                } else {
                                        wfd_sink_debug("%s has parent.(current ref %d)",
-                                                               GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[i].gst)),
-                                                               ((GObject *) v_decodebin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[i].gst)),
+                                                                       ((GObject *) v_decodebin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(parent));
                                        parent = NULL;
                                }
@@ -3682,15 +3823,15 @@ static int __mm_wfd_sink_destroy_video_decodebin(mm_wfd_sink_t *wfd_sink)
                /* release video decodebin with it's childs */
                if (v_decodebin[WFD_SINK_V_D_BIN].gst) {
                        wfd_sink_debug("unref %s(current ref %d)",
-                                               GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[WFD_SINK_V_D_BIN].gst)),
-                                               ((GObject *)v_decodebin[WFD_SINK_V_D_BIN].gst)->ref_count);
+                                                       GST_STR_NULL(GST_ELEMENT_NAME(v_decodebin[WFD_SINK_V_D_BIN].gst)),
+                                                       ((GObject *)v_decodebin[WFD_SINK_V_D_BIN].gst)->ref_count);
 
                        gst_object_unref(GST_OBJECT(v_decodebin[WFD_SINK_V_D_BIN].gst));
                        v_decodebin[WFD_SINK_V_D_BIN].gst = NULL;
                }
        } else {
                wfd_sink_debug("video decodebin has parent(%s), unref it",
-                                       GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
+                                               GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
 
                gst_object_unref(GST_OBJECT(parent));
                parent = NULL;
@@ -3716,8 +3857,8 @@ int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink)
        wfd_sink_debug_fenter();
 
        wfd_sink_return_val_if_fail(wfd_sink &&
-                                               wfd_sink->pipeline,
-                                               MM_ERROR_WFD_NOT_INITIALIZED);
+                                                               wfd_sink->pipeline,
+                                                               MM_ERROR_WFD_NOT_INITIALIZED);
 
        if (wfd_sink->pipeline->v_decodebin) {
                wfd_sink_debug("video decodebin is already created... nothing to do");
@@ -3896,14 +4037,14 @@ static int __mm_wfd_sink_destroy_video_sinkbin(mm_wfd_sink_t *wfd_sink)
                                parent = gst_element_get_parent(v_sinkbin[i].gst);
                                if (!parent) {
                                        wfd_sink_debug("unref %s(current ref %d)",
-                                                               GST_STR_NULL(GST_ELEMENT_NAME(v_sinkbin[i].gst)),
-                                                               ((GObject *) v_sinkbin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(v_sinkbin[i].gst)),
+                                                                       ((GObject *) v_sinkbin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(v_sinkbin[i].gst));
                                        v_sinkbin[i].gst = NULL;
                                } else {
                                        wfd_sink_debug("%s has parent.(current ref %d)",
-                                                               GST_STR_NULL(GST_ELEMENT_NAME(v_sinkbin[i].gst)),
-                                                               ((GObject *) v_sinkbin[i].gst)->ref_count);
+                                                                       GST_STR_NULL(GST_ELEMENT_NAME(v_sinkbin[i].gst)),
+                                                                       ((GObject *) v_sinkbin[i].gst)->ref_count);
                                        gst_object_unref(GST_OBJECT(parent));
                                        parent = NULL;
                                }
@@ -3916,7 +4057,7 @@ static int __mm_wfd_sink_destroy_video_sinkbin(mm_wfd_sink_t *wfd_sink)
                }
        } else {
                wfd_sink_debug("video sinkbin has parent(%s), unref it ",
-                                       GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
+                                               GST_STR_NULL(GST_OBJECT_NAME(GST_OBJECT(parent))));
 
                gst_object_unref(GST_OBJECT(parent));
                parent = NULL;
@@ -4026,7 +4167,7 @@ int __mm_wfd_sink_create_video_sinkbin(mm_wfd_sink_t *wfd_sink)
        pad = gst_element_get_static_pad(GST_ELEMENT(first_element->gst), "sink");
        if (!pad) {
                wfd_sink_error("failed to get pad from first element(%s) of the video sinkbin",
-                       GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(first_element->gst)));
                goto CREATE_ERROR;
        }
 
@@ -4226,11 +4367,11 @@ __mm_wfd_sink_dump_pipeline_state(mm_wfd_sink_t *wfd_sink)
        factory = gst_element_get_factory(item) ;
        if (factory) {
                wfd_sink_error("%s:%s : From:%s To:%s refcount : %d",
-                                       GST_OBJECT_NAME(factory),
-                                       GST_ELEMENT_NAME(item),
-                                       gst_element_state_get_name(state),
-                                       gst_element_state_get_name(pending),
-                                       GST_OBJECT_REFCOUNT_VALUE(item));
+                                               GST_OBJECT_NAME(factory),
+                                               GST_ELEMENT_NAME(item),
+                                               gst_element_state_get_name(state),
+                                               gst_element_state_get_name(pending),
+                                               GST_OBJECT_REFCOUNT_VALUE(item));
        }
 
        if (iter)
index e89d623f0662bf8654471d7b10dfcf7844454056..21da193db89d2321ca626c2dd82adcc22b8a1c07 100644 (file)
@@ -76,8 +76,8 @@ _mm_wfd_sink_util_pad_probe_cb(GstPad *pad, GstPadProbeInfo *info, gpointer u_da
        GstElement *parent = NULL;
 
        wfd_sink_return_val_if_fail(info &&
-                                               info->type != GST_PAD_PROBE_TYPE_INVALID,
-                                               GST_PAD_PROBE_DROP);
+                                                               info->type != GST_PAD_PROBE_TYPE_INVALID,
+                                                               GST_PAD_PROBE_DROP);
        wfd_sink_return_val_if_fail(pad, GST_PAD_PROBE_DROP);
 
        parent = (GstElement *)gst_object_get_parent(GST_OBJECT(pad));
@@ -90,21 +90,21 @@ _mm_wfd_sink_util_pad_probe_cb(GstPad *pad, GstPadProbeInfo *info, gpointer u_da
                GstBuffer *buffer = gst_pad_probe_info_get_buffer(info);
                /* show name and timestamp */
                wfd_sink_debug("BUFFER PROBE : %s:%s :  %u:%02u:%02u.%09u  (%"G_GSSIZE_FORMAT" bytes)\n",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)),
-                                       GST_STR_NULL(GST_PAD_NAME(pad)),
-                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
-                                       gst_buffer_get_size(buffer));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(parent)),
+                                               GST_STR_NULL(GST_PAD_NAME(pad)),
+                                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)),
+                                               gst_buffer_get_size(buffer));
        } else if (info->type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_UPSTREAM ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_FLUSH ||
-                       info->type & GST_PAD_PROBE_TYPE_EVENT_BOTH) {
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_UPSTREAM ||
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_FLUSH ||
+                               info->type & GST_PAD_PROBE_TYPE_EVENT_BOTH) {
                GstEvent *event = gst_pad_probe_info_get_event(info);
 
                /* show name and event type */
                wfd_sink_debug("EVENT PROBE : %s:%s :  %s\n",
-                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)),
-                                       GST_STR_NULL(GST_PAD_NAME(pad)),
-                                       GST_EVENT_TYPE_NAME(event));
+                                               GST_STR_NULL(GST_ELEMENT_NAME(parent)),
+                                               GST_STR_NULL(GST_PAD_NAME(pad)),
+                                               GST_EVENT_TYPE_NAME(event));
 
                if (GST_EVENT_TYPE(event) == GST_EVENT_SEGMENT) {
                        const GstSegment *segment = NULL;
@@ -153,7 +153,7 @@ mm_wfd_sink_util_add_pad_probe(GstPad *pad, GstElement *element, const gchar *pa
        if (probe_pad) {
                wfd_sink_debug("add pad(%s) probe", GST_STR_NULL(GST_PAD_NAME(probe_pad)));
                gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_DATA_BOTH,
-                                       _mm_wfd_sink_util_pad_probe_cb, (gpointer)NULL, NULL);
+                                                       _mm_wfd_sink_util_pad_probe_cb, (gpointer)NULL, NULL);
                gst_object_unref(probe_pad);
        }
 }
@@ -196,8 +196,8 @@ _mm_wfd_sink_util_check_first_buffer_cb(GstPad *pad, GstPadProbeInfo *info, gpoi
        buffer = gst_pad_probe_info_get_buffer(info);
 
        wfd_sink_debug("FIRST BUFFER PROBE : %s:%s :  %u:%02u:%02u.%09u (%"G_GSSIZE_FORMAT" bytes)\n",
-                               GST_STR_NULL(GST_ELEMENT_NAME(parent)), GST_STR_NULL(GST_PAD_NAME(pad)),
-                               GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)), gst_buffer_get_size(buffer));
+                                       GST_STR_NULL(GST_ELEMENT_NAME(parent)), GST_STR_NULL(GST_PAD_NAME(pad)),
+                                       GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)), gst_buffer_get_size(buffer));
 
        if (probe_id && *probe_id > 0) {
                wfd_sink_debug("remove buffer probe[%d]\n", *probe_id);
@@ -236,7 +236,7 @@ mm_wfd_sink_util_add_pad_probe_for_checking_first_buffer(GstPad *pad, GstElement
 
                *probe_id = gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_BUFFER, _mm_wfd_sink_util_check_first_buffer_cb, (gpointer)probe_id, NULL);
                wfd_sink_debug("add pad(%s) probe, %d",
-                                       GST_STR_NULL(GST_PAD_NAME(probe_pad)), *probe_id);
+                                               GST_STR_NULL(GST_PAD_NAME(probe_pad)), *probe_id);
 
                gst_object_unref(probe_pad);
        }