#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
}
#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");
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);
}
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);
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;
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);
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;
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;