From 5b6c933d8f68d6442cf72d09f16c60a69827e92b Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 15 Jun 2018 18:32:37 +0900 Subject: [PATCH] Support raw image capture with encodebin [Version] 0.10.160 [Profile] Common [Issue Type] Bug fix [Dependency module] N/A Change-Id: Ifccdbc4884c88176b83236224a65f83c9d723195 Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/mm_camcorder_gstcommon.c | 46 +++++++++++++++++++++++++++--------------- src/mm_camcorder_stillshot.c | 45 +++++++++++++++++++++++------------------ 3 files changed, 56 insertions(+), 37 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 97b8c22..a81c8e8 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -1,6 +1,6 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 0.10.159 +Version: 0.10.160 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index b0653f3..691e9aa 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -757,6 +757,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebin int auto_audio_convert = 0; int auto_audio_resample = 0; int auto_color_space = 0; + int cap_format = MM_PIXEL_FORMAT_INVALID; const char *gst_element_venc_name = NULL; const char *gst_element_aenc_name = NULL; const char *gst_element_ienc_name = NULL; @@ -884,12 +885,18 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebin _MMCAMCORDER_ELEMENT_MAKE(sc, sc->encode_element, _MMCAMCORDER_ENCSINK_ENCBIN, "encodebin", "encodesink_encbin", element_list, err); /* check element availability */ - err = mm_camcorder_get_attributes(handle, &err_name, - MMCAM_AUDIO_ENCODER, &audio_enc, - MMCAM_AUDIO_CHANNEL, &channel, - MMCAM_VIDEO_ENCODER_BITRATE, &v_bitrate, - MMCAM_AUDIO_ENCODER_BITRATE, &a_bitrate, - NULL); + if (profile == MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) { + err = mm_camcorder_get_attributes(handle, &err_name, + MMCAM_CAPTURE_FORMAT, &cap_format, + NULL); + } else { + err = mm_camcorder_get_attributes(handle, &err_name, + MMCAM_AUDIO_ENCODER, &audio_enc, + MMCAM_AUDIO_CHANNEL, &channel, + MMCAM_VIDEO_ENCODER_BITRATE, &v_bitrate, + MMCAM_AUDIO_ENCODER_BITRATE, &a_bitrate, + NULL); + } if (err != MM_ERROR_NONE) { if (err_name) { @@ -951,10 +958,12 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebin goto pipeline_creation_error; } - if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) - gst_element_venc_name = "capsfilter"; - else + if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) { + /* set dummy element */ + gst_element_venc_name = "identity"; + } else { _mmcamcorder_conf_get_value_element_name(VideoencElement, &gst_element_venc_name); + } if (gst_element_venc_name) { _mmcam_dbg_log("video encoder name [%s]", gst_element_venc_name); @@ -1052,14 +1061,19 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebin } if (profile == MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) { - ImageencElement = _mmcamcorder_get_type_element(handle, MM_CAM_IMAGE_ENCODER); - if (!ImageencElement) { - _mmcam_dbg_err("Fail to get type element"); - err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; - goto pipeline_creation_error; - } + if (cap_format == MM_PIXEL_FORMAT_ENCODED) { + ImageencElement = _mmcamcorder_get_type_element(handle, MM_CAM_IMAGE_ENCODER); + if (!ImageencElement) { + _mmcam_dbg_err("Fail to get type element"); + err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; + goto pipeline_creation_error; + } - _mmcamcorder_conf_get_value_element_name(ImageencElement, &gst_element_ienc_name); + _mmcamcorder_conf_get_value_element_name(ImageencElement, &gst_element_ienc_name); + } else { + /* raw format - set dummy element */ + gst_element_ienc_name = "identity"; + } MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "ienc-name", gst_element_ienc_name); _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_IENC, "image-encode", err); diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 53adfb0..7fece95 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -1505,6 +1505,11 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl _mmcam_dbg_log("Done Internal Encode - data %p, length %d", dest.data, dest.length); } + if (pixtype_main < MM_PIXEL_FORMAT_ENCODED) { + _mmcam_dbg_log("raw capture, skip EXIF related functions"); + goto _CAPTURE_CB_EXIF_DONE; + } + /* create EXIF info */ if (!provide_exif) { /* make new exif */ ret = mm_exif_create_exif_info(&(hcamcorder->exif_info)); @@ -1560,32 +1565,32 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstSample *sampl mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL, MMCAM_TAG_ENABLE, &tag_enable, NULL); /* Set extra data for JPEG if tag enabled and doesn't provide EXIF */ - if (dest.format == MM_PIXEL_FORMAT_ENCODED) { - if (tag_enable) { - mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL, - MMCAM_IMAGE_ENCODER, &codectype, - NULL); - _mmcam_dbg_log("codectype %d", codectype); + if (tag_enable) { + mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL, + MMCAM_IMAGE_ENCODER, &codectype, + NULL); + _mmcam_dbg_log("codectype %d", codectype); - switch (codectype) { - case MM_IMAGE_CODEC_JPEG: - case MM_IMAGE_CODEC_SRW: - case MM_IMAGE_CODEC_JPEG_SRW: - ret = __mmcamcorder_set_jpeg_data((MMHandleType)hcamcorder, &dest, &thumb, provide_exif); - if (ret != MM_ERROR_NONE) { - _mmcam_dbg_err("Error on setting extra data to jpeg"); - MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, ret); - goto error; - } - break; - default: - _mmcam_dbg_err("The codectype is not supported. (%d)", codectype); - MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL); + switch (codectype) { + case MM_IMAGE_CODEC_JPEG: + case MM_IMAGE_CODEC_SRW: + case MM_IMAGE_CODEC_JPEG_SRW: + ret = __mmcamcorder_set_jpeg_data((MMHandleType)hcamcorder, &dest, &thumb, provide_exif); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_err("Error on setting extra data to jpeg"); + MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, ret); goto error; } + break; + default: + _mmcam_dbg_err("The codectype is not supported. (%d)", codectype); + MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL); + goto error; } } +_CAPTURE_CB_EXIF_DONE: + /* Handle Capture Callback */ _MMCAMCORDER_LOCK_VCAPTURE_CALLBACK(hcamcorder); -- 2.7.4