From: backto.kim Date: Wed, 6 Oct 2021 07:30:28 +0000 (+0900) Subject: webrtc_source: rearrange codes of __create_rest_of_elements_for_filesrc_pipeline... X-Git-Tag: submit/tizen/20211020.012736~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F66%2F264966%2F4;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_source: rearrange codes of __create_rest_of_elements_for_filesrc_pipeline() to reduce code complexity [Version] 0.2.115 [Issue Type] Refactoring Change-Id: Ibed6a8d5b613e91af1a8a6c6f944e59dcdeae569 --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index cf151355..6fbc5c70 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.2.114 +Version: 0.2.115 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_source.c b/src/webrtc_source.c index ee5ebb22..915382de 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -1775,28 +1775,21 @@ static GstPadProbeReturn __fakesink_probe_cb(GstPad *pad, GstPadProbeInfo *info return GST_PAD_PROBE_REMOVE; } -static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, GstElement *payloader, bool is_audio) +static GstElement * __prepare_capsfilter_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio) { - GstBin *bin = NULL; GstElement *capsfilter = NULL; - GstElement *fakesink = NULL; GstCaps *sink_caps = NULL; - unsigned int payload_id; - GstPad *sink_pad = NULL; + unsigned int payload_id = 0; - RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL"); - RET_VAL_IF(payloader == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "payloader is NULL"); - RET_VAL_IF(source->filesrc_pipeline == NULL, WEBRTC_ERROR_INVALID_OPERATION, "filesrc_pipeline is NULL"); - - bin = GST_BIN(source->filesrc_pipeline); + RET_VAL_IF(source == NULL, NULL, "source is NULL"); if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, is_audio ? DEFAULT_NAME_AUDIO_CAPSFILTER : DEFAULT_NAME_VIDEO_CAPSFILTER))) - return WEBRTC_ERROR_INVALID_OPERATION; + return NULL; payload_id = __get_available_payload_id(source->webrtc); if (payload_id == 0) { SAFE_GST_OBJECT_UNREF(capsfilter); - return WEBRTC_ERROR_INVALID_OPERATION; + return NULL; } source->av[is_audio ? AV_IDX_AUDIO : AV_IDX_VIDEO].payload_id = payload_id; @@ -1806,40 +1799,75 @@ static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *sou gst_caps_unref(sink_caps); } - if (!(fakesink = _create_element("fakesink", is_audio ? DEFAULT_NAME_AUDIO_FAKESINK : DEFAULT_NAME_VIDEO_FAKESINK))) { - SAFE_GST_OBJECT_UNREF(capsfilter); - return WEBRTC_ERROR_INVALID_OPERATION; - } + return capsfilter; +} + +static GstElement * __prepare_fakesink_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio) +{ + GstElement *fakesink = NULL; + GstPad *sink_pad = NULL; + + RET_VAL_IF(source == NULL, NULL, "source is NULL"); + + if (!(fakesink = _create_element("fakesink", is_audio ? DEFAULT_NAME_AUDIO_FAKESINK : DEFAULT_NAME_VIDEO_FAKESINK))) + return NULL; sink_pad = gst_element_get_static_pad(fakesink, "sink"); gst_pad_add_probe(sink_pad, GST_PAD_PROBE_TYPE_BUFFER, __fakesink_probe_cb, source, NULL); gst_object_unref(sink_pad); - g_object_set(G_OBJECT(fakesink), "sync", true, NULL); - g_object_set(fakesink, "signal-handoffs", TRUE, NULL); + g_object_set(G_OBJECT(fakesink), + "sync", TRUE, + "signal-handoffs", TRUE, + NULL); + g_signal_connect(fakesink, "handoff", is_audio ? G_CALLBACK(__filesrc_pipeline_audio_stream_handoff_cb) : G_CALLBACK(__filesrc_pipeline_video_stream_handoff_cb), (gpointer)source); - gst_bin_add_many(GST_BIN(source->filesrc_pipeline), capsfilter, fakesink, NULL); + return fakesink; +} + +static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, GstElement *payloader, bool is_audio) +{ + GstBin *bin = NULL; + GstElement *capsfilter = NULL; + GstElement *fakesink = NULL; + + RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL"); + RET_VAL_IF(payloader == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "payloader is NULL"); + RET_VAL_IF(source->filesrc_pipeline == NULL, WEBRTC_ERROR_INVALID_OPERATION, "filesrc_pipeline is NULL"); + + bin = GST_BIN(source->filesrc_pipeline); + + if (!(capsfilter = __prepare_capsfilter_for_filesrc_pipeline(source, is_audio))) + return WEBRTC_ERROR_INVALID_OPERATION; + + if (!(fakesink = __prepare_fakesink_for_filesrc_pipeline(source, is_audio))) { + SAFE_GST_OBJECT_UNREF(capsfilter); + return WEBRTC_ERROR_INVALID_OPERATION; + } + + gst_bin_add_many(bin, capsfilter, fakesink, NULL); if (!gst_element_link_many(payloader, capsfilter, fakesink, NULL)) { LOG_ERROR("failed to gst_element_link_many()"); - gst_bin_remove_many(bin, capsfilter, fakesink, NULL); - return WEBRTC_ERROR_INVALID_OPERATION; + goto error; } if (!gst_element_sync_state_with_parent(capsfilter)) { LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(capsfilter)); - gst_bin_remove_many(bin, capsfilter, fakesink, NULL); - return WEBRTC_ERROR_INVALID_OPERATION; + goto error; } if (!gst_element_sync_state_with_parent(fakesink)) { LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(fakesink)); - gst_bin_remove_many(bin, capsfilter, fakesink, NULL); - return WEBRTC_ERROR_INVALID_OPERATION; + goto error; } return WEBRTC_ERROR_NONE; + +error: + gst_bin_remove_many(bin, capsfilter, fakesink, NULL); + return WEBRTC_ERROR_INVALID_OPERATION; } static GstElement * __link_decodebin_with_payload(GstPad *pad, webrtc_gst_slot_s *source, bool is_audio, bool create)