fix looping operation for evas surface and remove unused code 50/82950/6 accepted/tizen/common/20160811.145701 accepted/tizen/ivi/20160812.010640 accepted/tizen/mobile/20160812.010708 accepted/tizen/tv/20160812.010617 accepted/tizen/wearable/20160812.010552 submit/tizen/20160810.075454 submit/tizen/20160811.023523
authorNAMJEONGYOON <just.nam@samsung.com>
Mon, 8 Aug 2016 08:57:39 +0000 (17:57 +0900)
committerNAMJEONGYOON <just.nam@samsung.com>
Wed, 10 Aug 2016 05:34:44 +0000 (14:34 +0900)
1. when surface_type is evas, player will make videobin including fakesink.
2. it will make selector before making videobin.
3. remove unused callback

Change-Id: Id47485f7e823596080022489b51b7487d043b9d2

packaging/libmm-player.spec
src/include/mm_player.h
src/include/mm_player_priv.h
src/mm_player.c
src/mm_player_capture.c
src/mm_player_priv.c

index d68f44d..7f855be 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.5.92
+Version:    0.5.93
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 9fb1798..2ed7cc1 100644 (file)
@@ -2069,8 +2069,6 @@ int mm_player_set_next_uri(MMHandleType player, const char *uri);
  */
 int mm_player_get_next_uri(MMHandleType player, char **uri);
 
-int mm_player_enable_media_packet_video_stream(MMHandleType player, bool enable);
-
 /**
  * This function is to increase reference count of internal buffer.
  *
index 79f427a..ed8c96c 100644 (file)
@@ -544,7 +544,6 @@ typedef struct {
        /* video stream callback */
        mm_player_video_stream_callback video_stream_cb;
        void* video_stream_cb_user_param;
-       int use_video_stream;
        GCond video_bo_cond;
        GMutex video_bo_mutex;
        GList* video_bo_list; /* mm_player_video_bo_info_t, bo list for decoded video data by sw codec */
@@ -664,7 +663,6 @@ typedef struct {
        gboolean resumed_by_rewind;
 
        gboolean is_nv12_tiled;
-       gboolean is_drm_file;
 
        /* resource manager for H/W resources */
        MMPlayerResourceManager resource_manager;
@@ -857,7 +855,6 @@ int _mmplayer_set_uri(MMHandleType hplayer, const char* uri);
 int _mmplayer_set_next_uri(MMHandleType hplayer, const char* uri, bool is_first_path);
 int _mmplayer_get_next_uri(MMHandleType hplayer, char** uri);
 int _mmplayer_has_closed_caption(MMHandleType hplayer, bool* exist);
-int _mmplayer_enable_media_packet_video_stream(MMHandleType hplayer, bool enable);
 void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer);
 void _mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer);
 int _mmplayer_set_pcm_spec(MMHandleType hplayer, int samplerate, int channel);
index e1acd4c..9a4f776 100644 (file)
@@ -1012,22 +1012,6 @@ int mm_player_has_closed_caption(MMHandleType player, bool *exist)
        return result;
 }
 
-int mm_player_enable_media_packet_video_stream(MMHandleType player, bool enable)
-{
-       int result = MM_ERROR_NONE;
-
-       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-       MMPLAYER_RETURN_VAL_IF_FAIL(enable, MM_ERROR_INVALID_ARGUMENT);
-
-       MMPLAYER_CMD_LOCK( player );
-
-       result = _mmplayer_enable_media_packet_video_stream(player, enable);
-
-       MMPLAYER_CMD_UNLOCK( player );
-
-       return result;
-}
-
 void * mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
 {
        void * result;
index be80a75..170d284 100644 (file)
@@ -140,13 +140,6 @@ _mmplayer_do_video_capture(MMHandleType hplayer)
                }
        }
 
-       /* check if drm file */
-       if (player->is_drm_file)
-       {
-               LOGW("not supported in drm file");
-               return MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION;
-       }
-
        if (player->pipeline->videobin)
                pad = gst_element_get_static_pad(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "sink" );
        else // evas surface
index 7518f84..33456dd 100644 (file)
@@ -306,40 +306,6 @@ print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
 }
 #endif
 
-static void
-__mmplayer_videostream_cb(GstElement *element, void *data,
-int width, int height, gpointer user_data) // @
-{
-       mm_player_t* player = (mm_player_t*)user_data;
-
-       MMPLAYER_RETURN_IF_FAIL ( player );
-
-       MMPLAYER_FENTER();
-
-       if (player->is_drm_file)
-       {
-               MMMessageParamType msg_param = { 0, };
-               LOGW("not supported in drm file");
-               msg_param.code = MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION;
-               MMPLAYER_POST_MSG( player, MM_MESSAGE_ERROR, &msg_param );
-       }
-       else if ( !player->set_mode.media_packet_video_stream && player->video_stream_cb)
-       {
-               MMPlayerVideoStreamDataType stream;
-
-               /* clear stream data structure */
-               memset(&stream, 0x0, sizeof(MMPlayerVideoStreamDataType));
-
-               stream.data[0] = data;
-               stream.length_total = width * height * 4; // for rgb 32bit
-               stream.height = height;
-               stream.width = width;
-               player->video_stream_cb(&stream, player->video_stream_cb_user_param);
-       }
-
-       MMPLAYER_FLEAVE();
-}
-
 /* This function should be called after the pipeline goes PAUSED or higher
 state. */
 gboolean
@@ -1597,7 +1563,6 @@ __mmplayer_gst_callback(GstBus *bus, GstMessage *msg, gpointer data) // @
                                case GST_STATE_PAUSED:
                                {
                                        gboolean prepare_async = FALSE;
-                                       gboolean is_drm = FALSE;
 
                                        if ( ! player->audio_cb_probe_id && player->set_mode.pcm_extraction && !player->audio_stream_render_cb_ex)
                                                __mmplayer_configure_audio_callback(player);
@@ -1618,19 +1583,6 @@ __mmplayer_gst_callback(GstBus *bus, GstMessage *msg, gpointer data) // @
                                                                player->total_maximum_bitrate, player->total_bitrate);
                                                }
                                        }
-
-                                       /* NOTE : should consider streaming case */
-                                       /* check if drm file */
-                                       if ((player->pipeline->mainbin[MMPLAYER_M_SRC].gst) &&
-                                               (g_object_class_find_property(G_OBJECT_GET_CLASS(player->pipeline->mainbin[MMPLAYER_M_SRC].gst), "is-drm")))
-                                       {
-                                               g_object_get(G_OBJECT(player->pipeline->mainbin[MMPLAYER_M_SRC].gst), "is-drm", &is_drm, NULL);
-
-                                               if (is_drm)
-                                               {
-                                                       player->is_drm_file = TRUE;
-                                               }
-                                       }
                                }
                                break;
 
@@ -2741,7 +2693,7 @@ __mmplayer_gst_decode_pad_added (GstElement *elem, GstPad *pad, gpointer data)
                mm_attrs_get_int_by_name (player->attrs, "display_surface_type", &stype);
 
                /* don't make video because of not required, and not support multiple track */
-               if (stype == MM_DISPLAY_SURFACE_NULL || stype == MM_DISPLAY_SURFACE_REMOTE)
+               if (stype == MM_DISPLAY_SURFACE_NULL)
                {
                        LOGD ("no video sink by null surface or multiple track (%d)", stype);
                        MMPlayerResourceState resource_state = RESOURCE_STATE_NONE;
@@ -2749,7 +2701,7 @@ __mmplayer_gst_decode_pad_added (GstElement *elem, GstPad *pad, gpointer data)
                                        == MM_ERROR_NONE)
                        {
                                /* acquire resources for video playing */
-                               if (resource_state >= RESOURCE_STATE_PREPARED)
+                               if (resource_state == RESOURCE_STATE_PREPARED)
                                {
                                        if (_mmplayer_resource_manager_acquire(&player->resource_manager)
                                                        != MM_ERROR_NONE)
@@ -2918,12 +2870,8 @@ __mmplayer_gst_decode_pad_added (GstElement *elem, GstPad *pad, gpointer data)
 
                gst_element_set_state (selector, GST_STATE_PAUSED);
                gst_bin_add (GST_BIN(pipeline), selector);
-       }
-       else
-       {
+       } else
                LOGD ("input-selector is already created.\n");
-               selector = player->pipeline->mainbin[elemId].gst;
-       }
 
        // link
        LOGD ("Calling request pad with selector %p \n", selector);
@@ -3776,8 +3724,7 @@ __mmplayer_gst_decode_callback(GstElement *elem, GstPad *pad, gpointer data) //
                        mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &surface_type);
                        LOGD("display_surface_type (%d)\n", surface_type);
 
-                       if (surface_type == MM_DISPLAY_SURFACE_NULL || surface_type == MM_DISPLAY_SURFACE_REMOTE)
-                       {
+                       if (surface_type == MM_DISPLAY_SURFACE_NULL) {
                                LOGD("not make videobin because it dose not want\n");
                                goto ERROR;
                        }
@@ -3803,7 +3750,7 @@ __mmplayer_gst_decode_callback(GstElement *elem, GstPad *pad, gpointer data) //
                                == MM_ERROR_NONE)
                        {
                                /* acquire resources for video playing */
-                               if (resource_state >= RESOURCE_STATE_PREPARED)
+                               if (resource_state == RESOURCE_STATE_PREPARED)
                                {
                                        if (_mmplayer_resource_manager_acquire(&player->resource_manager)
                                                != MM_ERROR_NONE)
@@ -4511,70 +4458,6 @@ __mmplayer_update_evas_videosink_video_param(mm_player_t* player)
        return MM_ERROR_NONE;
 }
 
-void
-__mmplayer_update_video_stream_callback_video_param(mm_player_t* player)
-{
-       MMHandleType attrs = 0;
-       int org_angle = 0; // current supported angle values are 0, 90, 180, 270
-       int user_angle = 0;
-       int rotation_value = 0;
-       MMPLAYER_FENTER();
-
-       /* check video sinkbin is created */
-       if(MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
-               return;
-
-       attrs = MMPLAYER_GET_ATTRS(player);
-       MMPLAYER_RETURN_IF_FAIL (attrs);
-
-       __mmplayer_get_video_angle(player, &user_angle, &org_angle);
-
-       if (player->set_mode.video_zc)
-       {
-               gchar *ename = NULL;
-               int width = 0;
-               int height = 0;
-
-               mm_attrs_get_int_by_name(attrs, "display_width", &width);
-               mm_attrs_get_int_by_name(attrs, "display_height", &height);
-
-               /* resize video frame with requested values for fimcconvert */
-               MMPLAYER_RETURN_IF_FAIL (player->pipeline->videobin[MMPLAYER_V_CONV].gst);
-
-               ename = GST_OBJECT_NAME(gst_element_get_factory(player->pipeline->videobin[MMPLAYER_V_CONV].gst));
-
-               if (ename && g_strrstr(ename, "fimcconvert"))
-               {
-                       if (width)
-                               g_object_set(player->pipeline->videobin[MMPLAYER_V_CONV].gst, "dst-width", width, NULL);
-
-                       if (height)
-                               g_object_set(player->pipeline->videobin[MMPLAYER_V_CONV].gst, "dst-height", height, NULL);
-
-                       /* NOTE: fimcconvert does not manage index of src buffer from upstream src-plugin, decoder gives frame information in output buffer with no ordering */
-                       g_object_set(player->pipeline->videobin[MMPLAYER_V_CONV].gst, "src-rand-idx", TRUE, NULL);
-
-                       /* get rotation value to set */
-                       __mmplayer_get_property_value_for_rotation(player, org_angle+user_angle, &rotation_value);
-
-                       g_object_set(player->pipeline->videobin[MMPLAYER_V_CONV].gst, "rotate", rotation_value, NULL);
-
-                       LOGD("updating fimcconvert - r[%d], w[%d], h[%d]", rotation_value, width, height);
-               }
-       }
-       else
-       {
-               LOGD("using video stream callback with memsink. player handle : [%p]", player);
-               MMPLAYER_RETURN_IF_FAIL (player->pipeline->videobin[MMPLAYER_V_FLIP].gst);
-
-               /* get rotation value to set */
-               __mmplayer_get_property_value_for_rotation(player, org_angle+user_angle, &rotation_value);
-
-               g_object_set(player->pipeline->videobin[MMPLAYER_V_FLIP].gst, "method", rotation_value, NULL);
-       }
-
-}
-
 int
 _mmplayer_update_video_param(mm_player_t* player, char *param_name) // @
 {
@@ -4596,13 +4479,6 @@ _mmplayer_update_video_param(mm_player_t* player, char *param_name) // @
        }
        LOGD("param_name : %s", param_name);
 
-       /* check video stream callback is used */
-       if(!player->set_mode.media_packet_video_stream && player->use_video_stream )
-       {
-               __mmplayer_update_video_stream_callback_video_param(player);
-               return MM_ERROR_NONE;
-       }
-
        /* update display surface */
        mm_attrs_get_int_by_name(attrs, "display_surface_type", &surface_type);
        LOGD("check display surface type attribute: %d", surface_type);
@@ -5803,8 +5679,9 @@ __mmplayer_video_stream_probe (GstPad *pad, GstPadProbeInfo *info, gpointer user
 }
 
 static int
-__mmplayer_gst_create_video_filters(mm_player_t* player, GList** bucket, gboolean use_video_stream)
+__mmplayer_gst_create_video_filters(mm_player_t* player, GList** bucket)
 {
+       MMDisplaySurfaceType surface_type = MM_DISPLAY_SURFACE_NULL;
        gchar* video_csc = "videoconvert"; // default colorspace converter
        GList* element_bucket = *bucket;
 
@@ -5812,91 +5689,40 @@ __mmplayer_gst_create_video_filters(mm_player_t* player, GList** bucket, gboolea
 
        MMPLAYER_FENTER();
 
-       if (!player->set_mode.media_packet_video_stream && use_video_stream)
+       mm_attrs_get_int_by_name (player->attrs, "display_surface_type", (int *)&surface_type);
+
+       if (player->set_mode.video_zc) /* ST12 or SN12 , if player use omx, evasimagesink doesn't use videoconvert */
        {
-               if (player->set_mode.video_zc && strlen(player->ini.videoconverter_element) > 0)
+               if ( (surface_type == MM_DISPLAY_SURFACE_EVAS) && ( !strcmp(player->ini.videosink_element_evas, "evasimagesink")) )
                {
                        video_csc = player->ini.videoconverter_element;
                }
-
-               MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_CONV, video_csc, "video converter", TRUE, player);
-               LOGD("using video converter: %s", video_csc);
-
-               if ( !player->set_mode.video_zc)
+               else
                {
-                       gint width = 0;         //width of video
-                       gint height = 0;                //height of video
-                       GstCaps* video_caps = NULL;
-                       GstStructure *structure = NULL;
-
-                       /* rotator, scaler and capsfilter */
-                       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_FLIP, "videoflip", "video rotator", TRUE, player);
-                       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_SCALE, "videoscale", "video scaler", TRUE, player);
-                       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_CAPS, "capsfilter", "videocapsfilter", TRUE, player);
-
-                       /* get video stream caps parsed by demuxer */
-
-                       mm_attrs_get_int_by_name(player->attrs, "display_width", &width);
-
-                       if(width)
-                               structure = gst_structure_new("video/x-raw", "width", G_TYPE_INT, width, NULL);
-
-                       mm_attrs_get_int_by_name(player->attrs, "display_height", &height);
-
-                       if(structure && height) {
-                               gst_structure_set (structure, "height", G_TYPE_INT, height, NULL);
-
-                               video_caps = gst_caps_new_full(structure, NULL);
-                               g_object_set (GST_ELEMENT(player->pipeline->videobin[MMPLAYER_V_CAPS].gst), "caps", video_caps, NULL );
-                               MMPLAYER_LOG_GST_CAPS_TYPE(video_caps);
-                               gst_caps_unref(video_caps);
-                       }
-                       else
-                               LOGE("fail to set capsfilter %p, width %d, height %d", structure, width, height);
-
-                       if(structure)
-                               gst_structure_free(structure);
-
+                       video_csc = ""; /* Videosinks don't use videoconvert except evasimagesink which use  normal video formats */
                }
        }
-       else
+       else /* sw codec, if player use libav,  waylandsink need videoconvert  to render shm wl-buffer which support RGB only */
        {
-               MMDisplaySurfaceType surface_type = MM_DISPLAY_SURFACE_NULL;
-               mm_attrs_get_int_by_name (player->attrs, "display_surface_type", (int *)&surface_type);
-
-               if (player->set_mode.video_zc) /* ST12 or SN12 , if player use omx, evasimagesink doesn't use videoconvert */
-               {
-                       if ( (surface_type == MM_DISPLAY_SURFACE_EVAS) && ( !strcmp(player->ini.videosink_element_evas, "evasimagesink")) )
-                       {
-                               video_csc = player->ini.videoconverter_element;
-                       }
-                       else
-                       {
-                               video_csc = ""; /* Videosinks don't use videoconvert except evasimagesink which use  normal video formats */
-                       }
-               }
-               else /* sw codec, if player use libav,  waylandsink need videoconvert  to render shm wl-buffer which support RGB only */
-               {
-                       if ((surface_type == MM_DISPLAY_SURFACE_OVERLAY) && (!strncmp(player->ini.videosink_element_overlay, "waylandsink", strlen(player->ini.videosink_element_overlay))))
-                       {
-                               video_csc = "videoconvert";
-                       }
-               }
-               if (video_csc && (strcmp(video_csc, "")))
+               if ((surface_type == MM_DISPLAY_SURFACE_OVERLAY) && (!strncmp(player->ini.videosink_element_overlay, "waylandsink", strlen(player->ini.videosink_element_overlay))))
                {
-                       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_CONV, video_csc, "video converter", TRUE, player);
-                       LOGD("using video converter: %s", video_csc);
+                       video_csc = "videoconvert";
                }
+       }
+       if (video_csc && (strcmp(video_csc, "")))
+       {
+               MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_CONV, video_csc, "video converter", TRUE, player);
+               LOGD("using video converter: %s", video_csc);
+       }
 
-               /* set video rotator */
-               if ( !player->set_mode.video_zc )
-                       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_FLIP, "videoflip", "video rotator", TRUE, player);
+       /* set video rotator */
+       if ( !player->set_mode.video_zc )
+               MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_FLIP, "videoflip", "video rotator", TRUE, player);
 
-               /* videoscaler */
-               #if !defined(__arm__)
-               MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_SCALE, "videoscale", "videoscaler", TRUE, player);
-               #endif
-       }
+       /* videoscaler */
+       #if !defined(__arm__)
+       MMPLAYER_CREATE_ELEMENT(player->pipeline->videobin, MMPLAYER_V_SCALE, "videoscale", "videoscaler", TRUE, player);
+       #endif
 
        *bucket = element_bucket;
        MMPLAYER_FLEAVE();
@@ -5965,102 +5791,92 @@ __mmplayer_gst_create_video_pipeline(mm_player_t* player, GstCaps* caps, MMDispl
                goto ERROR;
        }
 
-       if( player->use_video_stream ) // video stream callback, so send raw video data to application
-       {
-               LOGD("using memsink\n");
-
-               if ( __mmplayer_gst_create_video_filters(player, &element_bucket, TRUE) != MM_ERROR_NONE)
+       if (!player->set_mode.media_packet_video_stream) {
+               if (__mmplayer_gst_create_video_filters(player, &element_bucket) != MM_ERROR_NONE)
                        goto ERROR;
-
-               /* finally, create video sink. output will be BGRA8888. */
-               MMPLAYER_CREATE_ELEMENT(videobin, MMPLAYER_V_SINK, "avsysmemsink", "videosink", TRUE, player);
-
-               MMPLAYER_SIGNAL_CONNECT( player,
-                                                                        videobin[MMPLAYER_V_SINK].gst,
-                                                                        MM_PLAYER_SIGNAL_TYPE_VIDEOBIN,
-                                                                        "video-stream",
-                                                                        G_CALLBACK(__mmplayer_videostream_cb),
-                                                                        player );
        }
-       else // render video data using sink plugin like xvimagesink
-       {
-               if ( __mmplayer_gst_create_video_filters(player, &element_bucket, FALSE) != MM_ERROR_NONE)
-                       goto ERROR;
 
-               /* set video sink */
-               switch (surface_type)
-               {
-                       case MM_DISPLAY_SURFACE_OVERLAY:
-                               if (strlen(player->ini.videosink_element_overlay) > 0)
-                                       videosink_element = player->ini.videosink_element_overlay;
-                               else
-                                       goto ERROR;
-                               break;
-                       case MM_DISPLAY_SURFACE_EVAS:
-                               if (strlen(player->ini.videosink_element_evas) > 0)
-                                       videosink_element = player->ini.videosink_element_evas;
-                               else
-                                       goto ERROR;
-                               break;
-                       case MM_DISPLAY_SURFACE_NULL:
-                               if (strlen(player->ini.videosink_element_fake) > 0)
-                                       videosink_element = player->ini.videosink_element_fake;
-                               else
-                                       goto ERROR;
-                               break;
-                       case MM_DISPLAY_SURFACE_REMOTE:
-                               if (strlen(player->ini.videosink_element_fake) > 0)
-                                       videosink_element = player->ini.videosink_element_fake;
-                               else
-                                       goto ERROR;
-                               break;
-                       default:
-                               LOGE("unidentified surface type");
+       /* set video sink */
+       switch (surface_type)
+       {
+               case MM_DISPLAY_SURFACE_OVERLAY:
+                       if (strlen(player->ini.videosink_element_overlay) > 0)
+                               videosink_element = player->ini.videosink_element_overlay;
+                       else
                                goto ERROR;
-               }
+                       break;
+               case MM_DISPLAY_SURFACE_EVAS:
+                       if (strlen(player->ini.videosink_element_evas) > 0)
+                               videosink_element = player->ini.videosink_element_evas;
+                       else
+                               goto ERROR;
+                       break;
+               case MM_DISPLAY_SURFACE_NULL:
+                       if (strlen(player->ini.videosink_element_fake) > 0)
+                               videosink_element = player->ini.videosink_element_fake;
+                       else
+                               goto ERROR;
+                       break;
+               case MM_DISPLAY_SURFACE_REMOTE:
+                       if (strlen(player->ini.videosink_element_fake) > 0)
+                               videosink_element = player->ini.videosink_element_fake;
+                       else
+                               goto ERROR;
+                       break;
+               default:
+                       LOGE("unidentified surface type");
+                       goto ERROR;
+       }
+       LOGD("selected videosink name: %s", videosink_element);
 
-               MMPLAYER_CREATE_ELEMENT(videobin, MMPLAYER_V_SINK, videosink_element, videosink_element, TRUE, player);
-               LOGD("selected videosink name: %s", videosink_element);
+       MMPLAYER_CREATE_ELEMENT(videobin, MMPLAYER_V_SINK, videosink_element, videosink_element, TRUE, player);
 
-               /* additional setting for sink plug-in */
-               switch (surface_type) {
-                       case MM_DISPLAY_SURFACE_OVERLAY:
+       /* additional setting for sink plug-in */
+       switch (surface_type) {
+               case MM_DISPLAY_SURFACE_OVERLAY:
+               {
+                       bool use_tbm = player->set_mode.video_zc;
+                       if (!use_tbm)
                        {
-                               bool use_tbm = player->set_mode.video_zc;
-                               if (!use_tbm)
-                               {
-                                       LOGD("selected videosink name: %s", videosink_element);
+                               LOGD("selected videosink name: %s", videosink_element);
 
-                                       /* support shard memory with S/W codec on HawkP */
-                                       if(strncmp(videosink_element, "waylandsink", strlen(videosink_element)) == 0)
-                                       {
-                                               g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst,
-                                                       "use-tbm", use_tbm, NULL);
-                                       }
+                               /* support shard memory with S/W codec on HawkP */
+                               if(strncmp(videosink_element, "waylandsink", strlen(videosink_element)) == 0)
+                               {
+                                       g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst,
+                                               "use-tbm", use_tbm, NULL);
                                }
-                               else
+                       }
+                       else
+                       {
+                               if (attrs)
                                {
-                                       if (attrs)
-                                       {
-                                               int gapless = 0;
+                                       int gapless = 0;
 
-                                               mm_attrs_get_int_by_name (attrs, "gapless_mode", &gapless);
+                                       mm_attrs_get_int_by_name (attrs, "gapless_mode", &gapless);
 
-                                               if (gapless > 0) {
-                                                       LOGD("disable last-sample");
-                                                       g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "enable-last-sample", FALSE, NULL);
-                                               }
+                                       if (gapless > 0) {
+                                               LOGD("disable last-sample");
+                                               g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "enable-last-sample", FALSE, NULL);
                                        }
                                }
-                               break;
-            }
-                       case MM_DISPLAY_SURFACE_REMOTE:
-                       {
-                               break;
                        }
-                       default:
-                               break;
+                       break;
+        }
+               case MM_DISPLAY_SURFACE_REMOTE:
+               {
+                       if (player->set_mode.media_packet_video_stream) {
+                               GstPad* sinkpad = NULL;
+                               sinkpad = gst_element_get_static_pad (player->pipeline->videobin[MMPLAYER_V_SINK].gst, "sink");
+                               g_object_set (player->pipeline->videobin[MMPLAYER_V_SINK].gst, "sync", TRUE, NULL);
+
+                               LOGE("add data probe at videosink");
+                               player->video_cb_probe_id = gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_BUFFER, __mmplayer_video_stream_probe, player, NULL);
+                       }
+                       break;
                }
+               default:
+                       break;
        }
 
        if (_mmplayer_update_video_param(player, "update_all_param") != MM_ERROR_NONE)
@@ -10426,10 +10242,14 @@ _mmplayer_set_videostream_cb(MMHandleType hplayer, mm_player_video_stream_callba
 
        MMPLAYER_RETURN_VAL_IF_FAIL ( player, MM_ERROR_PLAYER_NOT_INITIALIZED );
 
+       if (callback && !player->bufmgr)
+               player->bufmgr = tbm_bufmgr_init(-1);
+
+       player->set_mode.media_packet_video_stream = (callback)?TRUE:FALSE;
        player->video_stream_cb = callback;
        player->video_stream_cb_user_param = user_param;
-       player->use_video_stream = TRUE;
-       LOGD("Stream cb Handle value is %p : %p\n", player, player->video_stream_cb);
+
+       LOGD("Stream cb Handle value is %p : %p, enable:%d\n", player, player->video_stream_cb, player->set_mode.media_packet_video_stream);
 
        MMPLAYER_FLEAVE();
 
@@ -12377,7 +12197,6 @@ __mmplayer_initialize_next_play(mm_player_t *player)
        player->msg_posted = FALSE;
        player->has_many_types = FALSE;
        player->no_more_pad = FALSE;
-       player->is_drm_file = FALSE;
        player->not_found_demuxer = 0;
        player->doing_seek = FALSE;
        player->max_audio_channels = 0;
@@ -13164,15 +12983,12 @@ GstCaps* caps, GstElementFactory* factory, gpointer data)
                mm_attrs_get_int_by_name (player->attrs, "display_surface_type", &stype);
 
                /* don't make video because of not required */
-               if (stype == MM_DISPLAY_SURFACE_NULL || stype == MM_DISPLAY_SURFACE_REMOTE)
+               if ((stype == MM_DISPLAY_SURFACE_NULL) &&
+                       (player->set_mode.media_packet_video_stream == FALSE))
                {
-                       if (player->set_mode.media_packet_video_stream == FALSE
-                               && !player->video_stream_cb)
-                       {
-                               LOGD ("no video because it's not required. -> return expose");
-                               result = GST_AUTOPLUG_SELECT_EXPOSE;
-                               goto DONE;
-                       }
+                       LOGD ("no video because it's not required. -> return expose");
+                       result = GST_AUTOPLUG_SELECT_EXPOSE;
+                       goto DONE;
                }
 
                /* get w/h for omx state-tune */
@@ -13491,7 +13307,6 @@ __mmplayer_release_misc(mm_player_t* player)
 
        MMPLAYER_RETURN_IF_FAIL ( player );
 
-       player->use_video_stream = FALSE;
        player->video_stream_cb = NULL;
        player->video_stream_cb_user_param = NULL;
 
@@ -13528,7 +13343,6 @@ __mmplayer_release_misc(mm_player_t* player)
        player->pending_seek.pos = 0;
        player->msg_posted = FALSE;
        player->has_many_types = FALSE;
-       player->is_drm_file = FALSE;
        player->max_audio_channels = 0;
        player->video_share_api_delta = 0;
        player->video_share_clock_delta = 0;
@@ -14519,28 +14333,23 @@ static gboolean
 __mmplayer_can_extract_pcm( mm_player_t* player )
 {
        MMHandleType attrs = 0;
-       gboolean is_drm = FALSE;
        gboolean sound_extraction = FALSE;
 
        MMPLAYER_RETURN_VAL_IF_FAIL ( player, FALSE );
 
        attrs = MMPLAYER_GET_ATTRS(player);
-       if ( !attrs )
+       if (!attrs)
        {
                LOGE("fail to get attributes.");
                return FALSE;
        }
 
-       /* check file is drm or not */
-       if (g_object_class_find_property(G_OBJECT_GET_CLASS(player->pipeline->mainbin[MMPLAYER_M_SRC].gst), "is-drm"))
-               g_object_get(G_OBJECT(player->pipeline->mainbin[MMPLAYER_M_SRC].gst), "is-drm", &is_drm, NULL);
-
        /* get sound_extraction property */
        mm_attrs_get_int_by_name(attrs, "pcm_extraction", &sound_extraction);
 
-       if ( ! sound_extraction || is_drm )
+       if (!sound_extraction)
        {
-               LOGD("checking pcm extraction mode : %d, drm : %d", sound_extraction, is_drm);
+               LOGD("checking pcm extraction mode : %d ", sound_extraction);
                return FALSE;
        }
 
@@ -16660,24 +16469,6 @@ _mmplayer_has_closed_caption(MMHandleType hplayer, bool* exist)
        return MM_ERROR_NONE;
 }
 
-int
-_mmplayer_enable_media_packet_video_stream(MMHandleType hplayer, bool enable)
-{
-       mm_player_t* player = (mm_player_t*) hplayer;
-
-       MMPLAYER_FENTER();
-       MMPLAYER_RETURN_VAL_IF_FAIL (player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-
-       if (enable && !player->bufmgr)
-               player->bufmgr = tbm_bufmgr_init(-1);
-
-       player->set_mode.media_packet_video_stream = enable;
-
-       MMPLAYER_FLEAVE();
-
-       return MM_ERROR_NONE;
-}
-
 void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
 {
        void * ret = NULL