Add new interface to request codec config 55/283055/3
authorJeongmo Yang <jm80.yang@samsung.com>
Mon, 17 Oct 2022 09:59:58 +0000 (18:59 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 18 Oct 2022 06:15:04 +0000 (15:15 +0900)
[Version] 0.10.274
[Issue Type] New feature

Change-Id: I40ec4367cd753b8e22246112d1dac1ba9923dc25
Signed-off-by: Jeongmo Yang <jm80.yang@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 efc6e13..f7a66ab 100755 (executable)
@@ -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
index be7b87e..a171817 100644 (file)
@@ -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 */
index d0ce15e..4141143 100644 (file)
@@ -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);
 
 
 /**
index e135548..fa742c9 100644 (file)
@@ -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 */
index f2c9599..a6e2ef6 100644 (file)
@@ -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);
index 4933e86..997e77f 100644 (file)
@@ -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);
        }
 }