From: Jeongmo Yang Date: Wed, 28 Sep 2022 05:49:54 +0000 (+0900) Subject: Add property setting in ini X-Git-Tag: accepted/tizen/unified/20220929.140030^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F01%2F282201%2F5;p=platform%2Fcore%2Fapi%2Fmediacodec.git Add property setting in ini - 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 --- diff --git a/include/media_codec_ini.h b/include/media_codec_ini.h index bdf22ba..dbd7c5e 100644 --- a/include/media_codec_ini.h +++ b/include/media_codec_ini.h @@ -26,18 +26,21 @@ 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*/ diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index f3fe9a5..8b086e6 100644 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -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; diff --git a/include/media_codec_spec_emul.h b/include/media_codec_spec_emul.h index 96bb3fb..08e0705 100644 --- a/include/media_codec_spec_emul.h +++ b/include/media_codec_spec_emul.h @@ -22,6 +22,7 @@ extern "C" { #endif #include +#include #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 { diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 0cede0a..ce40850 100644 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -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 diff --git a/src/media_codec_ini.c b/src/media_codec_ini.c index 0978fe3..917cc94 100644 --- a/src/media_codec_ini.c +++ b/src/media_codec_ini.c @@ -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); } } diff --git a/src/media_codec_port.c b/src/media_codec_port.c index 68d5b78..ee24d4d 100644 --- a/src/media_codec_port.c +++ b/src/media_codec_port.c @@ -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++; } } diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index abad009..9c3e7d7 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -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);