51#include <wx/checkbox.h>
56#include <wx/textctrl.h>
57#include <wx/listbox.h>
59#include <wx/spinctrl.h>
60#include <wx/combobox.h>
61#include <wx/stattext.h>
63#include "../widgets/FileDialog/FileDialog.h"
67#include "../widgets/AudacityMessageBox.h"
68#include "../widgets/HelpSystem.h"
73#if defined(USE_FFMPEG)
79#define FFMPEG_EXPORT_CTRL_ID_ENTRIES \
80 FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(FEFirstID, 20000), \
81 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatID), \
82 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecID), \
83 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitrateID), \
84 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEQualityID), \
85 FFMPEG_EXPORT_CTRL_ID_ENTRY(FESampleRateID), \
86 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELanguageID), \
87 FFMPEG_EXPORT_CTRL_ID_ENTRY(FETagID), \
88 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECutoffID), \
89 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFrameSizeID), \
90 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBufSizeID), \
91 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEProfileID), \
92 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECompLevelID), \
93 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEUseLPCID), \
94 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELPCCoeffsID), \
95 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPredID), \
96 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPredID), \
97 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPredOrderID), \
98 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPartOrderID), \
99 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPartOrderID), \
100 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMuxRateID), \
101 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPacketSizeID), \
102 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitReservoirID), \
103 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEVariableBlockLenID), \
104 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELastID), \
106 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatLabelID), \
107 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecLabelID), \
108 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatNameID), \
109 FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecNameID), \
110 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPresetID), \
111 FFMPEG_EXPORT_CTRL_ID_ENTRY(FESavePresetID), \
112 FFMPEG_EXPORT_CTRL_ID_ENTRY(FELoadPresetID), \
113 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEDeletePresetID), \
114 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllFormatsID), \
115 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllCodecsID), \
116 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEImportPresetsID), \
117 FFMPEG_EXPORT_CTRL_ID_ENTRY(FEExportPresetsID) \
120#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) name = num
121#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) name
128#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY
129#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) wxT(#name)
130#undef FFMPEG_EXPORT_CTRL_ID_ENTRY
131#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) wxT(#name)
136#undef FFMPEG_EXPORT_CTRL_ID_ENTRIES
137#undef FFMPEG_EXPORT_CTRL_ID_ENTRY
138#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY
216 S.StartVerticalLay();
218 S.StartHorizontalLay(wxCENTER);
220 S.StartMultiColumn(2, wxCENTER);
224 {wxT(
"/FileFormats/AC3BitRate"),
232 S.EndHorizontalLay();
278 S.StartVerticalLay();
280 S.StartHorizontalLay(wxEXPAND);
282 S.SetSizerProportion(1);
283 S.StartMultiColumn(2, wxCENTER);
287 XXO(
"Quality (kbps):"),
288 {wxT(
"/FileFormats/AACQuality"), 160},320, 98);
292 S.EndHorizontalLay();
371 S.StartVerticalLay();
373 S.StartHorizontalLay(wxCENTER);
375 S.StartMultiColumn(2, wxCENTER);
379 {wxT(
"/FileFormats/AMRNBBitRate"),
387 S.EndHorizontalLay();
420 wxT(
"/FileFormats/OPUSBitrate"),
461 wxT(
"/FileFormats/OPUSCompression"),
497 wxT(
"/FileFormats/OPUSVbrMode"),
516 wxT(
"/FileFormats/OPUSApplication"),
535 wxT(
"/FileFormats/OPUSFrameDuration"),
560 wxT(
"/FileFormats/OPUSCutoff"),
568 XO(
"Super Wideband"),
602 S.SetSizerProportion(1);
604 S.StartVerticalLay();
606 S.StartHorizontalLay(wxCENTER);
608 S.StartMultiColumn(2, wxCENTER);
610 S.StartMultiColumn(2, wxCENTER);
621 XXO(
"Frame Duration:"),
626 S.StartMultiColumn(2, wxCENTER);
645 S.EndHorizontalLay();
674{ 8000, 11025, 16000, 22050, 44100, 0};
730 S.StartVerticalLay();
732 S.StartHorizontalLay(wxCENTER);
734 S.StartMultiColumn(2, wxCENTER);
738 {wxT(
"/FileFormats/WMABitRate"),
746 S.EndHorizontalLay();
786 PopulateOrExchange(
S);
788 TransferDataToWindow();
800 S.StartHorizontalLay(wxCENTER);
802 S.StartVerticalLay(wxCENTER, 0);
804 S.Id(
OpenID).AddButton(
XXO(
"Open custom FFmpeg format options"));
805 S.StartMultiColumn(2, wxCENTER);
807 S.AddPrompt(
XXO(
"Current Format:"));
808 mFormat =
S.Style(wxTE_READONLY).AddTextBox({}, wxT(
""), 25);
809 S.AddPrompt(
XXO(
"Current Codec:"));
810 mCodec =
S.Style(wxTE_READONLY).AddTextBox({}, wxT(
""), 25);
814 S.EndHorizontalLay();
816 S.EndHorizontalLay();
825 mFormat->SetValue(
gPrefs->Read(wxT(
"/FileFormats/FFmpegFormat"), wxT(
"")));
826 mCodec->SetValue(
gPrefs->Read(wxT(
"/FileFormats/FFmpegCodec"), wxT(
"")));
855 auto pWin = wxGetTopLevelParent(
this );
858 auto pWin = wxTheApp->GetTopWindow();
883 xmlfile.
Parse(
this,xmlFileName.GetFullPath());
892 xmlFileName.GetFullPath(),
XO(
"Error Saving FFmpeg Presets") };
907 bool success = xmlfile.
Parse(
this,filename);
926 FFmpegPresetMap::iterator iter;
929 list.push_back(iter->second.mPresetName);
932 std::sort( list.begin(), list.end() );
949 return &iter->second;
961 auto query =
XO(
"Overwrite preset '%s'?").Format(
name);
964 XO(
"Confirm Overwrite"),
965 wxYES_NO | wxCENTRE);
966 if (action == wxNO)
return false;
982 wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(FEFormatID,parent);
983 lb =
dynamic_cast<wxListBox*
>(wnd);
984 if (lb->GetSelection() < 0)
989 format = lb->GetStringSelection();
991 wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(FECodecID,parent);
992 lb =
dynamic_cast<wxListBox*
>(wnd);
993 if (lb->GetSelection() < 0)
999 codec = lb->GetStringSelection();
1010 for (
int id = FEFirstID;
id < FELastID;
id++)
1012 wxWindow *wnd =
dynamic_cast<wxWindow*
>(parent)->FindWindowById(
id,parent);
1021 preset->mControlState[
id - FEFirstID] = codec;
1026 case FESampleRateID:
1034 case FEMinPartOrderID:
1035 case FEMaxPartOrderID:
1037 case FEPacketSizeID:
1038 sc =
dynamic_cast<wxSpinCtrl*
>(wnd);
1039 preset->mControlState[
id - FEFirstID] = wxString::Format(wxT(
"%d"),sc->GetValue());
1044 tc =
dynamic_cast<wxTextCtrl*
>(wnd);
1045 preset->mControlState[
id - FEFirstID] = tc->GetValue();
1050 ch =
dynamic_cast<wxChoice*
>(wnd);
1051 preset->mControlState[
id - FEFirstID] = wxString::Format(wxT(
"%d"),ch->GetSelection());
1055 case FEBitReservoirID:
1056 case FEVariableBlockLenID:
1057 cb =
dynamic_cast<wxCheckBox*
>(wnd);
1058 preset->mControlState[
id - FEFirstID] = wxString::Format(wxT(
"%d"),cb->GetValue());
1081 for (
int id = FEFirstID;
id < FELastID;
id++)
1083 wxWindow *wnd = parent->FindWindowById(
id,parent);
1094 lb =
dynamic_cast<wxListBox*
>(wnd);
1095 readstr =
preset->mControlState[
id - FEFirstID];
1096 readlong = lb->FindString(readstr);
1097 if (readlong > -1) lb->Select(readlong);
1102 case FESampleRateID:
1110 case FEMinPartOrderID:
1111 case FEMaxPartOrderID:
1113 case FEPacketSizeID:
1114 sc =
dynamic_cast<wxSpinCtrl*
>(wnd);
1115 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1116 sc->SetValue(readlong);
1121 tc =
dynamic_cast<wxTextCtrl*
>(wnd);
1122 tc->SetValue(
preset->mControlState[
id - FEFirstID]);
1127 ch =
dynamic_cast<wxChoice*
>(wnd);
1128 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1129 if (readlong > -1) ch->Select(readlong);
1133 case FEBitReservoirID:
1134 case FEVariableBlockLenID:
1135 cb =
dynamic_cast<wxCheckBox*
>(wnd);
1136 preset->mControlState[
id - FEFirstID].ToLong(&readlong);
1137 if (readlong) readbool =
true;
else readbool =
false;
1138 cb->SetValue(readbool);
1152 if (tag ==
"ffmpeg_presets")
1157 if (tag ==
"preset")
1159 for (
auto pair : attrs)
1161 auto attr = pair.first;
1162 auto value = pair.second;
1166 wxString strValue = value.ToWString();
1171 auto query =
XO(
"Replace preset '%s'?").Format( strValue );
1174 XO(
"Confirm Overwrite"),
1175 wxYES_NO | wxCANCEL | wxCENTRE);
1176 if (action == wxCANCEL)
1199 if (tag ==
"setctrlstate" &&
mPreset)
1202 for (
auto pair : attrs)
1204 auto attr = pair.first;
1205 auto value = pair.second;
1209 for (
long i = FEFirstID; i < FELastID; i++)
1213 else if (attr ==
"state")
1215 if (
id > FEFirstID &&
id < FELastID)
1232 if (tag ==
"preset")
1236 else if (tag ==
"setctrlstate")
1246 xmlFile.Write(wxT(
"<?xml "));
1247 xmlFile.Write(wxT(
"version=\"1.0\" "));
1248 xmlFile.Write(wxT(
"standalone=\"no\" "));
1249 xmlFile.Write(wxT(
"?>\n"));
1251 wxString dtdName = wxT(
"-//audacityffmpegpreset-1.0.0//DTD//EN");
1253 wxT(
"http://audacity.sourceforge.net/xml/audacityffmpegpreset-1.0.0.dtd");
1255 xmlFile.Write(wxT(
"<!DOCTYPE "));
1256 xmlFile.Write(wxT(
"project "));
1257 xmlFile.Write(wxT(
"PUBLIC "));
1258 xmlFile.Write(wxT(
"\"-//audacityffmpegpreset-1.0.0//DTD//EN\" "));
1259 xmlFile.Write(wxT(
"\"http://audacity.sourceforge.net/xml/audacityffmpegpreset-1.0.0.dtd\" "));
1260 xmlFile.Write(wxT(
">\n"));
1266 xmlFile.StartTag(wxT(
"ffmpeg_presets"));
1267 xmlFile.WriteAttr(wxT(
"version"),wxT(
"1.0"));
1268 FFmpegPresetMap::const_iterator iter;
1269 for (iter = mPresets.begin(); iter != mPresets.end(); ++iter)
1271 auto preset = &iter->second;
1272 xmlFile.StartTag(wxT(
"preset"));
1273 xmlFile.WriteAttr(wxT(
"name"),
preset->mPresetName);
1274 for (
long i = FEFirstID + 1; i < FELastID; i++)
1276 xmlFile.StartTag(wxT(
"setctrlstate"));
1278 xmlFile.WriteAttr(wxT(
"state"),
preset->mControlState[i - FEFirstID]);
1279 xmlFile.EndTag(wxT(
"setctrlstate"));
1281 xmlFile.EndTag(wxT(
"preset"));
1283 xmlFile.EndTag(wxT(
"ffmpeg_presets"));
1342#if LIBAVCODEC_VERSION_MAJOR < 58
1378#if LIBAVCODEC_VERSION_MAJOR < 58
1427#if LIBAVCODEC_VERSION_MAJOR < 58
1535 #if LIBAVCODEC_VERSION_MAJOR < 58
1585#if LIBAVCODEC_VERSION_MAJOR < 58
1609 {wxT(
"1") ,
XO(
"LC")},
1610 {wxT(
"0") ,
XO(
"Main")},
1612 {wxT(
"3") ,
XO(
"LTP")},
1620 {
FMT_M4A, wxT(
"M4A"), wxT(
"m4a"), wxT(
"ipod"), 48,
AV_CANMETA,
true,
XO(
"M4A (AAC) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_AAC,
true},
1621 {
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},
1622 {
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},
1623 {
FMT_OPUS, wxT(
"OPUS"), wxT(
"opus"), wxT(
"opus"), 255,
AV_CANMETA,
true,
XO(
"Opus (OggOpus) Files (FFmpeg)"),
AUDACITY_AV_CODEC_ID_OPUS,
true},
1624 {
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},
1735 XO(
"Configure custom FFmpeg options"))
1742 mPresets = std::make_unique<FFmpegPresets>();
1757 auto codec =
mFFmpeg->CreateEncoder(
gPrefs->Read(wxT(
"/FileFormats/FFmpegCodec")).
ToUTF8());
1759 if (codec !=
nullptr)
1775 std::unique_ptr<AVOutputFormatWrapper> ofmt;
1777 while ((ofmt =
mFFmpeg->GetNextOutputFormat(ofmt.get()))!=NULL)
1783 mFormatNames.push_back(wxString::FromUTF8(ofmt->GetName()));
1799 std::unique_ptr<AVCodecWrapper> codec;
1800 while ((codec =
mFFmpeg->GetNextCodec(codec.get()))!=NULL)
1803 if (codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
1809 mCodecNames.push_back(wxString::FromUTF8(codec->GetName()));
1822 S.StartVerticalLay(1);
1823 S.StartMultiColumn(1, wxEXPAND);
1825 S.SetStretchyRow(3);
1826 S.StartMultiColumn(7, wxEXPAND);
1828 S.SetStretchyCol(1);
1830 S.Id(FELoadPresetID).AddButton(
XXO(
"Load Preset"));
1831 S.Id(FESavePresetID).AddButton(
XXO(
"Save Preset"));
1832 S.Id(FEDeletePresetID).AddButton(
XXO(
"Delete Preset"));
1833 S.Id(FEImportPresetsID).AddButton(
XXO(
"Import Presets"));
1834 S.Id(FEExportPresetsID).AddButton(
XXO(
"Export Presets"));
1837 S.StartMultiColumn(4, wxALIGN_LEFT);
1839 S.SetStretchyCol(1);
1840 S.SetStretchyCol(3);
1841 S.Id(FEFormatLabelID).AddFixedText(
XO(
"Format:"));
1842 mFormatName =
S.Id(FEFormatNameID).AddVariableText( {} );
1844 S.Id(FECodecLabelID).AddFixedText(
XO(
"Codec:"));
1845 mCodecName =
S.Id(FECodecNameID).AddVariableText( {} );
1848 S.AddVariableText(
XO(
1849"Not all formats and codecs are compatible. Nor are all option combinations compatible with all codecs."),
1851 S.StartMultiColumn(2, wxEXPAND);
1853 S.StartMultiColumn(2, wxEXPAND);
1855 S.SetStretchyRow(1);
1856 S.Id(FEAllFormatsID).AddButton(
XXO(
"Show All Formats"));
1857 S.Id(FEAllCodecsID).AddButton(
XXO(
"Show All Codecs"));
1864 S.StartVerticalLay();
1868 S.StartStatic(
XO(
"General Options"), 0);
1870 S.StartMultiColumn(8, wxEXPAND);
1873 .ToolTip(
XO(
"ISO 639 3-letter language code\nOptional\nempty - automatic"))
1874 .TieTextBox(
XXO(
"Language:"), {wxT(
"/FileFormats/FFmpegLanguage"), wxEmptyString}, 9);
1877 S.AddVariableText(
XO(
"Bit Reservoir"));
1878 S.Id(FEBitReservoirID).TieCheckBox( {}, {wxT(
"/FileFormats/FFmpegBitReservoir"),
true});
1881 S.AddVariableText(
XO(
"VBL"));
1882 S.Id(FEVariableBlockLenID).TieCheckBox( {}, {wxT(
"/FileFormats/FFmpegVariableBlockLen"),
true});
1885 S.StartMultiColumn(4, wxALIGN_LEFT);
1889 .ToolTip(
XO(
"Codec tag (FOURCC)\nOptional\nempty - automatic"))
1890 .TieTextBox(
XXO(
"Tag:"), {wxT(
"/FileFormats/FFmpegTag"), wxEmptyString}, 4);
1893 .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"))
1894 .TieSpinCtrl(
XXO(
"Bit Rate:"), {wxT(
"/FileFormats/FFmpegBitRate"), 0}, 1000000, 0);
1897 .ToolTip(
XO(
"Overall quality, used differently by different codecs\nRequired for vorbis\n0 - automatic\n-1 - off (use bitrate instead)"))
1898 .TieSpinCtrl(
XXO(
"Quality:"), {wxT(
"/FileFormats/FFmpegQuality"), 0}, 500, -1);
1900 S.Id(FESampleRateID)
1901 .ToolTip(
XO(
"Sample rate (Hz)\n0 - don't change sample rate"))
1902 .TieSpinCtrl(
XXO(
"Sample Rate:"), {wxT(
"/FileFormats/FFmpegSampleRate"), 0}, 200000, 0);
1905 .ToolTip(
XO(
"Audio cutoff bandwidth (Hz)\nOptional\n0 - automatic"))
1906 .TieSpinCtrl(
XXO(
"Cutoff:"), {wxT(
"/FileFormats/FFmpegCutOff"), 0}, 10000000, 0);
1910 .ToolTip(
XO(
"AAC Profile\nLow Complexity - default\nMost players won't play anything other than LC"))
1911 .MinSize( { 100, -1 } )
1917 S.StartStatic(
XO(
"FLAC options"),0);
1919 S.StartMultiColumn(4, wxALIGN_LEFT);
1922 .ToolTip(
XO(
"Compression level\nRequired for FLAC\n-1 - automatic\nmin - 0 (fast encoding, large output file)\nmax - 10 (slow encoding, small output file)"))
1923 .Id(FECompLevelID).TieSpinCtrl(
XXO(
"Compression:"), {wxT(
"/FileFormats/FFmpegCompLevel"), 0}, 10, -1);
1926 .ToolTip(
XO(
"Frame size\nOptional\n0 - default\nmin - 16\nmax - 65535"))
1927 .TieSpinCtrl(
XXO(
"Frame:"), {wxT(
"/FileFormats/FFmpegFrameSize"), 0}, 65535, 0);
1930 .ToolTip(
XO(
"LPC coefficients precision\nOptional\n0 - default\nmin - 1\nmax - 15"))
1931 .TieSpinCtrl(
XXO(
"LPC"), {wxT(
"/FileFormats/FFmpegLPCCoefPrec"), 0}, 15, 0);
1934 .ToolTip(
XO(
"Prediction Order Method\nEstimate - fastest, lower compression\nLog search - slowest, best compression\nFull search - default"))
1935 .MinSize( { 100, -1 } )
1938 {wxT(
"/FileFormats/FFmpegPredOrderMethod"),
1944 .ToolTip(
XO(
"Minimal prediction order\nOptional\n-1 - default\nmin - 0\nmax - 32 (with LPC) or 4 (without LPC)"))
1945 .TieSpinCtrl(
XXO(
"Min. PdO"), {wxT(
"/FileFormats/FFmpegMinPredOrder"), -1}, 32, -1);
1948 .ToolTip(
XO(
"Maximal prediction order\nOptional\n-1 - default\nmin - 0\nmax - 32 (with LPC) or 4 (without LPC)"))
1949 .TieSpinCtrl(
XXO(
"Max. PdO"), {wxT(
"/FileFormats/FFmpegMaxPredOrder"), -1}, 32, -1);
1951 S.Id(FEMinPartOrderID)
1952 .ToolTip(
XO(
"Minimal partition order\nOptional\n-1 - default\nmin - 0\nmax - 8"))
1953 .TieSpinCtrl(
XXO(
"Min. PtO"), {wxT(
"/FileFormats/FFmpegMinPartOrder"), -1}, 8, -1);
1955 S.Id(FEMaxPartOrderID)
1956 .ToolTip(
XO(
"Maximal partition order\nOptional\n-1 - default\nmin - 0\nmax - 8"))
1957 .TieSpinCtrl(
XXO(
"Max. PtO"), {wxT(
"/FileFormats/FFmpegMaxPartOrder"), -1}, 8, -1);
1961 S.AddVariableText(
XO(
"Use LPC"));
1963 S.Id(FEUseLPCID).TieCheckBox( {}, {wxT(
"/FileFormats/FFmpegUseLPC"),
true});
1968 S.StartStatic(
XO(
"MPEG container options"),0);
1970 S.StartMultiColumn(4, wxALIGN_LEFT);
1973 .ToolTip(
XO(
"Maximum bit rate of the multiplexed stream\nOptional\n0 - default"))
1977 .TieSpinCtrl(
XXO(
"Mux Rate:"), {wxT(
"/FileFormats/FFmpegMuxRate"), 0}, 10000000, 0);
1979 S.Id(FEPacketSizeID)
1982 .ToolTip(
XO(
"Packet size\nOptional\n0 - default"))
1985 .TieSpinCtrl(
XXO(
"Packet Size:"), {wxT(
"/FileFormats/FFmpegPacketSize"), 0}, 10000000, 0);
2003 SetMinSize(GetSize());
2014 wxArrayInt selections;
2019 wxString selfmt =
mFormatList->GetString(selections[0]);
2023 if (nFormat == wxNOT_FOUND)
return;
2035 wxArrayInt selections;
2036 int n =
mCodecList->GetSelections(selections);
2040 wxString selcdc =
mCodecList->GetString(selections[0]);
2044 if (nCodec == wxNOT_FOUND)
return;
2055 const auto ffmpegId =
mFFmpeg->GetAVCodecID(
id);
2082 if (codec != NULL && codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2085 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2096 std::unique_ptr<AVCodecWrapper> codec;
2097 while ((codec =
mFFmpeg->GetNextCodec(codec.get()))!=NULL)
2099 if (codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2106 .contains( wxString::FromUTF8(codec->GetName()) ) )
2108 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2119 else if (found == 0)
2121 wxCharBuffer buf =
str.ToUTF8();
2122 auto format =
mFFmpeg->GuessOutputFormat(buf,
nullptr,
nullptr);
2126 auto codec =
mFFmpeg->CreateEncoder(
format->GetAudioCodec());
2129 codec !=
nullptr && codec->IsAudio() &&
mFFmpeg->av_codec_is_encoder(codec->GetWrappedValue()))
2131 if ((ffmpegId >= 0) && codec->GetId() == ffmpegId)
2154 std::unique_ptr<AVOutputFormatWrapper> ofmt;
2156 wxArrayString FromList;
2165 auto tofmt =
mFFmpeg->GuessOutputFormat(
2172 wxString::FromUTF8(tofmt->GetLongName())));
2192 while ((ofmt =
mFFmpeg->GetNextOutputFormat(ofmt.get()))!=NULL)
2194 if (ofmt->GetAudioCodec() ==
mFFmpeg->GetAVCodecID(
id))
2196 wxString ofmtname = wxString::FromUTF8(ofmt->GetName());
2198 for (
unsigned int i = 0; i < FromList.size(); i++)
2200 if (ofmtname == FromList[i])
2208 if ((selfmt != NULL) &&
2209 (*selfmt == wxString::FromUTF8(ofmt->GetName())))
2216 wxString::FromUTF8(ofmt->GetLongName())));
2229 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2230 wxString presetname =
preset->GetValue();
2231 if (presetname.empty())
2237 auto query =
XO(
"Delete preset '%s'?").Format( presetname );
2240 XO(
"Confirm Deletion"),
2241 wxYES_NO | wxCENTRE);
2242 if (action == wxNO)
return;
2244 mPresets->DeletePreset(presetname);
2245 long index =
preset->FindString(presetname);
2246 preset->SetValue(wxEmptyString);
2256{
const bool kCheckForOverwrite =
true;
2263 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2270 if( bCheckForOverwrite && !
mPresets->OverwriteIsOk(
name))
2289 wxComboBox *
preset =
dynamic_cast<wxComboBox*
>(FindWindowById(FEPresetID,
this));
2290 wxString presetname =
preset->GetValue();
2302 mPresets->LoadPreset(
this,presetname);
2321 XO(
"Select xml file with presets to import"),
2322 gPrefs->Read(wxT(
"/FileFormats/FFmpegPresetDir")),
2326 if (dlg.
ShowModal() == wxID_CANCEL)
return;
2338 const bool kCheckForOverwrite =
true;
2344 wxArrayString presets;
2346 if( presets.Count() < 1)
2354 XO(
"Select xml file to export presets into"),
2355 gPrefs->Read(wxT(
"/FileFormats/FFmpegPresetDir")),
2358 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
2359 if (dlg.
ShowModal() == wxID_CANCEL)
return;
2393 wxString *selcdc =
nullptr;
2394 wxString* selcdclong =
nullptr;
2398 if (selcdc ==
nullptr)
2401 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2406 wxString* selfmt =
nullptr;
2407 wxString* selfmtlong =
nullptr;
2411 if (selfmt ==
nullptr)
2417 bool bFound =
false;
2442 XO(
"Format %s is not compatible with codec %s.")
2443 .
Format( *selfmt, *selcdc ),
2445 XO(
"Incompatible format and codec"));
2457 if (
apptable[i].control != handled)
2473 else if (selfmt != NULL &&
2478 wxWindow *item = FindWindowById(
apptable[i].control,
this);
2479 if (item != NULL) item->Enable(
apptable[i].enable);
2487 wxString *selfmt = NULL;
2488 wxString *selfmtlong = NULL;
2495 wxString *selcdc = NULL;
2496 wxString *selcdclong = NULL;
2499 auto fmt =
mFFmpeg->GuessOutputFormat(selfmt->ToUTF8(),NULL,NULL);
2503 mFormatName->SetLabel(wxString(
_(
"Failed to guess format")));
2506 mFormatName->SetLabel(wxString::Format(wxT(
"%s"), *selfmtlong));
2510 if (selcdc !=
nullptr)
2512 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2516 selcdcid =
mFFmpeg->GetAudacityCodecID(cdc->GetId());
2522 if (newselcdc >= 0)
mCodecList->Select(newselcdc);
2524 std::unique_ptr<AVCodecWrapper> cdc;
2526 if (selcdc !=
nullptr)
2527 cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2537 wxString *selcdc =
nullptr;
2538 wxString* selcdclong =
nullptr;
2542 if (selcdc ==
nullptr)
2547 wxString* selfmt =
nullptr;
2548 wxString* selfmtlong =
nullptr;
2552 auto cdc =
mFFmpeg->CreateEncoder(selcdc->ToUTF8());
2557 mCodecName->SetLabel(wxString(
_(
"Failed to find the codec")));
2561 mCodecName->SetLabel(wxString::Format(wxT(
"[%d] %s"), (
int)
mFFmpeg->GetAudacityCodecID(cdc->GetId()).value, *selcdclong));
2563 if (selfmt !=
nullptr)
2565 auto fmt =
mFFmpeg->GuessOutputFormat(selfmt->ToUTF8(),
nullptr,
nullptr);
2569 selfmtlong =
nullptr;
2574 mFFmpeg->GetAudacityCodecID(cdc->GetId()), selfmt);
2609 if (selcdc > -1)
gPrefs->Write(wxT(
"/FileFormats/FFmpegCodec"),
mCodecList->GetString(selcdc));
2610 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)
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)
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)