You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.1 KiB
39 lines
1.1 KiB
#include "tools/clip/recorder/widget.h"
|
|
|
|
#include "tools/clip/recorder/ffmpeg.h"
|
|
|
|
Recorder::Recorder(const std::string& outputFile, QObject *parent) : QObject(parent) {
|
|
encoder = new FFmpegEncoder(outputFile, DEVICE_SCREEN_SIZE.width(), DEVICE_SCREEN_SIZE.height(), UI_FREQ);
|
|
}
|
|
|
|
Recorder::~Recorder() {
|
|
delete encoder;
|
|
}
|
|
|
|
void Recorder::saveFrame(const std::shared_ptr<QPixmap> &frame) {
|
|
QMutexLocker locker(&mutex);
|
|
frameQueue.enqueue(frame);
|
|
if (!isProcessing) {
|
|
isProcessing = true;
|
|
QMetaObject::invokeMethod(this, &Recorder::processQueue, Qt::QueuedConnection);
|
|
}
|
|
}
|
|
|
|
void Recorder::processQueue() {
|
|
while (true) {
|
|
std::shared_ptr<QPixmap> frame;
|
|
{
|
|
QMutexLocker locker(&mutex);
|
|
if (frameQueue.isEmpty() || !keepRunning) {
|
|
isProcessing = false;
|
|
return;
|
|
}
|
|
frame = frameQueue.dequeue();
|
|
}
|
|
|
|
if (!encoder->writeFrame(frame->toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied))) {
|
|
fprintf(stderr, "did not write\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
|