webrtc_test: Add vp8 decoding pipeline when __DEBUG_VALIDATE_ENCODED_FRAME_CB__ is... 02/268402/6
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 22 Dec 2021 09:41:31 +0000 (18:41 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 4 Jan 2022 08:07:47 +0000 (17:07 +0900)
[Version] 0.3.38
[Issue Type] Debug

Change-Id: I1a99f64c86f10769b539e6a15a0fda64b1f19a4d
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
test/webrtc_test.c

index 5eeae3dc718fe04ae24ad315ce37f05ee8f2955c..bcc19cbf3f061b922ceba6125a38ebb9e612ffa6 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.37
+Version:    0.3.38
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index f636e3fb7d2854b04115324b4d7a3dd40aa28e79..23984cfdb2ca11a5883d5d94bf97734dd9571aaa 100644 (file)
@@ -257,9 +257,12 @@ static webrtc_signaling_server_h g_inner_signaling_server;
 
 #if defined(__DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__) || defined(__DEBUG_VALIDATE_ENCODED_FRAME_CB__)
 GstBuffer *__alloc_buffer_from_packet(media_packet_h packet);
+#endif
+#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
 static GstElement* __build_appsrc_h264_render_pipeline(GstElement **appsrc);
 #endif
 #ifdef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+static GstElement* __build_appsrc_vp8_render_pipeline(GstElement **appsrc);
 static GstElement* __build_appsrc_opus_render_pipeline(GstElement **appsrc);
 #endif
 
@@ -2087,7 +2090,7 @@ static void __track_added_cb(webrtc_h webrtc, webrtc_media_type_e type, unsigned
                }
 #else
                g_print("Video track is added\n");
-               if ((conn->video_render_pipeline = __build_appsrc_h264_render_pipeline(&conn->appsrc_for_video))) {
+               if ((conn->video_render_pipeline = __build_appsrc_vp8_render_pipeline(&conn->appsrc_for_video))) {
                        GstStateChangeReturn state_change_ret = gst_element_set_state(conn->video_render_pipeline, GST_STATE_PLAYING);
                        if (state_change_ret == GST_STATE_CHANGE_FAILURE)
                                g_printerr("failed to set state to PLAYING to video render pipeline\n");
@@ -2172,6 +2175,7 @@ static void __encoded_frame_cb(webrtc_h webrtc, webrtc_media_type_e type, unsign
                GstFlowReturn gst_ret = GST_FLOW_OK;
                GstElement *appsrc = (type == WEBRTC_MEDIA_TYPE_AUDIO) ? conn->appsrc_for_audio : conn->appsrc_for_video;
                static bool first_audio_packet = true;
+               static bool first_video_packet = true;
                GstBuffer *buffer = __alloc_buffer_from_packet(packet);
                if (!buffer) {
                        media_packet_destroy(packet);
@@ -2199,6 +2203,27 @@ static void __encoded_frame_cb(webrtc_h webrtc, webrtc_media_type_e type, unsign
                        }
                        media_format_unref(format);
                        first_audio_packet = false;
+
+               } else if (type == WEBRTC_MEDIA_TYPE_VIDEO && first_video_packet) {
+                       media_format_h format;
+                       int width = 0;
+                       int height = 0;
+
+                       media_packet_get_format(packet, &format);
+                       media_format_get_video_info(format, NULL, &width, &height, NULL, NULL);
+                       if (width > 0 && height > 0) {
+                               GstCaps *caps = gst_caps_new_simple("video/x-vp8",
+                                       "width", G_TYPE_INT, width,
+                                       "height", G_TYPE_INT, height,
+                                       NULL);
+
+                               g_print("width[%d] height[%d]\n", width, height);
+
+                               g_object_set(G_OBJECT(appsrc), "caps", caps, NULL);
+                               gst_caps_unref(caps);
+                       }
+                       media_format_unref(format);
+                       first_video_packet = false;
                }
 
                g_signal_emit_by_name(G_OBJECT(appsrc), "push-buffer", buffer, &gst_ret, NULL);
@@ -3214,13 +3239,13 @@ error:
        return NULL;
 }
 
-#if defined(__DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__) || defined(__DEBUG_VALIDATE_ENCODED_FRAME_CB__)
+#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
 static GstElement* __build_appsrc_h264_render_pipeline(GstElement **appsrc)
 {
        GstElement *pipeline;
-       GstElement *src;
-       GstElement *dec;
-       GstElement *convert;
+       GstElement *src = NULL;
+       GstElement *dec = NULL;
+       GstElement *convert = NULL;
        GstElement *sink;
        GstCaps *caps;
 
@@ -3251,19 +3276,19 @@ static GstElement* __build_appsrc_h264_render_pipeline(GstElement **appsrc)
        dec = gst_element_factory_make("avdec_h264", NULL);
        if (!dec) {
                g_printerr("failed to gst_element_factory_make(), avdec_h264\n");
-               goto error;
+               goto error_with_unref_elem;
        }
 
        convert = gst_element_factory_make("videoconvert", NULL);
        if (!convert) {
                g_printerr("failed to gst_element_factory_make(), videoconvert\n");
-               goto error;
+               goto error_with_unref_elem;
        }
 
        sink = gst_element_factory_make("tizenwlsink", NULL);
        if (!sink) {
                g_printerr("failed to gst_element_factory_make(), tizenwlsink\n");
-               goto error;
+               goto error_with_unref_elem;
        }
 
        gst_bin_add_many(GST_BIN(pipeline), src, dec, convert, sink, NULL);
@@ -3278,13 +3303,95 @@ static GstElement* __build_appsrc_h264_render_pipeline(GstElement **appsrc)
 
        return pipeline;
 
+error_with_unref_elem:
+       if (src)
+               gst_object_unref(src);
+       if (dec)
+               gst_object_unref(dec);
+       if (convert)
+               gst_object_unref(convert);
 error:
        gst_object_unref(pipeline);
        return NULL;
 }
-#endif
 
+#endif /* __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__ */
 #ifdef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+static GstElement* __build_appsrc_vp8_render_pipeline(GstElement **appsrc)
+{
+       GstElement *pipeline;
+       GstElement *src = NULL;
+       GstElement *dec = NULL;
+       GstElement *convert = NULL;
+       GstElement *sink;
+       GstCaps *caps;
+
+       if (!appsrc) {
+               g_printerr("appsrc is NULL\n");
+               return NULL;
+       }
+
+       pipeline = gst_pipeline_new("appsrc-vp8-render-pipeline");
+
+       src = gst_element_factory_make("appsrc", NULL);
+       if (!src) {
+               g_printerr("failed to gst_element_factory_make(), appsrc\n");
+               goto error;
+       }
+
+       caps = gst_caps_new_simple("video/x-vp8", NULL, NULL);
+
+       g_object_set(G_OBJECT(src),
+               "format", GST_FORMAT_TIME,
+               "caps", caps,
+               NULL);
+       gst_caps_unref(caps);
+
+       dec = gst_element_factory_make("vp8dec", NULL);
+       if (!dec) {
+               g_printerr("failed to gst_element_factory_make(), vp8dec\n");
+               goto error_with_unref_elem;
+       }
+
+       convert = gst_element_factory_make("videoconvert", NULL);
+       if (!convert) {
+               g_printerr("failed to gst_element_factory_make(), videoconvert\n");
+               goto error_with_unref_elem;
+       }
+
+       sink = gst_element_factory_make("tizenwlsink", NULL);
+       if (!sink) {
+               g_printerr("failed to gst_element_factory_make(), tizenwlsink\n");
+               goto error_with_unref_elem;
+       }
+       g_object_set(G_OBJECT(sink),
+               "sync", FALSE,
+               NULL);
+
+       gst_bin_add_many(GST_BIN(pipeline), src, dec, convert, sink, NULL);
+       if (!gst_element_link_many(src, dec, convert, sink, NULL)) {
+               g_printerr("failed to gst_element_link_many(), appsrc_vp8_render\n");
+               goto error;
+       }
+
+       *appsrc = src;
+
+       g_print("appsrc VP8 render pipeline is created\n");
+
+       return pipeline;
+
+error_with_unref_elem:
+       if (src)
+               gst_object_unref(src);
+       if (dec)
+               gst_object_unref(dec);
+       if (convert)
+               gst_object_unref(convert);
+error:
+       gst_object_unref(pipeline);
+       return NULL;
+}
+
 static GstElement* __build_appsrc_opus_render_pipeline(GstElement **appsrc)
 {
        GstElement *pipeline;
@@ -3350,8 +3457,8 @@ error:
        gst_object_unref(pipeline);
        return NULL;
 }
-#endif
 
+#endif /* __DEBUG_VALIDATE_ENCODED_FRAME_CB__ */
 static GstElement* __make_src_pipeline(media_packet_source_s *packet_source)
 {
        media_format_type_e format_type;