1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#if defined AVI_CAPTURING
#include "AviVideoCapturing.h"
#include "Rendering/AVIGenerator.h"
#include "Rendering/GlobalRendering.h"
#include "Sim/Misc/GlobalConstants.h"
#include "System/Log/ILog.h"
#include "System/Util.h"
#include "System/FileSystem/FileHandler.h"
#include "lib/streflop/streflop_cond.h"
#include <SDL_mouse.h>
#include <SDL_events.h>
#include <string>
AviVideoCapturing::AviVideoCapturing()
: capturing(false)
, aviGenerator(NULL) {
}
AviVideoCapturing::~AviVideoCapturing() {
}
bool AviVideoCapturing::IsCapturingSupported() const {
return true;
}
bool AviVideoCapturing::IsCapturing() const {
return capturing;
}
void AviVideoCapturing::StopCapturing() {
if (IsCapturing()) {
capturing = false;
SafeDelete(aviGenerator);
//delete aviGenerator;
//aviGenerator = NULL;
}
}
void AviVideoCapturing::StartCapturing() {
if (IsCapturing()) {
LOG_L(L_WARNING, "Video capturing is already running.");
return;
}
// Find a file to capture to
std::string fileName;
const size_t MAX_NUM_VIDEOS = 1000;
size_t vi;
for (vi = 0; vi < MAX_NUM_VIDEOS; ++vi) {
fileName = std::string("video") + IntToString(vi) + ".avi";
CFileHandler ifs(fileName);
if (!ifs.FileExists()) {
break;
}
}
if (vi == MAX_NUM_VIDEOS) {
LOG_L(L_ERROR, "You have too many videos on disc already, please move, rename or delete some.");
LOG_L(L_ERROR, "Not creating video!");
} else {
capturing = true;
const int videoSizeX = (globalRendering->viewSizeX / 4) * 4;
const int videoSizeY = (globalRendering->viewSizeY / 4) * 4;
aviGenerator = new CAVIGenerator(fileName, videoSizeX, videoSizeY, 30);
const int savedCursorMode = SDL_ShowCursor(SDL_QUERY);
SDL_ShowCursor(SDL_ENABLE);
if (!aviGenerator->InitEngine()) {
capturing = false;
LOG_L(L_ERROR, "%s", aviGenerator->GetLastErrorMessage().c_str());
delete aviGenerator;
aviGenerator = NULL;
} else {
LOG("Recording avi to %s size %i x %i",
fileName.c_str(), videoSizeX, videoSizeY);
}
SDL_ShowCursor(savedCursorMode);
//aviGenerator->InitEngine() (avicap32.dll)? modifies the FPU control word.
//Setting it back to default state.
streflop_init<streflop::Simple>();
}
}
void AviVideoCapturing::RenderFrame() {
if (IsCapturing()) {
globalRendering->lastFrameTime = 1.0f / GAME_SPEED;
if (!aviGenerator->readOpenglPixelDataThreaded()) {
StopCapturing();
}
// LOG("Saved avi frame size %i %i", ih->biWidth, ih->biHeight);
}
}
#endif // defined AVI_CAPTURING
|