- 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>
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;
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 {
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*/
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;
#endif
#include <media_codec_private.h>
+#include <media_codec_ini.h>
#define MEDIA_CODEC_MAX_CODEC_TYPE 100
char *factory_name;
char *mime;
media_format_mimetype_e out_format;
+ codec_property_t *property;
};
struct _mc_codec_map_t {
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
#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 ""
#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
#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)) \
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); \
} \
#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)
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);
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);
}
}
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:
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++;
}
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++;
}
}
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++;
}
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++;
}
}
}
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;
}
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);
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);