blob: 586846ffe95169add33892ad821392ea72ecf1e2 [file] [log] [blame]
#include <iomanip>
#include <sstream>
#include <iostream>
#include "SDL.h"
#include "VideoCapture.hpp"
#include "Renderer.hpp"
#include "System.hpp"
#include "VideoCaptureFfmpeg.hpp"
inline std::tm localtime_xp(std::time_t timer)
{
// Don't ignore unsafe warnings - https://stackoverflow.com/questions/38034033/c-localtime-this-function-or-variable-may-be-unsafe
std::tm bt{};
#if defined(__unix__)
localtime_r(&timer, &bt);
#elif defined(_MSC_VER)
localtime_s(&bt, &timer);
#else
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
bt = *std::localtime(&timer);
#endif
return bt;
}
VideoCapture::VideoCapture(const char *name) : name(name) {
;
}
VideoCapture::~VideoCapture() {
if (buffer) {
std::cerr << "Warning: recording was not stopped before exiting." << std::endl;
stop();
}
}
void VideoCapture::start(const char *filename) {
buffer = (Uint8 *)malloc(System::width * System::height * SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_RGB24));
ffmpeg_open_stream(filename, System::width, System::height, buffer);
std::cerr << "Started with filename " << filename << std::endl;
}
void VideoCapture::start() {
auto bt = localtime_xp(std::time(0));
std::stringstream filename;
filename << name;
filename << std::put_time(&bt, "-capture-%Y-%m-%d-%H-%M-%S.mp4");
start(filename.str().c_str());
}
void VideoCapture::capture(Renderer *source) {
if (buffer) {
source->read_pixels(System::width, System::height, SDL_PIXELFORMAT_RGB24, buffer);
ffmpeg_capture();
} else {
std::cerr << "Not recording" << std::endl;
}
}
void VideoCapture::stop() {
ffmpeg_close_stream();
free(buffer);
buffer = NULL;
std::cerr << "Stopped." << std::endl;
}