From b656e84ecd0ea7fa85024ebc42af6864054cf572 Mon Sep 17 00:00:00 2001 From: Jeongmo Yang Date: Mon, 17 Oct 2022 18:59:58 +0900 Subject: [PATCH] Add new interface to request codec config [Version] 0.10.274 [Issue Type] New feature Change-Id: I40ec4367cd753b8e22246112d1dac1ba9923dc25 Signed-off-by: Jeongmo Yang --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder.h | 6 +++++ src/include/mm_camcorder_attribute.h | 2 ++ src/include/mm_camcorder_gstcommon.h | 1 + src/mm_camcorder_attribute.c | 46 ++++++++++++++++++++++++++++++++++++ src/mm_camcorder_gstcommon.c | 22 ++++++++++------- 6 files changed, 70 insertions(+), 9 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index efc6e13..f7a66ab 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.273 +Version: 0.10.274 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder.h b/src/include/mm_camcorder.h index be7b87e..a171817 100644 --- a/src/include/mm_camcorder.h +++ b/src/include/mm_camcorder.h @@ -1248,6 +1248,11 @@ extern "C" { #define MMCAM_SUPPORT_EXTRA_PREVIEW "support-extra-preview" /** + * Request codec config for encoded format + */ +#define MMCAM_REQUEST_CODEC_CONFIG "request-codec-config" + +/** * Buffer fd from user */ #define MMCAM_USER_BUFFER_FD "user-buffer-fd" @@ -1864,6 +1869,7 @@ typedef struct { unsigned char *data; unsigned int length_data; int is_delta_frame; + int is_header_included; } encoded, depth, rgb; } data; /**< pointer of captured stream */ MMCamStreamData data_type; /**< data type */ diff --git a/src/include/mm_camcorder_attribute.h b/src/include/mm_camcorder_attribute.h index d0ce15e..4141143 100644 --- a/src/include/mm_camcorder_attribute.h +++ b/src/include/mm_camcorder_attribute.h @@ -197,6 +197,7 @@ typedef enum { MM_CAM_EXTRA_PREVIEW_ENABLE, MM_CAM_CAMERA_FOCUS_LEVEL, /* 140 */ MM_CAM_SUPPORT_EXTRA_PREVIEW, + MM_CAM_REQUEST_CODEC_CONFIG, MM_CAM_ATTRIBUTE_NUM } MMCamcorderAttrsID; @@ -401,6 +402,7 @@ bool _mmcamcorder_commit_sound_stream_info(MMHandleType handle, int attr_idx, co bool _mmcamcorder_commit_tag(MMHandleType handle, int attr_idx, const MMAttrsValue *value); bool _mmcamcorder_commit_audio_replay_gain(MMHandleType handle, int attr_idx, const MMAttrsValue *value); bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const MMAttrsValue *value); +bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, const MMAttrsValue *value); /** diff --git a/src/include/mm_camcorder_gstcommon.h b/src/include/mm_camcorder_gstcommon.h index e135548..fa742c9 100644 --- a/src/include/mm_camcorder_gstcommon.h +++ b/src/include/mm_camcorder_gstcommon.h @@ -184,6 +184,7 @@ void _mmcamcorder_set_encoder_bitrate(MMCamcorderEncoderType type, int codec, in gboolean _mmcamcorder_invoke_video_stream_cb(MMHandleType handle, GstSample *sample, gboolean is_preview, int stream_id); GstPadProbeReturn __mmcamcorder_muxed_dataprobe(GstPad *pad, GstPadProbeInfo *info, gpointer u_data); GstPadProbeReturn __mmcamcorder_eventprobe_monitor(GstPad *pad, GstPadProbeInfo *info, gpointer u_data); +int _mmcamcorder_request_codec_config(GstElement *videosrc_element); #ifdef _MMCAMCORDER_PRODUCT_TV bool __mmcamcorder_find_max_resolution(MMHandleType handle, gint *max_width, gint *max_height); #endif /* _MMCAMCORDER_PRODUCT_TV */ diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index f2c9599..a6e2ef6 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -1709,6 +1709,17 @@ _mmcamcorder_alloc_attribute(MMHandleType handle) {.int_min = FALSE}, {.int_max = TRUE}, NULL, + }, + { + MM_CAM_REQUEST_CODEC_CONFIG, + "request-codec-config", + MM_ATTRS_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)FALSE}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + {.int_min = FALSE}, + {.int_max = TRUE}, + _mmcamcorder_commit_request_codec_config, } }; @@ -4839,6 +4850,41 @@ bool _mmcamcorder_commit_extra_preview(MMHandleType handle, int attr_idx, const } +bool _mmcamcorder_commit_request_codec_config(MMHandleType handle, int attr_idx, const MMAttrsValue *value) +{ + int ret = MM_ERROR_NONE; + int current_state = MM_CAMCORDER_STATE_NONE; + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + _MMCamcorderSubContext *sc = NULL; + + mmf_return_val_if_fail(hcamcorder && value, FALSE); + + if (hcamcorder->type != MM_CAMCORDER_MODE_VIDEO_CAPTURE) { + MMCAM_LOG_ERROR("invalid mode %d", hcamcorder->type); + return FALSE; + } + + MMCAM_LOG_INFO("Request codec config"); + + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_READY) { + MMCAM_LOG_INFO("invalid state[%d]", current_state); + return FALSE; + } + + sc = MMF_CAMCORDER_SUBCONTEXT(handle); + mmf_return_val_if_fail(sc, FALSE); + + ret = _mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + if (ret != MM_ERROR_NONE) { + hcamcorder->error_code = ret; + return FALSE; + } + + return TRUE; +} + + bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle) { mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); diff --git a/src/mm_camcorder_gstcommon.c b/src/mm_camcorder_gstcommon.c index 4933e86..997e77f 100644 --- a/src/mm_camcorder_gstcommon.c +++ b/src/mm_camcorder_gstcommon.c @@ -157,7 +157,6 @@ static guint32 _mmcamcorder_get_structure_fourcc(const GstStructure *structure); static gboolean __mmcamcorder_set_stream_data(MMCamcorderVideoStreamDataType *stream, GstBuffer *buffer, GstMapInfo *map_info); static gboolean __mmcamcorder_set_stream_data_zero_copy(MMCamcorderVideoStreamDataType *stream, GstBuffer *buffer, GstMemory *memory); static const char *__mmcamcorder_get_parser_name(MMPixelFormatType format); -static void __mmcamcorder_request_codec_config(GstElement *videosrc_element); /*======================================================================================= | FUNCTION DEFINITIONS | @@ -236,6 +235,7 @@ static gboolean __mmcamcorder_set_stream_data(MMCamcorderVideoStreamDataType *st stream->data.encoded.data = map_info->data; stream->data.encoded.length_data = stream->length_total; stream->data.encoded.is_delta_frame = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + stream->data.encoded.is_header_included = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_HEADER); stream->num_planes = 1; break; @@ -297,9 +297,12 @@ static gboolean __mmcamcorder_set_stream_data_zero_copy(MMCamcorderVideoStreamDa stream->length_total = gst_memory_get_sizes(memory, NULL, NULL); stream->data.encoded.length_data = stream->length_total; stream->data.encoded.is_delta_frame = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + stream->data.encoded.is_header_included = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_HEADER); - MMCAM_LOG_VERBOSE("[ENCODED] length[%u], is_delta[%d]", - stream->data.encoded.length_data, stream->data.encoded.is_delta_frame); + MMCAM_LOG_VERBOSE("[ENCODED] length[%u], is_delta[%d], is_header_included[%d]", + stream->data.encoded.length_data, + stream->data.encoded.is_delta_frame, + stream->data.encoded.is_header_included); return TRUE; } @@ -388,22 +391,24 @@ static const char *__mmcamcorder_get_parser_name(MMPixelFormatType format) } -static void __mmcamcorder_request_codec_config(GstElement *videosrc_element) +int _mmcamcorder_request_codec_config(GstElement *videosrc_element) { if (!videosrc_element || !G_TYPE_CHECK_INSTANCE(videosrc_element)) { MMCAM_LOG_WARNING("invalid videosrc element[%p]", videosrc_element); - return; + return MM_ERROR_CAMCORDER_INVALID_ARGUMENT; } if (!g_signal_parse_name(_MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG, G_TYPE_FROM_INSTANCE(videosrc_element), NULL, NULL, FALSE)) { MMCAM_LOG_WARNING("no signal[%s]", _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG); - return; + return MM_ERROR_CAMCORDER_NOT_SUPPORTED; } MMCAM_LOG_INFO("emit signal[%s]", _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG); g_signal_emit_by_name(videosrc_element, _MMCAMCORDER_SIGNAL_REQUEST_CODEC_CONFIG); + + return MM_ERROR_NONE; } @@ -1772,6 +1777,7 @@ pipeline_creation_error: void _mmcamcorder_ready_to_encode_callback(GstElement *element, guint size, gpointer handle) { + int ret = MM_ERROR_NONE; mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); _MMCamcorderSubContext *sc = NULL; @@ -1784,8 +1790,8 @@ void _mmcamcorder_ready_to_encode_callback(GstElement *element, guint size, gpoi /* set flag */ if (sc->info_video->push_encoding_buffer == PUSH_ENCODING_BUFFER_INIT) { sc->info_video->push_encoding_buffer = PUSH_ENCODING_BUFFER_RUN; - __mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); - MMCAM_LOG_WARNING("start to push buffer to encoding pipeline"); + ret = _mmcamcorder_request_codec_config(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); + MMCAM_LOG_WARNING("Push buffer to encoding pipeline[request codec config:0x%x]", ret); } } -- 2.7.4