From ae343049a019912dd965d9405e1a15813a071c6b Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Fri, 6 Dec 2019 17:16:15 +0900 Subject: [PATCH] Update code for encoded preview setting [Version] 0.10.191 [Profile] Common [Issue Type] Update Change-Id: I39eebc1d0ac65d1eb368fd60b80cb867846b3270 Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder_gstcommon.h | 2 +- src/mm_camcorder_gstcommon.c | 28 ++++-------------- src/mm_camcorder_stillshot.c | 16 +++++++--- src/mm_camcorder_videorec.c | 57 +++++++++--------------------------- 5 files changed, 33 insertions(+), 72 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index a93758a..f4c5eb4 100644 --- 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.190 +Version: 0.10.191 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder_gstcommon.h b/src/include/mm_camcorder_gstcommon.h index 01250aa..7babef8 100644 --- a/src/include/mm_camcorder_gstcommon.h +++ b/src/include/mm_camcorder_gstcommon.h @@ -178,7 +178,7 @@ 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); +bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int gop_interval); bool _mmcamcorder_set_sound_stream_info(GstElement *element, char *stream_type, int stream_index); void _mmcamcorder_set_encoder_bitrate(MMCamcorderEncoderType type, int codec, int bitrate, GstElement *element); GstPadProbeReturn __mmcamcorder_muxed_dataprobe(GstPad *pad, GstPadProbeInfo *info, gpointer u_data); diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index a0da705..fc4d1e8 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -2953,10 +2953,6 @@ bool _mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int heig 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"); @@ -2976,27 +2972,13 @@ bool _mmcamcorder_set_encoded_preview_bitrate(MMHandleType handle, int bitrate) _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 : %p", controls); - if (controls != NULL) { - for (item = controls ; item && item->data ; item = item->next) { - CameraControlChannel = item->data; - _mmcam_dbg_log("label : %s", 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); - } - } - - _mmcam_dbg_warn("failed to find \"bitrate\" control channel"); - } + MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "bitrate", bitrate); - return FALSE; + return TRUE; } -bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int interval) +bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int gop_interval) { _MMCamcorderSubContext *sc = NULL; @@ -3016,9 +2998,9 @@ bool _mmcamcorder_set_encoded_preview_gop_interval(MMHandleType handle, int inte return FALSE; } - _mmcam_dbg_log("set encoded preview GOP interval : %d ms", interval); + _mmcam_dbg_log("set encoded preview GOP interval : %d ms", gop_interval); - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "newgop-interval", interval); + MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "gop-interval", gop_interval); return TRUE; } diff --git a/src/mm_camcorder_stillshot.c b/src/mm_camcorder_stillshot.c index 0b0ab0e..5fc9c95 100644 --- a/src/mm_camcorder_stillshot.c +++ b/src/mm_camcorder_stillshot.c @@ -53,8 +53,6 @@ do { \ #define THUMBNAIL_JPEG_QUALITY 90 #define TRY_LOCK_MAX_COUNT 100 #define TRY_LOCK_TIME 20000 /* ms */ -#define H264_PREVIEW_BITRATE 1024*10 /* kbps */ -#define H264_PREVIEW_NEWGOP_INTERVAL 1000 /* ms */ #define _MMCAMCORDER_MAKE_THUMBNAIL_INTERNAL_ENCODE @@ -633,6 +631,8 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle) int height = 0; int fps = 0; int rotation = 0; + int bitrate = 0; + int gop_interval = 0; unsigned int current_framecount = 0; int current_state = MM_CAMCORDER_STATE_NONE; gboolean fps_auto = FALSE; @@ -817,8 +817,16 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle) _mmcamcorder_sound_finalize(handle); } else { if (info->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) { - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "bitrate", H264_PREVIEW_BITRATE); - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "newgop-interval", H264_PREVIEW_NEWGOP_INTERVAL); + ret = mm_camcorder_get_attributes(handle, NULL, + MMCAM_ENCODED_PREVIEW_BITRATE, &bitrate, + MMCAM_ENCODED_PREVIEW_GOP_INTERVAL, &gop_interval, + NULL); + if (ret == MM_ERROR_NONE) { + _mmcamcorder_set_encoded_preview_bitrate(handle, bitrate); + _mmcamcorder_set_encoded_preview_gop_interval(handle, gop_interval); + } else { + _mmcam_dbg_err("failed to get encoded preview setting"); + } } MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", FALSE); diff --git a/src/mm_camcorder_videorec.c b/src/mm_camcorder_videorec.c index 7eac0b9..f7d0c42 100644 --- a/src/mm_camcorder_videorec.c +++ b/src/mm_camcorder_videorec.c @@ -501,14 +501,12 @@ int _mmcamcorder_video_command(MMHandleType handle, int command) int size = 0; int fileformat = 0; int count = 0; + int gop_interval = 0; int ret = MM_ERROR_NONE; double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE; char *err_name = NULL; char *target_filename = NULL; GstCameraControl *CameraControl = NULL; - GstCameraControlChannel *CameraControlChannel = NULL; - const GList *controls = NULL; - const GList *item = NULL; gint fps = 0; GstElement *pipeline = NULL; @@ -822,49 +820,22 @@ int _mmcamcorder_video_command(MMHandleType handle, int command) goto _ERR_CAMCORDER_VIDEO_COMMAND; } - /*set the camera control to create the GOP so that video record will get a new key frame*/ - if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264 && - GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) { - CameraControl = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); - controls = gst_camera_control_list_channels(CameraControl); - if (controls != NULL) { - for (item = controls ; item && item->data ; item = item->next) { - CameraControlChannel = item->data; - _mmcam_dbg_log("CameraControlChannel->label %s", CameraControlChannel->label); - if (!strcmp(CameraControlChannel->label, "new-gop")) { - /* gst_camera_control_set_value(CameraControl, CameraControlChannel, 1); */ - break; - } - } - - if (item == NULL) - _mmcam_dbg_warn("failed to find new-gop control channel"); - } - } else { - _mmcam_dbg_warn("Can't cast Video source into camera control or not H264 prevew format[%d]", - sc->info_image->preview_format); + /*set the GOP so that video record will get a new key frame*/ + if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) { + if (mm_camcorder_get_attributes(handle, NULL, + MMCAM_ENCODED_PREVIEW_GOP_INTERVAL, &gop_interval, NULL) == MM_ERROR_NONE) + _mmcamcorder_set_encoded_preview_gop_interval(handle, gop_interval); + else + _mmcam_dbg_err("get gop interval failed"); } } else { /* Resume case */ - - if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264 && - GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) { - /* generate and I-frame on resuming */ - CameraControl = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); - controls = gst_camera_control_list_channels(CameraControl); - if (controls != NULL) { - for (item = controls ; item && item->data ; item = item->next) { - CameraControlChannel = item->data; - _mmcam_dbg_log("CameraControlChannel->label %s", CameraControlChannel->label); - if (!strcmp(CameraControlChannel->label, "new-gop")) { - /* gst_camera_control_set_value(CameraControl, CameraControlChannel, 1); */ - break; - } - } - - if (item == NULL) - _mmcam_dbg_warn("failed to find new-gop control channel"); - } + if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ENCODED_H264) { + if (mm_camcorder_get_attributes(handle, NULL, + MMCAM_ENCODED_PREVIEW_GOP_INTERVAL, &gop_interval, NULL) == MM_ERROR_NONE) + _mmcamcorder_set_encoded_preview_gop_interval(handle, gop_interval); + else + _mmcam_dbg_err("get gop interval failed"); } MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "runtime-pause", FALSE); -- 2.7.4