From: Gilbok Lee Date: Mon, 5 Nov 2018 07:28:47 +0000 (+0900) Subject: [0.6.139] resolve complexity issue X-Git-Tag: submit/tizen/20181109.060212~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b34ee0d2afba3f62b49d342abb013c62a2a1949;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.139] resolve complexity issue - resolve the cyclomatic complexity issue of below function __mmplayer_video_stream_decoded_render_cb Change-Id: I36b82026a7d2cad1c76ad4a506cf68564313ba4f --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index cf42747..9764461 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.138 +Version: 0.6.139 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player.h b/src/include/mm_player.h index b941138..4f5d32c 100644 --- a/src/include/mm_player.h +++ b/src/include/mm_player.h @@ -267,6 +267,7 @@ typedef struct { int stride[BUFFER_MAX_PLANE_NUM]; /**< stride of plane */ int elevation[BUFFER_MAX_PLANE_NUM]; /**< elevation of plane */ int orientation; /**< orientation */ + int bo_size; /**< TBM buffer object size */ } MMPlayerVideoStreamDataType; /** diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index c000d2d..e1324f0 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -200,6 +200,11 @@ static int __resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_ static void __mmplayer_copy_uri_and_set_type(MMPlayerParseProfile* data, const char *uri, int uri_type); static int __mmplayer_set_mem_uri(MMPlayerParseProfile* data, char *path, void *param); static int __mmplayer_set_file_uri(MMPlayerParseProfile* data, const char *uri); + +static MMPlayerVideoStreamDataType* __mmplayer_create_stream_from_pad(GstPad *pad); +static void __mmplayer_zerocopy_set_stride_elevation_bo(MMPlayerVideoStreamDataType *stream, GstMemory *mem); +static gboolean __mmplayer_swcodec_set_stride_elevation(MMPlayerVideoStreamDataType *stream); +static gboolean __mmplayer_swcodec_set_bo(mm_player_t *player, MMPlayerVideoStreamDataType *stream, GstMemory *mem); /*=========================================================================================== | | | FUNCTION DEFINITIONS | @@ -3724,19 +3729,12 @@ static void __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer, GstPad *pad, gpointer data) { mm_player_t* player = (mm_player_t*)data; - GstCaps *caps = NULL; MMPlayerVideoStreamDataType *stream = NULL; - tbm_surface_h surface; GstMemory *mem = NULL; - GstMapInfo mapinfo = GST_MAP_INFO_INIT; - GstStructure *structure = NULL; - const gchar *string_format = NULL; - unsigned int fourcc = 0; - unsigned int pitch = 0; - int index = 0; MMPLAYER_FENTER(); - MMPLAYER_RETURN_IF_FAIL(player && player->video_stream_cb); + MMPLAYER_RETURN_IF_FAIL(player); + MMPLAYER_RETURN_IF_FAIL(player->video_stream_cb); if (player->video_stream_prerolled) { player->video_stream_prerolled = FALSE; @@ -3744,154 +3742,38 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer, return; } - caps = gst_pad_get_current_caps(pad); - if (caps == NULL) { - LOGE("Caps is NULL."); - return; - } - - /* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */ - /* clear stream data structure */ - stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType)); + stream = __mmplayer_create_stream_from_pad(pad); if (!stream) { - LOGE("failed to alloc mem for video data"); + LOGE("failed to alloc stream"); return; } - structure = gst_caps_get_structure(caps, 0); - 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); - gst_caps_unref(caps); - caps = NULL; - __mmplayer_get_video_angle(player, NULL, &stream->orientation); - /* - LOGD("Call video steramCb, data[%p], Width[%d],Height[%d], Format[%d]", - GST_BUFFER_DATA(buffer), stream.width, stream.height, stream.format); - */ - - if (stream->width == 0 || stream->height == 0 || stream->format == MM_PIXEL_FORMAT_INVALID) { - LOGE("Wrong condition!!"); - goto ERROR; - } - /* set size and timestamp */ mem = gst_buffer_peek_memory(buffer, 0); stream->length_total = gst_memory_get_sizes(mem, NULL, NULL); stream->timestamp = (unsigned int)(GST_TIME_AS_MSECONDS(GST_BUFFER_PTS(buffer))); /* nano sec -> mili sec */ - surface = gst_tizen_memory_get_surface(mem); /* check zero-copy */ if (player->set_mode.video_zc && player->set_mode.media_packet_video_stream && gst_is_tizen_memory(mem)) { - for (index = 0; index < gst_tizen_memory_get_num_bos(mem); index++) { - tbm_surface_internal_get_plane_data(surface, index, NULL, NULL, &pitch); - stream->bo[index] = tbm_bo_ref(gst_tizen_memory_get_bos(mem, index)); - stream->stride[index] = pitch; - stream->elevation[index] = stream->height; - } + __mmplayer_zerocopy_set_stride_elevation_bo(stream, mem); stream->internal_buffer = gst_buffer_ref(buffer); } else { /* sw codec */ - int i = 0; - int j = 0; - int k = 0; - int ret = TBM_SURFACE_ERROR_NONE; - int src_stride[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, }; - int src_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, }; - int size = 0; - unsigned char *src = NULL; - unsigned char *dest = NULL; - tbm_bo_handle thandle; - tbm_surface_h surface; - tbm_surface_info_s info; - gboolean gst_ret; - - gst_ret = gst_memory_map(mem, &mapinfo, GST_MAP_READWRITE); - if (!gst_ret) { - LOGE("fail to gst_memory_map"); - goto ERROR; - } - - - if (stream->format == MM_PIXEL_FORMAT_I420) { - surface = tbm_surface_create(stream->width, stream->height, TBM_FORMAT_YUV420); - - ret = tbm_surface_get_info(surface, &info); - - if (ret != TBM_SURFACE_ERROR_NONE) { - tbm_surface_destroy(surface); - goto ERROR; - } - tbm_surface_destroy(surface); - - src_stride[0] = GST_ROUND_UP_4(stream->width); - src_stride[1] = src_stride[2] = GST_ROUND_UP_4(stream->width>>1); - src_offset[1] = src_stride[0] * GST_ROUND_UP_2(stream->height); - src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(stream->height)>>1)); - stream->stride[0] = info.planes[0].stride; - stream->elevation[0] = info.planes[0].size / info.planes[0].stride; - stream->stride[1] = info.planes[1].stride; - stream->elevation[1] = info.planes[1].size / info.planes[1].stride; - stream->stride[2] = info.planes[2].stride; - stream->elevation[2] = info.planes[2].size / info.planes[2].stride; - size = info.planes[0].size + info.planes[1].size + info.planes[2].size; - } else if (stream->format == MM_PIXEL_FORMAT_RGBA) { - stream->stride[0] = stream->width * 4; - stream->elevation[0] = stream->height; - size = stream->stride[0] * stream->height; - } else { - LOGE("Not support format %d", stream->format); + if (!__mmplayer_swcodec_set_stride_elevation(stream)) goto ERROR; - } - stream->bo[0] = __mmplayer_video_stream_get_bo(player, size); - if (!stream->bo[0]) { - LOGE("Fail to tbm_bo_alloc!!"); + if (!__mmplayer_swcodec_set_bo(player, stream, mem)) goto ERROR; - } - - thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE); - if (thandle.ptr && mapinfo.data) { - if (stream->format == MM_PIXEL_FORMAT_I420) { - for (i = 0; i < 3; i++) { - src = mapinfo.data + src_offset[i]; - dest = thandle.ptr + info.planes[i].offset; - - if (i > 0) k = 1; - for (j = 0; j < stream->height>>k; j++) { - memcpy(dest, src, stream->width>>k); - src += src_stride[i]; - dest += stream->stride[i]; - } - } - } else if (stream->format == MM_PIXEL_FORMAT_RGBA) { - memcpy(thandle.ptr, mapinfo.data, size); - } else { - LOGE("Not support format %d", stream->format); - goto ERROR; - } - } else { - LOGE("data pointer is wrong. dest : %p, src : %p", - thandle.ptr, mapinfo.data); - goto ERROR; - } - tbm_bo_unmap(stream->bo[0]); } - if (player->video_stream_cb) { /* This has been already checked at the entry */ - if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) { - LOGE("failed to send video stream data."); - goto ERROR; - } + if (!player->video_stream_cb(stream, player->video_stream_cb_user_param)) { + LOGE("failed to send video stream data."); + goto ERROR; } - gst_memory_unmap(mem, &mapinfo); return; @@ -3911,8 +3793,6 @@ ERROR: if (stream->bo[0]) _mmplayer_video_stream_release_bo(player, stream->bo[0]); } - - gst_memory_unmap(mem, &mapinfo); g_free(stream); return; } @@ -10072,3 +9952,183 @@ __mmplayer_set_file_uri(MMPlayerParseProfile* data, const char *uri) return ret; } + +static MMPlayerVideoStreamDataType* +__mmplayer_create_stream_from_pad(GstPad *pad) +{ + GstCaps *caps = NULL; + GstStructure *structure = NULL; + unsigned int fourcc = 0; + const gchar *string_format = NULL; + MMPlayerVideoStreamDataType *stream = NULL; + gint width, height; + MMPixelFormatType format; + + caps = gst_pad_get_current_caps(pad); + if (!caps) { + LOGE("Caps is NULL."); + return NULL; + } + + /* MMPLAYER_LOG_GST_CAPS_TYPE(caps); */ + structure = gst_caps_get_structure(caps, 0); + gst_structure_get_int(structure, "width", &width); + gst_structure_get_int(structure, "height", &height); + string_format = gst_structure_get_string(structure, "format"); + if (string_format) + fourcc = _mmplayer_convert_fourcc_string_to_value(string_format); + format = util_get_pixtype(fourcc); + gst_caps_unref(caps); + + /* moved here */ + if (width == 0 || height == 0 || format == MM_PIXEL_FORMAT_INVALID) { + LOGE("Wrong condition!!"); + return NULL; + } + + stream = (MMPlayerVideoStreamDataType *)g_malloc0(sizeof(MMPlayerVideoStreamDataType)); + if (!stream) { + LOGE("failed to alloc mem for video data"); + return NULL; + } + + stream->width = width; + stream->height = height; + stream->format = format; + + return stream; +} + +static void +__mmplayer_zerocopy_set_stride_elevation_bo(MMPlayerVideoStreamDataType *stream, GstMemory *mem) +{ + unsigned int pitch = 0; + int index = 0; + tbm_surface_h surface = gst_tizen_memory_get_surface(mem); + + for (index = 0; index < gst_tizen_memory_get_num_bos(mem); index++) { + tbm_surface_internal_get_plane_data(surface, index, NULL, NULL, &pitch); + stream->bo[index] = tbm_bo_ref(gst_tizen_memory_get_bos(mem, index)); + stream->stride[index] = pitch; + stream->elevation[index] = stream->height; + } +} + +static gboolean +__mmplayer_swcodec_set_stride_elevation(MMPlayerVideoStreamDataType *stream) +{ + if (stream->format == MM_PIXEL_FORMAT_I420) { + int ret = TBM_SURFACE_ERROR_NONE; + tbm_surface_h surface; + tbm_surface_info_s info; + + surface = tbm_surface_create(stream->width, stream->height, TBM_FORMAT_YUV420); + + ret = tbm_surface_get_info(surface, &info); + if (ret != TBM_SURFACE_ERROR_NONE) { + tbm_surface_destroy(surface); + return FALSE; + } + + tbm_surface_destroy(surface); + stream->stride[0] = info.planes[0].stride; + stream->elevation[0] = info.planes[0].size / info.planes[0].stride; + stream->stride[1] = info.planes[1].stride; + stream->elevation[1] = info.planes[1].size / info.planes[1].stride; + stream->stride[2] = info.planes[2].stride; + stream->elevation[2] = info.planes[2].size / info.planes[2].stride; + stream->bo_size = info.planes[0].size + info.planes[1].size + info.planes[2].size; + } else if (stream->format == MM_PIXEL_FORMAT_RGBA) { + stream->stride[0] = stream->width * 4; + stream->elevation[0] = stream->height; + stream->bo_size = stream->stride[0] * stream->height; + } else { + LOGE("Not support format %d", stream->format); + return FALSE; + } + + return TRUE; +} + +static gboolean +__mmplayer_swcodec_set_bo(mm_player_t *player, MMPlayerVideoStreamDataType *stream, GstMemory *mem) +{ + tbm_bo_handle thandle; + gboolean is_mapped; + int src_stride[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, }; + int src_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, }; + int dest_offset[MM_PLAYER_IMGB_MPLANE_MAX] = { 0, }; + int i = 0; + int j = 0; + int k = 0; + unsigned char *src = NULL; + unsigned char *dest = NULL; + GstMapInfo mapinfo = GST_MAP_INFO_INIT; + + is_mapped = gst_memory_map(mem, &mapinfo, GST_MAP_READWRITE); + if (!is_mapped) { + LOGE("fail to gst_memory_map"); + return FALSE; + } + + if (!mapinfo.data) { + LOGE("data pointer is wrong"); + goto ERROR; + } + + stream->bo[0] = __mmplayer_video_stream_get_bo(player, stream->bo_size); + if (!stream->bo[0]) { + LOGE("Fail to tbm_bo_alloc!!"); + goto ERROR; + } + + thandle = tbm_bo_map(stream->bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE); + if (!thandle.ptr) { + LOGE("thandle pointer is wrong"); + goto ERROR; + } + + if (stream->format == MM_PIXEL_FORMAT_I420) { + src_stride[0] = GST_ROUND_UP_4(stream->width); + src_stride[1] = src_stride[2] = GST_ROUND_UP_4(stream->width >> 1); + src_offset[1] = src_stride[0] * GST_ROUND_UP_2(stream->height); + src_offset[2] = src_offset[1] + (src_stride[1] * (GST_ROUND_UP_2(stream->height) >> 1)); + + dest_offset[0] = 0; + dest_offset[1] = stream->stride[0] * stream->elevation[0]; + dest_offset[2] = dest_offset[1] + stream->stride[1] * stream->elevation[1]; + + for (i = 0; i < 3; i++) { + src = mapinfo.data + src_offset[i]; + dest = thandle.ptr + dest_offset[i]; + + if (i > 0) + k = 1; + + for (j = 0; j < stream->height >> k; j++) { + memcpy(dest, src, stream->width>>k); + src += src_stride[i]; + dest += stream->stride[i]; + } + } + } else if (stream->format == MM_PIXEL_FORMAT_RGBA) { + memcpy(thandle.ptr, mapinfo.data, stream->bo_size); + } else { + LOGE("Not support format %d", stream->format); + goto ERROR; + } + + tbm_bo_unmap(stream->bo[0]); + gst_memory_unmap(mem, &mapinfo); + + return TRUE; + +ERROR: + if (stream->bo[0]) + tbm_bo_unmap(stream->bo[0]); + + if (is_mapped) + gst_memory_unmap(mem, &mapinfo); + + return FALSE; +}