Add new functions for extra preview bitrate 08/263308/3 accepted/tizen/unified/20210906.123805 submit/tizen/20210903.031152
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 31 Aug 2021 08:36:03 +0000 (17:36 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 2 Sep 2021 10:32:43 +0000 (19:32 +0900)
[Version] 0.10.245
[Issue Type] New feature

Change-Id: I76a51c210079fd2cf4c347f520adf4afe1614e4f
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_stillshot.h
src/mm_camcorder.c
src/mm_camcorder_stillshot.c

index 00b2c69745e8a9b0c6e585a3cc4742bbc679aa68..dc8a0883adbc207fa404260b798260fe52894a45 100755 (executable)
@@ -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
index f1c582c62857b42f195b45cb73ecefd72147fc48..2ac283a7bb87a8d73edf26d0bae3f4c68088aec1 100644 (file)
@@ -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);
 
 /**
        @}
index e46ce5f7050ea251563983098aeed74520b7cd50..24300576d44a170486336dea1df72a1c8fa05c4e 100644 (file)
@@ -683,7 +683,8 @@ typedef struct {
        int width;
        int height;
        int fps;
-       gboolean is_set;
+       int bitrate;
+       gboolean need_to_set;
 } _MMCamcorderExtraPreviewStreamFormat;
 
 /**
index fbef48cf343f1d6981090c0486781a528467a679..121a8908265c1839c71ada1fe3a81d251a719365 100644 (file)
@@ -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
 }
index 1ccd141ecafb582ef39e5e3c9ac1c58d9bc6efad..4e903eee4b2daa7674559d6e65d9c7a8552ee499 100644 (file)
@@ -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);
+}
index 305172d2b4ead0564de834d1cbf71936b2d232be..8d013467e5afe3d146c9ff0f4aa29167070c4091 100644 (file)
@@ -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, &current_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, &current_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;
+}