webrtc_sink: Use fakesink to drop receiving audio data if stream_info is not set 79/264279/2 accepted/tizen/unified/20210916.123515 submit/tizen/20210916.061019
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 15 Sep 2021 09:07:53 +0000 (18:07 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 15 Sep 2021 09:17:24 +0000 (18:17 +0900)
[Version] 0.2.100
[Issue Type] Improvement

Change-Id: I056d6b1b4fce1dfcb0a20a969631326ec7d7be7d
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
src/webrtc_sink.c

index 4ecab4e8b31ae27bd0081822cfeca80f55cfbb2d..f0737f9aea5752eef8c9ef1a59cd6ab91d8f3f57 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.99
+Version:    0.2.100
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 3afae365d22cc25496c50ef5110d99dbd3a8d918..585d9c2a5999621a092c8cf26a0d0f8eac96045e 100644 (file)
@@ -221,6 +221,7 @@ static int __build_audiosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
        GstElement *audioconvert;
        GstElement *audioresample;
        GstElement *audiosink;
+       bool stream_info_is_set;
        int ret = WEBRTC_ERROR_NONE;
 
        RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
@@ -233,47 +234,62 @@ static int __build_audiosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
 
        sink->media_types = MEDIA_TYPE_AUDIO;
 
-       if (!(audioconvert = _create_element(DEFAULT_ELEMENT_AUDIOCONVERT, NULL))) {
-               LOG_ERROR("failed to create audioconvert");
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
+       stream_info_is_set = !!sink->sound_stream_info.type;
 
-       if (!(audioresample = _create_element(DEFAULT_ELEMENT_AUDIORESAMPLE, NULL))) {
-               LOG_ERROR("failed to create audioresample");
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
+       if (stream_info_is_set) {
+               if (!(audioconvert = _create_element(DEFAULT_ELEMENT_AUDIOCONVERT, NULL)))
+                       return WEBRTC_ERROR_INVALID_OPERATION;
 
-       if (!(audiosink = _create_element(webrtc->ini.rendering_sink.a_sink_element, NULL))) {
-               LOG_ERROR("failed to create audiosink");
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
+               if (!(audioresample = _create_element(DEFAULT_ELEMENT_AUDIORESAMPLE, NULL)))
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+
+               if (!(audiosink = _create_element(webrtc->ini.rendering_sink.a_sink_element, NULL)))
+                       return WEBRTC_ERROR_INVALID_OPERATION;
 
-       if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(audiosink)), "stream-properties")) {
-               if (sink->sound_stream_info.type) {
-                       ret = _apply_stream_info(audiosink, sink->sound_stream_info.type, sink->sound_stream_info.index);
-                       if (ret != WEBRTC_ERROR_NONE) /* FIXME: unref all the created elements */
-                               return WEBRTC_ERROR_INVALID_OPERATION;
+               if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(audiosink)), "stream-properties")) {
+                       if (sink->sound_stream_info.type) {
+                               ret = _apply_stream_info(audiosink, sink->sound_stream_info.type, sink->sound_stream_info.index);
+                               if (ret != WEBRTC_ERROR_NONE) /* FIXME: unref all the created elements */
+                                       return WEBRTC_ERROR_INVALID_OPERATION;
+                       }
                }
-       }
 
-       gst_bin_add_many(sink->bin, audioconvert, audioresample, audiosink, NULL);
+               gst_bin_add_many(sink->bin, audioconvert, audioresample, audiosink, NULL);
 
-       if (!gst_element_sync_state_with_parent(audioconvert)) {
-               LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioconvert));
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
-       if (!gst_element_sync_state_with_parent(audioresample)) {
-               LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioresample));
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
-       if (!gst_element_sync_state_with_parent(audiosink)) {
-               LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
-               return WEBRTC_ERROR_INVALID_OPERATION;
-       }
+               if (!gst_element_sync_state_with_parent(audioconvert)) {
+                       LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioconvert));
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
+               if (!gst_element_sync_state_with_parent(audioresample)) {
+                       LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioresample));
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
+               if (!gst_element_sync_state_with_parent(audiosink)) {
+                       LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
 
-       if (!gst_element_link_many(decodebin, audioconvert, audioresample, audiosink, NULL)) {
-               LOG_ERROR("failed to gst_element_link_many()");
-               return WEBRTC_ERROR_INVALID_OPERATION;
+               if (!gst_element_link_many(decodebin, audioconvert, audioresample, audiosink, NULL)) {
+                       LOG_ERROR("failed to gst_element_link_many()");
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
+
+       } else {
+               LOG_WARNING("stream_info is not set, use [%s] to drop audio data", DEFAULT_ELEMENT_FAKESINK);
+               if (!(audiosink = _create_element(DEFAULT_ELEMENT_FAKESINK, NULL)))
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+
+               gst_bin_add(sink->bin, audiosink);
+
+               if (!gst_element_sync_state_with_parent(audiosink)) {
+                       LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
+
+               if (!gst_element_link_many(decodebin, audiosink, NULL)) {
+                       LOG_ERROR("failed to gst_element_link_many()");
+                       return WEBRTC_ERROR_INVALID_OPERATION;
+               }
        }
 
        return WEBRTC_ERROR_NONE;