summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-11-11 12:08:04 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2013-11-11 12:08:04 (GMT)
commit691b83f05dce412e74c15dec1972f1ff228d54c7 (patch)
treef5f443a01e5f968533a3cbb869d5bf88da94ce58 /src
parentc0ee0966fee8005b926ec4cb6f21bda97e0f4647 (diff)
parente5751314a2d5700903a4f3b0ca8155164b469dbc (diff)
downloaduscxml-691b83f05dce412e74c15dec1972f1ff228d54c7.zip
uscxml-691b83f05dce412e74c15dec1972f1ff228d54c7.tar.gz
uscxml-691b83f05dce412e74c15dec1972f1ff228d54c7.tar.bz2
Merge branch 'master' of https://github.com/tklab-tud/uscxml
Diffstat (limited to 'src')
-rw-r--r--src/uscxml/plugins/invoker/miles/MilesSessionInvoker.cpp68
-rw-r--r--src/uscxml/plugins/invoker/miles/MilesSessionInvoker.h1
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;