[0.6.70] modify video stream cb 05/153005/2
authorEunhae Choi <eunhae1.choi@samsung.com>
Wed, 27 Sep 2017 13:11:52 +0000 (22:11 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Wed, 27 Sep 2017 13:19:41 +0000 (22:19 +0900)
export allocated mem which has vide stream data
it will be delivered to proxy and will be return after finishing rendering.
mmsvc-player do not need to create tbm surface and media packet anymore.

Change-Id: I1d64e4ce14443a717defce5bdff8698c16f0dacd

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

index eede030..176e334 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.69
+Version:    0.6.70
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 00902cb..a2f09c3 100644 (file)
@@ -1914,20 +1914,12 @@ int mm_player_set_next_uri(MMHandleType player, const char *uri);
 int mm_player_get_next_uri(MMHandleType player, char **uri);
 
 /**
- * This function is to increase reference count of internal buffer.
- *
- * @param   buffer [in] video callback internal buffer
- * @return  This function returns buffer point;
- */
-void * mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer);
-
-/**
  * This function is to decrease reference count of internal buffer.
  *
  * @param    buffer [in] video callback internal buffer
  * @return   None;
  */
-void mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer);
+void mm_player_video_stream_internal_buffer_unref(void *buffer);
 
 /**mm_player_submit_packet
  * This function is to submit buffer to appsrc.  \n
index 51aafe8..36e70d8 100644 (file)
@@ -851,8 +851,7 @@ 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);
-void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer);
-void _mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer);
+void _mm_player_video_stream_internal_buffer_unref(void *buffer);
 int _mmplayer_set_pcm_spec(MMHandleType hplayer, int samplerate, int channel);
 int _mmplayer_get_timeout(MMHandleType hplayer, int *timeout);
 int _mmplayer_get_num_of_video_out_buffers(MMHandleType hplayer, int *num, int *extra_num);
index 3fe4b30..8048148 100644 (file)
@@ -917,17 +917,9 @@ int mm_player_has_closed_caption(MMHandleType player, bool *exist)
        return result;
 }
 
-void * mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
+void mm_player_video_stream_internal_buffer_unref(void *buffer)
 {
-       void * result;
-       result = _mm_player_media_packet_video_stream_internal_buffer_ref(buffer);
-
-       return result;
-}
-
-void mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer)
-{
-       _mm_player_media_packet_video_stream_internal_buffer_unref(buffer);
+       _mm_player_video_stream_internal_buffer_unref(buffer);
 }
 
 int mm_player_submit_packet(MMHandleType player, media_packet_h packet)
index 5579042..1b02b62 100644 (file)
@@ -4767,6 +4767,7 @@ int _mmplayer_video_stream_release_bo(mm_player_t* player, void* bo)
                        if (tmp && tmp->bo == bo) {
                                tmp->using = FALSE;
                                LOGD("release bo %p", bo);
+                               tbm_bo_unref(tmp->bo);
                                MMPLAYER_VIDEO_BO_UNLOCK(player);
                                MMPLAYER_VIDEO_BO_SIGNAL(player);
                                return ret;
@@ -4877,7 +4878,7 @@ __mmplayer_video_stream_get_bo(mm_player_t* player, int size)
                                LOGD("found bo %p to use", tmp->bo);
                                tmp->using = TRUE;
                                MMPLAYER_VIDEO_BO_UNLOCK(player);
-                               return tmp->bo;
+                               return tbm_bo_ref(tmp->bo);
                        }
                }
                if (!ret) {
@@ -4917,7 +4918,7 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
 {
        mm_player_t* player = (mm_player_t*)data;
        GstCaps *caps = NULL;
-       MMPlayerVideoStreamDataType stream;
+       MMPlayerVideoStreamDataType *stream = NULL;
        MMVideoBuffer *video_buffer = NULL;
        GstMemory *dataBlock = NULL;
        GstMemory *metaBlock = NULL;
@@ -4944,15 +4945,19 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
        /* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */
 
        /* clear stream data structure */
-       memset(&stream, 0x0, sizeof(MMPlayerVideoStreamDataType));
+       stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType));
+       if (!stream) {
+               LOGE("failed to alloc mem for video data");
+               return;
+       }
 
        structure = gst_caps_get_structure(caps, 0);
-       gst_structure_get_int(structure, "width", & (stream.width));
-       gst_structure_get_int(structure, "height", & (stream.height));
+       gst_structure_get_int(structure, "width", &(stream->width));
+       gst_structure_get_int(structure, "height", &(stream->height));
        string_format = gst_structure_get_string(structure, "format");
        if (string_format)
                fourcc = _mmplayer_convert_fourcc_string_to_value(string_format);
-       stream.format = util_get_pixtype(fourcc);
+       stream->format = util_get_pixtype(fourcc);
        gst_caps_unref(caps);
        caps = NULL;
 
@@ -4961,15 +4966,15 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
                GST_BUFFER_DATA(buffer), stream.width, stream.height, stream.format);
     */
 
-       if (stream.width == 0 || stream.height == 0 || stream.format == MM_PIXEL_FORMAT_INVALID) {
+       if (stream->width == 0 || stream->height == 0 || stream->format == MM_PIXEL_FORMAT_INVALID) {
                LOGE("Wrong condition!!");
-               return;
+               goto ERROR;
        }
 
        /* set size and timestamp */
        dataBlock = gst_buffer_peek_memory(buffer, 0);
-       stream.length_total = gst_memory_get_sizes(dataBlock, NULL, NULL);
-       stream.timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/1000000); /* nano sec -> mili sec */
+       stream->length_total = gst_memory_get_sizes(dataBlock, NULL, NULL);
+       stream->timestamp = (unsigned int)(GST_BUFFER_PTS(buffer)/1000000); /* nano sec -> mili sec */
 
        /* check zero-copy */
        if (player->set_mode.video_zc &&
@@ -4983,64 +4988,74 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
        if (video_buffer) { /* hw codec */
                /* set tbm bo */
                if (video_buffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
+                       int i = 0;
+
                        /* copy pointer of tbm bo, stride, elevation */
-                       memcpy(stream.bo, video_buffer->handle.bo,
-                                       sizeof(void *) * MM_VIDEO_BUFFER_PLANE_MAX);
-               } else if (video_buffer->type == MM_VIDEO_BUFFER_TYPE_PHYSICAL_ADDRESS) {
-                       /* FIXME: need to check this path */
-                       memcpy(stream.data, video_buffer->data,
-                                       sizeof(void *) * MM_VIDEO_BUFFER_PLANE_MAX);
-               }
-               memcpy(stream.stride, video_buffer->stride_width,
+                       for (i = 0 ; i < MM_VIDEO_BUFFER_PLANE_MAX ; i++) {
+                               stream->bo[i] = tbm_bo_ref(video_buffer->handle.bo[i]);
+                       }
+               } else {
+                       LOGE("Not support video buffer format");
+                       goto ERROR;
+               }
+               memcpy(stream->stride, video_buffer->stride_width,
                                sizeof(int) * MM_VIDEO_BUFFER_PLANE_MAX);
-               memcpy(stream.elevation, video_buffer->stride_height,
+               memcpy(stream->elevation, video_buffer->stride_height,
                                sizeof(int) * MM_VIDEO_BUFFER_PLANE_MAX);
-               /* set gst buffer */
-               stream.internal_buffer = buffer;
+
+               /* will be released, by calling _mm_player_video_stream_internal_buffer_unref() */
+               stream->internal_buffer = gst_buffer_ref(buffer);
        } else { /* sw codec */
                tbm_bo_handle thandle;
-               int stride = GST_ROUND_UP_4(stream.width);
-               int elevation = stream.height;
+               int stride = GST_ROUND_UP_4(stream->width);
+               int elevation = stream->height;
                int size = 0;
 
                gboolean gst_ret;
                gst_ret = gst_memory_map(dataBlock, &mapinfo, GST_MAP_READWRITE);
                if (!gst_ret) {
                        LOGE("fail to gst_memory_map");
-                       return;
+                       goto ERROR;
                }
 
-               stream.stride[0] = stride;
-               stream.elevation[0] = elevation;
-               if (stream.format == MM_PIXEL_FORMAT_I420) {
-                       stream.stride[1] = stream.stride[2] = GST_ROUND_UP_4(GST_ROUND_UP_2(stream.width) / 2);
-                       stream.elevation[1] = stream.elevation[2] = stream.height / 2;
-                       size = stream.stride[0] * stream.elevation[0] + stream.stride[1] * stream.elevation[1] + stream.stride[2] * stream.elevation[2];
-               } else if (stream.format == MM_PIXEL_FORMAT_RGBA) {
-                       stream.stride[0] = stream.width * 4;
-                       size = stream.stride[0] * stream.height;
+               stream->stride[0] = stride;
+               stream->elevation[0] = elevation;
+               if (stream->format == MM_PIXEL_FORMAT_I420) {
+                       stream->stride[1] = stream->stride[2] = GST_ROUND_UP_4(GST_ROUND_UP_2(stream->width) / 2);
+                       stream->elevation[1] = stream->elevation[2] = stream->height / 2;
+                       size = stream->stride[0] * stream->elevation[0] + stream->stride[1] * stream->elevation[1] + stream->stride[2] * stream->elevation[2];
+               } else if (stream->format == MM_PIXEL_FORMAT_RGBA) {
+                       stream->stride[0] = stream->width * 4;
+                       size = stream->stride[0] * stream->height;
                } else {
-                       LOGE("Not support format %d", stream.format);
-                       gst_memory_unmap(dataBlock, &mapinfo);
-                       return;
+                       LOGE("Not support format %d", stream->format);
+                       goto ERROR;
                }
-               stream.bo[0] = __mmplayer_video_stream_get_bo(player, size);
-               if (!stream.bo[0]) {
+               stream->bo[0] = __mmplayer_video_stream_get_bo(player, size);
+               if (!stream->bo[0]) {
                        LOGE("Fail to tbm_bo_alloc!!");
-                       gst_memory_unmap(dataBlock, &mapinfo);
-                       return;
+                       goto ERROR;
                }
-               thandle = tbm_bo_map(stream.bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
-               if (thandle.ptr && mapinfo.data)
+
+               thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
+
+               /* copy the video data to bo, so don't need to ref the buffer */
+               if (thandle.ptr && mapinfo.data) {
                        memcpy(thandle.ptr, mapinfo.data, size);
-               else
-                       LOGE("data pointer is wrong. dest : %p, src : %p",
-                                       thandle.ptr, mapinfo.data);
-               tbm_bo_unmap(stream.bo[0]);
+                       tbm_bo_unmap(stream->bo[0]);
+               } else {
+                       LOGE("data pointer is wrong. dest : %p, src : %p", thandle.ptr, mapinfo.data);
+                       tbm_bo_unmap(stream->bo[0]);
+                       goto ERROR;
+               }
        }
 
-       if (player->video_stream_cb)
-               player->video_stream_cb(&stream, player->video_stream_cb_user_param);
+       if (player->video_stream_cb) {
+               if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) {
+                       LOGE("failed to send video stream data.");
+                       goto ERROR;
+               }
+       }
 
        if (metaBlock)
                gst_memory_unmap(metaBlock, &mapinfo);
@@ -5048,6 +5063,28 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
                gst_memory_unmap(dataBlock, &mapinfo);
 
        return;
+
+ERROR:
+       LOGE("release video stream resource.");
+       if (metaBlock) {
+               int i = 0;
+               for (i = 0 ; i < MM_VIDEO_BUFFER_PLANE_MAX ; i++) {
+                       if (stream->bo[i])
+                               tbm_bo_unref(stream->bo[i]);
+               }
+               gst_memory_unmap(metaBlock, &mapinfo);
+
+               /* unref gst buffer */
+               if (stream->internal_buffer)
+                       gst_buffer_unref(stream->internal_buffer);
+       } else if (dataBlock) {
+               if (stream->bo[0])
+                       _mmplayer_video_stream_release_bo(player, stream->bo[0]);
+               gst_memory_unmap(dataBlock, &mapinfo);
+       }
+
+       g_free(stream);
+       return;
 }
 
 static int
@@ -5168,7 +5205,7 @@ __mmplayer_gst_create_video_pipeline(mm_player_t* player, GstCaps* caps, MMDispl
                LOGE("unidentified surface type");
                goto ERROR;
        }
-       LOGD("selected videosink name: %s", videosink_element);
+       LOGD("surface_type %d, selected videosink name: %s", surface_type, videosink_element);
 
        MMPLAYER_CREATE_ELEMENT(videobin, MMPLAYER_V_SINK, videosink_element, videosink_element, TRUE, player);
 
@@ -11561,7 +11598,7 @@ static void
 __mmplayer_release_misc(mm_player_t* player)
 {
        int i;
-       gboolean cur_mode = player->set_mode.rich_audio;
+       bool cur_mode = player->set_mode.rich_audio;
        MMPLAYER_FENTER();
 
        MMPLAYER_RETURN_IF_FAIL(player);
@@ -13499,22 +13536,11 @@ _mmplayer_has_closed_caption(MMHandleType hplayer, bool* exist)
        return MM_ERROR_NONE;
 }
 
-void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
-{
-       void * ret = NULL
-       MMPLAYER_FENTER();
-       /* increase ref count of gst buffer */
-       if (buffer)
-               ret = gst_buffer_ref((GstBuffer *)buffer);
-
-       MMPLAYER_FLEAVE();
-       return ret;
-}
-
-void _mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer)
+void _mm_player_video_stream_internal_buffer_unref(void *buffer)
 {
        MMPLAYER_FENTER();
        if (buffer) {
+               // LOGD("unref internal gst buffer %p", buffer);
                gst_buffer_unref((GstBuffer *)buffer);
                buffer = NULL;
        }