Refactoring code related with media packet 74/256374/2
authorJeongmo Yang <jm80.yang@samsung.com>
Thu, 1 Apr 2021 11:35:43 +0000 (20:35 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 2 Apr 2021 02:15:30 +0000 (11:15 +0900)
- Replace deprecated APIs by new added APIs
- Remove duplicated and unncessary code

[Version] 0.4.49
[Issue Type] Refactoring

Change-Id: I4a229fe93803c52a11baeb44028f8a11562c54e7
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
include/camera_private.h
packaging/capi-media-camera.spec
src/camera.c

index e2aa8d8..fe6eb16 100644 (file)
@@ -204,7 +204,6 @@ typedef struct _camera_media_packet_data {
        tbm_bo buffer_bo[BUFFER_MAX_PLANE_NUM];
        int num_buffer_fd;
        tbm_bo data_bo;
-       int ref_cnt;
 } camera_media_packet_data;
 
 typedef struct _camera_msg_param {
@@ -236,7 +235,7 @@ typedef struct _camera_device_manager {
 
 int _camera_get_tbm_surface_format(int in_format, uint32_t *out_format);
 int _camera_get_media_packet_mimetype(int in_format, media_format_mimetype_e *mimetype);
-int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data);
+void _camera_media_packet_dispose(media_packet_h pkt, void *user_data);
 int _camera_start_evas_rendering(camera_h camera);
 int _camera_stop_evas_rendering(camera_h camera, bool keep_screen);
 int _camera_independent_request(int api, int device_type, const char *key, int *value);
index 2e09c89..a630686 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    0.4.48
+Version:    0.4.49
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 9187df2..d29e654 100644 (file)
@@ -169,8 +169,6 @@ static void __camera_release_preview_buffer(camera_h camera)
        }
 
        CAM_LOG_INFO("Done");
-
-       return;
 }
 
 
@@ -188,8 +186,6 @@ static void __camera_update_api_waiting(camera_cb_info_s *cb_info, int api, int
 
        CAM_LOG_DEBUG("api[%d], value[%d], waiting[%d]",
                api, value, cb_info->api_waiting[api]);
-
-       return;
 }
 
 
@@ -238,8 +234,6 @@ static void __camera_device_state_changed_cb(GDBusConnection *connection,
 
 _DONE:
        g_mutex_unlock(&g_cam_dev_state_changed_cb_lock);
-
-       return;
 }
 
 
@@ -264,7 +258,6 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv
        camera_stream_data_s *stream = NULL;
        camera_media_packet_data *mp_data = NULL;
        media_packet_h pkt = NULL;
-       media_packet_h pkt_evas = NULL;
 
        /* tfd[0]: MMCamcorderVideoStreamDataType
           tfd[1]: data_bo or zero copy bo[0]
@@ -323,7 +316,7 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv
                }
        }
 
-       /* call preview callback */
+       /* preview callback */
        if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW]) {
                camera_create_preview_frame(stream, num_buffer_fd, buffer_bo_handle, &data_bo_handle, &frame);
 
@@ -331,78 +324,81 @@ static void __camera_event_handler_preview(camera_cb_info_s *cb_info, char *recv
                        cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_PREVIEW]);
        }
 
-       if (CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) {
+       /* make media packet with below cases.
+        * 1. media_packet_preview_cb is set
+        * 2. EVAS display rendering
+        */
+       if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW] ||
+               CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) {
                ret = __camera_media_packet_data_create(ret_fd, tfd, num_buffer_fd, bo, buffer_bo, data_bo, &mp_data);
+               if (ret != CAMERA_ERROR_NONE) {
+                       CAM_LOG_ERROR("__camera_media_packet_data_create failed[0x%x]", ret);
+                       goto _PREVIEW_CB_HANDLER_DONE;
+               }
 
-               if (ret == CAMERA_ERROR_NONE) {
-                       ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt_evas);
-                       if (ret != CAMERA_ERROR_NONE) {
-                               CAM_LOG_ERROR("create pkt for evas failed");
-                               __camera_media_packet_data_release(mp_data, cb_info);
-                               mp_data = NULL;
-                       }
+               ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt);
+               if (ret != CAMERA_ERROR_NONE) {
+                       CAM_LOG_ERROR("__camera_media_packet_create failed[0x%x]", ret);
+                       __camera_media_packet_data_release(mp_data, cb_info);
+                       mp_data = NULL;
+                       goto _PREVIEW_CB_HANDLER_DONE;
                }
        }
 
-       /* call media packet callback */
+       /* 1. media packet preview callback */
        if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]) {
-               ret = __camera_media_packet_data_create(ret_fd, tfd, num_buffer_fd, bo, buffer_bo, data_bo, &mp_data);
-
-               if (ret == CAMERA_ERROR_NONE) {
-                       ret = __camera_media_packet_create(cb_info, stream, mp_data, &pkt);
-
-                       if (ret == CAMERA_ERROR_NONE) {
-                               ((camera_media_packet_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])(pkt,
-                                       cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
-                       } else {
-                               __camera_media_packet_data_release(mp_data, cb_info);
-                               mp_data = NULL;
-                       }
-               }
+               media_packet_ref(pkt);
+               ((camera_media_packet_preview_cb)cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])(pkt,
+                       cb_info->user_data[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW]);
        }
 
-       /* call evas renderer */
-       if (pkt_evas) {
+       /* 2. call evas renderer */
+       if (CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS)) {
                if (cb_info->run_evas_render) {
-                       mm_display_interface_evas_render(cb_info->dp_interface, pkt_evas);
+                       media_packet_ref(pkt);
+                       ret = mm_display_interface_evas_render(cb_info->dp_interface, pkt);
+                       if (ret != MM_ERROR_NONE) {
+                               CAM_LOG_ERROR("mm_display_interface_evas_render failed[0x%x]", ret);
+                               media_packet_unref(pkt);
+                       }
                } else {
                        CAM_LOG_WARNING("evas renderer is stopped, skip this buffer...");
-                       media_packet_destroy(pkt_evas);
                }
-               pkt_evas = NULL;
        }
 
+_PREVIEW_CB_HANDLER_DONE:
        /* send message for preview callback return */
-       if (!CHECK_PREVIEW_CB(cb_info, PREVIEW_CB_TYPE_EVAS))
+       if (cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_PREVIEW] ||
+               cb_info->user_cb[MUSE_CAMERA_EVENT_TYPE_MEDIA_PACKET_PREVIEW])
                _camera_msg_send(MUSE_CAMERA_API_PREVIEW_CB_RETURN, NULL, cb_info, NULL, 0);
 
-_PREVIEW_CB_HANDLER_DONE:
-       if (mp_data == NULL) {
-               /* release imported bo */
-               for (i = 0 ; i < num_buffer_fd && i < BUFFER_MAX_PLANE_NUM ; i++)
-                       __camera_release_imported_bo(&buffer_bo[i]);
+       if (pkt) {
+               media_packet_unref(pkt);
+               return;
+       }
 
-               /* unmap and unref tbm bo */
-               __camera_release_imported_bo(&data_bo);
-               __camera_release_imported_bo(&bo);
+       /* return buffer */
+       _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
 
-               /* close imported fd */
-               for (i = 0 ; i < MUSE_NUM_FD ; i++) {
-                       if (tfd[i] >= 0) {
-                               close(tfd[i]);
-                               tfd[i] = -1;
-                       } else {
-                               break;
-                       }
-               }
+       CAM_LOG_DEBUG("return buffer Done[tfd:%d, ret fd:%d]", tfd[0], ret_fd);
 
-               /* return buffer */
-               _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
+       /* release imported bo */
+       for (i = 0 ; i < num_buffer_fd && i < BUFFER_MAX_PLANE_NUM ; i++)
+               __camera_release_imported_bo(&buffer_bo[i]);
 
-               CAM_LOG_DEBUG("return buffer Done[tfd:%d, ret fd:%d]", tfd[0], ret_fd);
-       }
+       /* unmap and unref tbm bo */
+       __camera_release_imported_bo(&data_bo);
+       __camera_release_imported_bo(&bo);
 
-       return;
+       /* close imported fd */
+       for (i = 0 ; i < MUSE_NUM_FD ; i++) {
+               if (tfd[i] >= 0) {
+                       close(tfd[i]);
+                       tfd[i] = -1;
+               } else {
+                       break;
+               }
+       }
 }
 
 
@@ -525,8 +521,6 @@ _CAPTURE_CB_HANDLER_DONE:
        }
 
        CAM_LOG_INFO("return buffer done");
-
-       return;
 }
 
 
@@ -572,8 +566,6 @@ static void __camera_event_handler_face_detection(camera_cb_info_s *cb_info, cha
 
        /* return buffer */
        _camera_msg_return_buffer(face_fd, cb_info);
-
-       return;
 }
 
 
@@ -622,8 +614,6 @@ static void __camera_release_imported_bo(tbm_bo *bo)
 
        tbm_bo_unref(*bo);
        *bo = NULL;
-
-       return;
 }
 
 static int __camera_client_wait_for_cb_return(muse_camera_api_e api, camera_cb_info_s *cb_info, int time_out)
@@ -716,8 +706,6 @@ void _camera_msg_send(int api, int *fds, camera_cb_info_s *cb_info,
        __camera_update_api_waiting(cb_info, api, -1);
 
        muse_core_msg_free(msg);
-
-       return;
 }
 
 
@@ -795,8 +783,6 @@ void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info,
        __camera_update_api_waiting(cb_info, api, -1);
 
        muse_core_msg_free(msg);
-
-       return;
 }
 
 
@@ -854,8 +840,6 @@ void _camera_msg_send_param2_int(int api, camera_cb_info_s *cb_info,
 _SEND_PARAM2_INT_DONE:
        if (ret)
                *ret = func_ret;
-
-       return;
 }
 
 
@@ -871,8 +855,6 @@ void _camera_msg_return_buffer(int ret_fd, camera_cb_info_s *cb_info)
        CAMERA_MSG_PARAM_SET(param, INT, ret_fd);
 
        _camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, &param, 0);
-
-       return;
 }
 
 
@@ -999,54 +981,44 @@ static int __camera_media_packet_data_create(int ret_fd, int *tfd, int num_buffe
 {
        int i = 0;
        int ret = CAMERA_ERROR_NONE;
-       camera_media_packet_data *tmp_mp_data = NULL;
+       camera_media_packet_data *new_mp_data = NULL;
 
-       if (!tfd) {
-               CAM_LOG_ERROR("NULL tfd");
+       if (!tfd || !mp_data) {
+               CAM_LOG_ERROR("NULL param[%p,%p]", tfd, mp_data);
                return CAMERA_ERROR_INVALID_PARAMETER;
        }
 
-       if (*mp_data == NULL) {
-               tmp_mp_data = g_new0(camera_media_packet_data, 1);
-               if (tmp_mp_data) {
-                       tmp_mp_data->ret_fd = ret_fd;
-                       tmp_mp_data->fd = tfd[0];
-                       tmp_mp_data->num_buffer_fd = num_buffer_fd;
-                       tmp_mp_data->bo = bo;
+       new_mp_data = g_new0(camera_media_packet_data, 1);
 
-                       CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", tmp_mp_data->fd, tmp_mp_data->ret_fd);
+       new_mp_data->ret_fd = ret_fd;
+       new_mp_data->fd = tfd[0];
+       new_mp_data->num_buffer_fd = num_buffer_fd;
+       new_mp_data->bo = bo;
 
-                       if (data_bo) {
-                               /* non-zero copy */
-                               tmp_mp_data->data_bo = data_bo;
-                               tmp_mp_data->data_fd = tfd[1];
+       CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", new_mp_data->fd, new_mp_data->ret_fd);
 
-                               CAM_LOG_VERBOSE("bo[%p], fd[%d]",
-                                       tmp_mp_data->data_bo, tmp_mp_data->data_fd);
-                       } else {
-                               /* zero copy */
-                               for (i = 0 ; i < num_buffer_fd ; i++) {
-                                       tmp_mp_data->buffer_bo[i] = buffer_bo[i];
-                                       tmp_mp_data->buffer_fd[i] = (tbm_fd)tfd[i + 1];
+       if (data_bo) {
+               /* non-zero copy */
+               new_mp_data->data_bo = data_bo;
+               new_mp_data->data_fd = tfd[1];
 
-                                       CAM_LOG_VERBOSE("    [%d] bo[%p], fd[%d]",
-                                               i, tmp_mp_data->buffer_bo[i], tmp_mp_data->buffer_fd[i]);
-                               }
-                       }
-
-                       tmp_mp_data->ref_cnt++;
-
-                       *mp_data = tmp_mp_data;
+               CAM_LOG_VERBOSE("bo[%p], fd[%d]",
+                       new_mp_data->data_bo, new_mp_data->data_fd);
+       } else {
+               /* zero copy */
+               for (i = 0 ; i < num_buffer_fd ; i++) {
+                       new_mp_data->buffer_bo[i] = buffer_bo[i];
+                       new_mp_data->buffer_fd[i] = (tbm_fd)tfd[i + 1];
 
-                       CAM_LOG_DEBUG("mp_data %p", tmp_mp_data);
-               } else {
-                       ret = CAMERA_ERROR_OUT_OF_MEMORY;
-                       CAM_LOG_ERROR("failed to alloc media packet data");
+                       CAM_LOG_VERBOSE("    [%d] bo[%p], fd[%d]",
+                               i, new_mp_data->buffer_bo[i], new_mp_data->buffer_fd[i]);
                }
-       } else {
-               ((camera_media_packet_data *)*mp_data)->ref_cnt++;
        }
 
+       *mp_data = new_mp_data;
+
+       CAM_LOG_DEBUG("mp_data %p", new_mp_data);
+
        return ret;
 }
 
@@ -1059,40 +1031,33 @@ static void __camera_media_packet_data_release(camera_media_packet_data *mp_data
                return;
        }
 
-       if (mp_data->ref_cnt > 1) {
-               mp_data->ref_cnt--;
-               CAM_LOG_INFO("ref count %d", mp_data->ref_cnt);
-       } else {
-               CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", mp_data->fd, mp_data->ret_fd);
+       CAM_LOG_VERBOSE("tfd[%d], ret fd[%d]", mp_data->fd, mp_data->ret_fd);
 
-               /* release imported bo and close imported fd */
-               for (i = 0 ; i < mp_data->num_buffer_fd ; i++) {
-                       tbm_bo_unref(mp_data->buffer_bo[i]);
-                       mp_data->buffer_bo[i] = NULL;
+       /* release imported bo and close imported fd */
+       for (i = 0 ; i < mp_data->num_buffer_fd ; i++) {
+               tbm_bo_unref(mp_data->buffer_bo[i]);
+               mp_data->buffer_bo[i] = NULL;
 
-                       close(mp_data->buffer_fd[i]);
-                       mp_data->buffer_fd[i] = -1;
-               }
-
-               /* unref tbm bo and close imported fd */
-               close(mp_data->fd);
-               mp_data->fd = -1;
-
-               __camera_release_imported_bo(&mp_data->bo);
+               close(mp_data->buffer_fd[i]);
+               mp_data->buffer_fd[i] = -1;
+       }
 
-               if (mp_data->data_bo && mp_data->data_fd >= 0) {
-                       close(mp_data->data_fd);
-                       mp_data->data_fd = -1;
-               }
-               __camera_release_imported_bo(&mp_data->data_bo);
+       /* unref tbm bo and close imported fd */
+       close(mp_data->fd);
+       mp_data->fd = -1;
 
-               /* return buffer */
-               _camera_msg_return_buffer(mp_data->ret_fd, cb_info);
+       __camera_release_imported_bo(&mp_data->bo);
 
-               g_free(mp_data);
+       if (mp_data->data_bo && mp_data->data_fd >= 0) {
+               close(mp_data->data_fd);
+               mp_data->data_fd = -1;
        }
+       __camera_release_imported_bo(&mp_data->data_bo);
 
-       return;
+       /* return buffer */
+       _camera_msg_return_buffer(mp_data->ret_fd, cb_info);
+
+       g_free(mp_data);
 }
 
 static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream_data_s *stream,
@@ -1107,7 +1072,10 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream
        int ret = 0;
        int i = 0;
        int num_buffer_fd = 0;
+       int pkt_fmt_width = 0;
+       int pkt_fmt_height = 0;
        tbm_bo *buffer_bo = NULL;
+       media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12;
 
        if (cb_info == NULL || stream == NULL || mp_data == NULL || packet == NULL) {
                CAM_LOG_ERROR("invalid parameter - cb_info:%p, stream:%p, mp_data:%p, packet:%p",
@@ -1116,6 +1084,7 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream
        }
 
        memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s));
+
        buffer_bo = mp_data->buffer_bo;
        num_buffer_fd = mp_data->num_buffer_fd;
 
@@ -1126,160 +1095,168 @@ static int __camera_media_packet_create(camera_cb_info_s *cb_info, camera_stream
        /* get tbm surface format */
        ret = _camera_get_tbm_surface_format(stream->format, &bo_format);
        ret |= _camera_get_media_packet_mimetype(stream->format, &mimetype);
+       if (ret != CAMERA_ERROR_NONE)
+               return ret;
 
-       if (ret == CAMERA_ERROR_NONE) {
-               tsurf_info.width = stream->width;
-               tsurf_info.height = stream->height;
-               tsurf_info.format = bo_format;
-               tsurf_info.bpp = tbm_surface_internal_get_bpp(bo_format);
-               tsurf_info.num_planes = tbm_surface_internal_get_num_planes(bo_format);
-
-               if (num_buffer_fd > 0) {
-                       switch (bo_format) {
-                       case TBM_FORMAT_NV12:
-                       case TBM_FORMAT_NV21:
-                               tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
-                               tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
-                               tsurf_info.planes[0].offset = 0;
-                               if (num_buffer_fd == 1)
-                                       tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
-                               tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
-                               break;
-//LCOV_EXCL_START
-                       case TBM_FORMAT_YUV420:
-                       case TBM_FORMAT_YVU420:
-                               tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
-                               tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
-                               tsurf_info.planes[2].size = stream->stride[2] * stream->elevation[2];
-                               tsurf_info.planes[0].offset = 0;
-                               if (num_buffer_fd == 1) {
-                                       tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
-                                       tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
-                               }
-                               tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
-                               break;
-                       case TBM_FORMAT_UYVY:
-                       case TBM_FORMAT_YUYV:
-                               tsurf_info.planes[0].size = (stream->stride[0] * stream->elevation[0]) << 1;
-                               tsurf_info.planes[0].offset = 0;
-                               tsurf_info.size = tsurf_info.planes[0].size;
-                               break;
-                       default:
-                               break;
-//LCOV_EXCL_STOP
-                       }
-
-                       tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, buffer_bo, num_buffer_fd);
-               } else if (mp_data->data_bo) {
-//LCOV_EXCL_START
-                       switch (bo_format) {
-                       case TBM_FORMAT_NV12:
-                       case TBM_FORMAT_NV21:
-                               tsurf_info.planes[0].size = stream->width * stream->height;
-                               tsurf_info.planes[1].size = (tsurf_info.planes[0].size) >> 1;
-                               tsurf_info.planes[0].offset = 0;
+       tsurf_info.width = stream->width;
+       tsurf_info.height = stream->height;
+       tsurf_info.format = bo_format;
+       tsurf_info.bpp = tbm_surface_internal_get_bpp(bo_format);
+       tsurf_info.num_planes = tbm_surface_internal_get_num_planes(bo_format);
+
+       if (num_buffer_fd > 0) {
+               switch (bo_format) {
+               case TBM_FORMAT_NV12:
+               case TBM_FORMAT_NV21:
+                       tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
+                       tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
+                       tsurf_info.planes[0].offset = 0;
+                       if (num_buffer_fd == 1)
                                tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
-                               tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
-                               break;
-                       case TBM_FORMAT_YUV420:
-                       case TBM_FORMAT_YVU420:
-                               tsurf_info.planes[0].size = stream->width * stream->height;
-                               tsurf_info.planes[1].size = (stream->width >> 1) * (stream->height >> 1);
-                               tsurf_info.planes[2].size = tsurf_info.planes[1].size;
-                               tsurf_info.planes[0].offset = 0;
+                       tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
+                       break;
+//LCOV_EXCL_START
+               case TBM_FORMAT_YUV420:
+               case TBM_FORMAT_YVU420:
+                       tsurf_info.planes[0].size = stream->stride[0] * stream->elevation[0];
+                       tsurf_info.planes[1].size = stream->stride[1] * stream->elevation[1];
+                       tsurf_info.planes[2].size = stream->stride[2] * stream->elevation[2];
+                       tsurf_info.planes[0].offset = 0;
+                       if (num_buffer_fd == 1) {
                                tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
                                tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
-                               tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
-                               break;
-                       case TBM_FORMAT_UYVY:
-                       case TBM_FORMAT_YUYV:
-                               tsurf_info.planes[0].size = (stream->width * stream->height) << 1;
-                               tsurf_info.planes[0].offset = 0;
-                               tsurf_info.size = tsurf_info.planes[0].size;
-                               break;
-                       default:
-                               break;
                        }
-
-                       tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1);
+                       tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
+                       break;
+               case TBM_FORMAT_UYVY:
+               case TBM_FORMAT_YUYV:
+                       tsurf_info.planes[0].size = (stream->stride[0] * stream->elevation[0]) << 1;
+                       tsurf_info.planes[0].offset = 0;
+                       tsurf_info.size = tsurf_info.planes[0].size;
+                       break;
+               default:
+                       break;
 //LCOV_EXCL_STOP
                }
-       }
 
-       if (tsurf) {
-               /* check media packet format */
-               if (cb_info->pkt_fmt) {
-                       int pkt_fmt_width = 0;
-                       int pkt_fmt_height = 0;
-                       media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12;
-
-                       media_format_get_video_info(cb_info->pkt_fmt, &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL);
-
-                       CAM_LOG_INFO("pkt_fmt %dx%d - stream %dx%d", pkt_fmt_width, pkt_fmt_height, stream->width, stream->height);
-
-                       if (pkt_fmt_mimetype != mimetype ||
-                           pkt_fmt_width != stream->width ||
-                           pkt_fmt_height != stream->height) {
-                               CAM_LOG_WARNING("change fmt: current 0x%x, %dx%d",
-                                    pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height);
-                               media_format_unref(cb_info->pkt_fmt);
-                               cb_info->pkt_fmt = NULL;
-                               make_pkt_fmt = true;
-                       }
-               } else {
-                       make_pkt_fmt = true;
+               tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, buffer_bo, num_buffer_fd);
+       } else if (mp_data->data_bo) {
+//LCOV_EXCL_START
+               switch (bo_format) {
+               case TBM_FORMAT_NV12:
+               case TBM_FORMAT_NV21:
+                       tsurf_info.planes[0].size = stream->width * stream->height;
+                       tsurf_info.planes[1].size = (tsurf_info.planes[0].size) >> 1;
+                       tsurf_info.planes[0].offset = 0;
+                       tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
+                       tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
+                       break;
+               case TBM_FORMAT_YUV420:
+               case TBM_FORMAT_YVU420:
+                       tsurf_info.planes[0].size = stream->width * stream->height;
+                       tsurf_info.planes[1].size = (stream->width >> 1) * (stream->height >> 1);
+                       tsurf_info.planes[2].size = tsurf_info.planes[1].size;
+                       tsurf_info.planes[0].offset = 0;
+                       tsurf_info.planes[1].offset = tsurf_info.planes[0].size;
+                       tsurf_info.planes[2].offset = tsurf_info.planes[0].size + tsurf_info.planes[1].size;
+                       tsurf_info.size = tsurf_info.planes[0].size + tsurf_info.planes[1].size + tsurf_info.planes[2].size;
+                       break;
+               case TBM_FORMAT_UYVY:
+               case TBM_FORMAT_YUYV:
+                       tsurf_info.planes[0].size = (stream->width * stream->height) << 1;
+                       tsurf_info.planes[0].offset = 0;
+                       tsurf_info.size = tsurf_info.planes[0].size;
+                       break;
+               default:
+                       break;
                }
 
-               /* create packet format */
-               if (make_pkt_fmt) {
-                       CAM_LOG_WARNING("make new pkt_fmt - 0x%x, %dx%d", mimetype, stream->width, stream->height);
-                       ret = media_format_create(&cb_info->pkt_fmt);
-                       if (ret == MEDIA_FORMAT_ERROR_NONE) {
-                               ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype);
-                               ret |= media_format_set_video_width(cb_info->pkt_fmt, stream->width);
-                               ret |= media_format_set_video_height(cb_info->pkt_fmt, stream->height);
-                               CAM_LOG_WARNING("media_format_set : 0x%x", ret);
-                       } else {
-                               CAM_LOG_WARNING("media_format_create failed 0x%x", ret);
-                       }
-               }
+               tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, &mp_data->data_bo, 1);
+//LCOV_EXCL_STOP
+       }
 
-               /* create media packet */
-               ret = media_packet_create_from_tbm_surface(cb_info->pkt_fmt,
-                       tsurf, (media_packet_finalize_cb)_camera_media_packet_finalize,
-                       (void *)cb_info, &pkt);
-               if (ret != MEDIA_PACKET_ERROR_NONE) {
-                       CAM_LOG_ERROR("media_packet_create failed 0x%x", ret);
-                       tbm_surface_destroy(tsurf);
-                       tsurf = NULL;
-               }
-       } else {
+       if (!tsurf) {
                CAM_LOG_ERROR("tbm surface failed. %dx%d, format %d, num_buffer_fd %d, data_bo %p",
                        stream->width, stream->height, stream->format, num_buffer_fd, mp_data->data_bo);
+               return CAMERA_ERROR_INVALID_OPERATION;
        }
 
-       if (pkt) {
-               /* set media packet data */
-               ret = media_packet_set_extra(pkt, (void *)mp_data);
-               if (ret != MEDIA_PACKET_ERROR_NONE) {
-                       CAM_LOG_ERROR("media_packet_set_extra failed");
+       /* check media packet format */
+       if (cb_info->pkt_fmt) {
+               media_format_get_video_info(cb_info->pkt_fmt,
+                       &pkt_fmt_mimetype, &pkt_fmt_width, &pkt_fmt_height, NULL, NULL);
 
-                       __camera_media_packet_data_release(mp_data, cb_info);
+               CAM_LOG_INFO("pkt_fmt %dx%d - stream %dx%d",
+                       pkt_fmt_width, pkt_fmt_height, stream->width, stream->height);
 
-                       media_packet_destroy(pkt);
-               } else {
-                       /* set timestamp : msec -> nsec */
-                       if (media_packet_set_pts(pkt, (uint64_t)(stream->timestamp) * 1000000) != MEDIA_PACKET_ERROR_NONE)
-                               CAM_LOG_WARNING("media_packet_set_pts failed");
+               if (pkt_fmt_mimetype != mimetype ||
+                       pkt_fmt_width != stream->width ||
+                       pkt_fmt_height != stream->height) {
+                       CAM_LOG_WARNING("change fmt[previous:0x%x,%dx%d]",
+                                       pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height);
 
-                       *packet = pkt;
+                       media_format_unref(cb_info->pkt_fmt);
+                       cb_info->pkt_fmt = NULL;
+                       make_pkt_fmt = true;
                }
+       } else {
+               make_pkt_fmt = true;
        }
 
-       return ret;
+       /* create packet format */
+       if (make_pkt_fmt) {
+               CAM_LOG_WARNING("make new fmt - 0x%x, %dx%d",
+                       mimetype, stream->width, stream->height);
+
+               ret = media_format_create(&cb_info->pkt_fmt);
+               if (ret != MEDIA_FORMAT_ERROR_NONE) {
+                       CAM_LOG_WARNING("media_format_create failed 0x%x", ret);
+                       goto _PACKET_CREATE_FAILED;
+               }
+
+               ret = media_format_set_video_mime(cb_info->pkt_fmt, mimetype);
+               ret |= media_format_set_video_width(cb_info->pkt_fmt, stream->width);
+               ret |= media_format_set_video_height(cb_info->pkt_fmt, stream->height);
+               if (ret != MEDIA_FORMAT_ERROR_NONE) {
+                       CAM_LOG_WARNING("media format set failed 0x%x", ret);
+                       goto _PACKET_CREATE_FAILED;
+               }
+       }
+
+       /* create media packet */
+       ret = media_packet_new_from_tbm_surface(cb_info->pkt_fmt,
+               tsurf, (media_packet_dispose_cb)_camera_media_packet_dispose,
+               (void *)cb_info, &pkt);
+       if (ret != MEDIA_PACKET_ERROR_NONE) {
+               CAM_LOG_ERROR("media_packet_new failed 0x%x", ret);
+               goto _PACKET_CREATE_FAILED;
+       }
+
+       /* set media packet data */
+       ret = media_packet_set_extra(pkt, (void *)mp_data);
+       if (ret != MEDIA_PACKET_ERROR_NONE) {
+               CAM_LOG_ERROR("media_packet_set_extra failed");
+               goto _PACKET_CREATE_FAILED;
+       }
+
+       /* set timestamp : msec -> nsec */
+       if (media_packet_set_pts(pkt, (uint64_t)(stream->timestamp) * 1000000) != MEDIA_PACKET_ERROR_NONE)
+               CAM_LOG_WARNING("media_packet_set_pts failed");
+
+       *packet = pkt;
+
+       return CAMERA_ERROR_NONE;
+
+_PACKET_CREATE_FAILED:
+       if (tsurf)
+               tbm_surface_destroy(tsurf);
+       if (pkt)
+               media_packet_unref(pkt);
+
+       return CAMERA_ERROR_INVALID_OPERATION;
 }
 
-int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
+void _camera_media_packet_dispose(media_packet_h pkt, void *user_data)
 {
        int ret = 0;
        camera_cb_info_s *cb_info = (camera_cb_info_s *)user_data;
@@ -1288,13 +1265,13 @@ int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user
 
        if (!pkt || !cb_info) {
                CAM_LOG_ERROR("NULL pointer %p %p", pkt, cb_info);
-               return MEDIA_PACKET_FINALIZE;
+               return;
        }
 
        ret = media_packet_get_extra(pkt, (void **)&mp_data);
        if (ret != MEDIA_PACKET_ERROR_NONE) {
                CAM_LOG_ERROR("media_packet_get_extra failed 0x%x", ret);
-               return MEDIA_PACKET_FINALIZE;
+               return;
        }
 
        CAM_LOG_VERBOSE("mp_data[%p]", mp_data);
@@ -1314,8 +1291,6 @@ int _camera_media_packet_finalize(media_packet_h pkt, int error_code, void *user
                tbm_surface_destroy(tsurf);
                tsurf = NULL;
        }
-
-       return MEDIA_PACKET_FINALIZE;
 }
 
 static void __camera_client_user_callback(camera_cb_info_s *cb_info, char *recv_msg, muse_camera_event_e event, int *tfd)
@@ -1511,8 +1486,6 @@ static void __camera_client_user_callback(camera_cb_info_s *cb_info, char *recv_
        }
 
        g_mutex_unlock(&cb_info->user_cb_mutex[event]);
-
-       return;
 }
 
 static gboolean __camera_idle_event_callback(gpointer data)
@@ -1734,8 +1707,6 @@ static void __camera_deactivate_idle_event_all(camera_cb_info_s *cb_info)
        cb_info->idle_event_list = NULL;
 
        g_mutex_unlock(&g_cam_idle_event_lock);
-
-       return;
 }
 
 
@@ -1784,8 +1755,6 @@ static void __camera_add_msg_to_queue(camera_cb_info_s *cb_info, int api, int ev
        }
 
        cam_msg = NULL;
-
-       return;
 }
 
 
@@ -1906,8 +1875,6 @@ static void __camera_process_msg(camera_cb_info_s *cb_info, char *msg, int *tfd)
        } else {
                CAM_LOG_WARNING("unknown camera api %d, class %d", api, api_class);
        }
-
-       return;
 }
 
 
@@ -2067,8 +2034,6 @@ static void __destroy_msg_handler_thread(camera_msg_handler_info_s *handler_info
        handler_info->queue = NULL;
 
        CAM_LOG_INFO("t:%d done", type);
-
-       return;
 }
 
 
@@ -2215,8 +2180,6 @@ static void __camera_client_callback_destroy(camera_cb_info_s *cb_info)
        cb_info->preview_cb_flag = 0;
 
        g_free(cb_info);
-
-       return;
 }
 
 //LCOV_EXCL_START