webrtc_sink: Add capsfilter to apply stream-format and alignment in case of H264... 56/253256/1
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 8 Feb 2021 04:09:21 +0000 (13:09 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 8 Feb 2021 04:09:21 +0000 (13:09 +0900)
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 <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_sink.c
src/webrtc_source.c

index 94b54b3100d8e72800de866708bca57ed421d32c..43a4a4d7183012ce56064fc8f8cc35be0621e168 100644 (file)
@@ -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"
index feaaefcb19397e089c38ea8daa52bc1910d15ea3..d13fcfd1967c481b3b6f28b0053b6e333347f858 100644 (file)
@@ -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
index ae5ca35d17407d1cb12c976b997725b5015d38a1..28015a64a5cbb81d333acf599a5a78877e894518 100644 (file)
@@ -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;
        }
index 9950791c5fe6a649da78d9d5bee4abba32e033ef..b89851e3528b6c348bc8d3a5e20bcf72ae04c8f9 100644 (file)
 #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,