mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
Video (both ways)
May or not work, depending on the camera, time of day, phases of the moon, and distance to the closest uTox installation
This commit is contained in:
parent
b394372ad0
commit
aabc8367bb
9
core.cpp
9
core.cpp
|
@ -1172,7 +1172,7 @@ void Core::prepareCall(int friendId, int callId, ToxAv* toxav, bool videoEnabled
|
||||||
calls[callId].sendVideoTimer.setSingleShot(true);
|
calls[callId].sendVideoTimer.setSingleShot(true);
|
||||||
connect(&calls[callId].sendVideoTimer, &QTimer::timeout, [=](){
|
connect(&calls[callId].sendVideoTimer, &QTimer::timeout, [=](){
|
||||||
Widget::getInstance()->getCore()->sendCallVideo(callId);});
|
Widget::getInstance()->getCore()->sendCallVideo(callId);});
|
||||||
//calls[callId].sendVideoTimer.start();
|
calls[callId].sendVideoTimer.start();
|
||||||
|
|
||||||
Widget::getInstance()->getCamera()->suscribe();
|
Widget::getInstance()->getCamera()->suscribe();
|
||||||
}
|
}
|
||||||
|
@ -1300,14 +1300,15 @@ void Core::sendCallVideo(int callId)
|
||||||
if (!calls[callId].active || !calls[callId].videoEnabled)
|
if (!calls[callId].active || !calls[callId].videoEnabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint8_t videobuf[TOXAV_VIDEO_WIDTH * TOXAV_VIDEO_HEIGHT * 4];
|
const int bufsize = TOXAV_MAX_VIDEO_WIDTH * TOXAV_MAX_VIDEO_HEIGHT * 4;
|
||||||
|
uint8_t videobuf[bufsize];
|
||||||
vpx_image frame = camera->getLastVPXImage();
|
vpx_image frame = camera->getLastVPXImage();
|
||||||
if (frame.w && frame.h)
|
if (frame.w && frame.h)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
if((result = toxav_prepare_video_frame(toxav, callId, videobuf, sizeof(videobuf), &frame)) < 0)
|
if((result = toxav_prepare_video_frame(toxav, callId, videobuf, bufsize, &frame)) < 0)
|
||||||
{
|
{
|
||||||
qDebug() << "Core: toxav_prepare_video_frame error\n";
|
qDebug() << QString("Core: toxav_prepare_video_frame: error %1").arg(result);
|
||||||
calls[callId].sendVideoTimer.start();
|
calls[callId].sendVideoTimer.start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
2
core.h
2
core.h
|
@ -43,6 +43,8 @@
|
||||||
#define TOXAV_RINGING_TIME 15
|
#define TOXAV_RINGING_TIME 15
|
||||||
|
|
||||||
// TODO: Put that in the settings
|
// TODO: Put that in the settings
|
||||||
|
#define TOXAV_MAX_VIDEO_WIDTH 1600
|
||||||
|
#define TOXAV_MAX_VIDEO_HEIGHT 1200
|
||||||
#define TOXAV_VIDEO_WIDTH 640
|
#define TOXAV_VIDEO_WIDTH 640
|
||||||
#define TOXAV_VIDEO_HEIGHT 480
|
#define TOXAV_VIDEO_HEIGHT 480
|
||||||
|
|
||||||
|
|
1
main.cpp
1
main.cpp
|
@ -24,6 +24,7 @@ int main(int argc, char *argv[])
|
||||||
/** TODO
|
/** TODO
|
||||||
* ">using a dedicated tool to maintain a TODO list" edition
|
* ">using a dedicated tool to maintain a TODO list" edition
|
||||||
*
|
*
|
||||||
|
* Most cameras use YUYV, implement YUYV -> YUV240
|
||||||
* Groupchat users count not updated when people leave
|
* Groupchat users count not updated when people leave
|
||||||
* Sending large files (~380MB) "restarts" after ~10MB. Goes back to 0%, consumes twice as much ram (reloads the file?)
|
* Sending large files (~380MB) "restarts" after ~10MB. Goes back to 0%, consumes twice as much ram (reloads the file?)
|
||||||
* => Don't load the whole file at once, load small chunks (25MB?) when needed, then free them and load the next
|
* => Don't load the whole file at once, load small chunks (25MB?) when needed, then free them and load the next
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include <QVideoSurfaceFormat>
|
#include <QVideoSurfaceFormat>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QVideoEncoderSettings>
|
||||||
|
#include <QVideoEncoderSettingsControl>
|
||||||
|
|
||||||
Camera::Camera()
|
Camera::Camera()
|
||||||
: refcount{0}, camera{new QCamera}
|
: refcount{0}, camera{new QCamera}
|
||||||
|
@ -8,6 +10,12 @@ Camera::Camera()
|
||||||
camera->setCaptureMode(QCamera::CaptureVideo);
|
camera->setCaptureMode(QCamera::CaptureVideo);
|
||||||
camera->setViewfinder(this);
|
camera->setViewfinder(this);
|
||||||
|
|
||||||
|
QMediaService *m = camera->service();
|
||||||
|
QVideoEncoderSettingsControl *enc = m->requestControl<QVideoEncoderSettingsControl*>();
|
||||||
|
QVideoEncoderSettings sets = enc->videoSettings();
|
||||||
|
sets.setResolution(640, 480);
|
||||||
|
enc->setVideoSettings(sets);
|
||||||
|
|
||||||
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(onCameraError(QCamera::Error)));
|
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(onCameraError(QCamera::Error)));
|
||||||
|
|
||||||
supportedFormats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 << QVideoFrame::Format_RGB32;
|
supportedFormats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 << QVideoFrame::Format_RGB32;
|
||||||
|
@ -191,7 +199,7 @@ vpx_image Camera::getLastVPXImage()
|
||||||
img.planes[VPX_PLANE_U] = vData;
|
img.planes[VPX_PLANE_U] = vData;
|
||||||
img.planes[VPX_PLANE_V] = uData;
|
img.planes[VPX_PLANE_V] = uData;
|
||||||
}
|
}
|
||||||
else if (frameFormat == QVideoFrame::Format_RGB32)
|
else if (frameFormat == QVideoFrame::Format_RGB32 || frameFormat == QVideoFrame::Format_ARGB32)
|
||||||
{
|
{
|
||||||
img.w = img.h = 0; // Invalid frame. TODO: Implement conversion
|
img.w = img.h = 0; // Invalid frame. TODO: Implement conversion
|
||||||
qWarning() << "Camera: Can't convert from RGB32! Go complain at github.com/tux3/toxgui";
|
qWarning() << "Camera: Can't convert from RGB32! Go complain at github.com/tux3/toxgui";
|
||||||
|
|
Loading…
Reference in New Issue
Block a user