webrtc_ini: Add new item to set EVAS native surface tbm format 26/277626/4
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 11 Jul 2022 02:31:32 +0000 (11:31 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 12 Jul 2022 03:46:40 +0000 (03:46 +0000)
It is also modified that loopback pipeline of source and video sink bin
apply it in case of EVAS surface type.

[Version] 0.3.150
[Issue Type] New feature

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

index 4e574354d6b6bc671403bbf1fc08f480d743036b..dc750f85c14ecbc899c39bb6d27fc24ce9491ab8 100644 (file)
@@ -351,6 +351,7 @@ typedef struct _ini_item_media_source_s {
 typedef struct _ini_item_rendering_sink_s {
        const char *a_sink_element;
        const char *v_sink_element;
+       const char *evas_native_surface_tbm_format;
        GStrv a_hw_decoder_elements;
        GStrv v_hw_decoder_elements;
        bool v_overlay_resource_required;
index cf4d17583b638225afe8665af3549d18322c9ba7..7c76be7acc96be3a6f0eabc68c643aa4a1bb807c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.149
+Version:    0.3.150
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 91588cba8b77d349d65ca4ebe7a333e54cb39222..67a0ef778a906b50db24f563a6ff7279da9f958e 100644 (file)
 #define INI_ITEM_VIDEO_SINK_ELEMENT               "video sink element"
 #define INI_ITEM_AUDIO_HW_DECODER_ELEMENTS        "audio hw decoder elements"
 #define INI_ITEM_VIDEO_HW_DECODER_ELEMENTS        "video hw decoder elements"
+#define INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT   "evas native surface tbm format"
 
 /* items for resource acquisition */
 #define INI_ITEM_RESOURCE_CAMERA                "camera"
@@ -250,6 +251,7 @@ static void __dump_ini(webrtc_ini_s *ini)
        __dump_item(INI_ITEM_VIDEO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_sink_element);
        __dump_item(INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.a_hw_decoder_elements);
        __dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.v_hw_decoder_elements);
+       __dump_item(INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.evas_native_surface_tbm_format);
 
        LOG_INFO("[%s]", INI_CATEGORY_RESOURCE_ACQUISITION);
        __dump_item(INI_ITEM_RESOURCE_CAMERA, INI_ITEM_TYPE_BOOL, &ini->resource_acquisition.camera);
@@ -525,6 +527,7 @@ void _load_ini(webrtc_s *webrtc)
        ini->rendering_sink.v_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_SINK_ELEMENT, DEFAULT_VIDEO_SINK_ELEMENT);
        __ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, &ini->rendering_sink.a_hw_decoder_elements, NULL);
        __ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, &ini->rendering_sink.v_hw_decoder_elements, NULL);
+       ini->rendering_sink.evas_native_surface_tbm_format = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, DEFAULT_VIDEO_RAW_FORMAT);
 
        ini->resource_acquisition.camera = __ini_get_boolean(ini->dict, INI_CATEGORY_RESOURCE_ACQUISITION,
                INI_ITEM_RESOURCE_CAMERA, DEFAULT_RESOURCE_CAMERA_REQUIRED);
index 68d24a6c47314d61dbdaa8b31bf8eef81307f360..eab48e350aa8309ea110cca614cf2666d9d549c9 100644 (file)
@@ -125,6 +125,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
 {
        webrtc_gst_slot_s *sink;
        GstElement *videoconvert = NULL;
+       GstElement *capsfilter;
        GstElement *videosink;
        GstElement *link_to;
        const char *videosink_factory_name;
@@ -160,11 +161,6 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                                return ret;
                }
 #endif
-               if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL)))
-                       goto exit;
-               PREPEND_ELEMENT(element_list, videoconvert);
-               link_to = videoconvert;
-
                if (sink->display->type == WEBRTC_DISPLAY_TYPE_OVERLAY ||
                        sink->display->type == WEBRTC_DISPLAY_TYPE_ECORE_WL) {
                        gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(videosink), sink->display->overlay_surface_id);
@@ -178,13 +174,29 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                                NULL);
 
                } else if (sink->display->type == WEBRTC_DISPLAY_TYPE_EVAS) {
+                       GstCaps *caps;
                        g_object_set(G_OBJECT(videosink),
                                "sync", TRUE,
                                "qos", TRUE,
                                "signal-handoffs", TRUE,
                                NULL);
                        _connect_and_append_signal(&sink->signals, (GObject *)videosink, "handoff", G_CALLBACK(_video_stream_decoded_cb), sink->display);
+
+                       if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL)))
+                               goto exit;
+                       PREPEND_ELEMENT(element_list, capsfilter);
+
+                       caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
+                                                       "format", G_TYPE_STRING, webrtc->ini.rendering_sink.evas_native_surface_tbm_format,
+                                                       NULL);
+                       g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
+                       gst_caps_unref(caps);
                }
+
+               if (!(videoconvert = _create_element(DEFAULT_ELEMENT_VIDEOCONVERT, NULL)))
+                       goto exit;
+               PREPEND_ELEMENT(element_list, videoconvert);
+               link_to = videoconvert;
        }
 
        if (!_add_elements_to_bin(sink->bin, element_list)) {
index b0e0d2512c347bce4642a8f91c303aee703e255f..ea4883228e6738392e02d6edc5f472c7ece11c81 100644 (file)
@@ -3353,6 +3353,7 @@ static int __build_loopback_videosink(webrtc_gst_slot_s *source, GstElement *lin
        const char *videosink_factory_name;
        GstElement *videosink;
        GstElement *videoconvert;
+       GstElement *capsfilter;
        GList *element_list = NULL;
 
        RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
@@ -3390,6 +3391,19 @@ static int __build_loopback_videosink(webrtc_gst_slot_s *source, GstElement *lin
                return WEBRTC_ERROR_INVALID_OPERATION;
        APPEND_ELEMENT(element_list, videoconvert);
 
+       if (source->display->type == WEBRTC_DISPLAY_TYPE_EVAS) {
+               GstCaps *caps;
+               if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL)))
+                       goto exit;
+               APPEND_ELEMENT(element_list, capsfilter);
+
+               caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
+                                               "format", G_TYPE_STRING, webrtc->ini.rendering_sink.evas_native_surface_tbm_format,
+                                               NULL);
+               g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
+               gst_caps_unref(caps);
+       }
+
        if (!(videosink = _create_element(videosink_factory_name, NULL)))
                goto exit;
        APPEND_ELEMENT(element_list, videosink);