[0.6.139] resolve complexity issue 86/192386/2
authorGilbok Lee <gilbok.lee@samsung.com>
Mon, 5 Nov 2018 07:28:47 +0000 (16:28 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 5 Nov 2018 23:45:36 +0000 (08:45 +0900)
- resolve the cyclomatic complexity issue of below function
  __mmplayer_video_stream_decoded_render_cb

Change-Id: I36b82026a7d2cad1c76ad4a506cf68564313ba4f

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

index cf42747..9764461 100644 (file)
@@ -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
index b941138..4f5d32c 100644 (file)
@@ -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;
 
 /**
index c000d2d..e1324f0 100644 (file)
@@ -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;
+}