webrtc_source: Add support for h/w encoder element 39/247239/4
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 9 Nov 2020 07:30:26 +0000 (16:30 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 12 Nov 2020 07:49:31 +0000 (16:49 +0900)
[Version] 0.1.51
[Issue Type] Improvement

Change-Id: Ib5da2035f8f3b6cb68e6b147f4ece345332e5c35
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_ini.c
src/webrtc_source.c

index 99d37997371a3bfbb1f9c47cac20685a57ef212e..1ad6dd71559e3d6b3443c218d695da5ee438ec7f 100644 (file)
@@ -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);
index 16f67c5704de16580dfe1c8f1792b793b8d115e5..eaeb1edc2a9ff23d6f930c9915d05c78b44be4c7 100644 (file)
@@ -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
index 0a00db627f4c7dd2739e765469f20749f5d68b35..5a921436ef3a77bb82c8e23d29379605eb10468b 100644 (file)
@@ -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");
index 611e8abbaa44e4814760e8559ebeaf48c7a0c4b9..2b4aa3feba24ae71d4c34f0906cffc64583ab889 100644 (file)
@@ -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),