Skip to content
This repository was archived by the owner on Sep 11, 2023. It is now read-only.

Commit 5a3b56c

Browse files
committed
Video Recorder: Added support for GIF file export
1 parent cb65732 commit 5a3b56c

32 files changed

+1214
-242
lines changed

Core/AviRecorder.h

Lines changed: 0 additions & 45 deletions
This file was deleted.

Core/Console.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,15 @@ double Console::GetFrameDelay()
10511051
return frameDelay;
10521052
}
10531053

1054+
double Console::GetFps()
1055+
{
1056+
if(_model == NesModel::NTSC) {
1057+
return _settings->CheckFlag(EmulationFlags::IntegerFpsMode) ? 60.0 : 60.098812;
1058+
} else {
1059+
return _settings->CheckFlag(EmulationFlags::IntegerFpsMode) ? 50.0 : 50.006978;
1060+
}
1061+
}
1062+
10541063
void Console::SaveState(ostream &saveStream)
10551064
{
10561065
if(_initialized) {

Core/Console.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ class Console : public std::enable_shared_from_this<Console>
219219

220220
bool IsDebuggerAttached();
221221

222+
double GetFps();
223+
222224
void InitializeRam(void* data, uint32_t length);
223225
static void InitializeRam(RamPowerOnState powerOnState, void* data, uint32_t length);
224226

Core/Core.vcxproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,6 @@
629629
<ClInclude Include="Rambo1_158.h" />
630630
<ClInclude Include="RecordedRomTest.h" />
631631
<ClInclude Include="AutoSaveManager.h" />
632-
<ClInclude Include="AviRecorder.h" />
633632
<ClInclude Include="Ax5705.h" />
634633
<ClInclude Include="Bandai74161_7432.h" />
635634
<ClInclude Include="BandaiFcg.h" />
@@ -1021,7 +1020,6 @@
10211020
<ClCompile Include="RawVideoFilter.cpp" />
10221021
<ClCompile Include="RecordedRomTest.cpp" />
10231022
<ClCompile Include="AutoSaveManager.cpp" />
1024-
<ClCompile Include="AviRecorder.cpp" />
10251023
<ClCompile Include="BaseControlDevice.cpp" />
10261024
<ClCompile Include="BaseMapper.cpp" />
10271025
<ClCompile Include="BisqwitNtscFilter.cpp" />

Core/Core.vcxproj.filters

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,9 +1087,6 @@
10871087
<ClInclude Include="BisqwitNtscFilter.h">
10881088
<Filter>VideoDecoder</Filter>
10891089
</ClInclude>
1090-
<ClInclude Include="AviRecorder.h">
1091-
<Filter>Misc</Filter>
1092-
</ClInclude>
10931090
<ClInclude Include="MagicKidGooGoo.h">
10941091
<Filter>Nes\Mappers</Filter>
10951092
</ClInclude>
@@ -1663,9 +1660,6 @@
16631660
<ClCompile Include="BisqwitNtscFilter.cpp">
16641661
<Filter>VideoDecoder</Filter>
16651662
</ClCompile>
1666-
<ClCompile Include="AviRecorder.cpp">
1667-
<Filter>Misc</Filter>
1668-
</ClCompile>
16691663
<ClCompile Include="Assembler.cpp">
16701664
<Filter>Debugger</Filter>
16711665
</ClCompile>

Core/SaveStateManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ int32_t SaveStateManager::GetSaveStatePreview(string saveStatePath, uint8_t* png
343343
string data = pngStream.str();
344344
memcpy(pngData, data.c_str(), data.size());
345345

346-
return frameData.size();
346+
return (int32_t)frameData.size();
347347
}
348348
}
349349
return -1;

Core/VideoRenderer.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include "stdafx.h"
22
#include "IRenderingDevice.h"
33
#include "VideoRenderer.h"
4-
#include "AviRecorder.h"
54
#include "VideoDecoder.h"
65
#include "Console.h"
6+
#include "../Utilities/IVideoRecorder.h"
7+
#include "../Utilities/AviRecorder.h"
8+
#include "../Utilities/GifRecorder.h"
79

810
VideoRenderer::VideoRenderer(shared_ptr<Console> console)
911
{
@@ -58,9 +60,9 @@ void VideoRenderer::RenderThread()
5860

5961
void VideoRenderer::UpdateFrame(void *frameBuffer, uint32_t width, uint32_t height)
6062
{
61-
shared_ptr<AviRecorder> aviRecorder = _aviRecorder;
62-
if(aviRecorder) {
63-
aviRecorder->AddFrame(frameBuffer, width, height);
63+
shared_ptr<IVideoRecorder> recorder = _recorder;
64+
if(recorder) {
65+
recorder->AddFrame(frameBuffer, width, height, _console->GetFps());
6466
}
6567

6668
if(_renderer) {
@@ -85,28 +87,40 @@ void VideoRenderer::UnregisterRenderingDevice(IRenderingDevice *renderer)
8587

8688
void VideoRenderer::StartRecording(string filename, VideoCodec codec, uint32_t compressionLevel)
8789
{
88-
shared_ptr<AviRecorder> recorder(new AviRecorder(_console));
89-
9090
FrameInfo frameInfo = _console->GetVideoDecoder()->GetFrameInfo();
91-
if(recorder->StartRecording(filename, codec, frameInfo.Width, frameInfo.Height, frameInfo.BitsPerPixel, _console->GetSettings()->GetSampleRate(), compressionLevel)) {
92-
_aviRecorder = recorder;
91+
92+
shared_ptr<IVideoRecorder> recorder;
93+
if(codec == VideoCodec::GIF) {
94+
recorder.reset(new GifRecorder());
95+
} else {
96+
recorder.reset(new AviRecorder(codec, compressionLevel));
97+
}
98+
99+
if(recorder->StartRecording(filename, frameInfo.Width, frameInfo.Height, frameInfo.BitsPerPixel, _console->GetSettings()->GetSampleRate(), _console->GetFps())) {
100+
_recorder = recorder;
101+
MessageManager::DisplayMessage("VideoRecorder", "VideoRecorderStarted", filename);
93102
}
94103
}
95104

96105
void VideoRenderer::AddRecordingSound(int16_t* soundBuffer, uint32_t sampleCount, uint32_t sampleRate)
97106
{
98-
shared_ptr<AviRecorder> aviRecorder = _aviRecorder;
99-
if(aviRecorder) {
100-
aviRecorder->AddSound(soundBuffer, sampleCount, sampleRate);
107+
shared_ptr<IVideoRecorder> recorder = _recorder;
108+
if(recorder) {
109+
recorder->AddSound(soundBuffer, sampleCount, sampleRate);
101110
}
102111
}
103112

104113
void VideoRenderer::StopRecording()
105114
{
106-
_aviRecorder.reset();
115+
shared_ptr<IVideoRecorder> recorder = _recorder;
116+
if(recorder) {
117+
recorder->StopRecording();
118+
MessageManager::DisplayMessage("VideoRecorder", "VideoRecorderStopped", recorder->GetOutputFile());
119+
}
120+
_recorder.reset();
107121
}
108122

109123
bool VideoRenderer::IsRecording()
110124
{
111-
return _aviRecorder != nullptr && _aviRecorder->IsRecording();
125+
return _recorder != nullptr && _recorder->IsRecording();
112126
}

Core/VideoRenderer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "stdafx.h"
33
#include <thread>
44
#include "../Utilities/AutoResetEvent.h"
5+
#include "../Utilities/IVideoRecorder.h"
56
#include "FrameInfo.h"
67

78
class IRenderingDevice;
@@ -19,7 +20,7 @@ class VideoRenderer
1920
IRenderingDevice* _renderer = nullptr;
2021
atomic<bool> _stopFlag;
2122

22-
shared_ptr<AviRecorder> _aviRecorder;
23+
shared_ptr<IVideoRecorder> _recorder;
2324

2425
void RenderThread();
2526

GUI.NET/Dependencies/resources.ca.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,7 @@
754754
<Message ID="FilterMovie">Pel·lícules (*.mmo)|*.mmo|Tots els fitxers (*.*)|*.*</Message>
755755
<Message ID="FilterWave">Fitxers de so (*.wav)|*.wav|Tots els fitxers(*.*)|*.*</Message>
756756
<Message ID="FilterAvi">Fitxers de vídeo (*.avi)|*.avi|Tots els fitxers (*.*)|*.*</Message>
757+
<Message ID="FilterGif">GIF files (*.gif)|*.gif|All Files (*.*)|*.*</Message>
757758
<Message ID="FilterPalette">Fitxers de paleta (*.pal)|*.pal|Tots els fitxers (*.*)|*.*</Message>
758759
<Message ID="FilterRom">Tots els formats suportats (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.unif, *.studybox)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF;*.UNIF;*.STUDYBOX|Roms de NES (*.nes, *.unf, *.unif)|*.NES;*.UNF;*.UNIF|Roms de Famicom Disk System (*.fds)|*.FDS|Fitxers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Arxius comprimits (*.zip)|*.ZIP|Arxius 7-Zip (*.7z)|*.7z|Tots els fitxers (*.*)|*.*</Message>
759760
<Message ID="FilterRomIps">Tots els formats suportats (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.unif, *.studybox, *.ips, *.bps, *.ups)|*.NES;*.ZIP;*.7z;*.IPS;*.BPS;*.UPS;*.FDS;*.NSF;*.NSFE;*.UNF;*.UNIF;*.STUDYBOX|Roms de NES(*.nes, *.unf, *.unif)|*.NES;*.UNF;*.UNIF|Roms de Famicom Disk System (*.fds)|*.FDS|Fitxers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Arxius comprimits (*.zip)|*.ZIP|Arxius 7-Zip (*.7z)|*.7z|Pedaços IPS/UPS/BPS (*.ips, *.bps, *.ups)|*.IPS;*.BPS;*.UPS|Tots els fitxers (*.*)|*.*</Message>

GUI.NET/Dependencies/resources.en.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@
784784
<Message ID="FilterMovie">Movie files (*.mmo)|*.mmo|All Files (*.*)|*.*</Message>
785785
<Message ID="FilterWave">Wave files (*.wav)|*.wav|All Files (*.*)|*.*</Message>
786786
<Message ID="FilterAvi">Avi files (*.avi)|*.avi|All Files (*.*)|*.*</Message>
787+
<Message ID="FilterGif">GIF files (*.gif)|*.gif|All Files (*.*)|*.*</Message>
787788
<Message ID="FilterPalette">Palette Files (*.pal)|*.pal|All Files (*.*)|*.*</Message>
788789
<Message ID="FilterRom">All supported formats (*.nes, *.zip, *.7z, *.nsf, *.nsfe, *.fds, *.unf, *.unif, *.studybox)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF;*.UNIF;*.STUDYBOX|NES Roms (*.nes, *.unf, *.unif)|*.NES;*.UNF;*.UNIF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|All (*.*)|*.*</Message>
789790
<Message ID="FilterRomIps">All supported formats (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.unif, *.studybox, *.ips, *.bps, *.ups)|*.NES;*.ZIP;*.7z;*.IPS;*.BPS;*.UPS;*.FDS;*.NSF;*.NSFE;*.UNF;*.UNIF;*.STUDYBOX|NES Roms (*.nes, *.unf, *.unif)|*.NES;*.UNF;*.UNIF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|IPS/UPS/BPS Patches (*.ips, *.bps, *.ups)|*.IPS;*.BPS;*.UPS|All (*.*)|*.*</Message>

0 commit comments

Comments
 (0)