For non-win32 and with-libav conditions, add an option to frame dumping to use FFV1 codec for lossless video dumping.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7139 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
c45a430649
commit
cecef62c8c
|
@ -99,6 +99,9 @@ wxString dump_textures_tooltip = wxTRANSLATE("Dump game textures to User/Dump/Te
|
||||||
wxString load_hires_textures_tooltip = wxTRANSLATE("Load high-resolution textures from User/Load/Textures/<game id>/");
|
wxString load_hires_textures_tooltip = wxTRANSLATE("Load high-resolution textures from User/Load/Textures/<game id>/");
|
||||||
wxString dump_efb_tooltip = wxT("");
|
wxString dump_efb_tooltip = wxT("");
|
||||||
wxString dump_frames_tooltip = wxT("");
|
wxString dump_frames_tooltip = wxT("");
|
||||||
|
#if !defined WIN32 && defined HAVE_LIBAV
|
||||||
|
wxString use_ffv1_tooltip = wxT("");
|
||||||
|
#endif
|
||||||
wxString free_look_tooltip = wxT("");
|
wxString free_look_tooltip = wxT("");
|
||||||
wxString crop_tooltip = wxT("");
|
wxString crop_tooltip = wxT("");
|
||||||
wxString opencl_tooltip = wxT("");
|
wxString opencl_tooltip = wxT("");
|
||||||
|
@ -402,6 +405,9 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
|
||||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump EFB Target"), dump_efb_tooltip, vconfig.bDumpEFBTarget));
|
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump EFB Target"), dump_efb_tooltip, vconfig.bDumpEFBTarget));
|
||||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump Frames"), dump_frames_tooltip, vconfig.bDumpFrames));
|
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump Frames"), dump_frames_tooltip, vconfig.bDumpFrames));
|
||||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Free Look"), free_look_tooltip, vconfig.bFreeLook));
|
szr_utility->Add(new SettingCheckBox(page_advanced, _("Free Look"), free_look_tooltip, vconfig.bFreeLook));
|
||||||
|
#if !defined WIN32 && defined HAVE_LIBAV
|
||||||
|
szr_utility->Add(new SettingCheckBox(page_advanced, _("Frame dumps use FFV1"), use_ffv1_tooltip, vconfig.bUseFFV1));
|
||||||
|
#endif
|
||||||
|
|
||||||
wxStaticBoxSizer* const group_utility = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Utility"));
|
wxStaticBoxSizer* const group_utility = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Utility"));
|
||||||
szr_advanced->Add(group_utility, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
szr_advanced->Add(group_utility, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "AVIDump.h"
|
#include "AVIDump.h"
|
||||||
#include "HW/VideoInterface.h" //for TargetRefreshRate
|
#include "HW/VideoInterface.h" //for TargetRefreshRate
|
||||||
|
#include "VideoConfig.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
@ -253,6 +254,11 @@ bool AVIDump::CreateFile()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_Config.bUseFFV1)
|
||||||
|
{
|
||||||
|
s_FormatContext->oformat->video_codec = CODEC_ID_FFV1;
|
||||||
|
}
|
||||||
|
|
||||||
s_Stream->codec->codec_id = s_FormatContext->oformat->video_codec;
|
s_Stream->codec->codec_id = s_FormatContext->oformat->video_codec;
|
||||||
s_Stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
s_Stream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||||
s_Stream->codec->bit_rate = 400000;
|
s_Stream->codec->bit_rate = 400000;
|
||||||
|
@ -260,7 +266,7 @@ bool AVIDump::CreateFile()
|
||||||
s_Stream->codec->height = s_height;
|
s_Stream->codec->height = s_height;
|
||||||
s_Stream->codec->time_base = (AVRational){1, VideoInterface::TargetRefreshRate};
|
s_Stream->codec->time_base = (AVRational){1, VideoInterface::TargetRefreshRate};
|
||||||
s_Stream->codec->gop_size = 12;
|
s_Stream->codec->gop_size = 12;
|
||||||
s_Stream->codec->pix_fmt = PIX_FMT_YUV420P;
|
s_Stream->codec->pix_fmt = (g_Config.bUseFFV1) ? PIX_FMT_BGRA : PIX_FMT_YUV420P;
|
||||||
|
|
||||||
av_set_parameters(s_FormatContext, NULL);
|
av_set_parameters(s_FormatContext, NULL);
|
||||||
|
|
||||||
|
@ -272,7 +278,7 @@ bool AVIDump::CreateFile()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(s_SwsContext = sws_getContext(s_width, s_height, PIX_FMT_BGR24, s_width, s_height,
|
if(!(s_SwsContext = sws_getContext(s_width, s_height, PIX_FMT_BGR24, s_width, s_height,
|
||||||
PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL)))
|
s_Stream->codec->pix_fmt, SWS_BICUBIC, NULL, NULL, NULL)))
|
||||||
{
|
{
|
||||||
CloseFile();
|
CloseFile();
|
||||||
return false;
|
return false;
|
||||||
|
@ -281,10 +287,10 @@ bool AVIDump::CreateFile()
|
||||||
s_BGRFrame = avcodec_alloc_frame();
|
s_BGRFrame = avcodec_alloc_frame();
|
||||||
s_YUVFrame = avcodec_alloc_frame();
|
s_YUVFrame = avcodec_alloc_frame();
|
||||||
|
|
||||||
s_size = avpicture_get_size(PIX_FMT_YUV420P, s_width, s_height);
|
s_size = avpicture_get_size(s_Stream->codec->pix_fmt, s_width, s_height);
|
||||||
|
|
||||||
s_YUVBuffer = new uint8_t[s_size];
|
s_YUVBuffer = new uint8_t[s_size];
|
||||||
avpicture_fill((AVPicture *)s_YUVFrame, s_YUVBuffer, PIX_FMT_YUV420P, s_width, s_height);
|
avpicture_fill((AVPicture *)s_YUVFrame, s_YUVBuffer, s_Stream->codec->pix_fmt, s_width, s_height);
|
||||||
|
|
||||||
s_OutBuffer = new uint8_t[s_size];
|
s_OutBuffer = new uint8_t[s_size];
|
||||||
|
|
||||||
|
|
|
@ -76,6 +76,7 @@ void VideoConfig::Load(const char *ini_file)
|
||||||
iniFile.Get("Settings", "DumpEFBTarget", &bDumpEFBTarget, 0);
|
iniFile.Get("Settings", "DumpEFBTarget", &bDumpEFBTarget, 0);
|
||||||
iniFile.Get("Settings", "DumpFrames", &bDumpFrames, 0);
|
iniFile.Get("Settings", "DumpFrames", &bDumpFrames, 0);
|
||||||
iniFile.Get("Settings", "FreeLook", &bFreeLook, 0);
|
iniFile.Get("Settings", "FreeLook", &bFreeLook, 0);
|
||||||
|
iniFile.Get("Settings", "UseFFV1", &bUseFFV1, 0);
|
||||||
iniFile.Get("Settings", "AnaglyphStereo", &bAnaglyphStereo, false);
|
iniFile.Get("Settings", "AnaglyphStereo", &bAnaglyphStereo, false);
|
||||||
iniFile.Get("Settings", "AnaglyphStereoSeparation", &iAnaglyphStereoSeparation, 200);
|
iniFile.Get("Settings", "AnaglyphStereoSeparation", &iAnaglyphStereoSeparation, 200);
|
||||||
iniFile.Get("Settings", "AnaglyphFocalAngle", &iAnaglyphFocalAngle, 0);
|
iniFile.Get("Settings", "AnaglyphFocalAngle", &iAnaglyphFocalAngle, 0);
|
||||||
|
@ -203,6 +204,7 @@ void VideoConfig::Save(const char *ini_file)
|
||||||
iniFile.Set("Settings", "DumpEFBTarget", bDumpEFBTarget);
|
iniFile.Set("Settings", "DumpEFBTarget", bDumpEFBTarget);
|
||||||
iniFile.Set("Settings", "DumpFrames", bDumpFrames);
|
iniFile.Set("Settings", "DumpFrames", bDumpFrames);
|
||||||
iniFile.Set("Settings", "FreeLook", bFreeLook);
|
iniFile.Set("Settings", "FreeLook", bFreeLook);
|
||||||
|
iniFile.Set("Settings", "UseFFV1", bUseFFV1);
|
||||||
iniFile.Set("Settings", "AnaglyphStereo", bAnaglyphStereo);
|
iniFile.Set("Settings", "AnaglyphStereo", bAnaglyphStereo);
|
||||||
iniFile.Set("Settings", "AnaglyphStereoSeparation", iAnaglyphStereoSeparation);
|
iniFile.Set("Settings", "AnaglyphStereoSeparation", iAnaglyphStereoSeparation);
|
||||||
iniFile.Set("Settings", "AnaglyphFocalAngle", iAnaglyphFocalAngle);
|
iniFile.Set("Settings", "AnaglyphFocalAngle", iAnaglyphFocalAngle);
|
||||||
|
|
|
@ -108,6 +108,7 @@ struct VideoConfig
|
||||||
bool bHiresTextures;
|
bool bHiresTextures;
|
||||||
bool bDumpEFBTarget;
|
bool bDumpEFBTarget;
|
||||||
bool bDumpFrames;
|
bool bDumpFrames;
|
||||||
|
bool bUseFFV1;
|
||||||
bool bFreeLook;
|
bool bFreeLook;
|
||||||
bool bAnaglyphStereo;
|
bool bAnaglyphStereo;
|
||||||
int iAnaglyphStereoSeparation;
|
int iAnaglyphStereoSeparation;
|
||||||
|
|
Loading…
Reference in New Issue