51#include <wx/checkbox.h>
53#include <wx/textctrl.h>
54#include <wx/listbox.h>
56#include <wx/spinctrl.h>
57#include <wx/combobox.h>
58#include <wx/stattext.h>
70#if defined(USE_FFMPEG)
76#define FFMPEG_EXPORT_CTRL_ID_ENTRIES \
77 FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(FEFirstID, 20000), \
78 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatID), \
79 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecID), \
80 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitrateID), \
81 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEQualityID), \
82 FFMPEG_EXPORT_CTRL_ID_ENTRY(FESampleRateID), \
83 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELanguageID), \
84 FFMPEG_EXPORT_CTRL_ID_ENTRY(FETagID), \
85 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECutoffID), \
86 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFrameSizeID), \
87 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBufSizeID), \
88 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEProfileID), \
89 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECompLevelID), \
90 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEUseLPCID), \
91 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELPCCoeffsID), \
92 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPredID), \
93 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPredID), \
94 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPredOrderID), \
95 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPartOrderID), \
96 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPartOrderID), \
97 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMuxRateID), \
98 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPacketSizeID), \
99 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitReservoirID), \
100 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEVariableBlockLenID), \
101 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELastID), \
103 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatLabelID), \
104 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecLabelID), \
105 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatNameID), \
106 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecNameID), \
107 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPresetID), \
108 FFMPEG_EXPORT_CTRL_ID_ENTRY(FESavePresetID), \
109 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELoadPresetID), \
110 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEDeletePresetID), \
111 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllFormatsID), \
112 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllCodecsID), \
113 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEImportPresetsID), \
114 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEExportPresetsID) \
117#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) name = num
118#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) name
125#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY
126#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) wxT(#name)
127#undef FFMPEG_EXPORT_CTRL_ID_ENTRY
128#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) wxT(#name)
133#undef FFMPEG_EXPORT_CTRL_ID_ENTRIES
134#undef FFMPEG_EXPORT_CTRL_ID_ENTRY
135#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY
215 S.StartVerticalLay();
217 S.StartHorizontalLay(wxCENTER);
219 S.StartMultiColumn(2, wxCENTER);
226 S.EndHorizontalLay();
272 S.StartVerticalLay();
274 S.StartHorizontalLay(wxEXPAND);
276 S.SetSizerProportion(1);
277 S.StartMultiColumn(2, wxCENTER);
281 XXO(
"Quality (kbps):"),
282 {
wxT(
"/FileFormats/AACQuality"), 160}, 320, 98);
286 S.EndHorizontalLay();
366 S.StartVerticalLay();
368 S.StartHorizontalLay(wxCENTER);
370 S.StartMultiColumn(2, wxCENTER);
377 S.EndHorizontalLay();
410 wxT(
"/FileFormats/OPUSBitrate"),
451 wxT(
"/FileFormats/OPUSCompression"),
487 wxT(
"/FileFormats/OPUSVbrMode"),
506 wxT(
"/FileFormats/OPUSApplication"),
525 wxT(
"/FileFormats/OPUSFrameDuration"),
550 wxT(
"/FileFormats/OPUSCutoff"),
558 XO(
"Super Wideband"),
592 S.SetSizerProportion(1);
594 S.StartVerticalLay();
596 S.StartHorizontalLay(wxCENTER);
598 S.StartMultiColumn(2, wxCENTER);
600 S.StartMultiColumn(2, wxCENTER);
611 XXO(
"Frame Duration:"),
616 S.StartMultiColumn(2, wxCENTER);
635 S.EndHorizontalLay();
664{ 8000, 11025, 16000, 22050, 44100, 0};
721 S.StartVerticalLay();
723 S.StartHorizontalLay(wxCENTER);
725 S.StartMultiColumn(2, wxCENTER);
727 S.TieNumberAsChoice(
XXO(
"Bit Rate:"),
732 S.EndHorizontalLay();
772 PopulateOrExchange(
S);
774 TransferDataToWindow();
786 S.StartHorizontalLay(wxCENTER);
788 S.StartVerticalLay(wxCENTER, 0);
790 S.Id(
OpenID).AddButton(
XXO(
"Open custom FFmpeg format options"));
791 S.StartMultiColumn(2, wxCENTER);
793 S.AddPrompt(
XXO(
"Current Format:"));
794 mFormat =
S.Style(wxTE_READONLY).AddTextBox({},
wxT(
""), 25);
795 S.AddPrompt(
XXO(
"Current Codec:"));
796 mCodec =
S.Style(wxTE_READONLY).AddTextBox({},
wxT(
""), 25);
800 S.EndHorizontalLay();
802 S.EndHorizontalLay();
841 auto pWin = wxGetTopLevelParent(
this );
844 auto pWin = wxTheApp->GetTopWindow();
869 xmlfile.
Parse(
this,xmlFileName.GetFullPath());
878 xmlFileName.GetFullPath(),
XO(
"Error Saving FFmpeg Presets") };
893 bool success = xmlfile.
Parse(
this,filename);
912 FFmpegPresetMap::iterator iter;
915 list.push_back(iter->second.mPresetName);
918 std::sort( list.begin(), list.end() );
935 return &iter->second;
947 auto query =
XO(
"Overwrite preset '%s'?").Format(
name);
950 XO(
"Confirm Overwrite"),
951 wxYES_NO | wxCENTRE);
952 if (action == wxNO)
return false;
968 wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(FEFormatID,parent);
969 lb =
dynamic_cast<wxListBox*
>(wnd);
970 if (lb->GetSelection() < 0)
975 format = lb->GetStringSelection();
977 wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(FECodecID,parent);
978 lb =
dynamic_cast<wxListBox*
>(wnd);
979 if (lb->GetSelection() < 0)
985 codec = lb->GetStringSelection();
996 for (
int id = FEFirstID;
id < FELastID;
id++)
998 wxWindow *wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(
id,parent);
1007 preset->mControlState[
id - FEFirstID] = codec;
1012 case FESampleRateID:
1020 case FEMinPartOrderID:
1021 case FEMaxPartOrderID:
1023 case FEPacketSizeID:
1024 sc =
dynamic_cast<wxSpinCtrl*
>(wnd);
1025 preset->mControlState[
id - FEFirstID] = wxString::Format(
wxT(
"%d"),sc->GetValue());
1030 tc =
dynamic_cast<wxTextCtrl*
>(wnd);
1031 preset->mControlState[
id - FEFirstID] = tc->GetValue();
1036 ch =
dynamic_cast<wxChoice*
>(wnd);
1037 preset->mControlState[
id - FEFirstID] = wxString::Format(
wxT(
"%d"),ch->GetSelection());
1041 case FEBitReservoirID:
1042 case FEVariableBlockLenID:
1043 cb =
dynamic_cast<wxCheckBox*
>(wnd);
1044 preset->mControlState[
id - FEFirstID] = wxString::Format(
wxT(
"%d"),cb->GetValue());
1067 for (
int id = FEFirstID;
id < FELastID;
id++)
1069 wxWindow *wnd = parent->FindWindowById(
id,parent);
1080 lb =
dynamic_cast<wxListBox*
>(wnd);
1081 readstr =
preset->mControlState[
id - FEFirstID];
1082 readlong = lb->FindString(readstr);
1083 if (readlong > -1) lb->Select(readlong);
1088 case FESampleRateID:
1096 case FEMinPartOrderID:
1097 case FEMaxPartOrderID:
1099 case FEPacketSizeID:
1100 sc =
dynamic_cast<wxSpinCtrl*
>(wnd);
1101 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1102 sc->SetValue(readlong);
1107 tc =
dynamic_cast<wxTextCtrl*
>(wnd);
1108 tc->SetValue(
preset->mControlState[
id - FEFirstID]);
1113 ch =
dynamic_cast<wxChoice*
>(wnd);
1114 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1115 if (readlong > -1) ch->Select(readlong);
1119 case FEBitReservoirID:
1120 case FEVariableBlockLenID:
1121 cb =
dynamic_cast<wxCheckBox*
>(wnd);
1122 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1123 if (readlong) readbool =
true;
else readbool =
false;
1124 cb->SetValue(readbool);
1138 if (tag ==
"ffmpeg_presets")
1143 if (tag ==
"preset")
1145 for (
auto pair : attrs)
1147 auto attr = pair.first;
1148 auto value = pair.second;
1152 wxString strValue = value.ToWString();
1157 auto query =
XO(
"Replace preset '%s'?").Format( strValue );
1160 XO(
"Confirm Overwrite"),
1161 wxYES_NO | wxCANCEL | wxCENTRE);
1162 if (action == wxCANCEL)
1185 if (tag ==
"setctrlstate" &&
mPreset)
1188 for (
auto pair : attrs)
1190 auto attr = pair.first;
1191 auto value = pair.second;
1195 for (
long i = FEFirstID; i < FELastID; i++)
1199 else if (attr ==
"state")
1201 if (
id > FEFirstID &&
id < FELastID)
1218 if (tag ==
"preset")
1222 else if (tag ==
"setctrlstate")
1232 xmlFile.Write(
wxT(
"<?xml "));
1233 xmlFile.Write(
wxT(
"version=\"1.0\" "));
1234 xmlFile.Write(
wxT(
"standalone=\"no\" "));
1235 xmlFile.Write(
wxT(
"?>\n"));
1237 wxString dtdName =
wxT(
"-//audacityffmpegpreset-1.0.0//DTD//EN");
1239 wxT(
"http://audacity.sourceforge.net/xml/audacityffmpegpreset-1.0.0.dtd");
1241 xmlFile.Write(
wxT(
"<!DOCTYPE "));
1242 xmlFile.Write(
wxT(
"project "));
1243 xmlFile.Write(
wxT(
"PUBLIC "));
1244 xmlFile.Write(
wxT(
"\"-//audacityffmpegpreset-1.0.0//DTD//EN\" "));
1245 xmlFile.Write(
wxT(
"\"http://audacity.sourceforge.net/xml/audacityffmpegpreset-1.0.0.dtd\" "));
1246 xmlFile.Write(
wxT(
">\n"));
1252 xmlFile.StartTag(
wxT(
"ffmpeg_presets"));
1253 xmlFile.WriteAttr(
wxT(
"version"),
wxT(
"1.0"));
1254 FFmpegPresetMap::const_iterator iter;
1255 for (iter = mPresets.begin(); iter != mPresets.end(); ++iter)
1257 auto preset = &iter->second;
1258 xmlFile.StartTag(
wxT(
"preset"));
1259 xmlFile.WriteAttr(
wxT(
"name"),
preset->mPresetName);
1260 for (
long i = FEFirstID + 1; i < FELastID; i++)
1262 xmlFile.StartTag(
wxT(
"setctrlstate"));
1264 xmlFile.WriteAttr(
wxT(
"state"),
preset->mControlState[i - FEFirstID]);
1265 xmlFile.EndTag(
wxT(
"setctrlstate"));
1267 xmlFile.EndTag(
wxT(
"preset"));
1269 xmlFile.EndTag(
wxT(
"ffmpeg_presets"));
1328#if LIBAVCODEC_VERSION_MAJOR < 58
1364#if LIBAVCODEC_VERSION_MAJOR < 58
1413#if LIBAVCODEC_VERSION_MAJOR < 58
1521 #if LIBAVCODEC_VERSION_MAJOR < 58
1571#if LIBAVCODEC_VERSION_MAJOR < 58
1595 {
wxT(
"1") ,
XO(
"LC")},
1596 {
wxT(
"0") ,
XO(
"Main")},
1598 {
wxT(
"3") ,
XO(
"LTP")},
1606 {
FMT_M4A,
wxT(
"M4A"),
wxT(
"m4a"),
wxT(
"ipod"), 48,
AV_CANMETA,
true,
XO(
"M4A (AAC) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_AAC,
true},
1607 {
FMT_AC3,
wxT(
"AC3"),
wxT(
"ac3"),
wxT(
"ac3"), 7,
AV_VERSION_INT(0,0,0),
false,
XO(
"AC3 Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_AC3,
true},
1608 {
FMT_AMRNB,
wxT(
"AMRNB"),
wxT(
"amr"),
wxT(
"amr"), 1,
AV_VERSION_INT(0,0,0),
false,
XO(
"AMR (narrow band) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_AMR_NB,
true},
1609 {
FMT_OPUS,
wxT(
"OPUS"),
wxT(
"opus"),
wxT(
"opus"), 255,
AV_CANMETA,
true,
XO(
"Opus (OggOpus) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_OPUS,
true},
1610 {
FMT_WMA2,
wxT(
"WMA"),
wxT(
"wma"),
wxT(
"asf"), 2,
AV_VERSION_INT(52,53,0),
false,
XO(
"WMA (version 2) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_WMAV2,
true},
1721 XO(
"Configure custom FFmpeg options"))
1728 mPresets = std::make_unique<FFmpegPresets>();
1745 if (codec !=
nullptr)
1760 for (
auto ofmt :
mFFmpeg->GetOutputFormats())
1766 mFormatNames.push_back(wxString::FromUTF8(ofmt->GetName()));
1782 std::unique_ptr<AVCodecWrapper> codec;
1783 for (
auto codec :
mFFmpeg->GetCodecs())
1786 if (codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
1792 mCodecNames.push_back(wxString::FromUTF8(codec->GetName()));
1805 IntSetting PredictionOrderSetting{ L
"/FileFormats/FFmpegPredOrderMethod",
1808 S.StartVerticalLay(1);
1809 S.StartMultiColumn(1, wxEXPAND);
1811 S.SetStretchyRow(3);
1812 S.StartMultiColumn(7, wxEXPAND);
1814 S.SetStretchyCol(1);
1816 S.Id(FELoadPresetID).AddButton(
XXO(
"Load Preset"));
1817 S.Id(FESavePresetID).AddButton(
XXO(
"Save Preset"));
1818 S.Id(FEDeletePresetID).AddButton(
XXO(
"Delete Preset"));
1819 S.Id(FEImportPresetsID).AddButton(
XXO(
"Import Presets"));
1820 S.Id(FEExportPresetsID).AddButton(
XXO(
"Export Presets"));
1823 S.StartMultiColumn(4, wxALIGN_LEFT);
1825 S.SetStretchyCol(1);
1826 S.SetStretchyCol(3);
1827 S.Id(FEFormatLabelID).AddFixedText(
XO(
"Format:"));
1828 mFormatName =
S.Id(FEFormatNameID).AddVariableText( {} );
1830 S.Id(FECodecLabelID).AddFixedText(
XO(
"Codec:"));
1831 mCodecName =
S.Id(FECodecNameID).AddVariableText( {} );
1834 S.AddVariableText(
XO(
1835"Not all formats and codecs are compatible. Nor are all option combinations compatible with all codecs."),
1837 S.StartMultiColumn(2, wxEXPAND);
1839 S.StartMultiColumn(2, wxEXPAND);
1841 S.SetStretchyRow(1);
1842 S.Id(FEAllFormatsID).AddButton(
XXO(
"Show All Formats"));
1843 S.Id(FEAllCodecsID).AddButton(
XXO(
"Show All Codecs"));
1850 S.StartVerticalLay();
1854 S.StartStatic(
XO(
"General Options"), 0);
1856 S.StartMultiColumn(8, wxEXPAND);
1859 .ToolTip(
XO(
"ISO 639 3-letter language code\nOptional\nempty - automatic"))
1860 .TieTextBox(
XXO(
"Language:"), {
wxT(
"/FileFormats/FFmpegLanguage"), wxEmptyString}, 9);
1863 S.AddVariableText(
XO(
"Bit Reservoir"));
1864 S.Id(FEBitReservoirID).TieCheckBox( {}, {
wxT(
"/FileFormats/FFmpegBitReservoir"),
true});
1867 S.AddVariableText(
XO(
"VBL"));
1868 S.Id(FEVariableBlockLenID).TieCheckBox( {}, {
wxT(
"/FileFormats/FFmpegVariableBlockLen"),
true});
1871 S.StartMultiColumn(4, wxALIGN_LEFT);
1875 .ToolTip(
XO(
"Codec tag (FOURCC)\nOptional\nempty - automatic"))
1876 .TieTextBox(
XXO(
"Tag:"), {
wxT(
"/FileFormats/FFmpegTag"), wxEmptyString}, 4);
1879 .ToolTip(
XO(
"Bit Rate (bits/second) - influences the resulting file size and quality\nSome codecs may only accept specific values (128k, 192k, 256k etc)\n0 - automatic\nRecommended - 192000"))
1880 .TieSpinCtrl(
XXO(
"Bit Rate:"), {
wxT(
"/FileFormats/FFmpegBitRate"), 0}, 1000000, 0);
1883 .ToolTip(
XO(
"Overall quality, used differently by different codecs\nRequired for vorbis\n0 - automatic\n-1 - off (use bitrate instead)"))
1884 .TieSpinCtrl(
XXO(
"Quality:"), {
wxT(
"/FileFormats/FFmpegQuality"), 0}, 500, -1);
1886 S.Id(FESampleRateID)
1887 .ToolTip(
XO(
"Sample rate (Hz)\n0 - don't change sample rate"))
1888 .TieSpinCtrl(
XXO(
"Sample Rate:"), {
wxT(
"/FileFormats/FFmpegSampleRate"), 0}, 200000, 0);
1891 .ToolTip(
XO(
"Audio cutoff bandwidth (Hz)\nOptional\n0 - automatic"))
1892 .TieSpinCtrl(
XXO(
"Cutoff:"), {
wxT(
"/FileFormats/FFmpegCutOff"), 0}, 10000000, 0);
1896 .ToolTip(
XO(
"AAC Profile\nLow Complexity - default\nMost players won't play anything other than LC"))
1897 .MinSize( { 100, -1 } )
1903 S.StartStatic(
XO(
"FLAC options"),0);
1905 S.StartMultiColumn(4, wxALIGN_LEFT);
1908 .ToolTip(
XO(
"Compression level\nRequired for FLAC\n-1 - automatic\nmin - 0 (fast encoding, large output file)\nmax - 10 (slow encoding, small output file)"))
1909 .Id(FECompLevelID).TieSpinCtrl(
XXO(
"Compression:"), {
wxT(
"/FileFormats/FFmpegCompLevel"), 0}, 10, -1);
1912 .ToolTip(
XO(
"Frame size\nOptional\n0 - default\nmin - 16\nmax - 65535"))
1913 .TieSpinCtrl(
XXO(
"Frame:"), {
wxT(
"/FileFormats/FFmpegFrameSize"), 0}, 65535, 0);
1916 .ToolTip(
XO(
"LPC coefficients precision\nOptional\n0 - default\nmin - 1\nmax - 15"))
1917 .TieSpinCtrl(
XXO(
"LPC"), {
wxT(
"/FileFormats/FFmpegLPCCoefPrec"), 0}, 15, 0);
1920 .ToolTip(
XO(
"Prediction Order Method\nEstimate - fastest, lower compression\nLog search - slowest, best compression\nFull search - default"))
1921 .MinSize( { 100, -1 } )
1924 PredictionOrderSetting,
1929 .ToolTip(
XO(
"Minimal prediction order\nOptional\n-1 - default\nmin - 0\nmax - 32 (with LPC) or 4 (without LPC)"))
1930 .TieSpinCtrl(
XXO(
"Min. PdO"), {
wxT(
"/FileFormats/FFmpegMinPredOrder"), -1}, 32, -1);
1933 .ToolTip(
XO(
"Maximal prediction order\nOptional\n-1 - default\nmin - 0\nmax - 32 (with LPC) or 4 (without LPC)"))
1934 .TieSpinCtrl(
XXO(
"Max. PdO"), {
wxT(
"/FileFormats/FFmpegMaxPredOrder"), -1}, 32, -1);
1936 S.Id(FEMinPartOrderID)
1937 .ToolTip(
XO(
"Minimal partition order\nOptional\n-1 - default\nmin - 0\nmax - 8"))
1938 .TieSpinCtrl(
XXO(
"Min. PtO"), {
wxT(
"/FileFormats/FFmpegMinPartOrder"), -1}, 8, -1);
1940 S.Id(FEMaxPartOrderID)
1941 .ToolTip(
XO(
"Maximal partition order\nOptional\n-1 - default\nmin - 0\nmax - 8"))
1942 .TieSpinCtrl(
XXO(
"Max. PtO"), {
wxT(
"/FileFormats/FFmpegMaxPartOrder"), -1}, 8, -1);
1946 S.AddVariableText(
XO(
"Use LPC"));
1948 S.Id(FEUseLPCID).TieCheckBox( {}, {
wxT(
"/FileFormats/FFmpegUseLPC"),
true});
1953 S.StartStatic(
XO(
"MPEG container options"),0);
1955 S.StartMultiColumn(4, wxALIGN_LEFT);
1958 .ToolTip(
XO(
"Maximum bit rate of the multiplexed stream\nOptional\n0 - default"))
1962 .TieSpinCtrl(
XXO(
"Mux Rate:"), {
wxT(
"/FileFormats/FFmpegMuxRate"), 0}, 10000000, 0);
1964 S.Id(FEPacketSizeID)
1967 .ToolTip(
XO(
"Packet size\nOptional\n0 - default"))
1970 .TieSpinCtrl(
XXO(
"Packet Size:"), {
wxT(
"/FileFormats/FFmpegPacketSize"), 0}, 10000000, 0);
1988 SetMinSize(GetSize());
1999 wxArrayInt selections;
2004 wxString selfmt =
mFormatList->GetString(selections[0]);
2008 if (nFormat == wxNOT_FOUND)
return;
2020 wxArrayInt selections;
2021 int n =
mCodecList->GetSelections(selections);
2025 wxString selcdc =
mCodecList->GetString(selections[0]);
2029 if (nCodec == wxNOT_FOUND)
return;
2040 const auto ffmpegId =
mFFmpeg->GetAVCodecID(
id);
2067 if (codec != NULL && codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2070 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2081 std::unique_ptr<AVCodecWrapper> codec;
2082 for (
auto codec :
mFFmpeg->GetCodecs())
2084 if (codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2091 .contains( wxString::FromUTF8(codec->GetName()) ) )
2093 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2104 else if (found == 0)
2106 wxCharBuffer buf =
str.ToUTF8();
2107 auto format =
mFFmpeg->GuessOutputFormat(buf,
nullptr,
nullptr);
2111 auto codec =
mFFmpeg->CreateEncoder(
format->GetAudioCodec());
2114 codec !=
nullptr && codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2116 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2140 wxArrayString FromList;
2149 auto tofmt =
mFFmpeg->GuessOutputFormat(
2156 wxString::FromUTF8(tofmt->GetLongName())));
2176 for (
auto ofmt :
mFFmpeg->GetOutputFormats())
2178 if (ofmt->GetAudioCodec() ==
mFFmpeg->GetAVCodecID(
id))
2180 wxString ofmtname = wxString::FromUTF8(ofmt->GetName());
2182 for (
unsigned int i = 0; i < FromList.size(); i++)
2184 if (ofmtname == FromList[i])
2192 if ((selfmt != NULL) &&
2193 (*selfmt == wxString::FromUTF8(ofmt->GetName())))
2200 wxString::FromUTF8(ofmt->GetLongName())));
2213 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2214 wxString presetname =
preset->GetValue();
2215 if (presetname.empty())
2221 auto query =
XO(
"Delete preset '%s'?").Format( presetname );
2224 XO(
"Confirm Deletion"),
2225 wxYES_NO | wxCENTRE);
2226 if (action == wxNO)
return;
2228 mPresets->DeletePreset(presetname);
2229 long index =
preset->FindString(presetname);
2230 preset->SetValue(wxEmptyString);
2240{
const bool kCheckForOverwrite =
true;
2247 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2254 if( bCheckForOverwrite && !
mPresets->OverwriteIsOk(
name))
2273 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2274 wxString presetname =
preset->GetValue();
2286 mPresets->LoadPreset(
this,presetname);
2305 XO(
"Select xml file with presets to import"),
2306 gPrefs->Read(
wxT(
"/FileFormats/FFmpegPresetDir")),
2310 if (dlg.
ShowModal() == wxID_CANCEL)
return;
2322 const bool kCheckForOverwrite =
true;
2328 wxArrayString presets;
2330 if( presets.Count() < 1)
2338 XO(
"Select xml file to export presets into"),
2339 gPrefs->Read(
wxT(
"/FileFormats/FFmpegPresetDir")),
2342 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
2343 if (dlg.
ShowModal() == wxID_CANCEL)
return;
2377 wxString *selcdc =
nullptr;
2378 wxString* selcdclong =
nullptr;
2382 if (selcdc ==
nullptr)
2385 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2390 wxString* selfmt =
nullptr;
2391 wxString* selfmtlong =
nullptr;
2395 if (selfmt ==
nullptr)
2401 bool bFound =
false;
2426 XO(
"Format %s is not compatible with codec %s.")
2427 .
Format( *selfmt, *selcdc ),
2429 XO(
"Incompatible format and codec"));
2441 if (
apptable[i].control != handled)
2457 else if (selfmt != NULL &&
2462 wxWindow *item = FindWindowById(
apptable[i].control,
this);
2463 if (item != NULL) item->Enable(
apptable[i].enable);
2471 wxString *selfmt = NULL;
2472 wxString *selfmtlong = NULL;
2479 wxString *selcdc = NULL;
2480 wxString *selcdclong = NULL;
2483 auto fmt =
mFFmpeg->GuessOutputFormat(selfmt->ToUTF8(),NULL,NULL);
2487 mFormatName->SetLabel(wxString(
_(
"Failed to guess format")));
2494 if (selcdc !=
nullptr)
2496 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2500 selcdcid =
mFFmpeg->GetAudacityCodecID(cdc->GetId());
2506 if (newselcdc >= 0)
mCodecList->Select(newselcdc);
2508 std::unique_ptr<AVCodecWrapper> cdc;
2510 if (selcdc !=
nullptr)
2511 cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2521 wxString *selcdc =
nullptr;
2522 wxString* selcdclong =
nullptr;
2526 if (selcdc ==
nullptr)
2531 wxString* selfmt =
nullptr;
2532 wxString* selfmtlong =
nullptr;
2536 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2541 mCodecName->SetLabel(wxString(
_(
"Failed to find the codec")));
2545 mCodecName->SetLabel(wxString::Format(
wxT(
"[%d] %s"), (
int)
mFFmpeg->GetAudacityCodecID(cdc->GetId()).value, *selcdclong));
2547 if (selfmt !=
nullptr)
2549 auto fmt =
mFFmpeg->GuessOutputFormat(selfmt->ToUTF8(),
nullptr,
nullptr);
2553 selfmtlong =
nullptr;
2558 mFFmpeg->GetAudacityCodecID(cdc->GetId()), selfmt);
2593 if (selcdc > -1)
gPrefs->Write(
wxT(
"/FileFormats/FFmpegCodec"),
mCodecList->GetString(selcdc));
2594 if (selfmt > -1)
gPrefs->Write(
wxT(
"/FileFormats/FFmpegFormat"),
mFormatList->GetString(selfmt));
@ AUDACITY_AV_CODEC_ID_GSM_MS
@ AUDACITY_AV_CODEC_ID_IMC
@ AUDACITY_AV_CODEC_ID_QCELP
@ AUDACITY_AV_CODEC_ID_PCM_S16BE
@ AUDACITY_AV_CODEC_ID_ADPCM_G726
@ AUDACITY_AV_CODEC_ID_OPUS
@ AUDACITY_AV_CODEC_ID_ADPCM_IMA_QT
@ AUDACITY_AV_CODEC_ID_QDM2
@ AUDACITY_AV_CODEC_ID_PCM_S24LE
@ AUDACITY_AV_CODEC_ID_ADPCM_YAMAHA
@ AUDACITY_AV_CODEC_ID_AC3
@ AUDACITY_AV_CODEC_ID_MACE3
@ AUDACITY_AV_CODEC_ID_PCM_MULAW
@ AUDACITY_AV_CODEC_ID_PCM_S8
@ AUDACITY_AV_CODEC_ID_VORBIS
@ AUDACITY_AV_CODEC_ID_DVAUDIO
@ AUDACITY_AV_CODEC_ID_PCM_S32BE
@ AUDACITY_AV_CODEC_ID_DTS
@ AUDACITY_AV_CODEC_ID_ALAC
@ AUDACITY_AV_CODEC_ID_PCM_S16LE
@ AUDACITY_AV_CODEC_ID_PCM_S32LE
@ AUDACITY_AV_CODEC_ID_FLAC
@ AUDACITY_AV_CODEC_ID_PCM_ALAW
@ AUDACITY_AV_CODEC_ID_WMAV1
@ AUDACITY_AV_CODEC_ID_NONE
@ AUDACITY_AV_CODEC_ID_ADPCM_SWF
@ AUDACITY_AV_CODEC_ID_VOXWARE
@ AUDACITY_AV_CODEC_ID_NELLYMOSER
@ AUDACITY_AV_CODEC_ID_GSM
@ AUDACITY_AV_CODEC_ID_PCM_U8
@ AUDACITY_AV_CODEC_ID_ROQ_DPCM
@ AUDACITY_AV_CODEC_ID_TRUESPEECH
@ AUDACITY_AV_CODEC_ID_MP2
@ AUDACITY_AV_CODEC_ID_WMAPRO
@ AUDACITY_AV_CODEC_ID_WMAV2
@ AUDACITY_AV_CODEC_ID_AMR_NB
@ AUDACITY_AV_CODEC_ID_MP3
@ AUDACITY_AV_CODEC_ID_PCM_S24BE
@ AUDACITY_AV_CODEC_ID_ATRAC3
@ AUDACITY_AV_CODEC_ID_ADPCM_MS
@ AUDACITY_AV_CODEC_ID_AMR_WB
@ AUDACITY_AV_CODEC_ID_AAC
@ AUDACITY_AV_CODEC_ID_ADPCM_IMA_WAV
@ AUDACITY_AV_CODEC_ID_MACE6
@ AUDACITY_AV_CODEC_ID_WMAVOICE
@ AUDACITY_AV_CODEC_ID_ADPCM_CT
R GuardedCall(const F1 &body, const F2 &handler=F2::Default(), F3 delayedHandler=DefaultDelayedHandlerAction) noexcept(noexcept(handler(std::declval< AudacityException * >())) &&noexcept(handler(nullptr)) &&noexcept(std::function< void(AudacityException *)>{std::move(delayedHandler)}))
Execute some code on any thread; catch any AudacityException; enqueue error report on the main thread...
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
EVT_BUTTON(wxID_NO, DependencyDialog::OnNo) EVT_BUTTON(wxID_YES
const TranslatableString name
static const FileNames::FileTypes & FileTypes()
#define FFMPEG_EXPORT_CTRL_ID_ENTRIES
static const wxChar * FFmpegExportCtrlIDNames[]
ChoiceSetting AACProfiles
AAC profiles.
std::unordered_map< wxString, FFmpegPreset > FFmpegPresetMap
TranslatableString n_kbps(int n)
bool FindFFmpegLibs(wxWindow *parent)
bool LoadFFmpeg(bool showerror)
#define AV_VERSION_INT(a, b, c)
XXO("&Cut/Copy/Paste Toolbar")
IteratorRange< Iterator > make_iterator_range(const Iterator &i1, const Iterator &i2)
EffectReverbSettings preset
std::vector< TranslatableString > TranslatableStrings
std::vector< Attribute > AttributesList
virtual AVCodecIDFwd GetId() const noexcept=0
bool TransferDataToWindow() override
bool TransferDataFromWindow() override
ExportFFmpegAACOptions(wxWindow *parent, int format)
virtual ~ExportFFmpegAACOptions()
void PopulateOrExchange(ShuttleGui &S)
virtual ~ExportFFmpegAC3Options()
static const int iAC3SampleRates[]
ExportFFmpegAC3Options(wxWindow *parent, int format)
bool TransferDataToWindow() override
bool TransferDataFromWindow() override
void PopulateOrExchange(ShuttleGui &S)
bool TransferDataToWindow() override
ExportFFmpegAMRNBOptions(wxWindow *parent, int format)
void PopulateOrExchange(ShuttleGui &S)
bool TransferDataFromWindow() override
virtual ~ExportFFmpegAMRNBOptions()
bool TransferDataFromWindow() override
void OnOpen(wxCommandEvent &evt)
bool TransferDataToWindow() override
~ExportFFmpegCustomOptions()
void PopulateOrExchange(ShuttleGui &S)
bool TransferDataToWindow() override
bool TransferDataFromWindow() override
~ExportFFmpegOPUSOptions()
ExportFFmpegOPUSOptions(wxWindow *parent, int format)
void PopulateOrExchange(ShuttleGui &S)
Custom FFmpeg export dialog.
void OnExportPresets(wxCommandEvent &event)
void OnSavePreset(wxCommandEvent &event)
void OnImportPresets(wxCommandEvent &event)
void FindSelectedCodec(wxString **name, wxString **longname)
Finds the codec currently selected and returns its name and description.
wxArrayStringEx mCodecNames
wxComboBox * mPresetCombo
void OnDeletePreset(wxCommandEvent &event)
wxArrayString mShownFormatLongNames
void FetchCodecList()
Retrieves codec list from libavcodec.
static CompatibilityEntry CompatibilityList[]
std::unique_ptr< FFmpegPresets > mPresets
int FetchCompatibleFormatList(AudacityAVCodecID id, wxString *selfmt)
void OnCodecList(wxCommandEvent &event)
void PopulateOrExchange(ShuttleGui &S)
void FindSelectedFormat(wxString **name, wxString **longname)
Finds the format currently selected and returns its name and description.
void OnLoadPreset(wxCommandEvent &event)
wxArrayStringEx mFormatNames
wxArrayString mShownCodecLongNames
wxArrayString mShownCodecNames
int FetchCompatibleCodecList(const wxChar *fmt, AudacityAVCodecID id)
wxStaticText * mCodecName
wxArrayString mCodecLongNames
void OnFormatList(wxCommandEvent &event)
void OnAllFormats(wxCommandEvent &event)
wxStaticText * mFormatName
void OnOK(wxCommandEvent &event)
ExportFFmpegOptions(wxWindow *parent)
void OnAllCodecs(wxCommandEvent &event)
bool SavePreset(bool bCheckForOverwrite)
void FetchFormatList()
Retrieves format list from libavformat.
static ExposedFormat fmts[]
List of export types.
static ApplicableFor apptable[]
bool ReportIfBadCombination()
wxArrayString mShownFormatNames
void OnGetURL(wxCommandEvent &event)
wxArrayStringEx mPresetNames
void EnableDisableControls(AVCodecWrapper *cdc, wxString *selfmt)
std::shared_ptr< FFmpegFunctions > mFFmpeg
wxArrayString mFormatLongNames
bool TransferDataFromWindow() override
void PopulateOrExchange(ShuttleGui &S)
bool TransferDataToWindow() override
~ExportFFmpegWMAOptions()
static const int iWMASampleRates[]
ExportFFmpegWMAOptions(wxWindow *parent, int format)
wxArrayString mControlState
void LoadPreset(ExportFFmpegOptions *parent, wxString &name)
bool SavePreset(ExportFFmpegOptions *parent, wxString &name)
void ImportPresets(wxString &filename)
bool OverwriteIsOk(wxString &name)
XMLTagHandler * HandleXMLChild(const std::string_view &tag) override
void DeletePreset(wxString &name)
bool HandleXMLTag(const std::string_view &tag, const AttributesList &attrs) override
void WriteXMLHeader(XMLWriter &xmlFile) const
void GetPresetList(wxArrayString &list)
void WriteXML(XMLWriter &xmlFile) const
void ExportPresets(wxString &filename)
FFmpegPreset * FindPreset(wxString &name)
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
virtual wxString GetPath() const
FILES_API const FileType XMLFiles
std::vector< FileType > FileTypes
FILES_API const FileType AllFiles
static void ShowHelp(wxWindow *parent, const FilePath &localFileName, const URLString &remoteURL, bool bModal=false, bool alwaysDefaultBrowser=false)
Specialization of Setting for int.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Holds a msgid for the translation catalog; may also bind format arguments.
Reads a file and passes the results through an XMLTagHandler.
bool Parse(XMLTagHandler *baseHandler, const FilePath &fname)
Wrapper to output XML data to files.
This class is an interface which should be implemented by classes which wish to be able to load and s...
Base class for XMLFileWriter and XMLStringWriter that provides the general functionality for creating...
FILES_API FilePath DataDir()
Audacity user data directory.
const TranslatableStrings PredictionOrderMethodNames
Prediction order method - names.
TranslatableString f_kbps(double d)
ChoiceSetting OPUSCompression
ChoiceSetting OPUSBitrate
Bit Rates supported by OPUS encoder. Setting bit rate to other values will not result in different fi...
ChoiceSetting OPUSApplication
const std::vector< int > AC3BitRateValues
const TranslatableStrings WMABitRateNames
Bit Rates supported by WMA encoder. Setting bit rate to other values will not result in different fil...
ChoiceSetting OPUSVbrMode
ChoiceSetting OPUSFrameDuration
const std::vector< int > WMABitRateValues
const TranslatableStrings AMRNBBitRateNames
const std::vector< int > AMRNBBitRateValues
const TranslatableStrings AC3BitRateNames
std::string ToUTF8(const std::wstring &wstr)
Entry for the Applicability table.
Describes format-codec compatibility.
const wxChar * fmt
format, recognizable by guess_format()
AudacityAVCodecID codec
codec ID
static std::shared_ptr< FFmpegFunctions > Load(bool fromUserPathOnly=false)