From e41069a977362a07b378452d43e57469e8618dd1 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Tue, 31 Aug 2021 17:36:03 +0900 Subject: [PATCH] Add new functions for extra preview bitrate [Version] 0.10.245 [Issue Type] New feature Change-Id: I76a51c210079fd2cf4c347f520adf4afe1614e4f Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder.h | 2 + src/include/mm_camcorder_internal.h | 3 +- src/include/mm_camcorder_stillshot.h | 2 + src/mm_camcorder.c | 10 ++++ src/mm_camcorder_stillshot.c | 85 ++++++++++++++++++++++++++-- 6 files changed, 98 insertions(+), 6 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 00b2c69..dc8a088 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.244 +Version: 0.10.245 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index f1c582c..2ac283a 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -3458,6 +3458,8 @@ 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); +int mm_camcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate); +int mm_camcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate); /** @} diff --git a/src/include/mm_camcorder_internal.h b/src/include/mm_camcorder_internal.h index e46ce5f..2430057 100644 --- a/src/include/mm_camcorder_internal.h +++ b/src/include/mm_camcorder_internal.h @@ -683,7 +683,8 @@ typedef struct { int width; int height; int fps; - gboolean is_set; + int bitrate; + gboolean need_to_set; } _MMCamcorderExtraPreviewStreamFormat; /** diff --git a/src/include/mm_camcorder_stillshot.h b/src/include/mm_camcorder_stillshot.h index fbef48c..121a890 100644 --- a/src/include/mm_camcorder_stillshot.h +++ b/src/include/mm_camcorder_stillshot.h @@ -147,6 +147,8 @@ gboolean __mmcamcorder_handoff_callback(GstElement *fakesink, GstBuffer *buffer, 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); +int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate); +int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate); #ifdef __cplusplus } diff --git a/src/mm_camcorder.c b/src/mm_camcorder.c index 1ccd141..4e903ee 100644 --- a/src/mm_camcorder.c +++ b/src/mm_camcorder.c @@ -491,3 +491,13 @@ int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str { return _mmcamcorder_get_extra_preview_stream_format(camcorder, stream_id, pixel_format, width, height, fps); } + +int mm_camcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate) +{ + return _mmcamcorder_set_extra_preview_bitrate(camcorder, stream_id, bitrate); +} + +int mm_camcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate) +{ + return _mmcamcorder_get_extra_preview_bitrate(camcorder, stream_id, bitrate); +} diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 305172d..8d01346 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -188,14 +188,17 @@ int _mmcamcorder_initialize_extra_preview_stream(MMHandleType handle) for (i = 0 ; i < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM ; i++) { e_fmt = &hcamcorder->extra_preview_format[i]; - if (!e_fmt->is_set) + if (!e_fmt->need_to_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); + MMCAM_LOG_WARNING("set format[%d,%dx%d,%d] failed for stream[%d]", + e_fmt->pixel_format, e_fmt->width, e_fmt->height, e_fmt->fps, i); + + if (!gst_camera_control_set_extra_preview_bitrate(control, i, e_fmt->bitrate)) + MMCAM_LOG_WARNING("set bitrate[%d] failed for stream[%d]", e_fmt->bitrate, i); } return MM_ERROR_NONE; @@ -2969,13 +2972,13 @@ int _mmcamcorder_set_extra_preview_stream_format(MMHandleType camcorder, int str } } else { MMCAM_LOG_INFO("It will be set when start preview"); + hcamcorder->extra_preview_format[stream_id].need_to_set = TRUE; } 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; } @@ -3025,3 +3028,77 @@ int _mmcamcorder_get_extra_preview_stream_format(MMHandleType camcorder, int str return MM_ERROR_NONE; } + + +int _mmcamcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate) +{ + 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(bitrate > 0, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + + mm_camcorder_get_state(camcorder, ¤t_state); + + MMCAM_LOG_INFO("state[%d] stream_id[%d], bitrate[%d]", current_state, stream_id, bitrate); + + 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_bitrate(control, stream_id, bitrate)) { + MMCAM_LOG_ERROR("set bitrate[%d] for stream[%d] failed", bitrate, stream_id); + return MM_ERROR_CAMCORDER_INTERNAL; + } + } else { + MMCAM_LOG_INFO("It will be set when start preview"); + hcamcorder->extra_preview_format[stream_id].need_to_set = TRUE; + } + + hcamcorder->extra_preview_format[stream_id].bitrate = bitrate; + + return MM_ERROR_NONE; +} + + +int _mmcamcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate) +{ + int _bitrate = 0; + 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(stream_id >= 0 && stream_id < MM_CAMCORDER_EXTRA_PREVIEW_STREAM_NUM, + MM_ERROR_CAMCORDER_INVALID_ARGUMENT); + mmf_return_val_if_fail(bitrate, 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_bitrate(control, stream_id, &_bitrate)) { + MMCAM_LOG_ERROR("get bitrate for stream[%d] failed", stream_id); + return MM_ERROR_CAMCORDER_INTERNAL; + } + + *bitrate = _bitrate; + } else { + *bitrate = hcamcorder->extra_preview_format[stream_id].bitrate; + } + + MMCAM_LOG_INFO("get bitrate[%d] for stream[%d][state:%d]", *bitrate, stream_id, current_state); + + return MM_ERROR_NONE; +} -- 2.34.1