diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp | 68 | ||||
-rw-r--r-- | src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h | 1 |
2 files changed, 52 insertions, 17 deletions
diff --git a/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp b/src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp index b36935c..6667017 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; @@ -330,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; @@ -438,11 +451,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 +701,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 +717,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,7 +1020,10 @@ int MilesSessionInvoker::video_transmitter(struct miles_video_grabber_context *g static int first_time=1; struct timeval now; int tbf; + char *video_buf_ptr; +#ifndef WIN32 + // Need to fix gettimeofday() on Win if (first_time) { gettimeofday(&last_time, 0); first_time = 0; @@ -1008,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); @@ -1017,8 +1044,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; |