From ff20ef307ab7fe199a19e687579319a4de66f186 Mon Sep 17 00:00:00 2001 From: Autobuilder at buildslave-ubuntu-12-32 Date: Thu, 7 Nov 2013 14:56:30 +0100 Subject: video grabber improvements --- .../plugins/invoker/miles/MilesSessionInvoker.cpp | 59 +++++++++++++++------- .../plugins/invoker/miles/MilesSessionInvoker.h | 1 + 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp index b36935c..d51e94e 100644 --- a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp +++ b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp @@ -65,6 +65,7 @@ Data MilesSessionInvoker::getDataModelVariables() { void MilesSessionInvoker::init_media_buffers() { video_out_buf = NULL; + video_conv_buf = NULL; encoded_out_img = NULL; audio_in_buf = NULL; render_img = NULL; @@ -81,6 +82,9 @@ void MilesSessionInvoker::free_media_buffers() { if(video_out_buf) free(video_out_buf); video_out_buf = NULL; + if(video_conv_buf) + free(video_conv_buf); + video_conv_buf = NULL; if(encoded_out_img) free(encoded_out_img); encoded_out_img = NULL; @@ -113,6 +117,9 @@ void MilesSessionInvoker::free_video_buffers() { if(video_out_buf) free(video_out_buf); video_out_buf = NULL; + if(video_conv_buf) + free(video_conv_buf); + video_conv_buf = NULL; if(encoded_out_img) free(encoded_out_img); encoded_out_img = NULL; @@ -438,11 +445,10 @@ void MilesSessionInvoker::processEventThumbnail(const std::string& origin, const ev.name = "thumbnail.reply"; struct thumb_entry *use_thumb = NULL; - struct miles_rtp_in_stream *rtps; struct miles_list *p; struct thumb_entry *te; _mutex.lock(); - // Find thumbnail of user + // Find thumbnail of user p = thumb_list; while(p) { te = (struct thumb_entry *)p->item; @@ -689,18 +695,6 @@ int MilesSessionInvoker::setup_audio() { int MilesSessionInvoker::setup_video_grabber() { struct miles_video_grabber_description *grabber_description; - /* Initialize and configure video encoder */ - video_encoder = miles_video_codec_init_encoder(); - video_encoder->codec_id = miles_video_codec_get_encoder_for_rtp_payload_type(MILES_RTP_PAYLOAD_TYPE_JPEG); - video_encoder->width = 320; - video_encoder->height = 240; - video_encoder->qfactor = 50; - int rv = miles_video_codec_setup_encoder(video_encoder); - if (!rv) { - LOG(ERROR) << "Could not setup video encoder"; - return 0; - } - /* Set up video grabber */ int n = miles_video_grabber_get_supported_grabbers(&supported_video_grabbers); if(n<=0) { @@ -717,17 +711,40 @@ int MilesSessionInvoker::setup_video_grabber() { /* Make sure there is a device */ if(grabber_description->devices != NULL) { use_grabber = i; + free(grabber_description); break; } } + free(grabber_description); } } + grabber_description = miles_video_grabber_get_description(supported_video_grabbers[use_grabber]); video_grabber = miles_video_grabber_create_context(supported_video_grabbers[use_grabber]); - video_grabber->width = video_encoder->width; - video_grabber->height = video_encoder->height; + video_grabber->width = 320; + video_grabber->height = 240; video_grabber->frame_rate = 25*100; + /* Select first supported image format */ + struct miles_video_grabber_device *dev; + dev = (struct miles_video_grabber_device *)grabber_description->devices->item; + struct miles_int_struct *img_format; + img_format = (struct miles_int_struct *)dev->capabilities->formats->item; + video_grabber->image_format = img_format->value; miles_video_grabber_setup(video_grabber); free(supported_video_grabbers); + free(grabber_description); + + /* Initialize and configure video encoder */ + video_encoder = miles_video_codec_init_encoder(); + video_encoder->codec_id = miles_video_codec_get_encoder_for_rtp_payload_type(MILES_RTP_PAYLOAD_TYPE_JPEG); + video_encoder->width = video_grabber->width = 320; + video_encoder->height = video_grabber->height = 240; + video_encoder->qfactor = 50; + video_encoder->input_format = video_grabber->image_format; + int rv = miles_video_codec_setup_encoder(video_encoder); + if (!rv) { + LOG(ERROR) << "Could not setup video encoder"; + return 0; + } video_out_buf = (char *)malloc(video_encoder->width*video_encoder->height*4); encoded_out_img = (char *)malloc(video_encoder->width*video_encoder->height*4); @@ -997,6 +1014,7 @@ int MilesSessionInvoker::video_transmitter(struct miles_video_grabber_context *g static int first_time=1; struct timeval now; int tbf; + char *video_buf_ptr; if (first_time) { gettimeofday(&last_time, 0); @@ -1017,8 +1035,15 @@ int MilesSessionInvoker::video_transmitter(struct miles_video_grabber_context *g return 0; if(grabber->image_format != codec_ctx->input_format) { /* image conversion ... */ + if(video_conv_buf==NULL) + video_conv_buf = (char *)malloc(codec_ctx->width*codec_ctx->height*4); + printf("converting video...\n"); + miles_image_convert(video_out_buf, video_conv_buf, grabber->image_format, codec_ctx->input_format, codec_ctx->width, codec_ctx->height); + video_buf_ptr = video_conv_buf; + } else { + video_buf_ptr = video_out_buf; } - n = miles_video_codec_encode(codec_ctx, video_out_buf, encoded_out_img); + n = miles_video_codec_encode(codec_ctx, video_buf_ptr, encoded_out_img); if(n<=0) return 0; return miles_rtp_send(rtp_stream, encoded_out_img, n); diff --git a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h index fec2243..63d3011 100644 --- a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h +++ b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h @@ -110,6 +110,7 @@ protected: std::string ip_address; char *video_out_buf; + char *video_conv_buf; char *encoded_out_img; char *audio_in_buf; char *render_img; -- cgit v0.12 From 37bfae41ae210cbf100fac9783ebaa962053edd9 Mon Sep 17 00:00:00 2001 From: Autobuilder at buildslave-ubuntu-12-32 Date: Fri, 8 Nov 2013 09:17:21 +0100 Subject: CNAME of outgoing streams set --- src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp index d51e94e..87f6e1e 100644 --- a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp +++ b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp @@ -337,11 +337,17 @@ void MilesSessionInvoker::processEventStart(const std::string& origin, const std out_rtp_video_stream = miles_rtp_setup_outgoing_stream(video_session, video_rtp_out_socket, 0, MILES_RTP_PAYLOAD_TYPE_JPEG); out_rtp_video_stream->codec_ctx = video_encoder; out_rtcp_video_stream = miles_rtp_setup_outgoing_rtcp_stream(video_session->rtcp_session, video_rtcp_out_socket, out_rtp_video_stream->ssrc); + if(out_rtp_video_stream->sdes.cname) + free(out_rtp_video_stream->sdes.cname); + out_rtp_video_stream->sdes.cname = strdup(userid.c_str()); } /* Set up outgoing RTP stream for audio */ if(audio_available) { out_rtp_audio_stream = miles_rtp_setup_outgoing_stream(audio_session, audio_rtp_out_socket, 0, MILES_RTP_PAYLOAD_TYPE_L16); + if(out_rtp_audio_stream->sdes.cname) + free(out_rtp_audio_stream->sdes.cname); + out_rtp_audio_stream->sdes.cname = strdup(userid.c_str()); /* Associate RTP stream with codec context */ out_rtp_audio_stream->codec_ctx = audio_encoder; -- cgit v0.12 From 114bca005c398cdbf79c146fe02ddda13634b768 Mon Sep 17 00:00:00 2001 From: Autobuilder at buildslave-ubuntu-12-32 Date: Fri, 8 Nov 2013 17:11:50 +0100 Subject: commented out gettimeofday to compile on Windows --- src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp index 87f6e1e..6667017 100644 --- a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp +++ b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp @@ -1022,6 +1022,8 @@ int MilesSessionInvoker::video_transmitter(struct miles_video_grabber_context *g int tbf; char *video_buf_ptr; +#ifndef WIN32 + // Need to fix gettimeofday() on Win if (first_time) { gettimeofday(&last_time, 0); first_time = 0; @@ -1032,6 +1034,7 @@ int MilesSessionInvoker::video_transmitter(struct miles_video_grabber_context *g return 0; last_time = now; +#endif /* Send RTCP packets, if due */ miles_rtp_send_rtcp(out_rtcp_stream); -- cgit v0.12