Set wait-for-keyframe to rtpv8depay 25/246825/8
authorHyunil <hyunil46.park@samsung.com>
Wed, 4 Nov 2020 08:38:09 +0000 (17:38 +0900)
committerHyunil <hyunil46.park@samsung.com>
Thu, 12 Nov 2020 04:13:20 +0000 (13:13 +0900)
- If property is set, rtpvp8depay drops the buffer being depayed and wait intra frame when packet loss occurs
- Add element-added callback
- Add parsing ini value(wait for keyframe)

[Issue type] Improvement
[Version] 0.1.129

Change-Id: Ief9a0331b3bbbd12d3b2c697539fcc25831ebeb2
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
include/media_streamer_util.h
packaging/capi-media-streamer.spec
src/media_streamer_gst_webrtc.c

index e2a7f69..716d0b0 100644 (file)
@@ -149,6 +149,7 @@ typedef struct _media_streamer_wl_info_s {
 #define DEFAULT_GENERATE_DOT                FALSE
 #define DEFAULT_USE_DECODEBIN               FALSE
 #define DEFAULT_USE_ZEROCOPY                FALSE
+#define DEFAULT_WAIT_FOR_KEYFRAME           TRUE
 #define DEFAULT_QUEUE                       "queue"
 #define DEFAULT_FILTER                      "capsfilter"
 #define DEFAULT_TYPEFIND                    "typefind"
index d519a06..d2e8892 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.128
+Version:    0.1.129
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 3a1641b..1d3f103 100644 (file)
@@ -636,6 +636,27 @@ static void __trigger_decoded_ready_callback(media_streamer_node_s *webrtc_node,
        ms_debug("<===== end of the callback");
 }
 
+static void __decodebin_element_added_cb(GstElement *decodebin, GstElement *element, gpointer user_data)
+{
+       const gchar *klass = NULL;
+       gchar *factory_name = NULL;
+       gboolean wait_for_keyframe = DEFAULT_WAIT_FOR_KEYFRAME;
+
+       ms_retm_if(decodebin == NULL, "decodebin is NULL");
+       ms_retm_if(element == NULL, "element is NULL");
+
+       klass = gst_element_factory_get_metadata(gst_element_get_factory(element), GST_ELEMENT_METADATA_KLASS);
+       factory_name = GST_OBJECT_NAME(gst_element_get_factory(element));
+
+       ms_debug("klass: %s, factory_name: %s, element name : %s", klass, factory_name, GST_ELEMENT_NAME(element));
+
+       if (g_strrstr(klass, "Codec/Depayloader/Network/RTP") && g_strrstr(factory_name, "rtpvp8depay")) {
+               wait_for_keyframe = ms_ini_get_boolean("general:wait for keyframe", DEFAULT_WAIT_FOR_KEYFRAME);
+               ms_debug("set wait-for-keyframe[%s] to rtpvp8depay", (wait_for_keyframe) ? "TRUE" : "FALSE");
+               g_object_set(G_OBJECT(element), "wait-for-keyframe", wait_for_keyframe, NULL);
+       }
+}
+
 static void __decodebin_pad_added_cb(GstElement *decodebin, GstPad *new_pad, gpointer user_data)
 {
        media_streamer_node_s *webrtc_node = (media_streamer_node_s *)user_data;
@@ -713,6 +734,7 @@ void ms_webrtcbin_pad_added_cb(GstElement *webrtcbin, GstPad *new_pad, gpointer
 
        g_signal_connect(decodebin, "pad-added", G_CALLBACK(__decodebin_pad_added_cb), webrtc_node);
        g_signal_connect(decodebin, "autoplug-select", G_CALLBACK(ms_decodebin_autoplug_select_cb), webrtc_node->parent_streamer);
+       g_signal_connect(decodebin, "element-added", G_CALLBACK(__decodebin_element_added_cb), NULL);
        sink_pad = gst_element_get_static_pad(decodebin, "sink");
        ms_retm_if(sink_pad == NULL, "sink_pad is NULL");