static appdata_s g_ad;
-#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
appdata_s *get_appdata(void)
{
g_ad.conns[index].recv_channels[i] = NULL;
}
-#ifdef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
- if (g_ad.conns[index].video_render_pipeline) {
- if (gst_element_set_state(g_ad.conns[index].video_render_pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)
- g_printerr("failed to set state to NULL\n");
- gst_object_unref(g_ad.conns[index].video_render_pipeline);
- g_ad.conns[index].video_render_pipeline = NULL;
- g_ad.conns[index].appsrc_for_video = NULL;
- g_print("video render pipeline is released\n");
- }
- if (g_ad.conns[index].audio_render_pipeline) {
- if (gst_element_set_state(g_ad.conns[index].audio_render_pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)
- g_printerr("failed to set state to NULL\n");
- gst_object_unref(g_ad.conns[index].audio_render_pipeline);
- g_ad.conns[index].audio_render_pipeline = NULL;
- g_ad.conns[index].appsrc_for_audio = NULL;
- g_print("audio render pipeline is released\n");
+ if (g_ad.validate_encoded_frame_cb) {
+ if (g_ad.conns[index].video_render_pipeline) {
+ if (gst_element_set_state(g_ad.conns[index].video_render_pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)
+ g_printerr("failed to set state to NULL\n");
+ gst_object_unref(g_ad.conns[index].video_render_pipeline);
+ g_ad.conns[index].video_render_pipeline = NULL;
+ g_ad.conns[index].appsrc_for_video = NULL;
+ g_print("video render pipeline is released\n");
+ }
+ if (g_ad.conns[index].audio_render_pipeline) {
+ if (gst_element_set_state(g_ad.conns[index].audio_render_pipeline, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE)
+ g_printerr("failed to set state to NULL\n");
+ gst_object_unref(g_ad.conns[index].audio_render_pipeline);
+ g_ad.conns[index].audio_render_pipeline = NULL;
+ g_ad.conns[index].appsrc_for_audio = NULL;
+ g_print("audio render pipeline is released\n");
+ }
}
-#endif
#ifndef TIZEN_TV
if (g_ad.conns[index].encoded_audio_frame_cb_is_set ||
g_ad.conns[index].encoded_video_frame_cb_is_set)
g_print("__track_added_cb() is invoked, webrtc[%p], type[%d], id[%u], conn[%p]\n", webrtc, type, id, conn);
if (type == WEBRTC_MEDIA_TYPE_VIDEO) {
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+ if (!g_ad.validate_encoded_frame_cb) {
#ifndef TIZEN_TV
- conn->render.espp.video_track_preparing = true;
+ conn->render.espp.video_track_preparing = true;
#endif
- if (conn->render.display_type == WEBRTC_DISPLAY_TYPE_OVERLAY) {
- g_print("Video track is added, set display - overlay, object[%p]\n", g_ad.win_id);
+ if (conn->render.display_type == WEBRTC_DISPLAY_TYPE_OVERLAY) {
+ g_print("Video track is added, set display - overlay, object[%p]\n", g_ad.win_id);
#ifndef TIZEN_TV
- if (!conn->render.espp.handle)
- webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
- else
- esplusplayer_set_display(conn->render.espp.handle, ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
+ if (!conn->render.espp.handle)
+ webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
+ else
+ esplusplayer_set_display(conn->render.espp.handle, ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
#else
- webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
+ webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_OVERLAY, g_ad.win_id);
#endif
- } else if (conn->render.display_type == WEBRTC_DISPLAY_TYPE_EVAS) {
- g_print("Video track is added, set display - evas object[%p]\n", conn->render.eo);
+ } else if (conn->render.display_type == WEBRTC_DISPLAY_TYPE_EVAS) {
+ g_print("Video track is added, set display - evas object[%p]\n", conn->render.eo);
#ifndef TIZEN_TV
- if (!conn->render.espp.handle)
- webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_EVAS, conn->render.eo);
- else
- esplusplayer_set_display(conn->render.espp.handle, ESPLUSPLAYER_DISPLAY_TYPE_EVAS, conn->render.eo);
+ if (!conn->render.espp.handle)
+ webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_EVAS, conn->render.eo);
+ else
+ esplusplayer_set_display(conn->render.espp.handle, ESPLUSPLAYER_DISPLAY_TYPE_EVAS, conn->render.eo);
#else
- webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_EVAS, conn->render.eo);
+ webrtc_set_display(webrtc, id, WEBRTC_DISPLAY_TYPE_EVAS, conn->render.eo);
#endif
+ } else {
+ g_print("Video track is added, invalid display type[%d]\n", conn->render.display_type);
+ }
} else {
- g_print("Video track is added, invalid display type[%d]\n", conn->render.display_type);
- }
-#else
- g_print("Video track is added\n");
- 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");
+ g_print("Video track is added\n");
+ 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");
+ }
}
-#endif
+
} else if (type == WEBRTC_MEDIA_TYPE_AUDIO) {
g_print("Audio track is added\n");
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
- int ret;
+ if (!g_ad.validate_encoded_frame_cb) {
+ int ret;
#ifndef TIZEN_TV
- conn->render.espp.audio_track_preparing = true;
+ conn->render.espp.audio_track_preparing = true;
- if (conn->render.espp.handle) /* TODO: apply stream info if the function is provided in espp */
- return;
+ if (conn->render.espp.handle) /* TODO: apply stream info if the function is provided in espp */
+ return;
#endif
- if (!conn->render.stream_info) {
- ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, NULL, NULL, &conn->render.stream_info);
- RET_IF(ret != SOUND_MANAGER_ERROR_NONE, "failed to sound_manager_create_stream_information(), ret[0x%x]", ret);
- }
+ if (!conn->render.stream_info) {
+ ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, NULL, NULL, &conn->render.stream_info);
+ RET_IF(ret != SOUND_MANAGER_ERROR_NONE, "failed to sound_manager_create_stream_information(), ret[0x%x]", ret);
+ }
- ret = webrtc_set_sound_stream_info(webrtc, id, conn->render.stream_info);
- if (ret != WEBRTC_ERROR_NONE)
- g_printerr("failed to webrtc_set_sound_stream_info(), ret[0x%x]\n", ret);
-#else
- if ((conn->audio_render_pipeline = __build_appsrc_opus_render_pipeline(&conn->appsrc_for_audio))) {
- GstStateChangeReturn state_change_ret = gst_element_set_state(conn->audio_render_pipeline, GST_STATE_PLAYING);
- if (state_change_ret == GST_STATE_CHANGE_FAILURE)
- g_printerr("failed to set state to PLAYING to audio render pipeline\n");
+ ret = webrtc_set_sound_stream_info(webrtc, id, conn->render.stream_info);
+ if (ret != WEBRTC_ERROR_NONE)
+ g_printerr("failed to webrtc_set_sound_stream_info(), ret[0x%x]\n", ret);
+ } else {
+ if ((conn->audio_render_pipeline = __build_appsrc_opus_render_pipeline(&conn->appsrc_for_audio))) {
+ GstStateChangeReturn state_change_ret = gst_element_set_state(conn->audio_render_pipeline, GST_STATE_PLAYING);
+ if (state_change_ret == GST_STATE_CHANGE_FAILURE)
+ g_printerr("failed to set state to PLAYING to audio render pipeline\n");
+ }
}
-#endif
}
}
__espp_submit_packet(conn, packet, type);
}
#endif
-#ifdef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
- {
+ if (g_ad.validate_encoded_frame_cb) {
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;
gst_buffer_unref(buffer);
}
-#endif /* __DEBUG_VALIDATE_ENCODED_FRAME_CB__ */
#ifndef TIZEN_TV
out:
#endif
RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
g_print("webrtc_set_encoded_audio_frame_cb() success\n");
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+ if (!g_ad.validate_encoded_frame_cb) {
#ifndef TIZEN_TV
- if (!g_ad.conns[index].encoded_audio_frame_cb_is_set) {
- g_ad.conns[index].encoded_audio_frame_cb_is_set = true;
- __espp_init(index);
- }
-#endif
+ if (!g_ad.conns[index].encoded_audio_frame_cb_is_set) {
+ g_ad.conns[index].encoded_audio_frame_cb_is_set = true;
+ __espp_init(index);
+ }
#endif
+ }
}
static void _webrtc_unset_encoded_audio_frame_cb(int index)
RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
g_print("webrtc_unset_encoded_audio_frame_cb() success\n");
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+ if (!g_ad.validate_encoded_frame_cb) {
#ifndef TIZEN_TV
- if (g_ad.conns[index].encoded_audio_frame_cb_is_set) {
- g_ad.conns[index].encoded_audio_frame_cb_is_set = false;
- __espp_deinit(index);
- }
-#endif
+ if (g_ad.conns[index].encoded_audio_frame_cb_is_set) {
+ g_ad.conns[index].encoded_audio_frame_cb_is_set = false;
+ __espp_deinit(index);
+ }
#endif
+ }
}
static void _webrtc_set_encoded_video_frame_cb(int index)
g_print("webrtc_set_encoded_video_frame_cb() success\n");
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+ if (!g_ad.validate_encoded_frame_cb) {
#ifndef TIZEN_TV
- if (!g_ad.conns[index].encoded_video_frame_cb_is_set) {
- g_ad.conns[index].encoded_video_frame_cb_is_set = true;
- __espp_init(index);
- }
-#endif
+ if (!g_ad.conns[index].encoded_video_frame_cb_is_set) {
+ g_ad.conns[index].encoded_video_frame_cb_is_set = true;
+ __espp_init(index);
+ }
#endif
+ }
}
static void _webrtc_unset_encoded_video_frame_cb(int index)
g_print("webrtc_unset_encoded_video_frame_cb() success\n");
-#ifndef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
+ if (!g_ad.validate_encoded_frame_cb) {
#ifndef TIZEN_TV
- if (g_ad.conns[index].encoded_video_frame_cb_is_set) {
- g_ad.conns[index].encoded_video_frame_cb_is_set = false;
- __espp_deinit(index);
- }
-#endif
+ if (g_ad.conns[index].encoded_video_frame_cb_is_set) {
+ g_ad.conns[index].encoded_video_frame_cb_is_set = false;
+ __espp_deinit(index);
+ }
#endif
+ }
}
static void __media_packet_source_buffer_state_changed_cb(unsigned int source_id, webrtc_media_packet_source_buffer_state_e state, void *user_data)
return NULL;
}
-#if defined(__DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__) || defined(__DEBUG_VALIDATE_ENCODED_FRAME_CB__)
static int __fill_gst_buffer_mapped_data_from_packet(GstBuffer *buffer, media_packet_h packet)
{
bool has_tbm_surface = false;
return new_buffer;
}
-#endif /* __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__ */
static void __stream_handoff_cb(GstElement *object, GstBuffer *buffer, GstPad *pad, gpointer data)
{
return;
}
-#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
- GstBuffer *buffer_from_packet = NULL;
- bool is_new_buffer = false;
- media_packet_get_extra(packet, (void **)&buffer_from_packet);
- if (buffer_from_packet) {
- g_print("external gstbuffer[%p]\n", buffer_from_packet);
+ if (g_ad.validate_feeding_data) {
+ GstBuffer *buffer_from_packet = NULL;
+ bool is_new_buffer = false;
+ media_packet_get_extra(packet, (void **)&buffer_from_packet);
+ if (buffer_from_packet) {
+ g_print("external gstbuffer[%p]\n", buffer_from_packet);
+ } else {
+ buffer_from_packet = __alloc_buffer_from_packet(packet);
+ if (!buffer_from_packet) {
+ media_packet_destroy(packet);
+ return;
+ }
+ is_new_buffer = true;
+ }
+ GstFlowReturn gst_ret = GST_FLOW_OK;
+ g_signal_emit_by_name(G_OBJECT(packet_source->appsrc), "push-buffer", buffer_from_packet, &gst_ret, NULL);
+ if (gst_ret != GST_FLOW_OK)
+ g_printerr("failed to 'push-buffer', gst_ret[0x%x]\n", gst_ret);
+ if (is_new_buffer)
+ gst_buffer_unref(buffer_from_packet);
+ media_packet_destroy(packet);
+
} else {
- buffer_from_packet = __alloc_buffer_from_packet(packet);
- if (!buffer_from_packet) {
+ if (webrtc_media_packet_source_push_packet(packet_source->webrtc, packet_source->source_id, packet) != WEBRTC_ERROR_NONE) {
+ g_printerr("failed to webrtc_media_packet_source_push_packet()\n");
media_packet_destroy(packet);
- return;
}
- is_new_buffer = true;
- }
- GstFlowReturn gst_ret = GST_FLOW_OK;
- g_signal_emit_by_name(G_OBJECT(packet_source->appsrc), "push-buffer", buffer_from_packet, &gst_ret, NULL);
- if (gst_ret != GST_FLOW_OK)
- g_printerr("failed to 'push-buffer', gst_ret[0x%x]\n", gst_ret);
- if (is_new_buffer)
- gst_buffer_unref(buffer_from_packet);
- media_packet_destroy(packet);
-#else
- if (webrtc_media_packet_source_push_packet(packet_source->webrtc, packet_source->source_id, packet) != WEBRTC_ERROR_NONE) {
- g_printerr("failed to webrtc_media_packet_source_push_packet()\n");
- media_packet_destroy(packet);
}
-#endif
}
static GstCaps *__make_raw_caps(media_format_h format)
return NULL;
}
-#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
static GstElement* __build_appsrc_h264_render_pipeline(GstElement **appsrc)
{
GstElement *pipeline;
return NULL;
}
-#endif /* __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__ */
-#ifdef __DEBUG_VALIDATE_ENCODED_FRAME_CB__
static GstElement* __build_appsrc_vp8_render_pipeline(GstElement **appsrc)
{
GstElement *pipeline;
return NULL;
}
-#endif /* __DEBUG_VALIDATE_ENCODED_FRAME_CB__ */
static GstElement* __make_src_pipeline(media_packet_source_s *packet_source)
{
media_format_type_e format_type;
switch (mimetype) {
case MEDIA_FORMAT_H264_SP:
packet_source->src_pipeline = __build_h264_format_pipeline(packet_source);
-#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
- packet_source->render_pipeline = __build_appsrc_h264_render_pipeline(&packet_source->appsrc);
-#endif
+ if (g_ad.validate_feeding_data)
+ packet_source->render_pipeline = __build_appsrc_h264_render_pipeline(&packet_source->appsrc);
break;
case MEDIA_FORMAT_I420:
case MEDIA_FORMAT_NV12:
}
state_change_ret = gst_element_set_state(g_ad.conns[index].packet_sources[i].src_pipeline, GST_STATE_PLAYING);
-#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
- if (g_ad.conns[index].packet_sources[i].render_pipeline)
+ if (g_ad.validate_feeding_data && g_ad.conns[index].packet_sources[i].render_pipeline)
state_change_ret = gst_element_set_state(g_ad.conns[index].packet_sources[i].render_pipeline, GST_STATE_PLAYING);
-#endif
+
RET_IF(state_change_ret == GST_STATE_CHANGE_FAILURE, "failed to set state to PLAYING");
g_ad.conns[index].packet_sources[i].is_stop_requested = false;
g_ad.conns[index].packet_sources[i].is_stop_requested = true;
gst_element_set_state(g_ad.conns[index].packet_sources[i].src_pipeline, GST_STATE_PAUSED);
-#ifdef __DEBUG_VALIDATE_MEDIA_PACKET_SOURCE__
- if (g_ad.conns[index].packet_sources[i].render_pipeline)
+ if (g_ad.validate_feeding_data && g_ad.conns[index].packet_sources[i].render_pipeline)
gst_element_set_state(g_ad.conns[index].packet_sources[i].render_pipeline, GST_STATE_PAUSED);
-#endif
g_print("_stop_pushing_packet()\n");
}
{
printf("Usage : ");
printf("webrtc_test [option]\n\n"
- " -p, --proxy proxy URL to use (e.g. http://123.123.123.123:8080)\n"
- " -h, --help help\n");
+ " -p, --proxy proxy URL to use (e.g. http://123.123.123.123:8080)\n"
+ " -f, --validate-feeding-data validate media packet source feeding data by rendering these on gst pipeline\n"
+ " -e, --validate-encoded-frame-cb validate media packets from encoded frame callback by rendering these on gst pipeline\n"
+ " -h, --help help\n");
}
int main(int argc, char *argv[])
static struct option long_options[] = {
{ "proxy", required_argument, 0, 'p' },
+ { "validate-feeding-data", no_argument, 0, 'f' },
+ { "validate-encoded-frame-cb", no_argument, 0, 'e' },
{ "help", no_argument, 0, 'h' },
{ 0, 0, 0, 0 }
};
- if ((opt = getopt_long(argc, argv, "p:h", long_options, &opt_idx)) == -1)
+ if ((opt = getopt_long(argc, argv, "p:feh", long_options, &opt_idx)) == -1)
break;
switch (opt) {
case 'p':
strncpy(g_ad.proxy, optarg, sizeof(g_ad.proxy) - 1);
break;
+ case 'f':
+ g_ad.validate_feeding_data = true;
+ break;
+ case 'e':
+ g_ad.validate_encoded_frame_cb = true;
+ break;
case 'h':
default:
print_usage();