From: Sangchul Lee Date: Mon, 9 Nov 2020 07:30:26 +0000 (+0900) Subject: webrtc_source: Add support for h/w encoder element X-Git-Tag: submit/tizen/20210729.023123~191 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F39%2F247239%2F4;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source: Add support for h/w encoder element [Version] 0.1.51 [Issue Type] Improvement Change-Id: Ib5da2035f8f3b6cb68e6b147f4ece345332e5c35 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 99d37997..1ad6dd71 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -261,7 +261,7 @@ typedef struct _webrtc_signal_s { int _load_ini(webrtc_s *webrtc); void _unload_ini(webrtc_s *webrtc); -void _ini_read_list(dictionary *dict, const char *ini_path, gchar ***list); +ini_item_media_source_s* _ini_get_source_by_type(webrtc_ini_s *ini, webrtc_media_source_type_e type); int _gst_init(webrtc_s *webrtc); int _gst_build_pipeline(webrtc_s *webrtc); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 16f67c57..eaeb1edc 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.1.50 +Version: 0.1.51 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_ini.c b/src/webrtc_ini.c index 0a00db62..5a921436 100644 --- a/src/webrtc_ini.c +++ b/src/webrtc_ini.c @@ -339,6 +339,24 @@ int _load_ini(webrtc_s *webrtc) return WEBRTC_ERROR_NONE; } +ini_item_media_source_s* _ini_get_source_by_type(webrtc_ini_s *ini, webrtc_media_source_type_e type) +{ + const char *source_type = NULL; + + RET_VAL_IF(ini == NULL, NULL, "ini is NULL"); + + if (type == WEBRTC_MEDIA_SOURCE_TYPE_CAMERA) + source_type = INI_CATEGORY_SOURCE_CAMERA; + else if (type == WEBRTC_MEDIA_SOURCE_TYPE_MIC) + source_type = INI_CATEGORY_SOURCE_MIC; + else if (type == WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST) + source_type = INI_CATEGORY_SOURCE_AUDIOTEST; + else if (type == WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST) + source_type = INI_CATEGORY_SOURCE_VIDEOTEST; + + return (ini_item_media_source_s*)g_hash_table_lookup(ini->sources, source_type); +} + void _unload_ini(webrtc_s *webrtc) { RET_IF(webrtc == NULL, "webrtc is NULL"); diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 611e8abb..2b4aa3fe 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -141,26 +141,31 @@ static codec_type_e __get_video_codec_type(const gchar *media_type) static GstCaps *__make_default_raw_caps(webrtc_media_source_type_e type, webrtc_ini_s *ini) { GstCaps *caps = NULL; + ini_item_media_source_s *source; RET_VAL_IF(ini == NULL, NULL, "ini is NULL"); + source = _ini_get_source_by_type(ini, type); + if (source == NULL) + source = &ini->media_source; + switch (type) { case WEBRTC_MEDIA_SOURCE_TYPE_CAMERA: case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST: caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW, - "format", G_TYPE_STRING, ini->media_source.v_raw_format, - "framerate", GST_TYPE_FRACTION, ini->media_source.v_framerate, 1, - "width", G_TYPE_INT, ini->media_source.v_width, - "height", G_TYPE_INT, ini->media_source.v_height, + "format", G_TYPE_STRING, source->v_raw_format, + "framerate", GST_TYPE_FRACTION, source->v_framerate, 1, + "width", G_TYPE_INT, source->v_width, + "height", G_TYPE_INT, source->v_height, NULL); break; case WEBRTC_MEDIA_SOURCE_TYPE_MIC: case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST: caps = gst_caps_new_simple(MEDIA_TYPE_AUDIO_RAW, - "format", G_TYPE_STRING, ini->media_source.a_raw_format, - "channels", G_TYPE_INT, ini->media_source.a_channels, - "rate", G_TYPE_INT, ini->media_source.a_samplerate, + "format", G_TYPE_STRING, source->a_raw_format, + "channels", G_TYPE_INT, source->a_channels, + "rate", G_TYPE_INT, source->a_samplerate, NULL); break; @@ -176,27 +181,32 @@ static GstCaps *__make_default_raw_caps(webrtc_media_source_type_e type, webrtc_ static GstCaps *__make_default_encoded_caps(webrtc_media_source_type_e type, webrtc_ini_s *ini, gchar **media_type) { GstCaps *caps; + ini_item_media_source_s *source; const char *_media_type; RET_VAL_IF(ini == NULL, NULL, "ini is NULL"); + source = _ini_get_source_by_type(ini, type); + if (source == NULL) + source = &ini->media_source; + switch (type) { case WEBRTC_MEDIA_SOURCE_TYPE_CAMERA: case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST: - _media_type = __get_video_media_type(ini->media_source.v_codec); + _media_type = __get_video_media_type(source->v_codec); caps = gst_caps_new_simple(_media_type, - "framerate", GST_TYPE_FRACTION, ini->media_source.v_framerate, 1, - "width", G_TYPE_INT, ini->media_source.v_width, - "height", G_TYPE_INT, ini->media_source.v_height, + "framerate", GST_TYPE_FRACTION, source->v_framerate, 1, + "width", G_TYPE_INT, source->v_width, + "height", G_TYPE_INT, source->v_height, NULL); break; case WEBRTC_MEDIA_SOURCE_TYPE_MIC: case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST: - _media_type = __get_audio_media_type(ini->media_source.a_codec); + _media_type = __get_audio_media_type(source->a_codec); caps = gst_caps_new_simple(_media_type, - "channels", G_TYPE_INT, ini->media_source.a_channels, - "rate", G_TYPE_INT, ini->media_source.a_samplerate, + "channels", G_TYPE_INT, source->a_channels, + "rate", G_TYPE_INT, source->a_samplerate, NULL); break; @@ -239,6 +249,31 @@ static GstCaps *__make_rtp_caps(const gchar *media_type, unsigned int id) return caps; } +static GstElement *__get_hw_encoder_element(webrtc_s *webrtc, webrtc_media_source_type_e type) +{ + ini_item_media_source_s *source; + + RET_VAL_IF(webrtc == NULL, NULL, "webrtc is NULL"); + + source = _ini_get_source_by_type(&webrtc->ini, type); + + if (type == WEBRTC_MEDIA_SOURCE_TYPE_CAMERA || type == WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST) { + if (source && source->v_hw_encoder_element) + return _create_element(source->v_hw_encoder_element, NULL); + if (webrtc->ini.media_source.v_hw_encoder_element) + return _create_element(webrtc->ini.media_source.v_hw_encoder_element, NULL); + + } else if (type == WEBRTC_MEDIA_SOURCE_TYPE_MIC || type == WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST) { + if (source && source->a_hw_encoder_element) + return _create_element(source->a_hw_encoder_element, NULL); + if (webrtc->ini.media_source.a_hw_encoder_element) + return _create_element(webrtc->ini.media_source.a_hw_encoder_element, NULL); + } + + LOG_DEBUG("no hw encoder is requested, type(%d)", type); + return NULL; +} + static int __create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, webrtc_media_source_type_e type, GstElement **capsfilter, GstElement **encoder, GstElement **payloader, GstElement **queue, GstElement **capsfilter2) { @@ -260,6 +295,10 @@ static int __create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source return WEBRTC_ERROR_INVALID_OPERATION; } if ((sink_caps = __make_default_raw_caps(type, &webrtc->ini))) { + gchar *caps_str = gst_caps_to_string(sink_caps); + LOG_INFO("capsfilter caps[%s]", caps_str); + g_free(caps_str); + g_object_set(G_OBJECT(*capsfilter), "caps", sink_caps, NULL); gst_caps_unref(sink_caps); } @@ -269,12 +308,15 @@ static int __create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source else encoder_klass_name = GST_KLASS_NAME_ENCODER_AUDIO; - CREATE_ELEMENT_FROM_REGISTRY(elem_info, encoder_klass_name, - __make_default_raw_caps(type, &webrtc->ini), - __make_default_encoded_caps(type, &webrtc->ini, NULL), - *encoder); - if (*encoder == NULL) - return WEBRTC_ERROR_INVALID_OPERATION; + *encoder = __get_hw_encoder_element(webrtc, type); + if (*encoder == NULL) { + CREATE_ELEMENT_FROM_REGISTRY(elem_info, encoder_klass_name, + __make_default_raw_caps(type, &webrtc->ini), + __make_default_encoded_caps(type, &webrtc->ini, NULL), + *encoder); + if (*encoder == NULL) + return WEBRTC_ERROR_INVALID_OPERATION; + } CREATE_ELEMENT_FROM_REGISTRY(elem_info, GST_KLASS_NAME_PAYLOADER_RTP, __make_default_encoded_caps(type, &webrtc->ini, &media_type),