From a86ceb275961c259e3ac8f1ff03b3da059d98f62 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 31 Jul 2013 18:18:37 -0700 Subject: [PATCH] More work on full frame video. --- interface/src/Webcam.cpp | 8 +++++--- interface/src/avatar/Face.cpp | 27 +++++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/interface/src/Webcam.cpp b/interface/src/Webcam.cpp index b11f134fc5..3b1f1ec9ee 100644 --- a/interface/src/Webcam.cpp +++ b/interface/src/Webcam.cpp @@ -569,7 +569,8 @@ void FrameGrabber::grabFrame() { _faceColor = color; } - // convert from RGB to YV12 + // convert from RGB to YV12: see http://www.fourcc.org/yuv.php and + // http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor const int ENCODED_BITS_PER_Y = 8; const int ENCODED_BITS_PER_VU = 2; const int ENCODED_BITS_PER_PIXEL = ENCODED_BITS_PER_Y + 2 * ENCODED_BITS_PER_VU; @@ -627,9 +628,10 @@ void FrameGrabber::grabFrame() { // encode the frame vpx_codec_encode(&_colorCodec, &vpxImage, ++_frameCount, 1, 0, VPX_DL_REALTIME); - // start the payload off with the aspect ratio + // start the payload off with the aspect ratio (zero for no face) QByteArray payload(sizeof(float), 0); - *(float*)payload.data() = _smoothedFaceRect.size.width / _smoothedFaceRect.size.height; + *(float*)payload.data() = (_videoSendMode == FACE_VIDEO) ? + (_smoothedFaceRect.size.width / _smoothedFaceRect.size.height) : 0.0f; // extract the encoded frame vpx_codec_iter_t iterator = 0; diff --git a/interface/src/avatar/Face.cpp b/interface/src/avatar/Face.cpp index ff31241c54..72d1b5d5c2 100644 --- a/interface/src/avatar/Face.cpp +++ b/interface/src/avatar/Face.cpp @@ -97,7 +97,8 @@ int Face::processVideoMessage(unsigned char* packetData, size_t dataBytes) { vpx_codec_iter_t iterator = 0; vpx_image_t* image; while ((image = vpx_codec_get_frame(&_colorCodec, &iterator)) != 0) { - // convert from YV12 to RGB + // convert from YV12 to RGB: see http://www.fourcc.org/yuv.php and + // http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor Mat color(image->d_h, image->d_w, CV_8UC3); uchar* yline = image->planes[0]; uchar* vline = image->planes[1]; @@ -208,9 +209,19 @@ bool Face::render(float alpha) { glm::quat orientation = _owningHead->getOrientation(); glm::vec3 axis = glm::axis(orientation); glRotatef(glm::angle(orientation), axis.x, axis.y, axis.z); - float scale = BODY_BALL_RADIUS_HEAD_BASE * _owningHead->getScale(); + + float aspect, scale; + if (_aspectRatio == 0.0f) { + aspect = _textureSize.width / _textureSize.height; + const float FULL_FRAME_SCALE = 0.5f; + scale = FULL_FRAME_SCALE * _owningHead->getScale(); + + } else { + aspect = _aspectRatio; + scale = BODY_BALL_RADIUS_HEAD_BASE * _owningHead->getScale(); + } glScalef(scale, scale, scale); - + glColor4f(1.0f, 1.0f, 1.0f, alpha); Point2f points[4]; @@ -292,7 +303,7 @@ bool Face::render(float alpha) { (points[3].x - points[0].x) / _textureSize.width, (points[3].y - points[0].y) / _textureSize.height); _program->setUniformValue(_texCoordUpLocation, (points[1].x - points[0].x) / _textureSize.width, (points[1].y - points[0].y) / _textureSize.height); - _program->setUniformValue(_aspectRatioLocation, _aspectRatio); + _program->setUniformValue(_aspectRatioLocation, aspect); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, 0); @@ -324,13 +335,13 @@ bool Face::render(float alpha) { glBegin(GL_QUADS); glTexCoord2f(points[0].x / _textureSize.width, points[0].y / _textureSize.height); - glVertex3f(0.5f, -0.5f / _aspectRatio, -0.5f); + glVertex3f(0.5f, -0.5f / aspect, -0.5f); glTexCoord2f(points[1].x / _textureSize.width, points[1].y / _textureSize.height); - glVertex3f(0.5f, 0.5f / _aspectRatio, -0.5f); + glVertex3f(0.5f, 0.5f / aspect, -0.5f); glTexCoord2f(points[2].x / _textureSize.width, points[2].y / _textureSize.height); - glVertex3f(-0.5f, 0.5f / _aspectRatio, -0.5f); + glVertex3f(-0.5f, 0.5f / aspect, -0.5f); glTexCoord2f(points[3].x / _textureSize.width, points[3].y / _textureSize.height); - glVertex3f(-0.5f, -0.5f / _aspectRatio, -0.5f); + glVertex3f(-0.5f, -0.5f / aspect, -0.5f); glEnd(); glDisable(GL_TEXTURE_2D);