Add property setting in ini 01/282201/5 accepted/tizen_7.0_unified_hotfix tizen_7.0_hotfix accepted/tizen/7.0/unified/hotfix/20221116.104718 accepted/tizen/unified/20220929.140030 tizen_7.0_m2_release
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 28 Sep 2022 05:49:54 +0000 (14:49 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 28 Sep 2022 07:31:26 +0000 (16:31 +0900)
- Add property name for bitrate of encoder.
- Add extra properties and values.

[Version] 0.6.26
[Issue Type] New feature

Change-Id: Ie487df68a1105a6b5be538d7238ab96c7b16aec0
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
include/media_codec_ini.h
include/media_codec_port_gst.h
include/media_codec_spec_emul.h
packaging/capi-media-codec.spec
src/media_codec_ini.c
src/media_codec_port.c
src/media_codec_port_gst.c

index bdf22ba..dbd7c5e 100644 (file)
 extern "C" {
 #endif
 
-#define MEDIA_CODEC_INI_DEFAULT_PATH   SYSCONFDIR"/multimedia/mmfw_media_codec.ini"
-#define MEDIA_CODEC_INI_MAX_STRLEN     256
-#define MEDIA_CODEC_INI_CNAME_LEN      16
-#define DEFAULT_PORT "GST_PORT"
-#define MEDIA_CODEC_MAX_CODEC_TYPE 100
-
-#define MEDICODEC_INI_MAX_ELEMENT 10
-#define MEDIA_CODEC_MAX_VIDEO_CODEC 100
-#define MEDIA_CODEC_MAX_AUDIO_CODEC 100
+#define MEDIA_CODEC_INI_DEFAULT_PATH    SYSCONFDIR"/multimedia/mmfw_media_codec.ini"
+#define MEDIA_CODEC_INI_MAX_STRLEN      256
+#define MEDIA_CODEC_INI_STRLEN          32
+#define MEDIA_CODEC_INI_CNAME_LEN       16
+#define DEFAULT_PORT                    "GST_PORT"
+#define MEDIA_CODEC_MAX_CODEC_TYPE      100
+#define MEDIA_CODEC_MAX_PROPERTY_EXT    5
+
+#define MEDICODEC_INI_MAX_ELEMENT       10
+#define MEDIA_CODEC_MAX_VIDEO_CODEC     100
+#define MEDIA_CODEC_MAX_AUDIO_CODEC     100
 
 typedef struct _codec_list_t codec_list_t;
 typedef struct _codec_info_t codec_info_t;
+typedef struct _codec_property_t codec_property_t;
 typedef struct _codec_t codec_t;
 typedef struct _mc_ini_t mc_ini_t;
 
@@ -60,10 +63,27 @@ typedef enum {
        MEDIA_CODEC_ROLE_MAX
 } codec_role;
 
+typedef enum {
+       MEDIA_CODEC_INFO_NAME = 0,
+       MEDIA_CODEC_INFO_MIME,
+       MEDIA_CODEC_INFO_FORMAT,
+       MEDIA_CODEC_INFO_PROPERTY_BITRATE_NAME,
+       MEDIA_CODEC_INFO_PROPERTY_EXT_NAME,
+       MEDIA_CODEC_INFO_PROPERTY_EXT_VALUE
+} codec_info;
+
+struct _codec_property_t {
+       gchar bitrate_name[MEDIA_CODEC_INI_STRLEN];
+       gchar ext_name[MEDIA_CODEC_MAX_PROPERTY_EXT][MEDIA_CODEC_INI_STRLEN];
+       gchar ext_value[MEDIA_CODEC_MAX_PROPERTY_EXT][MEDIA_CODEC_INI_STRLEN];
+       gint ext_num;
+};
+
 struct _codec_info_t {
-       gchar name[MEDIA_CODEC_INI_MAX_STRLEN];
-       gchar mime[MEDIA_CODEC_INI_MAX_STRLEN];
-       gchar format[MEDIA_CODEC_INI_MAX_STRLEN];
+       gchar name[MEDIA_CODEC_INI_STRLEN];
+       gchar mime[MEDIA_CODEC_INI_STRLEN];
+       gchar format[MEDIA_CODEC_INI_STRLEN];
+       codec_property_t property;
 };
 
 struct _codec_t {
@@ -80,7 +100,7 @@ struct _mc_ini_t {
        port_mode port_type;
        /* general */
        gchar port_name[MEDIA_CODEC_INI_MAX_STRLEN];
-       codec_t  codec[MEDIA_CODEC_MAX_CODEC_TYPE];
+       codec_t codec[MEDIA_CODEC_MAX_CODEC_TYPE];
 };
 
 /*Default sink ini values*/
index f3fe9a5..8b086e6 100644 (file)
@@ -135,6 +135,7 @@ struct _mc_gst_core_t {
        media_format_h output_fmt;
        mc_gst_port_t *ports[2];
        mc_bitstream_t bits;
+       mc_codec_type_t *codec_type;
 
        mc_aqueue_t *available_queue;
        GQueue *output_queue;
index 96bb3fb..08e0705 100644 (file)
@@ -22,6 +22,7 @@ extern "C" {
 #endif
 
 #include <media_codec_private.h>
+#include <media_codec_ini.h>
 
 #define MEDIA_CODEC_MAX_CODEC_TYPE 100
 
@@ -42,6 +43,7 @@ struct _mc_codec_type_t {
        char *factory_name;
        char *mime;
        media_format_mimetype_e out_format;
+       codec_property_t *property;
 };
 
 struct _mc_codec_map_t {
index 0cede0a..ce40850 100644 (file)
@@ -4,7 +4,7 @@
 
 Name:       capi-media-codec
 Summary:    A Media Codec library in Tizen Native API
-Version:    0.6.25
+Version:    0.6.26
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 0978fe3..917cc94 100644 (file)
@@ -36,6 +36,7 @@
 #define DEFAULT_HW_ENCODER_NAME ""
 #define DEFAULT_HW_ENCODER_MIME ""
 #define DEFAULT_HW_ENCODER_FORMAT ""
+#define DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME "bitrate"
 
 #define DEFAULT_SW_DECODER_NAME ""
 #define DEFAULT_SW_DECODER_MIME ""
@@ -44,6 +45,7 @@
 #define DEFAULT_SW_ENCODER_NAME ""
 #define DEFAULT_SW_ENCODER_MIME ""
 #define DEFAULT_SW_ENCODER_FORMAT ""
+#define DEFAULT_SW_ENCODER_PROPERTY_BITRATE_NAME "bitrate"
 
 
 #define CNAME_SIZE 512
@@ -85,7 +87,6 @@ static void _mc_ini_check_ini_status(void);
 #define MEDIA_CODEC_INI_GET_STRING(x_dict, x_item, x_ini, x_default) \
 do {\
        const char *str = iniparser_getstring(x_dict, x_ini, x_default); \
-       \
        if (str &&  \
                        (strlen(str) > 0) && \
                        (strlen(str) < MEDIA_CODEC_INI_MAX_STRLEN)) \
@@ -102,14 +103,35 @@ do {\
        const char *delimiters = " ,"; \
        gchar temp_arr[MEDIA_CODEC_INI_MAX_STRLEN] = {0}; \
        MEDIA_CODEC_INI_GET_STRING(x_dict, temp_arr, x_ini, x_default); \
+       strncpy(x_list.property.bitrate_name, DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME, MEDIA_CODEC_INI_STRLEN - 1); \
        token = strtok_r(temp_arr, delimiters, &usr_ptr); \
        while (token) {\
-               if (index == 0) \
-               strncpy(x_list.name, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\
-               else if (index == 1) \
-               strncpy(x_list.mime, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\
-               else if (index == 2) \
-               strncpy(x_list.format, token, MEDIA_CODEC_INI_MAX_STRLEN-1);\
+               LOGI("index[%d], token[%s]", index, token);\
+               switch (index) { \
+               case MEDIA_CODEC_INFO_NAME: \
+                       strncpy(x_list.name, token, MEDIA_CODEC_INI_STRLEN - 1); \
+                       break; \
+               case MEDIA_CODEC_INFO_MIME: \
+                       strncpy(x_list.mime, token, MEDIA_CODEC_INI_STRLEN - 1); \
+                       break; \
+               case MEDIA_CODEC_INFO_FORMAT: \
+                       strncpy(x_list.format, token, MEDIA_CODEC_INI_STRLEN - 1); \
+                       break; \
+               case MEDIA_CODEC_INFO_PROPERTY_BITRATE_NAME: \
+                       strncpy(x_list.property.bitrate_name, token, MEDIA_CODEC_INI_STRLEN - 1); \
+                       break; \
+               default: \
+                       if (x_list.property.ext_num < MEDIA_CODEC_MAX_PROPERTY_EXT) { \
+                               strncpy(x_list.property.ext_name[x_list.property.ext_num], token, MEDIA_CODEC_INI_STRLEN - 1); \
+                               token = strtok_r(NULL, delimiters, &usr_ptr); \
+                               LOGI("  token[property value:%s]", token);\
+                               strncpy(x_list.property.ext_value[x_list.property.ext_num], token, MEDIA_CODEC_INI_STRLEN - 1); \
+                               x_list.property.ext_num++; \
+                       } else { \
+                               LOGW("unhandled token[%s] from ini", token); \
+                       } \
+                       break; \
+               } \
                index++;\
                token = strtok_r(NULL, delimiters, &usr_ptr); \
        } \
@@ -174,13 +196,17 @@ do {\
 
 #define MEDIA_CODEC_GET_DEFAULT_LIST(x_list, x_default) \
 do {\
-       strncpy(x_list, x_default, MEDIA_CODEC_INI_MAX_STRLEN - 1);\
+       strncpy(x_list, x_default, MEDIA_CODEC_INI_STRLEN - 1);\
 } while (0)
+
 #define MEDIA_CODEC_PRINT_LIST(x_list,  x_message) \
 do {\
-       codec_info_t codec_list = x_list;\
+       int prop_index = 0;\
        LOGW("%s =", x_message);\
-       LOGW("%s %s %s\n", codec_list.name, codec_list.mime, codec_list.format);\
+       LOGW("  %s %s %s", x_list.name, x_list.mime, x_list.format);\
+       LOGW("  bitrate property: %s\n", x_list.property.bitrate_name);\
+       for (prop_index = 0 ; prop_index < x_list.property.ext_num ; prop_index++)\
+               LOGW("  property ext: %s,%s", x_list.property.ext_name[prop_index], x_list.property.ext_value[prop_index]);\
 } while (0)
 
 media_format_mimetype_e _mc_convert_media_format_str_to_int(char *sformat)
@@ -362,6 +388,7 @@ int mc_ini_load(mc_ini_t *ini)
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].name,   DEFAULT_HW_ENCODER_NAME);
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime,   DEFAULT_HW_ENCODER_MIME);
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format, DEFAULT_HW_ENCODER_FORMAT);
+                       MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].property.bitrate_name, DEFAULT_HW_ENCODER_PROPERTY_BITRATE_NAME);
 
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].name,   DEFAULT_SW_DECODER_NAME);
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime,   DEFAULT_SW_DECODER_MIME);
@@ -370,6 +397,7 @@ int mc_ini_load(mc_ini_t *ini)
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].name,   DEFAULT_SW_ENCODER_NAME);
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime,   DEFAULT_SW_ENCODER_MIME);
                        MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format, DEFAULT_SW_ENCODER_FORMAT);
+                       MEDIA_CODEC_GET_DEFAULT_LIST(ini->codec[i].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].property.bitrate_name, DEFAULT_SW_ENCODER_PROPERTY_BITRATE_NAME);
                }
        }
 
index 68d5b78..ee24d4d 100644 (file)
@@ -490,6 +490,11 @@ int mc_get_output(MMHandleType mediacodec, media_packet_h *outbuf, uint64_t time
                return MC_INVALID_ARG;
        }
 
+       if (!outbuf) {
+               LOGE("invaild outbuf buffer");
+               return MC_INVALID_OUT_BUF;
+       }
+
        /* setting core details */
        switch (mc_handle->port_type) {
        case MEDIACODEC_PORT_TYPE_GENERAL:
@@ -847,6 +852,7 @@ void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec)
                        mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].mime;
                        mediacodec->decoder_map[count].type.out_format =
                                _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].format);
+                       mediacodec->decoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_DECODER].property;
                        count++;
                }
 
@@ -857,6 +863,7 @@ void _mc_create_decoder_map_from_ini(mc_handle_t *mediacodec)
                        mediacodec->decoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].mime;
                        mediacodec->decoder_map[count].type.out_format =
                                _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].format);
+                       mediacodec->decoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_DECODER].property;
                        count++;
                }
        }
@@ -878,6 +885,7 @@ void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec)
                        mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].mime;
                        mediacodec->encoder_map[count].type.out_format =
                                _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].format);
+                       mediacodec->encoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_HW_ENCODER].property;
                        count++;
                }
 
@@ -888,6 +896,7 @@ void _mc_create_encoder_map_from_ini(mc_handle_t *mediacodec)
                        mediacodec->encoder_map[count].type.mime = mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].mime;
                        mediacodec->encoder_map[count].type.out_format =
                                _mc_convert_media_format_str_to_int(mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].format);
+                       mediacodec->encoder_map[count].type.property = &mediacodec->ini->codec[indx].codec_info[MEDIA_CODEC_ROLE_SW_ENCODER].property;
                        count++;
                }
        }
index abad009..9c3e7d7 100644 (file)
@@ -1274,11 +1274,21 @@ static gpointer feed_task(gpointer data)
                }
 
                if (is_format_change) {
-                       GstCaps *caps;
-                       caps = core->mc_caps_new(core, core->codec_id, in_port_index);
+                       int bitrate = core->video ? \
+                               core->ports[in_port_index]->port_def.info.video.bitrate : \
+                               core->ports[in_port_index]->port_def.info.audio.bitrate;
+                       GstCaps *caps = core->mc_caps_new(core, core->codec_id, in_port_index);
+
                        g_object_set(core->appsrc, "caps", caps, NULL);
                        gst_caps_unref(caps);
+
                        LOGD("caps updated");
+
+                       g_object_set(core->codec, core->codec_type->property->bitrate_name, bitrate, NULL);
+
+                       LOGI("bitrate[property:%s,v:%d] %d updated",
+                               core->codec_type->property->bitrate_name, core->video, bitrate);
+
                        is_format_change = FALSE;
                }
 
@@ -1758,6 +1768,7 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle)
        memcpy(&new_core->ports[out_port_index]->port_def.info, &mc_handle->info, sizeof(mc_handle->info));
        new_core->ports[out_port_index]->port_def.coding_type = out_mime;
        new_core->codec_id = id;
+       new_core->codec_type = &codec_map[i].type;
        new_core->mc_caps_new = video ? &_mc_gst_vid_caps_new : &_mc_gst_aud_caps_new;
 
        new_core->bufmgr = tbm_bufmgr_init(new_core->drm_fd);
@@ -1821,9 +1832,22 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle)
                else
                        bitrate = mc_handle->info.audio.bitrate;
 
-               LOGI("set encoder bitrate[v:%d] %d", new_core->video, bitrate);
+               LOGI("set encoder bitrate[property:%s,v:%d] %d",
+                       new_core->codec_type->property->bitrate_name, new_core->video, bitrate);
+
+               g_object_set(new_core->codec,
+                       new_core->codec_type->property->bitrate_name, bitrate,
+                       NULL);
+       }
+
+       for (i = 0 ; i < new_core->codec_type->property->ext_num ; i++) {
+               LOGI("set property [%s] -> [%s]",
+                       new_core->codec_type->property->ext_name[i],
+                       new_core->codec_type->property->ext_value[i]);
 
-               g_object_set(new_core->codec, "bitrate", bitrate, NULL);
+               gst_util_set_object_arg((GObject *)new_core->codec,
+                       new_core->codec_type->property->ext_name[i],
+                       new_core->codec_type->property->ext_value[i]);
        }
 
        _mc_gst_feed_task_new(new_core);