From da72a32bcfc44dd42a017af2b14dad35be519c13 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 15 Jun 2021 09:29:07 +0900 Subject: [PATCH] Add new functions for extra preview stream format [Version] 0.10.240 [Issue Type] New feature Change-Id: I28971ea91dae20d93af7f921d1820ce7bcc836ba Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder.h | 4 + src/include/mm_camcorder_internal.h | 17 +++- src/include/mm_camcorder_stillshot.h | 14 ++-- src/include/mm_camcorder_util.h | 3 + src/mm_camcorder.c | 10 +++ src/mm_camcorder_attribute.c | 1 - src/mm_camcorder_gstcommon.c | 1 - src/mm_camcorder_internal.c | 3 +- src/mm_camcorder_stillshot.c | 115 ++++++++++++++++++++++++++- src/mm_camcorder_util.c | 54 +++++++++++++ src/mm_camcorder_videorec.c | 1 - 12 files changed, 207 insertions(+), 18 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 28686a2..74ec2a7 100755 --- 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.239 +Version: 0.10.240 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index 1347c86..f1c582c 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -3455,6 +3455,10 @@ int mm_camcorder_get_focus_level(MMHandleType camcorder, int *level); /* get log level */ int mm_camcorder_get_log_level(void); +/* extra preview */ +int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps); +int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps); + /** @} */ diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index 0387966..e46ce5f 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -485,6 +485,7 @@ do { \ #define MM_CAMCORDER_STROBE_MODE_NUM 8 /**< Number of strobe mode type */ #define MM_CAMCORDER_STROBE_CONTROL_NUM 3 /**< Number of strobe control type */ #define MM_CAMCORDER_DETECT_MODE_NUM 2 /**< Number of detect mode type */ +#define MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM 10 /**< Number of extra preview stream */ /*======================================================================================= | ENUM DEFINITIONS | @@ -674,6 +675,17 @@ typedef struct { gdouble album_gain; } _MMCamcorderReplayGain; +/** + * MMCamcorder Extra preview stream format + */ +typedef struct { + int pixel_format; + int width; + int height; + int fps; + gboolean is_set; +} _MMCamcorderExtraPreviewStreamFormat; + /** * MMCamcorder Sub Context */ @@ -777,7 +789,6 @@ typedef struct mmf_camcorder { int use_videoconvert; /**< Whether use videoconvert element for display */ int support_media_packet_preview_cb; /**< Whether support zero copy format for camera input */ int support_user_buffer; /**< Whether support user allocated buffer for zero copy */ - int support_extra_preview; /**< Whether support extra preview stream */ int shutter_sound_policy; /**< shutter sound policy */ int brightness_default; /**< default value of brightness */ int brightness_step_denominator; /**< denominator of brightness bias step */ @@ -838,6 +849,10 @@ typedef struct mmf_camcorder { /* Profiling */ int measure_preview_fps; /**< Flag for measuring fps of preview frames */ + /* Extra preview */ + int support_extra_preview; + _MMCamcorderExtraPreviewStreamFormat extra_preview_format[MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM]; + int reserved[4]; /**< reserved */ } mmf_camcorder_t; diff --git a/src/include/mm_camcorder_stillshot.h b/src/include/mm_camcorder_stillshot.h index 22c19c9..fbef48c 100644 --- a/src/include/mm_camcorder_stillshot.h +++ b/src/include/mm_camcorder_stillshot.h @@ -121,15 +121,6 @@ int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle); */ int _mmcamcorder_connect_capture_signal(MMHandleType handle); -/** - * This function connects extra preview stream signal. - * - * @param[in] handle Handle of camcorder context. - * @return This function returns MM_ERROR_NONE on success, or the other values on error. - * @remarks - */ -int _mmcamcorder_connect_extra_preview_stream(MMHandleType handle); - /** * This function destroy image pipeline. * @@ -152,6 +143,11 @@ int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureD int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail, int provide_exif); gboolean __mmcamcorder_handoff_callback(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data); +/* extra preview */ +int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle); +int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps); +int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps); + #ifdef __cplusplus } #endif diff --git a/src/include/mm_camcorder_util.h b/src/include/mm_camcorder_util.h index d93ff2c..d065bfa 100644 --- a/src/include/mm_camcorder_util.h +++ b/src/include/mm_camcorder_util.h @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef __cplusplus @@ -304,6 +305,8 @@ void _mmcamcorder_remove_message_all(MMHandleType handle); int _mmcamcorder_get_pixel_format(GstCaps *pad); int _mmcamcorder_get_pixtype(unsigned int fourcc); unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format); +MMPixelFormatType _mmcamcorder_get_pixel_format2(GstCameraControlImageFormat img_fmt); +GstCameraControlImageFormat _mmcamcorder_get_camera_control_image_format(int pixel_format); /* JPEG encode */ gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsigned int src_height, diff --git a/src/mm_camcorder.c b/src/mm_camcorder.c index eb74509..1ccd141 100644 --- a/src/mm_camcorder.c +++ b/src/mm_camcorder.c @@ -481,3 +481,13 @@ int mm_camcorder_get_log_level(void) { return _mmcamcorder_get_log_level(); } + +int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps) +{ + return _mmcamcorder_set_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps); +} + +int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps) +{ + return _mmcamcorder_get_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps); +} diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index e9e7637..320faf1 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -27,7 +27,6 @@ #include "mm_camcorder_gstcommon.h" #include -#include #include /*----------------------------------------------------------------------- diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index d866c1b..58f9b2b 100755 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -25,7 +25,6 @@ #include #include #include -#include #include #include diff --git a/src/mm_camcorder_internal.c b/src/mm_camcorder_internal.c index d43e79f..bc3ca34 100644 --- a/src/mm_camcorder_internal.c +++ b/src/mm_camcorder_internal.c @@ -36,7 +36,6 @@ #include #include -#include #include #include @@ -3135,7 +3134,7 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type) } if (hcamcorder->support_extra_preview && - _mmcamcorder_connect_extra_preview_stream(handle) != MM_ERROR_NONE) + _mmcamcorder_initialize_extra_preview_stream(handle) != MM_ERROR_NONE) MMCAM_LOG_WARNING("connect extra preview stream signal failed"); break; } diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 3e02677..305172d 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -25,7 +25,6 @@ #include #include #include -#include #include "mm_camcorder_internal.h" #include "mm_camcorder_stillshot.h" #include "mm_camcorder_exifinfo.h" @@ -158,10 +157,13 @@ int _mmcamcorder_connect_capture_signal(MMHandleType handle) } -int _mmcamcorder_connect_extra_preview_stream(MMHandleType handle) +int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle) { + int i = 0; mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; + GstCameraControl *control = NULL; + _MMCamcorderExtraPreviewStreamFormat *e_fmt = NULL; mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED); @@ -177,6 +179,25 @@ int _mmcamcorder_connect_extra_preview_stream(MMHandleType handle) G_CALLBACK(__mmcamcorder_extra_preview_stream_cb), hcamcorder); + control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + if (!control) { + MMCAM_LOG_ERROR("no camera control"); + return MM_ERROR_CAMCORDER_NOT_SUPPORTED; + } + + for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) { + e_fmt = &hcamcorder->extra_preview_format[i]; + + if (!e_fmt->is_set) + continue; + + if (!gst_camera_control_set_extra_preview_stream_format(control, + i, _mmcamcorder_get_pixel_format2(e_fmt->pixel_format), + e_fmt->width, e_fmt->height, e_fmt->fps)) + MMCAM_LOG_WARNING("set failed[%d],[%d,%dx%d,%d]", + i, e_fmt->pixel_format, e_fmt->width, e_fmt->height, e_fmt->fps); + } + return MM_ERROR_NONE; } @@ -2914,3 +2935,93 @@ static void __sound_status_changed_cb(keynode_t* node, void *data) return; } + + +int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps) +{ + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; + GstCameraControl *control = NULL; + _MMCamcorderSubContext *sc = NULL; + + mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED); + mmf_return_val_if_fail(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM, + MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(pixel_format > MM_PIXEL_FORMAT_INVALID && pixel_format < MM_PIXEL_FORMAT_NUM, + MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(width > 0 && height > 0 && fps >= 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + mm_camcorder_get_state(camcorder, ¤t_state); + + MMCAM_LOG_INFO("state[%d] stream_id[%d],fmt[%d],res[%dx%d],fps[%d]", + current_state, stream_id, pixel_format, width, height, fps); + + if (current_state >= MM_CAMCORDER_STATE_READY) { + sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + if (!gst_camera_control_set_extra_preview_stream_format(control, + stream_id, _mmcamcorder_get_camera_control_image_format(pixel_format), width, height, fps)) { + MMCAM_LOG_ERROR("camera control failed"); + return MM_ERROR_CAMCORDER_INTERNAL; + } + } else { + MMCAM_LOG_INFO("It will be set when start preview"); + } + + hcamcorder->extra_preview_format[stream_id].pixel_format = pixel_format; + hcamcorder->extra_preview_format[stream_id].width = width; + hcamcorder->extra_preview_format[stream_id].height = height; + hcamcorder->extra_preview_format[stream_id].fps = fps; + hcamcorder->extra_preview_format[stream_id].is_set = TRUE; + + return MM_ERROR_NONE; +} + + +int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps) +{ + int _width = 0; + int _height = 0; + int _fps = 0; + GstCameraControlImageFormat _img_fmt = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12; + GstCameraControl *control = NULL; + mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)camcorder; + MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE; + _MMCamcorderSubContext *sc = NULL; + + mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(hcamcorder->support_extra_preview, MM_ERROR_CAMCORDER_NOT_SUPPORTED); + mmf_return_val_if_fail(pixel_format && width && height && fps, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + mm_camcorder_get_state(camcorder, ¤t_state); + + if (current_state >= MM_CAMCORDER_STATE_READY) { + sc = MMF_CAMCORDER_SUBCONTEXT(camcorder); + mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + if (!gst_camera_control_get_extra_preview_stream_format(control, + stream_id, &_img_fmt, &_width, &_height, &_fps)) { + MMCAM_LOG_ERROR("extra preview stream format get failed"); + return MM_ERROR_CAMCORDER_INTERNAL; + } + + *pixel_format = _mmcamcorder_get_pixel_format2(_img_fmt); + *width = _width; + *height = _height; + *fps = _fps; + } else { + *pixel_format = hcamcorder->extra_preview_format[stream_id].pixel_format; + *width = hcamcorder->extra_preview_format[stream_id].width; + *height = hcamcorder->extra_preview_format[stream_id].height; + *fps = hcamcorder->extra_preview_format[stream_id].fps; + } + + MMCAM_LOG_INFO("get result[fmt:%d(%d),res:%dx%d,fps:%d][state:%d]", + *pixel_format, _img_fmt, *width, *height, *fps, current_state); + + return MM_ERROR_NONE; +} diff --git a/src/mm_camcorder_util.c b/src/mm_camcorder_util.c index 3babfdd..23e7f5e 100644 --- a/src/mm_camcorder_util.c +++ b/src/mm_camcorder_util.c @@ -1570,6 +1570,60 @@ int _mmcamcorder_get_pixel_format(GstCaps *caps) } +MMPixelFormatType _mmcamcorder_get_pixel_format2(GstCameraControlImageFormat img_fmt) +{ + const MMPixelFormatType pixel_format_table[] = { + [GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12] = MM_PIXEL_FORMAT_NV12, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_NV21] = MM_PIXEL_FORMAT_NV21, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_I420] = MM_PIXEL_FORMAT_I420, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_YV12] = MM_PIXEL_FORMAT_YV12, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_YUYV] = MM_PIXEL_FORMAT_YUYV, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_UYVY] = MM_PIXEL_FORMAT_UYVY, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_BGRA] = MM_PIXEL_FORMAT_RGBA, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_ARGB] = MM_PIXEL_FORMAT_ARGB, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_JPEG] = MM_PIXEL_FORMAT_ENCODED, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_H264] = MM_PIXEL_FORMAT_ENCODED_H264, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_MJPEG] = MM_PIXEL_FORMAT_ENCODED_MJPEG, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_VP8] = MM_PIXEL_FORMAT_ENCODED_VP8, + [GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9] = MM_PIXEL_FORMAT_ENCODED_VP9, + }; + + if (img_fmt < GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12 || img_fmt > GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9) { + MMCAM_LOG_ERROR("invalid format[%d], return default[NV12]", img_fmt); + return MM_PIXEL_FORMAT_NV12; + } + + return pixel_format_table[img_fmt]; +} + + +GstCameraControlImageFormat _mmcamcorder_get_camera_control_image_format(int pixel_format) +{ + const GstCameraControlImageFormat img_fmt_table[] = { + [MM_PIXEL_FORMAT_NV12] = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12, + [MM_PIXEL_FORMAT_NV21] = GST_CAMERA_CONTROL_IMAGE_FORMAT_NV21, + [MM_PIXEL_FORMAT_I420] = GST_CAMERA_CONTROL_IMAGE_FORMAT_I420, + [MM_PIXEL_FORMAT_YV12] = GST_CAMERA_CONTROL_IMAGE_FORMAT_YV12, + [MM_PIXEL_FORMAT_YUYV] = GST_CAMERA_CONTROL_IMAGE_FORMAT_YUYV, + [MM_PIXEL_FORMAT_UYVY] = GST_CAMERA_CONTROL_IMAGE_FORMAT_UYVY, + [MM_PIXEL_FORMAT_RGBA] = GST_CAMERA_CONTROL_IMAGE_FORMAT_BGRA, + [MM_PIXEL_FORMAT_ARGB] = GST_CAMERA_CONTROL_IMAGE_FORMAT_ARGB, + [MM_PIXEL_FORMAT_ENCODED] = GST_CAMERA_CONTROL_IMAGE_FORMAT_JPEG, + [MM_PIXEL_FORMAT_ENCODED_H264] = GST_CAMERA_CONTROL_IMAGE_FORMAT_H264, + [MM_PIXEL_FORMAT_ENCODED_MJPEG] = GST_CAMERA_CONTROL_IMAGE_FORMAT_MJPEG, + [MM_PIXEL_FORMAT_ENCODED_VP8] = GST_CAMERA_CONTROL_IMAGE_FORMAT_VP8, + [MM_PIXEL_FORMAT_ENCODED_VP9] = GST_CAMERA_CONTROL_IMAGE_FORMAT_VP9 + }; + + if (pixel_format < MM_PIXEL_FORMAT_NV12 || pixel_format > MM_PIXEL_FORMAT_ENCODED_VP9) { + MMCAM_LOG_ERROR("invalid format[%d], return default[NV12]", pixel_format); + return GST_CAMERA_CONTROL_IMAGE_FORMAT_NV12; + } + + return img_fmt_table[pixel_format]; +} + + unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_copy_format) { unsigned int fourcc = 0; diff --git a/src/mm_camcorder_videorec.c b/src/mm_camcorder_videorec.c index b128b11..42c6c45 100644 --- a/src/mm_camcorder_videorec.c +++ b/src/mm_camcorder_videorec.c @@ -23,7 +23,6 @@ | INCLUDE FILES | =======================================================================================*/ #include -#include #include #include "mm_camcorder_internal.h" #include "mm_camcorder_videorec.h" -- 2.34.1