From: Sangchul Lee Date: Tue, 31 May 2022 12:54:05 +0000 (+0900) Subject: webrtc_ini: Add support for audio/video codec list X-Git-Tag: submit/tizen/20220613.225802~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8b856844844342dcc78c18c27d8edf7925e92b98;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_ini: Add support for audio/video codec list 'video codec' item is replaced with 'video codecs'. 'audio codec' item is replaced with 'audio codecs'. [Version] 0.3.123 [Issue Type] New feature Change-Id: I27f90b44444cd1b9f18c12778708f4637b26d09d Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index a68716f0..b02c6f6c 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -308,7 +308,7 @@ typedef struct _ini_item_media_source_s { int v_width; int v_height; int v_framerate; - const char *v_codec; + GStrv v_codecs; const char *v_hw_encoder_element; bool v_drc_support; bool v_encoded_fmt_support; @@ -316,7 +316,7 @@ typedef struct _ini_item_media_source_s { const char *a_raw_format; int a_samplerate; int a_channels; - const char *a_codec; + GStrv a_codecs; const char *a_hw_encoder_element; /* Forward Error Correction */ /* ULPFEC */ diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 126d61f3..94b571b1 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.3.122 +Version: 0.3.123 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 00a0ba33..6458c969 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -65,12 +65,12 @@ #define INI_ITEM_VIDEO_FRAMERATE "video framerate" #define INI_ITEM_VIDEO_DRC_SUPPORT "video drc support" /* source element supports dynamic resolution change */ #define INI_ITEM_VIDEO_ENCODED_FMT_SUPPORT "video encoded format support" /* source element supports encoded format */ -#define INI_ITEM_VIDEO_CODEC "video codec" +#define INI_ITEM_VIDEO_CODECS "video codecs" #define INI_ITEM_VIDEO_HW_ENCODER_ELEMENT "video hw encoder element" #define INI_ITEM_AUDIO_RAW_FORMAT "audio raw format" #define INI_ITEM_AUDIO_SAMPLERATE "audio samplerate" #define INI_ITEM_AUDIO_CHANNELS "audio channels" -#define INI_ITEM_AUDIO_CODEC "audio codec" +#define INI_ITEM_AUDIO_CODECS "audio codecs" #define INI_ITEM_AUDIO_HW_ENCODER_ELEMENT "audio hw encoder element" #define INI_ITEM_USE_ULPFEC_RED "use ulpfec red" #define INI_ITEM_FEC_PERCENTAGE "fec percentage" @@ -194,12 +194,12 @@ static void __dump_items_of_source(ini_item_media_source_s *source) __dump_item(INI_ITEM_VIDEO_FRAMERATE, INI_ITEM_TYPE_INT, &source->v_framerate); __dump_item(INI_ITEM_VIDEO_DRC_SUPPORT, INI_ITEM_TYPE_BOOL, &source->v_drc_support); __dump_item(INI_ITEM_VIDEO_ENCODED_FMT_SUPPORT, INI_ITEM_TYPE_BOOL, &source->v_encoded_fmt_support); - __dump_item(INI_ITEM_VIDEO_CODEC, INI_ITEM_TYPE_STRING, (void *)source->v_codec); + __dump_item(INI_ITEM_VIDEO_CODECS, INI_ITEM_TYPE_STRINGS, (void *)source->v_codecs); __dump_item(INI_ITEM_VIDEO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->v_hw_encoder_element); __dump_item(INI_ITEM_AUDIO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)source->a_raw_format); __dump_item(INI_ITEM_AUDIO_SAMPLERATE, INI_ITEM_TYPE_INT, &source->a_samplerate); __dump_item(INI_ITEM_AUDIO_CHANNELS, INI_ITEM_TYPE_INT, &source->a_channels); - __dump_item(INI_ITEM_AUDIO_CODEC, INI_ITEM_TYPE_STRING, (void *)source->a_codec); + __dump_item(INI_ITEM_AUDIO_CODECS, INI_ITEM_TYPE_STRINGS, (void *)source->a_codecs); __dump_item(INI_ITEM_AUDIO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->a_hw_encoder_element); __dump_item(INI_ITEM_USE_ULPFEC_RED, INI_ITEM_TYPE_BOOL, &source->use_ulpfec_red); __dump_item(INI_ITEM_FEC_PERCENTAGE, INI_ITEM_TYPE_INT, &source->fec_percentage); @@ -207,10 +207,10 @@ static void __dump_items_of_source(ini_item_media_source_s *source) __dump_item(INI_ITEM_PACKET_LOSS_PERCENTAGE, INI_ITEM_TYPE_INT, &source->packet_loss_percentage); } -static bool __is_vpx(const char *v_codec) +static bool __is_vpx(const gchar * const* v_codecs) { - return (!g_strcmp0(v_codec, "vp8") || !g_strcmp0(v_codec, "vp9") || - !g_strcmp0(v_codec, "VP8") || !g_strcmp0(v_codec, "VP9")); + return (g_strv_contains(v_codecs, "vp8") || g_strv_contains(v_codecs, "vp9") || + g_strv_contains(v_codecs, "VP8") || g_strv_contains(v_codecs, "VP9")); } static void __dump_ini(webrtc_ini_s *ini) @@ -429,8 +429,7 @@ static void __apply_media_source_setting(webrtc_ini_s *ini, ini_item_media_sourc is_default ? DEFAULT_VIDEO_DRC_SUPPORT : ini->media_source.v_drc_support); source->v_encoded_fmt_support = __ini_get_boolean(ini->dict, category, INI_ITEM_VIDEO_ENCODED_FMT_SUPPORT, is_default ? DEFAULT_VIDEO_ENCODED_FMT_SUPPORT : ini->media_source.v_encoded_fmt_support); - source->v_codec = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_CODEC, - is_default ? DEFAULT_VIDEO_CODEC : ini->media_source.v_codec); + __ini_read_list(ini->dict, category, INI_ITEM_VIDEO_CODECS, &source->v_codecs, is_default ? NULL : ini->media_source.v_codecs); source->v_hw_encoder_element = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_HW_ENCODER_ELEMENT, is_default ? NULL : ini->media_source.v_hw_encoder_element); source->a_raw_format = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_RAW_FORMAT, @@ -439,8 +438,7 @@ static void __apply_media_source_setting(webrtc_ini_s *ini, ini_item_media_sourc is_default ? DEFAULT_AUDIO_SAMPLERATE : ini->media_source.a_samplerate); source->a_channels = __ini_get_int(ini->dict, category, INI_ITEM_AUDIO_CHANNELS, is_default ? DEFAULT_AUDIO_CHANNELS : ini->media_source.a_channels); - source->a_codec = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_CODEC, - is_default ? DEFAULT_AUDIO_CODEC : ini->media_source.a_codec); + __ini_read_list(ini->dict, category, INI_ITEM_AUDIO_CODECS, &source->a_codecs, is_default ? NULL : ini->media_source.a_codecs); source->a_hw_encoder_element = __ini_get_string(ini->dict, category, INI_ITEM_AUDIO_HW_ENCODER_ELEMENT, is_default ? NULL : ini->media_source.a_hw_encoder_element); source->use_ulpfec_red = __ini_get_boolean(ini->dict, category, INI_ITEM_USE_ULPFEC_RED, @@ -535,7 +533,7 @@ void _load_ini(webrtc_s *webrtc) ini->resource_acquisition.video_overlay = __ini_get_boolean(ini->dict, INI_CATEGORY_RESOURCE_ACQUISITION, INI_ITEM_RESOURCE_VIDEO_OVERLAY, DEFAULT_RESOURCE_VIDEO_OVERLAY_REQUIRED); - if (__is_vpx(ini->media_source.v_codec)) + if (__is_vpx((const gchar * const*)ini->media_source.v_codecs)) __apply_vpxenc_params_setting(ini, &ini->vpxenc_params, INI_CATEGORY_VPXENC_PARAMS); __dump_ini(ini); diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 15add739..6fc850d6 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -507,12 +507,17 @@ static GstCaps *__make_default_encoded_caps(webrtc_gst_slot_s *source, webrtc_in if (ini_source == NULL) ini_source = &ini->media_source; + if (source->media_types == MEDIA_TYPE_AUDIO) + RET_VAL_IF(ini_source->a_codecs == NULL, NULL, "a_codecs is NULL"); + else if (source->media_types == MEDIA_TYPE_VIDEO) + RET_VAL_IF(ini_source->v_codecs == NULL, NULL, "v_codecs is NULL"); + switch (source->type) { case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST: case WEBRTC_MEDIA_SOURCE_TYPE_CAMERA: case WEBRTC_MEDIA_SOURCE_TYPE_SCREEN: case WEBRTC_MEDIA_SOURCE_TYPE_CUSTOM_VIDEO: - _media_type = __get_video_media_type(ini_source->v_codec); + _media_type = __get_video_media_type(ini_source->v_codecs[0]); RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL"); source->video_info.width = source->video_info.width > 0 ? source->video_info.width : ini_source->v_width; @@ -525,18 +530,18 @@ static GstCaps *__make_default_encoded_caps(webrtc_gst_slot_s *source, webrtc_in case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST: case WEBRTC_MEDIA_SOURCE_TYPE_MIC: case WEBRTC_MEDIA_SOURCE_TYPE_CUSTOM_AUDIO: - _media_type = __get_audio_media_type(ini_source->a_codec); + _media_type = __get_audio_media_type(ini_source->a_codecs[0]); RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL"); caps = __get_caps_from_encoded_audio_media_type(_media_type, ini_source->a_channels, ini_source->a_samplerate); break; case WEBRTC_MEDIA_SOURCE_TYPE_MEDIA_PACKET: if (source->media_types == MEDIA_TYPE_AUDIO) { - _media_type = __get_audio_media_type(ini_source->a_codec); + _media_type = __get_audio_media_type(ini_source->a_codecs[0]); RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL"); caps = __get_caps_from_encoded_audio_media_type(_media_type, ini_source->a_channels, ini_source->a_samplerate); } else if (source->media_types == MEDIA_TYPE_VIDEO) { - _media_type = __get_video_media_type(ini_source->v_codec); + _media_type = __get_video_media_type(ini_source->v_codecs[0]); RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL"); caps = __get_caps_from_encoded_video_media_type(_media_type, ini_source->v_width, ini_source->v_height); } else {