Add New APIs for encoded preview 76/56276/6
authorHaesu Gwon <haesu.gwon@samsung.com>
Wed, 6 Jan 2016 03:12:13 +0000 (12:12 +0900)
committerHaesu Gwon <haesu.gwon@samsung.com>
Fri, 8 Jan 2016 03:11:25 +0000 (12:11 +0900)
Change-Id: I466856321c5b312af23baf178a48f06c90aec31a
Signed-off-by: Haesu Gwon <haesu.gwon@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder.h
src/include/mm_camcorder_attribute.h
src/include/mm_camcorder_gstcommon.h
src/mm_camcorder_attribute.c
src/mm_camcorder_gstcommon.c

index e204b35..a64100a 100644 (file)
@@ -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
index 347e2da..ab4fa61 100644 (file)
@@ -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                                                                     |
index 43b5859..b7b5aac 100644 (file)
@@ -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);
 
 /**
index 243bfdb..a402db3 100644 (file)
@@ -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
index 47321f8..2e001ff 100644 (file)
@@ -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;
index 130d76c..97d2e60 100644 (file)
@@ -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;
+}