Fixed issue where crash occurred on bottom crop 91/166591/3 accepted/tizen/4.0/unified/20180116.022644 submit/tizen_4.0/20180115.053143 tizen_4.0.IoT.p2_release
authorSejun Park <sejun79.park@samsung.com>
Thu, 11 Jan 2018 03:28:26 +0000 (12:28 +0900)
committerSejun Park <sejun79.park@samsung.com>
Thu, 11 Jan 2018 04:11:41 +0000 (13:11 +0900)
Change-Id: I67867d6ea97423603d086541e6eb29af77a5f203

packaging/libmm-player.spec
src/mm_player_priv.c

index c8014963187f0b2443b08ff784813d9e473e9f4c..60836a0bda83c0cef3c56966003a6a13d6ba03ad 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.88
+Version:    0.6.89
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 20b03d90b7a22b49b042b9c97c2cd340127d81fd..94eb87765edefeaf17aca7b2bb65f7d51a37c67e 100644 (file)
@@ -5215,26 +5215,50 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
                /* set gst buffer */
                stream.internal_buffer = buffer;
        } else { /* sw codec */
-               tbm_bo_handle thandle;
-               int stride = GST_ROUND_UP_4(stream.width);
-               int elevation = stream.height;
+               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(dataBlock, &mapinfo, GST_MAP_READWRITE);
                if (!gst_ret) {
                        LOGE("fail to gst_memory_map");
                        return;
                }
 
-               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];
+                       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;
+                       }
+                       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;
+                       tbm_surface_destroy(surface);
                } 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);
@@ -5248,9 +5272,25 @@ __mmplayer_video_stream_decoded_render_cb(GstElement* object, GstBuffer *buffer,
                        return;
                }
                thandle = tbm_bo_map(stream.bo[0], TBM_DEVICE_CPU, TBM_OPTION_WRITE);
-               if (thandle.ptr && mapinfo.data)
-                       memcpy(thandle.ptr, mapinfo.data, size);
-               else
+               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);
+                       }
+               } else
                        LOGE("data pointer is wrong. dest : %p, src : %p",
                                        thandle.ptr, mapinfo.data);
                tbm_bo_unmap(stream.bo[0]);