From fde7937c1d17a6930ef3463e6649474ad836034c Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Wed, 27 Sep 2017 22:11:52 +0900 Subject: [PATCH] [0.6.70] modify video stream cb 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 | 2 +- src/include/mm_player.h | 10 +-- src/include/mm_player_priv.h | 3 +- src/mm_player.c | 12 +--- src/mm_player_priv.c | 152 +++++++++++++++++++++++++------------------ 5 files changed, 94 insertions(+), 85 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index eede030..176e334 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -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 diff --git a/src/include/mm_player.h b/src/include/mm_player.h index 00902cb..a2f09c3 100644 --- a/src/include/mm_player.h +++ b/src/include/mm_player.h @@ -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 diff --git a/src/include/mm_player_priv.h b/src/include/mm_player_priv.h index 51aafe8..36e70d8 100644 --- a/src/include/mm_player_priv.h +++ b/src/include/mm_player_priv.h @@ -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); diff --git a/src/mm_player.c b/src/mm_player.c index 3fe4b30..8048148 100644 --- a/src/mm_player.c +++ b/src/mm_player.c @@ -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) diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 5579042..1b02b62 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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; } -- 2.7.4