Add new functions for extra preview stream format 32/259832/8 accepted/tizen/unified/20210621.123215 submit/tizen/20210618.081505
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 15 Jun 2021 00:29:07 +0000 (09:29 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 18 Jun 2021 07:50:04 +0000 (16:50 +0900)
[Version] 0.10.240
[Issue Type] New feature

Change-Id: I28971ea91dae20d93af7f921d1820ce7bcc836ba
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
12 files changed:
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_stillshot.h
src/include/mm_camcorder_util.h
src/mm_camcorder.c
src/mm_camcorder_attribute.c
src/mm_camcorder_gstcommon.c
src/mm_camcorder_internal.c
src/mm_camcorder_stillshot.c
src/mm_camcorder_util.c
src/mm_camcorder_videorec.c

index 28686a2..74ec2a7 100755 (executable)
@@ -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
index 1347c86..f1c582c 100644 (file)
@@ -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);
+
 /**
        @}
  */
index 0387966..e46ce5f 100644 (file)
@@ -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                                                                     |
@@ -675,6 +676,17 @@ typedef struct {
 } _MMCamcorderReplayGain;
 
 /**
+ * MMCamcorder Extra preview stream format
+ */
+typedef struct {
+       int pixel_format;
+       int width;
+       int height;
+       int fps;
+       gboolean is_set;
+} _MMCamcorderExtraPreviewStreamFormat;
+
+/**
  * MMCamcorder Sub Context
  */
 typedef struct {
@@ -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;
 
index 22c19c9..fbef48c 100644 (file)
@@ -122,15 +122,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.
  *
  * @param[in]  handle          Handle of camcorder context.
@@ -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
index d93ff2c..d065bfa 100644 (file)
@@ -28,6 +28,7 @@
 #include <gio/gio.h>
 #include <linux/magic.h>
 #include <storage.h>
+#include <gst/video/cameracontrol.h>
 
 
 #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,
index eb74509..1ccd141 100644 (file)
@@ -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);
+}
index e9e7637..320faf1 100644 (file)
@@ -27,7 +27,6 @@
 #include "mm_camcorder_gstcommon.h"
 
 #include <gst/video/colorbalance.h>
-#include <gst/video/cameracontrol.h>
 #include <gst/video/videooverlay.h>
 
 /*-----------------------------------------------------------------------
index d866c1b..58f9b2b 100755 (executable)
@@ -25,7 +25,6 @@
 #include <gst/allocators/gsttizenmemory.h>
 #include <gst/audio/audio-format.h>
 #include <gst/video/videooverlay.h>
-#include <gst/video/cameracontrol.h>
 
 #include <sys/time.h>
 #include <unistd.h>
index d43e79f..bc3ca34 100644 (file)
@@ -36,7 +36,6 @@
 #include <mm_types.h>
 
 #include <gst/video/colorbalance.h>
-#include <gst/video/cameracontrol.h>
 #include <asm/types.h>
 
 #include <system_info.h>
@@ -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;
        }
index 3e02677..305172d 100644 (file)
@@ -25,7 +25,6 @@
 #include <stdlib.h>
 #include <sys/time.h>
 #include <sys/times.h>
-#include <gst/video/cameracontrol.h>
 #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, &current_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, &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_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;
+}
index 3babfdd..23e7f5e 100644 (file)
@@ -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;
index b128b11..42c6c45 100644 (file)
@@ -23,7 +23,6 @@
 |  INCLUDE FILES                                                                                                                                               |
 =======================================================================================*/
 #include <gst/allocators/gsttizenmemory.h>
-#include <gst/video/cameracontrol.h>
 #include <gst/app/gstappsrc.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_videorec.h"