From: Sangchul Lee Date: Mon, 8 Feb 2021 04:09:21 +0000 (+0900) Subject: webrtc_sink: Add capsfilter to apply stream-format and alignment in case of H264... X-Git-Tag: submit/tizen/20210729.023123~136 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F56%2F253256%2F1;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_sink: Add capsfilter to apply stream-format and alignment in case of H264/H265 In case of H264/H265 encoded frame callback, it is added to apply 'byte-stream' of stream format and 'au' of alignment, as default values. [Version] 0.1.105 [Issue Type] Improvement Change-Id: I352962743b714d3e45f4854faeb9984d357d304e Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 94b54b31..43a4a4d7 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -172,6 +172,16 @@ do { \ g_free(dot_name); \ } while (0) +#define MEDIA_TYPE_AUDIO_RAW "audio/x-raw" +#define MEDIA_TYPE_AUDIO_OPUS "audio/x-opus" +#define MEDIA_TYPE_AUDIO_VORBIS "audio/x-vorbis" +#define MEDIA_TYPE_VIDEO_RAW "video/x-raw" +#define MEDIA_TYPE_VIDEO_VP8 "video/x-vp8" +#define MEDIA_TYPE_VIDEO_VP9 "video/x-vp9" +#define MEDIA_TYPE_VIDEO_THEORA "video/x-theora" +#define MEDIA_TYPE_VIDEO_H264 "video/x-h264" +#define MEDIA_TYPE_VIDEO_H265 "video/x-h265" + #define WEBRTC_DISPLAY_TYPE_ECORE_WL 2 #define SIGNALING_MESSAGE_PREFIX_CONNECTED "CONNECTED" diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index feaaefcb..d13fcfd1 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.104 +Version: 0.1.105 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index ae5ca35d..28015a64 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -20,6 +20,7 @@ #define GST_KLASS_NAME_DEPAYLOADER_RTP "Codec/Depayloader/Network/RTP" +#define DEFAULT_ELEMENT_CAPSFILTER "capsfilter" #define DEFAULT_ELEMENT_VIDEOCONVERT "videoconvert" #define DEFAULT_ELEMENT_AUDIOCONVERT "audioconvert" #define DEFAULT_ELEMENT_AUDIORESAMPLE "audioresample" @@ -508,15 +509,15 @@ static int __get_media_format_mimetype(const gchar *mime, media_format_mimetype_ RET_VAL_IF(mime == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "mime is NULL"); RET_VAL_IF(media_format_mime == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "media_format_mime is NULL"); - if (!g_strcmp0(mime, "audio/x-opus")) { + if (!g_strcmp0(mime, MEDIA_TYPE_AUDIO_OPUS)) { *media_format_mime = MEDIA_FORMAT_OPUS; - } else if (!g_strcmp0(mime, "audio/x-vorbis")) { + } else if (!g_strcmp0(mime, MEDIA_TYPE_AUDIO_VORBIS)) { *media_format_mime = MEDIA_FORMAT_VORBIS; - } else if (!g_strcmp0(mime, "video/x-vp8")) { + } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_VP8)) { *media_format_mime = MEDIA_FORMAT_VP8; - } else if (!g_strcmp0(mime, "video/x-vp9")) { + } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_VP9)) { *media_format_mime = MEDIA_FORMAT_VP9; - } else if (!g_strcmp0(mime, "video/x-h264")) { + } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_H264)) { *media_format_mime = MEDIA_FORMAT_H264_HP; } else { LOG_ERROR("not supported mime[%s]", mime); @@ -637,6 +638,42 @@ static void __encoded_stream_cb(GstElement *object, GstBuffer *buffer, GstPad *p LOG_DEBUG("<<< end of the callback"); } +static GstCaps* __make_caps_if_h264_or_h265(GstPad *pad) +{ + GstCaps *caps; + GstStructure *structure; + const gchar *encoding_name; + const gchar *media_type; + GstCaps *new_caps; + + RET_VAL_IF(pad == NULL, NULL, "pad is NULL"); + + caps = gst_pad_get_current_caps(pad); + structure = gst_caps_get_structure(caps, 0); + encoding_name = gst_structure_get_string(structure, "encoding-name"); + + LOG_INFO("encoding-name[%s]", encoding_name); + + if (!g_strcmp0(encoding_name, "H264") || !g_strcmp0(encoding_name, "h264")) { + media_type = MEDIA_TYPE_VIDEO_H264; + } else if (!g_strcmp0(encoding_name, "H265") || !g_strcmp0(encoding_name, "h265")) { + media_type = MEDIA_TYPE_VIDEO_H265; + } else { + gst_caps_unref(caps); + return NULL; + } + + /* FIXME: get value of stream-format, alignment from ini file */ + new_caps = gst_caps_new_simple(media_type, + "stream-format", G_TYPE_STRING, "byte-stream", + "alignment", G_TYPE_STRING, "au", + NULL); + + gst_caps_unref(caps); + + return new_caps; +} + int _add_forwarding_sink_bin(webrtc_s *webrtc, GstPad *src_pad, bool is_video) { int ret = WEBRTC_ERROR_NONE; @@ -645,7 +682,9 @@ int _add_forwarding_sink_bin(webrtc_s *webrtc, GstPad *src_pad, bool is_video) gchar *track_name; element_info_s elem_info; GstElement *depayloader = NULL; + GstElement *capsfilter = NULL; GstElement *fakesink = NULL; + GstCaps *sink_caps; webrtc_gst_slot_s *sink; GstPad *sink_pad = NULL; @@ -674,7 +713,20 @@ int _add_forwarding_sink_bin(webrtc_s *webrtc, GstPad *src_pad, bool is_video) g_object_set(fakesink, "signal-handoffs", TRUE, NULL); _connect_and_append_signal(&sink->signals, (GObject *)fakesink, "handoff", G_CALLBACK(__encoded_stream_cb), sink); - gst_bin_add_many(GST_BIN(sink->bin), depayloader, fakesink, NULL); + capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL); + if (!capsfilter) + goto error_before_insert; + + if ((sink_caps = __make_caps_if_h264_or_h265(src_pad))) { + 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); + } + + gst_bin_add_many(GST_BIN(sink->bin), depayloader, capsfilter, fakesink, NULL); ret = _add_no_target_ghostpad_to_slot(sink, false, &sink_pad); if (ret != WEBRTC_ERROR_NONE) @@ -684,7 +736,7 @@ int _add_forwarding_sink_bin(webrtc_s *webrtc, GstPad *src_pad, bool is_video) if (ret != WEBRTC_ERROR_NONE) goto error_before_insert; - if (!gst_element_link_many(depayloader, fakesink, NULL)) { + if (!gst_element_link_many(depayloader, capsfilter, fakesink, NULL)) { LOG_ERROR("failed to gst_element_link_many()"); goto error_before_insert; } diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 9950791c..b89851e3 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -35,16 +35,6 @@ #define DEFAULT_ELEMENT_CAPSFILTER "capsfilter" #define DEFAULT_ELEMENT_QUEUE "queue" -#define MEDIA_TYPE_AUDIO_RAW "audio/x-raw" -#define MEDIA_TYPE_AUDIO_OPUS "audio/x-opus" -#define MEDIA_TYPE_AUDIO_VORBIS "audio/x-vorbis" -#define MEDIA_TYPE_VIDEO_RAW "video/x-raw" -#define MEDIA_TYPE_VIDEO_VP8 "video/x-vp8" -#define MEDIA_TYPE_VIDEO_VP9 "video/x-vp9" -#define MEDIA_TYPE_VIDEO_THEORA "video/x-theora" -#define MEDIA_TYPE_VIDEO_H264 "video/x-h264" -#define MEDIA_TYPE_VIDEO_H265 "video/x-h265" - typedef enum { CODEC_TYPE_OPUS, CODEC_TYPE_VORBIS,