From: Haesu Gwon Date: Wed, 6 Jan 2016 03:12:13 +0000 (+0900) Subject: Add New APIs for encoded preview X-Git-Tag: accepted/tizen/mobile/20160114.012009~1 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git;a=commitdiff_plain;h=ff2cc16f25619abaf7b0523bda7a93641dbbca19 Add New APIs for encoded preview Change-Id: I466856321c5b312af23baf178a48f06c90aec31a Signed-off-by: Haesu Gwon --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index e204b35..a64100a 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -2,7 +2,7 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 0.10.27 +Version: 0.10.28 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 347e2da..ab4fa61 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -1242,6 +1242,15 @@ extern "C" { */ #define MMCAM_ROOT_DIRECTORY "root-directory" +/** + * Bitrate for encoded preview stream + */ +#define MMCAM_ENCODED_PREVIEW_BITRATE "encoded-preview-bitrate" + +/** + * GOP interval for encoded preview stream + */ +#define MMCAM_ENCODED_PREVIEW_GOP_INTERVAL "encoded-preview-gop-interval" /*======================================================================================= | ENUM DEFINITIONS | diff --git a/src/include/mm_camcorder_attribute.h b/src/include/mm_camcorder_attribute.h index 43b5859..b7b5aac 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -171,10 +171,12 @@ typedef enum MM_CAM_SUPPORT_ZSL_CAPTURE, MM_CAM_SUPPORT_ZERO_COPY_FORMAT, MM_CAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB, + MM_CAM_ENCODED_PREVIEW_BITRATE, + MM_CAM_ENCODED_PREVIEW_GOP_INTERVAL, MM_CAM_RECORDER_TAG_ENABLE, MM_CAM_DISPLAY_SOCKET_PATH, MM_CAM_PID_FOR_SOUND_FOCUS, - MM_CAM_ROOT_DIRECTORY, + MM_CAM_ROOT_DIRECTORY, /* 120 */ MM_CAM_ATTRIBUTE_NUM }MMCamcorderAttrsID; @@ -366,6 +368,8 @@ bool _mmcamcorder_commit_strobe(MMHandleType handle, int attr_idx, const mmf_val bool _mmcamcorder_commit_detect(MMHandleType handle, int attr_idx, const mmf_value_t *value); bool _mmcamcorder_commit_camera_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value); bool _mmcamcorder_commit_camera_hdr_capture(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmcamcorder_commit_encoded_preview_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value); +bool _mmcamcorder_commit_encoded_preview_gop_interval(MMHandleType handle, int attr_idx, const mmf_value_t *value); bool _mmcamcorder_commit_pid_for_sound_focus(MMHandleType handle, int attr_idx, const mmf_value_t *value); /** diff --git a/src/include/mm_camcorder_gstcommon.h b/src/include/mm_camcorder_gstcommon.h index 243bfdb..a402db3 100644 --- a/src/include/mm_camcorder_gstcommon.h +++ b/src/include/mm_camcorder_gstcommon.h @@ -167,7 +167,8 @@ bool _mmcamcorder_set_videosrc_flip(MMHandleType handle, int viderosrc_flip); bool _mmcamcorder_set_videosrc_anti_shake(MMHandleType handle, int anti_shake); bool _mmcamcorder_set_videosrc_stabilization(MMHandleType handle, int stabilization); bool _mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int height); - +bool _mmcamcorder_set_encoded_preview_bitrate(MMHandleType handle, int bitrate); +bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int gop); #ifdef __cplusplus } #endif diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 47321f8..2e001ff 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -38,6 +38,8 @@ -----------------------------------------------------------------------*/ #define MMCAMCORDER_DEFAULT_CAMERA_WIDTH 640 #define MMCAMCORDER_DEFAULT_CAMERA_HEIGHT 480 +#define MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_BITRATE (1024*1024*10) +#define MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_GOP_INTERVAL 1000 /*--------------------------------------------------------------------------------------- | GLOBAL VARIABLE DEFINITIONS for internal | @@ -1412,6 +1414,28 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) NULL, }, { + MM_CAM_ENCODED_PREVIEW_BITRATE, + "encoded-preview-bitrate", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_BITRATE}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + 0, + _MMCAMCORDER_MAX_INT, + _mmcamcorder_commit_encoded_preview_bitrate, + }, + { + MM_CAM_ENCODED_PREVIEW_GOP_INTERVAL, + "encoded-preview-gop-interval", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_GOP_INTERVAL}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + 0, + _MMCAMCORDER_MAX_INT, + _mmcamcorder_commit_encoded_preview_gop_interval, + }, + { MM_CAM_RECORDER_TAG_ENABLE, "recorder-tag-enable", MMF_VALUE_TYPE_INT, @@ -1444,6 +1468,7 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) {.int_max = _MMCAMCORDER_MAX_INT}, _mmcamcorder_commit_pid_for_sound_focus, }, + //120 { MM_CAM_ROOT_DIRECTORY, "root-directory", @@ -3989,6 +4014,66 @@ bool _mmcamcorder_commit_detect(MMHandleType handle, int attr_idx, const mmf_val } +bool _mmcamcorder_commit_encoded_preview_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value) +{ + int current_state = MM_CAMCORDER_STATE_NONE; + int preview_format = MM_PIXEL_FORMAT_NV12; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + _mmcam_dbg_log("Commit : encoded preview bitrate - %d", value->value.i_val); + + /* check preview format */ + mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FORMAT, &preview_format, NULL); + if (preview_format != MM_PIXEL_FORMAT_ENCODED_H264) { + _mmcam_dbg_err("current preview format[%d] is not encoded format", preview_format); + return FALSE; + } + + /* check state */ + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_READY) { + _mmcam_dbg_log("will be applied when preview starts"); + return TRUE; + } + + return _mmcamcorder_set_encoded_preview_bitrate(handle, value->value.i_val); +} + + +bool _mmcamcorder_commit_encoded_preview_gop_interval(MMHandleType handle, int attr_idx, const mmf_value_t *value) +{ + int current_state = MM_CAMCORDER_STATE_NONE; + int preview_format = MM_PIXEL_FORMAT_NV12; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + _mmcam_dbg_log("Commit : encoded preview I-frame interval - %d", value->value.i_val); + + /* check preview format */ + mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FORMAT, &preview_format, NULL); + if (preview_format != MM_PIXEL_FORMAT_ENCODED_H264) { + _mmcam_dbg_err("current preview format[%d] is not encoded format", preview_format); + return FALSE; + } + + /* check state */ + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_READY) { + _mmcam_dbg_log("will be applied when preview starts"); + return TRUE; + } + + return _mmcamcorder_set_encoded_preview_gop_interval(handle, value->value.i_val); +} + + bool _mmcamcorder_commit_pid_for_sound_focus(MMHandleType handle, int attr_idx, const mmf_value_t *value) { int new_pid = 0; diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 130d76c..97d2e60 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -292,6 +292,22 @@ int _mmcamcorder_create_preview_elements(MMHandleType handle) /* make demux and decoder for H264 stream from videosrc */ if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) { + int preview_bitrate = 0; + int gop_interval = 0; + + /* set encoded preview bitrate and iframe interval */ + mm_camcorder_get_attributes(handle, NULL, + MMCAM_ENCODED_PREVIEW_BITRATE, &preview_bitrate, + MMCAM_ENCODED_PREVIEW_GOP_INTERVAL, &gop_interval, + NULL); + + if (!_mmcamcorder_set_encoded_preview_bitrate(handle, preview_bitrate)) + _mmcam_dbg_warn("_mmcamcorder_set_encoded_preview_bitrate failed"); + + if (!_mmcamcorder_set_encoded_preview_gop_interval(handle, gop_interval)) + _mmcam_dbg_warn("_mmcamcorder_set_encoded_preview_gop_interval failed"); + + /* create decoder element */ _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_VIDEOSRC_DECODE, _MMCAMCORDER_VIDEO_DECODER_NAME, "videosrc_decode", element_list, err); } @@ -2456,3 +2472,80 @@ bool _mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int heig return _mmcamcorder_set_videosrc_caps(handle, sc->fourcc, width, height, fps, sc->videosrc_rotate); } + + +bool _mmcamcorder_set_encoded_preview_bitrate(MMHandleType handle, int bitrate) +{ + _MMCamcorderSubContext *sc = NULL; + GstCameraControl *CameraControl = NULL; + GstCameraControlChannel *CameraControlChannel = NULL; + const GList *controls = NULL; + const GList *item = NULL; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + sc = MMF_CAMCORDER_SUBCONTEXT(handle); + if (!sc) { + _mmcam_dbg_warn("subcontext is NULL"); + return FALSE; + } + + if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst == NULL) { + _mmcam_dbg_warn("videosrc plugin is NULL"); + return FALSE; + } + + _mmcam_dbg_log("set encoded preview bitrate : %d bps", bitrate); + + CameraControl = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + controls = gst_camera_control_list_channels(CameraControl); + _mmcam_dbg_log("controls : 0x%x", controls); + if (controls != NULL) { + _mmcam_dbg_log("controls : 0x%x", controls); + for (item = controls ; item && item->data ; item = item->next) { + CameraControlChannel = item->data; + _mmcam_dbg_log("label : %d", CameraControlChannel->label); + if (!strcmp(CameraControlChannel->label, "bitrate")) { + _mmcam_dbg_log("set encoded preview bitrate %d", bitrate); + return gst_camera_control_set_value(CameraControl, CameraControlChannel, bitrate); + } + } + + if (item == NULL) { + _mmcam_dbg_warn("failed to find \"bitrate\" control channel"); + } + } + + return FALSE; +} + + +bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int interval) +{ + _MMCamcorderSubContext *sc = NULL; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + sc = MMF_CAMCORDER_SUBCONTEXT(handle); + if (!sc) { + _mmcam_dbg_warn("subcontext is NULL"); + return FALSE; + } + + if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst == NULL) { + _mmcam_dbg_warn("videosrc plugin is NULL"); + return FALSE; + } + + _mmcam_dbg_log("set encoded preview GOP interval : %d ms", interval); + + MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "newgop-interval", interval); + + return TRUE; +}