}
CAM_LOG_INFO("Done");
-
- return;
}
CAM_LOG_DEBUG("api[%d], value[%d], waiting[%d]",
api, value, cb_info->api_waiting[api]);
-
- return;
}
_DONE:
g_mutex_unlock(&g_cam_dev_state_changed_cb_lock);
-
- return;
}
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]
}
}
- /* 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);
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, ¶m, 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, ¶m, 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;
+ }
+ }
}
}
CAM_LOG_INFO("return buffer done");
-
- return;
}
/* return buffer */
_camera_msg_return_buffer(face_fd, cb_info);
-
- return;
}
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)
__camera_update_api_waiting(cb_info, api, -1);
muse_core_msg_free(msg);
-
- return;
}
__camera_update_api_waiting(cb_info, api, -1);
muse_core_msg_free(msg);
-
- return;
}
_SEND_PARAM2_INT_DONE:
if (ret)
*ret = func_ret;
-
- return;
}
CAMERA_MSG_PARAM_SET(param, INT, ret_fd);
_camera_msg_send_param1(MUSE_CAMERA_API_RETURN_BUFFER, cb_info, NULL, ¶m, 0);
-
- return;
}
{
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;
}
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,
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",
}
memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s));
+
buffer_bo = mp_data->buffer_bo;
num_buffer_fd = mp_data->num_buffer_fd;
/* 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;
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);
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)
}
g_mutex_unlock(&cb_info->user_cb_mutex[event]);
-
- return;
}
static gboolean __camera_idle_event_callback(gpointer data)
cb_info->idle_event_list = NULL;
g_mutex_unlock(&g_cam_idle_event_lock);
-
- return;
}
}
cam_msg = NULL;
-
- return;
}
} else {
CAM_LOG_WARNING("unknown camera api %d, class %d", api, api_class);
}
-
- return;
}
handler_info->queue = NULL;
CAM_LOG_INFO("t:%d done", type);
-
- return;
}
cb_info->preview_cb_flag = 0;
g_free(cb_info);
-
- return;
}
//LCOV_EXCL_START