diff --git a/src/export/ExportFFmpeg.cpp b/src/export/ExportFFmpeg.cpp index e3d72a1bd..d407c687f 100644 --- a/src/export/ExportFFmpeg.cpp +++ b/src/export/ExportFFmpeg.cpp @@ -52,7 +52,7 @@ function. extern FFmpegLibs *FFmpegLibsInst; -bool CheckFFmpegPresence() +static bool CheckFFmpegPresence() { bool result = true; PickFFmpegLibs(); @@ -65,12 +65,12 @@ bool CheckFFmpegPresence() return result; } -int AdjustFormatIndex(int format) +static int AdjustFormatIndex(int format) { int subFormat = -1; for (int i = 0; i <= FMT_OTHER; i++) { - if (fmts[i].compiledIn) subFormat++; + if (ExportFFmpegOptions::fmts[i].compiledIn) subFormat++; if (subFormat == format || i == FMT_OTHER) { subFormat = i; @@ -183,22 +183,22 @@ ExportFFmpeg::ExportFFmpeg() // Adds export types from the export type list for (newfmt = 0; newfmt < FMT_LAST; newfmt++) { - wxString shortname(fmts[newfmt].shortname); + wxString shortname(ExportFFmpegOptions::fmts[newfmt].shortname); //Don't hide export types when there's no av-libs, and don't hide FMT_OTHER if (newfmt < FMT_OTHER && FFmpegLibsInst->ValidLibsLoaded()) { // Format/Codec support is compiled in? AVOutputFormat *avoformat = FFmpegLibsInst->guess_format(shortname.mb_str(), NULL, NULL); - AVCodec *avcodec = FFmpegLibsInst->avcodec_find_encoder(fmts[newfmt].codecid); + AVCodec *avcodec = FFmpegLibsInst->avcodec_find_encoder(ExportFFmpegOptions::fmts[newfmt].codecid); if (avoformat == NULL || avcodec == NULL) { - fmts[newfmt].compiledIn = false; + ExportFFmpegOptions::fmts[newfmt].compiledIn = false; continue; } } int fmtindex = AddFormat() - 1; - SetFormat(fmts[newfmt].name,fmtindex); - AddExtension(fmts[newfmt].extension,fmtindex); + SetFormat(ExportFFmpegOptions::fmts[newfmt].name,fmtindex); + AddExtension(ExportFFmpegOptions::fmts[newfmt].extension,fmtindex); // For some types add other extensions switch(newfmt) { @@ -215,9 +215,9 @@ ExportFFmpeg::ExportFFmpeg() break; } - SetMaxChannels(fmts[newfmt].maxchannels,fmtindex); - SetCanMetaData(fmts[newfmt].canmetadata,fmtindex); - SetDescription(fmts[newfmt].description,fmtindex); + SetMaxChannels(ExportFFmpegOptions::fmts[newfmt].maxchannels,fmtindex); + SetCanMetaData(ExportFFmpegOptions::fmts[newfmt].canmetadata,fmtindex); + SetDescription(ExportFFmpegOptions::fmts[newfmt].description,fmtindex); } } @@ -230,8 +230,8 @@ void ExportFFmpeg::Destroy() bool ExportFFmpeg::CheckFileName(wxFileName &filename, int format) { bool result = true; - int subFormat = AdjustFormatIndex(format); #if FFMPEG_STABLE + int subFormat = AdjustFormatIndex(format); if (subFormat == FMT_AMRNB || subFormat == FMT_AMRWB) { wxMessageBox(_("Properly configured FFmpeg is required to proceed.\nYou can configure it at Preferences > Libraries.\n\nNote that AMR support is not available with our FFmpeg\ninstaller, but requires you compile FFmpeg yourself."), _("AMR support is not distributable")); @@ -317,9 +317,9 @@ bool ExportFFmpeg::Init(const char *shortname, AudacityProject *project, Tags *m // Add metadata BEFORE writing the header. // At the moment that works with ffmpeg-git and ffmpeg-0.5 for MP4. - if (fmts[mSubFormat].canmetadata) + if (ExportFFmpegOptions::fmts[mSubFormat].canmetadata) { - mSupportsUTF8 = fmts[mSubFormat].canutf8; + mSupportsUTF8 = ExportFFmpegOptions::fmts[mSubFormat].canutf8; AddTags(metadata); } @@ -351,7 +351,7 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project) FFmpegLibsInst->avcodec_get_context_defaults(mEncAudioCodecCtx); - mEncAudioCodecCtx->codec_id = fmts[mSubFormat].codecid; + mEncAudioCodecCtx->codec_id = ExportFFmpegOptions::fmts[mSubFormat].codecid; mEncAudioCodecCtx->codec_type = CODEC_TYPE_AUDIO; mEncAudioCodecCtx->codec_tag = FFmpegLibsInst->av_codec_get_tag((const AVCodecTag **)mEncFormatCtx->oformat->codec_tag,mEncAudioCodecCtx->codec_id); mSampleRate = (int)project->GetRate(); @@ -366,8 +366,16 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project) mEncAudioCodecCtx->profile = FF_PROFILE_AAC_LOW; mEncAudioCodecCtx->cutoff = 0; mEncAudioCodecCtx->global_quality = gPrefs->Read(wxT("/FileFormats/AACQuality"),-99999); - if (!CheckSampleRate(mSampleRate,iAACSampleRates[0],iAACSampleRates[11],&iAACSampleRates[0])) - mSampleRate = AskResample(mEncAudioCodecCtx->bit_rate,mSampleRate,iAACSampleRates[0],iAACSampleRates[11],&iAACSampleRates[0]); + if (!CheckSampleRate(mSampleRate, + ExportFFmpegOptions::iAACSampleRates[0], + ExportFFmpegOptions::iAACSampleRates[11], + &ExportFFmpegOptions::iAACSampleRates[0])) + { + mSampleRate = AskResample(mEncAudioCodecCtx->bit_rate,mSampleRate, + ExportFFmpegOptions::iAACSampleRates[0], + ExportFFmpegOptions::iAACSampleRates[11], + &ExportFFmpegOptions::iAACSampleRates[0]); + } break; case FMT_AC3: mEncAudioCodecCtx->bit_rate = gPrefs->Read(wxT("/FileFormats/AC3BitRate"), 192000); @@ -693,10 +701,10 @@ int ExportFFmpeg::Export(AudacityProject *project, mChannels = channels; // subformat index may not correspond directly to fmts[] index, convert it mSubFormat = AdjustFormatIndex(subformat); - if (channels > fmts[mSubFormat].maxchannels) + if (channels > ExportFFmpegOptions::fmts[mSubFormat].maxchannels) { - wxLogMessage(wxT("Attempted to export %d channels, but max. channels = %d"),channels,fmts[mSubFormat].maxchannels); - wxMessageBox(wxString::Format(_("Attempted to export %d channels, but max. channels for selected output format is %d"),channels,fmts[mSubFormat].maxchannels),_("Error")); + wxLogMessage(wxT("Attempted to export %d channels, but max. channels = %d"),channels,ExportFFmpegOptions::fmts[mSubFormat].maxchannels); + wxMessageBox(wxString::Format(_("Attempted to export %d channels, but max. channels for selected output format is %d"),channels,ExportFFmpegOptions::fmts[mSubFormat].maxchannels),_("Error")); return false; } mName = fName; @@ -705,7 +713,7 @@ int ExportFFmpeg::Export(AudacityProject *project, if (mSubFormat >= FMT_LAST) return false; - wxString shortname(fmts[mSubFormat].shortname); + wxString shortname(ExportFFmpegOptions::fmts[mSubFormat].shortname); if (mSubFormat == FMT_OTHER) shortname = gPrefs->Read(wxT("/FileFormats/FFmpegFormat"),wxT("matroska")); ret = Init(shortname.mb_str(),project, metadata); @@ -725,8 +733,8 @@ int ExportFFmpeg::Export(AudacityProject *project, ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(), selectionOnly ? - wxString::Format(_("Exporting selected audio as %s"), fmts[mSubFormat].description) : - wxString::Format(_("Exporting entire file as %s"), fmts[mSubFormat].description)); + wxString::Format(_("Exporting selected audio as %s"), ExportFFmpegOptions::fmts[mSubFormat].description) : + wxString::Format(_("Exporting entire file as %s"), ExportFFmpegOptions::fmts[mSubFormat].description)); int updateResult = eProgressSuccess; diff --git a/src/export/ExportFFmpegDialogs.cpp b/src/export/ExportFFmpegDialogs.cpp index b2835e116..8d3f9fb01 100644 --- a/src/export/ExportFFmpegDialogs.cpp +++ b/src/export/ExportFFmpegDialogs.cpp @@ -75,6 +75,71 @@ extern FFmpegLibs *FFmpegLibsInst; +/// This construction defines a enumeration of UI element IDs, and a static +/// array of their string representations (this way they're always synchronized). +/// Do not store the enumerated values in external files, as they may change; +/// the strings may be stored. +#define FFMPEG_EXPORT_CTRL_ID_ENTRIES \ + FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(FEFirstID, 20000), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitrateID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEQualityID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FESampleRateID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FELanguageID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FETagID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FECutoffID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFrameSizeID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBufSizeID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEProfileID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FECompLevelID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEUseLPCID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FELPCCoeffsID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPredID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPredID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPredOrderID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMinPartOrderID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMaxPartOrderID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEMuxRateID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPacketSizeID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEBitReservoirID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEVariableBlockLenID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FELastID), \ + \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatLabelID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecLabelID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEFormatNameID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FECodecNameID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEPresetID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FESavePresetID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FELoadPresetID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEDeletePresetID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllFormatsID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEAllCodecsID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEImportPresetsID), \ + FFMPEG_EXPORT_CTRL_ID_ENTRY(FEExportPresetsID) \ + +// First the enumeration +#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) name = num +#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) name + +enum FFmpegExportCtrlID { + FFMPEG_EXPORT_CTRL_ID_ENTRIES +}; + +// Now the string representations +#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY +#define FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY(name, num) wxT(#name) +#undef FFMPEG_EXPORT_CTRL_ID_ENTRY +#define FFMPEG_EXPORT_CTRL_ID_ENTRY(name) wxT(#name) +static const wxChar *FFmpegExportCtrlIDNames[] = { + FFMPEG_EXPORT_CTRL_ID_ENTRIES +}; + +#undef FFMPEG_EXPORT_CTRL_ID_ENTRIES +#undef FFMPEG_EXPORT_CTRL_ID_ENTRY +#undef FFMPEG_EXPORT_CTRL_ID_FIRST_ENTRY + //---------------------------------------------------------------------------- // ExportFFmpegAC3Options Class //---------------------------------------------------------------------------- @@ -206,6 +271,11 @@ BEGIN_EVENT_TABLE(ExportFFmpegAMRNBOptions, wxDialog) EVT_BUTTON(wxID_OK,ExportFFmpegAMRNBOptions::OnOK) END_EVENT_TABLE() +/// Bit Rates supported by libAMR-NB encoder +/// Sample Rate is always 8 kHz +int ExportFFmpegAMRNBOptions::iAMRNBBitRate[] = +{ 4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200 }; + ExportFFmpegAMRNBOptions::ExportFFmpegAMRNBOptions(wxWindow *parent) : wxDialog(parent, wxID_ANY, wxString(_("Specify AMR-NB Options"))) @@ -270,6 +340,11 @@ BEGIN_EVENT_TABLE(ExportFFmpegAMRWBOptions, wxDialog) EVT_BUTTON(wxID_OK,ExportFFmpegAMRWBOptions::OnOK) END_EVENT_TABLE() +/// Bit Rates supported by libAMR-WB encoder +/// Sample Rate is always 16 kHz +int ExportFFmpegAMRWBOptions::iAMRWBBitRate[] = +{ 6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850 }; + ExportFFmpegAMRWBOptions::ExportFFmpegAMRWBOptions(wxWindow *parent) : wxDialog(parent, wxID_ANY, wxString(_("Specify AMR-WB Options"))) @@ -334,7 +409,14 @@ BEGIN_EVENT_TABLE(ExportFFmpegWMAOptions, wxDialog) EVT_BUTTON(wxID_OK,ExportFFmpegWMAOptions::OnOK) END_EVENT_TABLE() -const int ExportFFmpegWMAOptions::iWMASampleRates[] = { 8000, 11025, 16000, 22050, 44100, 0}; +const int ExportFFmpegWMAOptions::iWMASampleRates[] = +{ 8000, 11025, 16000, 22050, 44100, 0}; + +/// Bit Rates supported by WMA encoder. Setting bit rate to other values will not result in different file size. +const int ExportFFmpegWMAOptions::iWMABitRate[] = +{ 24634, 26012, 27734, 29457, 31524, 33764, 36348, 39448, 42894, 47028, 52024, + 58225, 65805, 75624, 88716, 106976, 134539, 180189, 271835, 546598 }; + ExportFFmpegWMAOptions::ExportFFmpegWMAOptions(wxWindow *parent) : wxDialog(parent, wxID_ANY, @@ -784,6 +866,426 @@ BEGIN_EVENT_TABLE(ExportFFmpegOptions, wxDialog) EVT_BUTTON(FEExportPresetsID,ExportFFmpegOptions::OnExportPresets) END_EVENT_TABLE() +/// Format-codec compatibility list +/// Must end with NULL entry +CompatibilityEntry ExportFFmpegOptions::CompatibilityList[] = +{ + { wxT("adts"), CODEC_ID_AAC }, + + { wxT("aiff"), CODEC_ID_PCM_S16BE }, + { wxT("aiff"), CODEC_ID_PCM_S8 }, + { wxT("aiff"), CODEC_ID_PCM_S24BE }, + { wxT("aiff"), CODEC_ID_PCM_S32BE }, + { wxT("aiff"), CODEC_ID_PCM_ALAW }, + { wxT("aiff"), CODEC_ID_PCM_MULAW }, + { wxT("aiff"), CODEC_ID_MACE3 }, + { wxT("aiff"), CODEC_ID_MACE6 }, + { wxT("aiff"), CODEC_ID_GSM }, + { wxT("aiff"), CODEC_ID_ADPCM_G726 }, + { wxT("aiff"), CODEC_ID_PCM_S16LE }, + { wxT("aiff"), CODEC_ID_ADPCM_IMA_QT }, + { wxT("aiff"), CODEC_ID_QDM2 }, + + { wxT("amr"), CODEC_ID_AMR_NB }, + { wxT("amr"), CODEC_ID_AMR_WB }, + + { wxT("asf"), CODEC_ID_PCM_S16LE }, + { wxT("asf"), CODEC_ID_PCM_U8 }, + { wxT("asf"), CODEC_ID_PCM_S24LE }, + { wxT("asf"), CODEC_ID_PCM_S32LE }, + { wxT("asf"), CODEC_ID_ADPCM_MS }, + { wxT("asf"), CODEC_ID_PCM_ALAW }, + { wxT("asf"), CODEC_ID_PCM_MULAW }, + { wxT("asf"), CODEC_ID_WMAVOICE }, + { wxT("asf"), CODEC_ID_ADPCM_IMA_WAV }, + { wxT("asf"), CODEC_ID_ADPCM_YAMAHA }, + { wxT("asf"), CODEC_ID_TRUESPEECH }, + { wxT("asf"), CODEC_ID_GSM_MS }, + { wxT("asf"), CODEC_ID_ADPCM_G726 }, + { wxT("asf"), CODEC_ID_MP2 }, + { wxT("asf"), CODEC_ID_MP3 }, + { wxT("asf"), CODEC_ID_VOXWARE }, + { wxT("asf"), CODEC_ID_AAC }, + { wxT("asf"), CODEC_ID_WMAV1 }, + { wxT("asf"), CODEC_ID_WMAV2 }, + { wxT("asf"), CODEC_ID_WMAPRO }, + { wxT("asf"), CODEC_ID_ADPCM_CT }, + { wxT("asf"), CODEC_ID_ATRAC3 }, + { wxT("asf"), CODEC_ID_IMC }, + { wxT("asf"), CODEC_ID_AC3 }, + { wxT("asf"), CODEC_ID_DTS }, + { wxT("asf"), CODEC_ID_SONIC }, + { wxT("asf"), CODEC_ID_SONIC_LS }, + { wxT("asf"), CODEC_ID_FLAC }, + { wxT("asf"), CODEC_ID_ADPCM_SWF }, + { wxT("asf"), CODEC_ID_VORBIS }, + + { wxT("au"), CODEC_ID_PCM_MULAW }, + { wxT("au"), CODEC_ID_PCM_S8 }, + { wxT("au"), CODEC_ID_PCM_S16BE }, + { wxT("au"), CODEC_ID_PCM_ALAW }, + + { wxT("avi"), CODEC_ID_PCM_S16LE }, + { wxT("avi"), CODEC_ID_PCM_U8 }, + { wxT("avi"), CODEC_ID_PCM_S24LE }, + { wxT("avi"), CODEC_ID_PCM_S32LE }, + { wxT("avi"), CODEC_ID_ADPCM_MS }, + { wxT("avi"), CODEC_ID_PCM_ALAW }, + { wxT("avi"), CODEC_ID_PCM_MULAW }, + { wxT("avi"), CODEC_ID_WMAVOICE }, + { wxT("avi"), CODEC_ID_ADPCM_IMA_WAV }, + { wxT("avi"), CODEC_ID_ADPCM_YAMAHA }, + { wxT("avi"), CODEC_ID_TRUESPEECH }, + { wxT("avi"), CODEC_ID_GSM_MS }, + { wxT("avi"), CODEC_ID_ADPCM_G726 }, + { wxT("avi"), CODEC_ID_MP2 }, + { wxT("avi"), CODEC_ID_MP3 }, + { wxT("avi"), CODEC_ID_VOXWARE }, + { wxT("avi"), CODEC_ID_AAC }, + { wxT("avi"), CODEC_ID_WMAV1 }, + { wxT("avi"), CODEC_ID_WMAV2 }, + { wxT("avi"), CODEC_ID_WMAPRO }, + { wxT("avi"), CODEC_ID_ADPCM_CT }, + { wxT("avi"), CODEC_ID_ATRAC3 }, + { wxT("avi"), CODEC_ID_IMC }, + { wxT("avi"), CODEC_ID_AC3 }, + { wxT("avi"), CODEC_ID_DTS }, + { wxT("avi"), CODEC_ID_SONIC }, + { wxT("avi"), CODEC_ID_SONIC_LS }, + { wxT("avi"), CODEC_ID_FLAC }, + { wxT("avi"), CODEC_ID_ADPCM_SWF }, + { wxT("avi"), CODEC_ID_VORBIS }, + + { wxT("crc"), CODEC_ID_NONE }, + + { wxT("dv"), CODEC_ID_PCM_S16LE }, + + { wxT("ffm"), CODEC_ID_NONE }, + + { wxT("flv"), CODEC_ID_MP3 }, + { wxT("flv"), CODEC_ID_PCM_S8 }, + { wxT("flv"), CODEC_ID_PCM_S16BE }, + { wxT("flv"), CODEC_ID_PCM_S16LE }, + { wxT("flv"), CODEC_ID_ADPCM_SWF }, + { wxT("flv"), CODEC_ID_AAC }, + { wxT("flv"), CODEC_ID_NELLYMOSER }, + + { wxT("framecrc"), CODEC_ID_NONE }, + + { wxT("gxf"), CODEC_ID_PCM_S16LE }, + + { wxT("matroska"), CODEC_ID_PCM_S16LE }, + { wxT("matroska"), CODEC_ID_PCM_U8 }, + { wxT("matroska"), CODEC_ID_PCM_S24LE }, + { wxT("matroska"), CODEC_ID_PCM_S32LE }, + { wxT("matroska"), CODEC_ID_ADPCM_MS }, + { wxT("matroska"), CODEC_ID_PCM_ALAW }, + { wxT("matroska"), CODEC_ID_PCM_MULAW }, + { wxT("matroska"), CODEC_ID_WMAVOICE }, + { wxT("matroska"), CODEC_ID_ADPCM_IMA_WAV }, + { wxT("matroska"), CODEC_ID_ADPCM_YAMAHA }, + { wxT("matroska"), CODEC_ID_TRUESPEECH }, + { wxT("matroska"), CODEC_ID_GSM_MS }, + { wxT("matroska"), CODEC_ID_ADPCM_G726 }, + { wxT("matroska"), CODEC_ID_MP2 }, + { wxT("matroska"), CODEC_ID_MP3 }, + { wxT("matroska"), CODEC_ID_VOXWARE }, + { wxT("matroska"), CODEC_ID_AAC }, + { wxT("matroska"), CODEC_ID_WMAV1 }, + { wxT("matroska"), CODEC_ID_WMAV2 }, + { wxT("matroska"), CODEC_ID_WMAPRO }, + { wxT("matroska"), CODEC_ID_ADPCM_CT }, + { wxT("matroska"), CODEC_ID_ATRAC3 }, + { wxT("matroska"), CODEC_ID_IMC }, + { wxT("matroska"), CODEC_ID_AC3 }, + { wxT("matroska"), CODEC_ID_DTS }, + { wxT("matroska"), CODEC_ID_SONIC }, + { wxT("matroska"), CODEC_ID_SONIC_LS }, + { wxT("matroska"), CODEC_ID_FLAC }, + { wxT("matroska"), CODEC_ID_ADPCM_SWF }, + { wxT("matroska"), CODEC_ID_VORBIS }, + + { wxT("mmf"), CODEC_ID_ADPCM_YAMAHA }, + + { wxT("mov"), CODEC_ID_PCM_S32BE }, //mov + { wxT("mov"), CODEC_ID_PCM_S32LE }, + { wxT("mov"), CODEC_ID_PCM_S24BE }, + { wxT("mov"), CODEC_ID_PCM_S24LE }, + { wxT("mov"), CODEC_ID_PCM_S16BE }, + { wxT("mov"), CODEC_ID_PCM_S16LE }, + { wxT("mov"), CODEC_ID_PCM_S8 }, + { wxT("mov"), CODEC_ID_PCM_U8 }, + { wxT("mov"), CODEC_ID_PCM_MULAW }, + { wxT("mov"), CODEC_ID_PCM_ALAW }, + { wxT("mov"), CODEC_ID_ADPCM_IMA_QT }, + { wxT("mov"), CODEC_ID_MACE3 }, + { wxT("mov"), CODEC_ID_MACE6 }, + { wxT("mov"), CODEC_ID_MP3 }, + { wxT("mov"), CODEC_ID_AAC }, + { wxT("mov"), CODEC_ID_AMR_NB }, + { wxT("mov"), CODEC_ID_AMR_WB }, + { wxT("mov"), CODEC_ID_GSM }, + { wxT("mov"), CODEC_ID_ALAC }, + { wxT("mov"), CODEC_ID_QCELP }, + { wxT("mov"), CODEC_ID_QDM2 }, + { wxT("mov"), CODEC_ID_DVAUDIO }, + { wxT("mov"), CODEC_ID_WMAV2 }, + { wxT("mov"), CODEC_ID_ALAC }, + + { wxT("mp4"), CODEC_ID_AAC }, + { wxT("mp4"), CODEC_ID_QCELP }, + { wxT("mp4"), CODEC_ID_MP3 }, + { wxT("mp4"), CODEC_ID_VORBIS }, + + { wxT("psp"), CODEC_ID_AAC }, + { wxT("psp"), CODEC_ID_QCELP }, + { wxT("psp"), CODEC_ID_MP3 }, + { wxT("psp"), CODEC_ID_VORBIS }, + + { wxT("ipod"), CODEC_ID_AAC }, + { wxT("ipod"), CODEC_ID_QCELP }, + { wxT("ipod"), CODEC_ID_MP3 }, + { wxT("ipod"), CODEC_ID_VORBIS }, + + { wxT("3gp"), CODEC_ID_AAC }, + { wxT("3gp"), CODEC_ID_AMR_NB }, + { wxT("3gp"), CODEC_ID_AMR_WB }, + + { wxT("3g2"), CODEC_ID_AAC }, + { wxT("3g2"), CODEC_ID_AMR_NB }, + { wxT("3g2"), CODEC_ID_AMR_WB }, + + { wxT("mp3"), CODEC_ID_MP3 }, + + { wxT("mpeg"), CODEC_ID_AC3 }, + { wxT("mpeg"), CODEC_ID_DTS }, + { wxT("mpeg"), CODEC_ID_PCM_S16BE }, + { wxT("mpeg"), CODEC_ID_MP2 }, + + { wxT("vcd"), CODEC_ID_AC3 }, + { wxT("vcd"), CODEC_ID_DTS }, + { wxT("vcd"), CODEC_ID_PCM_S16BE }, + { wxT("vcd"), CODEC_ID_MP2 }, + + { wxT("vob"), CODEC_ID_AC3 }, + { wxT("vob"), CODEC_ID_DTS }, + { wxT("vob"), CODEC_ID_PCM_S16BE }, + { wxT("vob"), CODEC_ID_MP2 }, + + { wxT("svcd"), CODEC_ID_AC3 }, + { wxT("svcd"), CODEC_ID_DTS }, + { wxT("svcd"), CODEC_ID_PCM_S16BE }, + { wxT("svcd"), CODEC_ID_MP2 }, + + { wxT("dvd"), CODEC_ID_AC3 }, + { wxT("dvd"), CODEC_ID_DTS }, + { wxT("dvd"), CODEC_ID_PCM_S16BE }, + { wxT("dvd"), CODEC_ID_MP2 }, + + { wxT("nut"), CODEC_ID_PCM_S16LE }, + { wxT("nut"), CODEC_ID_PCM_U8 }, + { wxT("nut"), CODEC_ID_PCM_S24LE }, + { wxT("nut"), CODEC_ID_PCM_S32LE }, + { wxT("nut"), CODEC_ID_ADPCM_MS }, + { wxT("nut"), CODEC_ID_PCM_ALAW }, + { wxT("nut"), CODEC_ID_PCM_MULAW }, + { wxT("nut"), CODEC_ID_WMAVOICE }, + { wxT("nut"), CODEC_ID_ADPCM_IMA_WAV }, + { wxT("nut"), CODEC_ID_ADPCM_YAMAHA }, + { wxT("nut"), CODEC_ID_TRUESPEECH }, + { wxT("nut"), CODEC_ID_GSM_MS }, + { wxT("nut"), CODEC_ID_ADPCM_G726 }, + { wxT("nut"), CODEC_ID_MP2 }, + { wxT("nut"), CODEC_ID_MP3 }, + { wxT("nut"), CODEC_ID_VOXWARE }, + { wxT("nut"), CODEC_ID_AAC }, + { wxT("nut"), CODEC_ID_WMAV1 }, + { wxT("nut"), CODEC_ID_WMAV2 }, + { wxT("nut"), CODEC_ID_WMAPRO }, + { wxT("nut"), CODEC_ID_ADPCM_CT }, + { wxT("nut"), CODEC_ID_ATRAC3 }, + { wxT("nut"), CODEC_ID_IMC }, + { wxT("nut"), CODEC_ID_AC3 }, + { wxT("nut"), CODEC_ID_DTS }, + { wxT("nut"), CODEC_ID_SONIC }, + { wxT("nut"), CODEC_ID_SONIC_LS }, + { wxT("nut"), CODEC_ID_FLAC }, + { wxT("nut"), CODEC_ID_ADPCM_SWF }, + { wxT("nut"), CODEC_ID_VORBIS }, + + { wxT("ogg"), CODEC_ID_VORBIS }, + { wxT("ogg"), CODEC_ID_FLAC }, + + { wxT("ac3"), CODEC_ID_AC3 }, + + { wxT("dts"), CODEC_ID_DTS }, + + { wxT("flac"), CODEC_ID_FLAC }, + + { wxT("RoQ"), CODEC_ID_ROQ_DPCM }, + + { wxT("rm"), CODEC_ID_AC3 }, + + { wxT("swf"), CODEC_ID_MP3 }, + + { wxT("avm2"), CODEC_ID_MP3 }, + + { wxT("voc"), CODEC_ID_PCM_U8 }, + + { wxT("wav"), CODEC_ID_PCM_S16LE }, + { wxT("wav"), CODEC_ID_PCM_U8 }, + { wxT("wav"), CODEC_ID_PCM_S24LE }, + { wxT("wav"), CODEC_ID_PCM_S32LE }, + { wxT("wav"), CODEC_ID_ADPCM_MS }, + { wxT("wav"), CODEC_ID_PCM_ALAW }, + { wxT("wav"), CODEC_ID_PCM_MULAW }, + { wxT("wav"), CODEC_ID_WMAVOICE }, + { wxT("wav"), CODEC_ID_ADPCM_IMA_WAV }, + { wxT("wav"), CODEC_ID_ADPCM_YAMAHA }, + { wxT("wav"), CODEC_ID_TRUESPEECH }, + { wxT("wav"), CODEC_ID_GSM_MS }, + { wxT("wav"), CODEC_ID_ADPCM_G726 }, + { wxT("wav"), CODEC_ID_MP2 }, + { wxT("wav"), CODEC_ID_MP3 }, + { wxT("wav"), CODEC_ID_VOXWARE }, + { wxT("wav"), CODEC_ID_AAC }, + { wxT("wav"), CODEC_ID_WMAV1 }, + { wxT("wav"), CODEC_ID_WMAV2 }, + { wxT("wav"), CODEC_ID_WMAPRO }, + { wxT("wav"), CODEC_ID_ADPCM_CT }, + { wxT("wav"), CODEC_ID_ATRAC3 }, + { wxT("wav"), CODEC_ID_IMC }, + { wxT("wav"), CODEC_ID_AC3 }, + { wxT("wav"), CODEC_ID_DTS }, + { wxT("wav"), CODEC_ID_SONIC }, + { wxT("wav"), CODEC_ID_SONIC_LS }, + { wxT("wav"), CODEC_ID_FLAC }, + { wxT("wav"), CODEC_ID_ADPCM_SWF }, + { wxT("wav"), CODEC_ID_VORBIS }, + + { NULL, CODEC_ID_NONE } +}; + +/// AAC profiles +int ExportFFmpegOptions::iAACProfileValues[] = { + FF_PROFILE_AAC_LOW, + FF_PROFILE_AAC_MAIN, + /*FF_PROFILE_AAC_SSR,*/ + FF_PROFILE_AAC_LTP +}; + +/// Names of AAC profiles to be displayed +const wxChar *ExportFFmpegOptions::iAACProfileNames[] = { + _("LC"), + _("Main"), + /*_("SSR"),*/ //SSR is not supported + _("LTP") +}; + +/// List of export types +ExposedFormat ExportFFmpegOptions::fmts[] = +{ + {FMT_M4A, wxT("M4A"), wxT("m4a"), wxT("ipod"), 48, true ,true ,_("M4A (AAC) Files (FFmpeg)"), CODEC_ID_AAC, true}, + {FMT_AC3, wxT("AC3"), wxT("ac3"), wxT("ac3"), 7, false,false,_("AC3 Files (FFmpeg)"), CODEC_ID_AC3, true}, + {FMT_AMRNB, wxT("AMRNB"), wxT("amr"), wxT("amr"), 1, false,false,_("AMR (narrow band) Files (FFmpeg)"), CODEC_ID_AMR_NB, true}, +#if FFMPEG_STABLE + {FMT_AMRWB, wxT("AMRWB"), wxT("amr"), wxT("amr"), 1, false,false,_("AMR (wide band) Files (FFmpeg)"), CODEC_ID_AMR_WB, true}, +#endif + {FMT_WMA2, wxT("WMA"), wxT("wma"), wxT("asf"), 2, false,false,_("WMA (version 2) Files (FFmpeg)"), CODEC_ID_WMAV2, true}, + {FMT_OTHER, wxT("FFMPEG"), wxT(""), wxT(""), 255, true ,true ,_("Custom FFmpeg Export"), CODEC_ID_NONE, true} +}; + +/// Sample rates supported by AAC encoder (must end with zero-element) +const int ExportFFmpegOptions::iAACSampleRates[] = { 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 0 }; + +/// Some controls (parameters they represent) are only applicable to a number +/// of codecs and/or formats. +/// Syntax: first, enable a control for each applicable format-codec combination +/// then disable it for anything else +/// "any" - any format +/// CODEC_ID_NONE - any codec +/// This list must end with {FALSE,FFmpegExportCtrlID(0),CODEC_ID_NONE,NULL} +ApplicableFor ExportFFmpegOptions::apptable[] = +{ + {TRUE,FEQualityID,CODEC_ID_AAC,"any"}, + {TRUE,FEQualityID,CODEC_ID_MP3,"any"}, + {TRUE,FEQualityID,CODEC_ID_VORBIS,"any"}, + {FALSE,FEQualityID,CODEC_ID_NONE,"any"}, + + {TRUE,FECutoffID,CODEC_ID_AC3,"any"}, + {TRUE,FECutoffID,CODEC_ID_AAC,"any"}, + {TRUE,FECutoffID,CODEC_ID_VORBIS,"any"}, + {FALSE,FECutoffID,CODEC_ID_NONE,"any"}, + + {TRUE,FEFrameSizeID,CODEC_ID_FLAC,"any"}, + {FALSE,FEFrameSizeID,CODEC_ID_NONE,"any"}, + + {TRUE,FEProfileID,CODEC_ID_AAC,"any"}, + {FALSE,FEProfileID,CODEC_ID_NONE,"any"}, + + {TRUE,FECompLevelID,CODEC_ID_FLAC,"any"}, + {FALSE,FECompLevelID,CODEC_ID_NONE,"any"}, + + {TRUE,FEUseLPCID,CODEC_ID_FLAC,"any"}, + {FALSE,FEUseLPCID,CODEC_ID_NONE,"any"}, + + {TRUE,FELPCCoeffsID,CODEC_ID_FLAC,"any"}, + {FALSE,FELPCCoeffsID,CODEC_ID_NONE,"any"}, + + {TRUE,FEMinPredID,CODEC_ID_FLAC,"any"}, + {FALSE,FEMinPredID,CODEC_ID_NONE,"any"}, + + {TRUE,FEMaxPredID,CODEC_ID_FLAC,"any"}, + {FALSE,FEMaxPredID,CODEC_ID_NONE,"any"}, + + {TRUE,FEPredOrderID,CODEC_ID_FLAC,"any"}, + {FALSE,FEPredOrderID,CODEC_ID_NONE,"any"}, + + {TRUE,FEMinPartOrderID,CODEC_ID_FLAC,"any"}, + {FALSE,FEMinPartOrderID,CODEC_ID_NONE,"any"}, + + {TRUE,FEMaxPartOrderID,CODEC_ID_FLAC,"any"}, + {FALSE,FEMaxPartOrderID,CODEC_ID_NONE,"any"}, + + {TRUE,FEMuxRateID,CODEC_ID_NONE,"mpeg"}, + {TRUE,FEMuxRateID,CODEC_ID_NONE,"vcd"}, + {TRUE,FEMuxRateID,CODEC_ID_NONE,"vob"}, + {TRUE,FEMuxRateID,CODEC_ID_NONE,"svcd"}, + {TRUE,FEMuxRateID,CODEC_ID_NONE,"dvd"}, + {FALSE,FEMuxRateID,CODEC_ID_NONE,"any"}, + + {TRUE,FEPacketSizeID,CODEC_ID_NONE,"mpeg"}, + {TRUE,FEPacketSizeID,CODEC_ID_NONE,"vcd"}, + {TRUE,FEPacketSizeID,CODEC_ID_NONE,"vob"}, + {TRUE,FEPacketSizeID,CODEC_ID_NONE,"svcd"}, + {TRUE,FEPacketSizeID,CODEC_ID_NONE,"dvd"}, + {FALSE,FEPacketSizeID,CODEC_ID_NONE,"any"}, + + {TRUE,FELanguageID,CODEC_ID_NONE,"matroska"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"mov"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"3gp"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"mp4"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"psp"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"3g2"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"ipod"}, + {TRUE,FELanguageID,CODEC_ID_NONE,"mpegts"}, + {FALSE,FELanguageID,CODEC_ID_NONE,"any"}, + + {TRUE,FEBitReservoirID,CODEC_ID_MP3,"any"}, + {TRUE,FEBitReservoirID,CODEC_ID_WMAV1,"any"}, + {TRUE,FEBitReservoirID,CODEC_ID_WMAV2,"any"}, + {FALSE,FEBitReservoirID,CODEC_ID_NONE,"any"}, + + {TRUE,FEVariableBlockLenID,CODEC_ID_WMAV1,"any"}, + {TRUE,FEVariableBlockLenID,CODEC_ID_WMAV2,"any"}, + {FALSE,FEVariableBlockLenID,CODEC_ID_NONE,"any"}, + + {FALSE,FFmpegExportCtrlID(0),CODEC_ID_NONE,NULL} +}; + +/// Prediction order method - names. Labels are indices of this array. +const wxChar *ExportFFmpegOptions::PredictionOrderMethodNames[] = { _("Estimate"), _("2-level"), _("4-level"), _("8-level"), _("Full search"), _("Log search")}; + ExportFFmpegOptions::~ExportFFmpegOptions() { diff --git a/src/export/ExportFFmpegDialogs.h b/src/export/ExportFFmpegDialogs.h index 0bbdfc839..28584ff54 100644 --- a/src/export/ExportFFmpegDialogs.h +++ b/src/export/ExportFFmpegDialogs.h @@ -50,18 +50,6 @@ struct ExposedFormat bool compiledIn; //!< support for this codec/format is compiled in (checked at runtime) }; -/// List of export types -static ExposedFormat fmts[] = -{ - {FMT_M4A, wxT("M4A"), wxT("m4a"), wxT("ipod"), 48, true ,true ,_("M4A (AAC) Files (FFmpeg)"), CODEC_ID_AAC, true}, - {FMT_AC3, wxT("AC3"), wxT("ac3"), wxT("ac3"), 7, false,false,_("AC3 Files (FFmpeg)"), CODEC_ID_AC3, true}, - {FMT_AMRNB, wxT("AMRNB"), wxT("amr"), wxT("amr"), 1, false,false,_("AMR (narrow band) Files (FFmpeg)"), CODEC_ID_AMR_NB, true}, -#if FFMPEG_STABLE - {FMT_AMRWB, wxT("AMRWB"), wxT("amr"), wxT("amr"), 1, false,false,_("AMR (wide band) Files (FFmpeg)"), CODEC_ID_AMR_WB, true}, -#endif - {FMT_WMA2, wxT("WMA"), wxT("wma"), wxT("asf"), 2, false,false,_("WMA (version 2) Files (FFmpeg)"), CODEC_ID_WMAV2, true}, - {FMT_OTHER, wxT("FFMPEG"), wxT(""), wxT(""), 255, true ,true ,_("Custom FFmpeg Export"), CODEC_ID_NONE, true} -}; /// Describes format-codec compatibility struct CompatibilityEntry @@ -70,326 +58,6 @@ struct CompatibilityEntry CodecID codec; //!< codec ID }; -/// Format-codec compatibility list -/// Must end with NULL entry -static CompatibilityEntry CompatibilityList[] = -{ - { wxT("adts"), CODEC_ID_AAC }, - - { wxT("aiff"), CODEC_ID_PCM_S16BE }, - { wxT("aiff"), CODEC_ID_PCM_S8 }, - { wxT("aiff"), CODEC_ID_PCM_S24BE }, - { wxT("aiff"), CODEC_ID_PCM_S32BE }, - { wxT("aiff"), CODEC_ID_PCM_ALAW }, - { wxT("aiff"), CODEC_ID_PCM_MULAW }, - { wxT("aiff"), CODEC_ID_MACE3 }, - { wxT("aiff"), CODEC_ID_MACE6 }, - { wxT("aiff"), CODEC_ID_GSM }, - { wxT("aiff"), CODEC_ID_ADPCM_G726 }, - { wxT("aiff"), CODEC_ID_PCM_S16LE }, - { wxT("aiff"), CODEC_ID_ADPCM_IMA_QT }, - { wxT("aiff"), CODEC_ID_QDM2 }, - - { wxT("amr"), CODEC_ID_AMR_NB }, - { wxT("amr"), CODEC_ID_AMR_WB }, - - { wxT("asf"), CODEC_ID_PCM_S16LE }, - { wxT("asf"), CODEC_ID_PCM_U8 }, - { wxT("asf"), CODEC_ID_PCM_S24LE }, - { wxT("asf"), CODEC_ID_PCM_S32LE }, - { wxT("asf"), CODEC_ID_ADPCM_MS }, - { wxT("asf"), CODEC_ID_PCM_ALAW }, - { wxT("asf"), CODEC_ID_PCM_MULAW }, - { wxT("asf"), CODEC_ID_WMAVOICE }, - { wxT("asf"), CODEC_ID_ADPCM_IMA_WAV }, - { wxT("asf"), CODEC_ID_ADPCM_YAMAHA }, - { wxT("asf"), CODEC_ID_TRUESPEECH }, - { wxT("asf"), CODEC_ID_GSM_MS }, - { wxT("asf"), CODEC_ID_ADPCM_G726 }, - { wxT("asf"), CODEC_ID_MP2 }, - { wxT("asf"), CODEC_ID_MP3 }, - { wxT("asf"), CODEC_ID_VOXWARE }, - { wxT("asf"), CODEC_ID_AAC }, - { wxT("asf"), CODEC_ID_WMAV1 }, - { wxT("asf"), CODEC_ID_WMAV2 }, - { wxT("asf"), CODEC_ID_WMAPRO }, - { wxT("asf"), CODEC_ID_ADPCM_CT }, - { wxT("asf"), CODEC_ID_ATRAC3 }, - { wxT("asf"), CODEC_ID_IMC }, - { wxT("asf"), CODEC_ID_AC3 }, - { wxT("asf"), CODEC_ID_DTS }, - { wxT("asf"), CODEC_ID_SONIC }, - { wxT("asf"), CODEC_ID_SONIC_LS }, - { wxT("asf"), CODEC_ID_FLAC }, - { wxT("asf"), CODEC_ID_ADPCM_SWF }, - { wxT("asf"), CODEC_ID_VORBIS }, - - { wxT("au"), CODEC_ID_PCM_MULAW }, - { wxT("au"), CODEC_ID_PCM_S8 }, - { wxT("au"), CODEC_ID_PCM_S16BE }, - { wxT("au"), CODEC_ID_PCM_ALAW }, - - { wxT("avi"), CODEC_ID_PCM_S16LE }, - { wxT("avi"), CODEC_ID_PCM_U8 }, - { wxT("avi"), CODEC_ID_PCM_S24LE }, - { wxT("avi"), CODEC_ID_PCM_S32LE }, - { wxT("avi"), CODEC_ID_ADPCM_MS }, - { wxT("avi"), CODEC_ID_PCM_ALAW }, - { wxT("avi"), CODEC_ID_PCM_MULAW }, - { wxT("avi"), CODEC_ID_WMAVOICE }, - { wxT("avi"), CODEC_ID_ADPCM_IMA_WAV }, - { wxT("avi"), CODEC_ID_ADPCM_YAMAHA }, - { wxT("avi"), CODEC_ID_TRUESPEECH }, - { wxT("avi"), CODEC_ID_GSM_MS }, - { wxT("avi"), CODEC_ID_ADPCM_G726 }, - { wxT("avi"), CODEC_ID_MP2 }, - { wxT("avi"), CODEC_ID_MP3 }, - { wxT("avi"), CODEC_ID_VOXWARE }, - { wxT("avi"), CODEC_ID_AAC }, - { wxT("avi"), CODEC_ID_WMAV1 }, - { wxT("avi"), CODEC_ID_WMAV2 }, - { wxT("avi"), CODEC_ID_WMAPRO }, - { wxT("avi"), CODEC_ID_ADPCM_CT }, - { wxT("avi"), CODEC_ID_ATRAC3 }, - { wxT("avi"), CODEC_ID_IMC }, - { wxT("avi"), CODEC_ID_AC3 }, - { wxT("avi"), CODEC_ID_DTS }, - { wxT("avi"), CODEC_ID_SONIC }, - { wxT("avi"), CODEC_ID_SONIC_LS }, - { wxT("avi"), CODEC_ID_FLAC }, - { wxT("avi"), CODEC_ID_ADPCM_SWF }, - { wxT("avi"), CODEC_ID_VORBIS }, - - { wxT("crc"), CODEC_ID_NONE }, - - { wxT("dv"), CODEC_ID_PCM_S16LE }, - - { wxT("ffm"), CODEC_ID_NONE }, - - { wxT("flv"), CODEC_ID_MP3 }, - { wxT("flv"), CODEC_ID_PCM_S8 }, - { wxT("flv"), CODEC_ID_PCM_S16BE }, - { wxT("flv"), CODEC_ID_PCM_S16LE }, - { wxT("flv"), CODEC_ID_ADPCM_SWF }, - { wxT("flv"), CODEC_ID_AAC }, - { wxT("flv"), CODEC_ID_NELLYMOSER }, - - { wxT("framecrc"), CODEC_ID_NONE }, - - { wxT("gxf"), CODEC_ID_PCM_S16LE }, - - { wxT("matroska"), CODEC_ID_PCM_S16LE }, - { wxT("matroska"), CODEC_ID_PCM_U8 }, - { wxT("matroska"), CODEC_ID_PCM_S24LE }, - { wxT("matroska"), CODEC_ID_PCM_S32LE }, - { wxT("matroska"), CODEC_ID_ADPCM_MS }, - { wxT("matroska"), CODEC_ID_PCM_ALAW }, - { wxT("matroska"), CODEC_ID_PCM_MULAW }, - { wxT("matroska"), CODEC_ID_WMAVOICE }, - { wxT("matroska"), CODEC_ID_ADPCM_IMA_WAV }, - { wxT("matroska"), CODEC_ID_ADPCM_YAMAHA }, - { wxT("matroska"), CODEC_ID_TRUESPEECH }, - { wxT("matroska"), CODEC_ID_GSM_MS }, - { wxT("matroska"), CODEC_ID_ADPCM_G726 }, - { wxT("matroska"), CODEC_ID_MP2 }, - { wxT("matroska"), CODEC_ID_MP3 }, - { wxT("matroska"), CODEC_ID_VOXWARE }, - { wxT("matroska"), CODEC_ID_AAC }, - { wxT("matroska"), CODEC_ID_WMAV1 }, - { wxT("matroska"), CODEC_ID_WMAV2 }, - { wxT("matroska"), CODEC_ID_WMAPRO }, - { wxT("matroska"), CODEC_ID_ADPCM_CT }, - { wxT("matroska"), CODEC_ID_ATRAC3 }, - { wxT("matroska"), CODEC_ID_IMC }, - { wxT("matroska"), CODEC_ID_AC3 }, - { wxT("matroska"), CODEC_ID_DTS }, - { wxT("matroska"), CODEC_ID_SONIC }, - { wxT("matroska"), CODEC_ID_SONIC_LS }, - { wxT("matroska"), CODEC_ID_FLAC }, - { wxT("matroska"), CODEC_ID_ADPCM_SWF }, - { wxT("matroska"), CODEC_ID_VORBIS }, - - { wxT("mmf"), CODEC_ID_ADPCM_YAMAHA }, - - { wxT("mov"), CODEC_ID_PCM_S32BE }, //mov - { wxT("mov"), CODEC_ID_PCM_S32LE }, - { wxT("mov"), CODEC_ID_PCM_S24BE }, - { wxT("mov"), CODEC_ID_PCM_S24LE }, - { wxT("mov"), CODEC_ID_PCM_S16BE }, - { wxT("mov"), CODEC_ID_PCM_S16LE }, - { wxT("mov"), CODEC_ID_PCM_S8 }, - { wxT("mov"), CODEC_ID_PCM_U8 }, - { wxT("mov"), CODEC_ID_PCM_MULAW }, - { wxT("mov"), CODEC_ID_PCM_ALAW }, - { wxT("mov"), CODEC_ID_ADPCM_IMA_QT }, - { wxT("mov"), CODEC_ID_MACE3 }, - { wxT("mov"), CODEC_ID_MACE6 }, - { wxT("mov"), CODEC_ID_MP3 }, - { wxT("mov"), CODEC_ID_AAC }, - { wxT("mov"), CODEC_ID_AMR_NB }, - { wxT("mov"), CODEC_ID_AMR_WB }, - { wxT("mov"), CODEC_ID_GSM }, - { wxT("mov"), CODEC_ID_ALAC }, - { wxT("mov"), CODEC_ID_QCELP }, - { wxT("mov"), CODEC_ID_QDM2 }, - { wxT("mov"), CODEC_ID_DVAUDIO }, - { wxT("mov"), CODEC_ID_WMAV2 }, - { wxT("mov"), CODEC_ID_ALAC }, - - { wxT("mp4"), CODEC_ID_AAC }, - { wxT("mp4"), CODEC_ID_QCELP }, - { wxT("mp4"), CODEC_ID_MP3 }, - { wxT("mp4"), CODEC_ID_VORBIS }, - - { wxT("psp"), CODEC_ID_AAC }, - { wxT("psp"), CODEC_ID_QCELP }, - { wxT("psp"), CODEC_ID_MP3 }, - { wxT("psp"), CODEC_ID_VORBIS }, - - { wxT("ipod"), CODEC_ID_AAC }, - { wxT("ipod"), CODEC_ID_QCELP }, - { wxT("ipod"), CODEC_ID_MP3 }, - { wxT("ipod"), CODEC_ID_VORBIS }, - - { wxT("3gp"), CODEC_ID_AAC }, - { wxT("3gp"), CODEC_ID_AMR_NB }, - { wxT("3gp"), CODEC_ID_AMR_WB }, - - { wxT("3g2"), CODEC_ID_AAC }, - { wxT("3g2"), CODEC_ID_AMR_NB }, - { wxT("3g2"), CODEC_ID_AMR_WB }, - - { wxT("mp3"), CODEC_ID_MP3 }, - - { wxT("mpeg"), CODEC_ID_AC3 }, - { wxT("mpeg"), CODEC_ID_DTS }, - { wxT("mpeg"), CODEC_ID_PCM_S16BE }, - { wxT("mpeg"), CODEC_ID_MP2 }, - - { wxT("vcd"), CODEC_ID_AC3 }, - { wxT("vcd"), CODEC_ID_DTS }, - { wxT("vcd"), CODEC_ID_PCM_S16BE }, - { wxT("vcd"), CODEC_ID_MP2 }, - - { wxT("vob"), CODEC_ID_AC3 }, - { wxT("vob"), CODEC_ID_DTS }, - { wxT("vob"), CODEC_ID_PCM_S16BE }, - { wxT("vob"), CODEC_ID_MP2 }, - - { wxT("svcd"), CODEC_ID_AC3 }, - { wxT("svcd"), CODEC_ID_DTS }, - { wxT("svcd"), CODEC_ID_PCM_S16BE }, - { wxT("svcd"), CODEC_ID_MP2 }, - - { wxT("dvd"), CODEC_ID_AC3 }, - { wxT("dvd"), CODEC_ID_DTS }, - { wxT("dvd"), CODEC_ID_PCM_S16BE }, - { wxT("dvd"), CODEC_ID_MP2 }, - - { wxT("nut"), CODEC_ID_PCM_S16LE }, - { wxT("nut"), CODEC_ID_PCM_U8 }, - { wxT("nut"), CODEC_ID_PCM_S24LE }, - { wxT("nut"), CODEC_ID_PCM_S32LE }, - { wxT("nut"), CODEC_ID_ADPCM_MS }, - { wxT("nut"), CODEC_ID_PCM_ALAW }, - { wxT("nut"), CODEC_ID_PCM_MULAW }, - { wxT("nut"), CODEC_ID_WMAVOICE }, - { wxT("nut"), CODEC_ID_ADPCM_IMA_WAV }, - { wxT("nut"), CODEC_ID_ADPCM_YAMAHA }, - { wxT("nut"), CODEC_ID_TRUESPEECH }, - { wxT("nut"), CODEC_ID_GSM_MS }, - { wxT("nut"), CODEC_ID_ADPCM_G726 }, - { wxT("nut"), CODEC_ID_MP2 }, - { wxT("nut"), CODEC_ID_MP3 }, - { wxT("nut"), CODEC_ID_VOXWARE }, - { wxT("nut"), CODEC_ID_AAC }, - { wxT("nut"), CODEC_ID_WMAV1 }, - { wxT("nut"), CODEC_ID_WMAV2 }, - { wxT("nut"), CODEC_ID_WMAPRO }, - { wxT("nut"), CODEC_ID_ADPCM_CT }, - { wxT("nut"), CODEC_ID_ATRAC3 }, - { wxT("nut"), CODEC_ID_IMC }, - { wxT("nut"), CODEC_ID_AC3 }, - { wxT("nut"), CODEC_ID_DTS }, - { wxT("nut"), CODEC_ID_SONIC }, - { wxT("nut"), CODEC_ID_SONIC_LS }, - { wxT("nut"), CODEC_ID_FLAC }, - { wxT("nut"), CODEC_ID_ADPCM_SWF }, - { wxT("nut"), CODEC_ID_VORBIS }, - - { wxT("ogg"), CODEC_ID_VORBIS }, - { wxT("ogg"), CODEC_ID_FLAC }, - - { wxT("ac3"), CODEC_ID_AC3 }, - - { wxT("dts"), CODEC_ID_DTS }, - - { wxT("flac"), CODEC_ID_FLAC }, - - { wxT("RoQ"), CODEC_ID_ROQ_DPCM }, - - { wxT("rm"), CODEC_ID_AC3 }, - - { wxT("swf"), CODEC_ID_MP3 }, - - { wxT("avm2"), CODEC_ID_MP3 }, - - { wxT("voc"), CODEC_ID_PCM_U8 }, - - { wxT("wav"), CODEC_ID_PCM_S16LE }, - { wxT("wav"), CODEC_ID_PCM_U8 }, - { wxT("wav"), CODEC_ID_PCM_S24LE }, - { wxT("wav"), CODEC_ID_PCM_S32LE }, - { wxT("wav"), CODEC_ID_ADPCM_MS }, - { wxT("wav"), CODEC_ID_PCM_ALAW }, - { wxT("wav"), CODEC_ID_PCM_MULAW }, - { wxT("wav"), CODEC_ID_WMAVOICE }, - { wxT("wav"), CODEC_ID_ADPCM_IMA_WAV }, - { wxT("wav"), CODEC_ID_ADPCM_YAMAHA }, - { wxT("wav"), CODEC_ID_TRUESPEECH }, - { wxT("wav"), CODEC_ID_GSM_MS }, - { wxT("wav"), CODEC_ID_ADPCM_G726 }, - { wxT("wav"), CODEC_ID_MP2 }, - { wxT("wav"), CODEC_ID_MP3 }, - { wxT("wav"), CODEC_ID_VOXWARE }, - { wxT("wav"), CODEC_ID_AAC }, - { wxT("wav"), CODEC_ID_WMAV1 }, - { wxT("wav"), CODEC_ID_WMAV2 }, - { wxT("wav"), CODEC_ID_WMAPRO }, - { wxT("wav"), CODEC_ID_ADPCM_CT }, - { wxT("wav"), CODEC_ID_ATRAC3 }, - { wxT("wav"), CODEC_ID_IMC }, - { wxT("wav"), CODEC_ID_AC3 }, - { wxT("wav"), CODEC_ID_DTS }, - { wxT("wav"), CODEC_ID_SONIC }, - { wxT("wav"), CODEC_ID_SONIC_LS }, - { wxT("wav"), CODEC_ID_FLAC }, - { wxT("wav"), CODEC_ID_ADPCM_SWF }, - { wxT("wav"), CODEC_ID_VORBIS }, - - { NULL, CODEC_ID_NONE } -}; - - -/// AAC profiles -static int iAACProfileValues[] = { FF_PROFILE_AAC_LOW, FF_PROFILE_AAC_MAIN, /*FF_PROFILE_AAC_SSR,*/ FF_PROFILE_AAC_LTP }; - -/// Names of AAC profiles to be displayed -static const wxChar *iAACProfileNames[] = { _("LC"), _("Main"), /*_("SSR"),*/ _("LTP") }; //SSR is not supported - -/// Sample rates supported by AAC encoder (must end with zero-element) -static const int iAACSampleRates[] = { 7350, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 0 }; - -/// Bit Rates supported by libAMR-NB encoder -/// Sample Rate is always 8 kHz -static int iAMRNBBitRate[] = { 4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200 }; - -/// Bit Rates supported by libAMR-WB encoder -/// Sample Rate is always 16 kHz -static int iAMRWBBitRate[] = { 6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850 }; - -/// Bit Rates supported by WMA encoder. Setting bit rate to other values will not result in different file size. -static int iWMABitRate[] = { 24634, 26012, 27734, 29457, 31524, 33764, 36348, 39448, 42894, 47028, 52024, 58225, 65805, 75624, 88716, 106976, 134539, 180189, 271835, 546598 }; /// AC3 export options dialog class ExportFFmpegAC3Options : public wxDialog @@ -441,6 +109,8 @@ public: void PopulateOrExchange(ShuttleGui & S); void OnOK(wxCommandEvent& event); + static int iAMRNBBitRate[]; + private: wxArrayString mBitRateNames; @@ -461,6 +131,8 @@ public: void PopulateOrExchange(ShuttleGui & S); void OnOK(wxCommandEvent& event); + static int iAMRWBBitRate[]; + private: wxArrayString mBitRateNames; @@ -482,6 +154,7 @@ public: void OnOK(wxCommandEvent& event); static const int iWMASampleRates[]; + static const int iWMABitRate[]; private: @@ -495,191 +168,15 @@ private: DECLARE_EVENT_TABLE() }; -/// Identifiers for UI elements of the Custom FFmpeg export dialog -/// Do not store these in external files, as they may be changed later -enum FFmpegExportCtrlID { - FEFirstID = 20000, - FEFormatID, - FECodecID, - FEBitrateID, - FEQualityID, - FESampleRateID, - FELanguageID, - FETagID, - FECutoffID, - FEFrameSizeID, - FEBufSizeID, - FEProfileID, - FECompLevelID, - FEUseLPCID, - FELPCCoeffsID, - FEMinPredID, - FEMaxPredID, - FEPredOrderID, - FEMinPartOrderID, - FEMaxPartOrderID, - FEMuxRateID, - FEPacketSizeID, - FEBitReservoirID, - FEVariableBlockLenID, - FELastID, - - FEFormatLabelID, - FECodecLabelID, - FEFormatNameID, - FECodecNameID, - FEPresetID, - FESavePresetID, - FELoadPresetID, - FEDeletePresetID, - FEAllFormatsID, - FEAllCodecsID, - FEImportPresetsID, - FEExportPresetsID -}; - -/// String equivalents of identifiers for UI elements -/// These may be stored in external files -/// I have not yet found a convinient way to keep these two lists in sync automatically -/// To get control's ID string, use FFmpegExportCtrlIDNames[ControlID - FEFirstID] -static const wxChar *FFmpegExportCtrlIDNames[] = { - wxT("FEFirstID"), - wxT("FEFormatID"), - wxT("FECodecID"), - wxT("FEBitrateID"), - wxT("FEQualityID"), - wxT("FESampleRateID"), - wxT("FELanguageID"), - wxT("FETagID"), - wxT("FECutoffID"), - wxT("FEFrameSizeID"), - wxT("FEBufSizeID"), - wxT("FEProfileID"), - wxT("FECompLevelID"), - wxT("FEUseLPCID"), - wxT("FELPCCoeffsID"), - wxT("FEMinPredID"), - wxT("FEMaxPredID"), - wxT("FEPredOrderID"), - wxT("FEMinPartOrderID"), - wxT("FEMaxPartOrderID"), - wxT("FEMuxRateID"), - wxT("FEPacketSizeID"), - wxT("FEBitReservoirID"), - wxT("FEVariableBlockLenID"), - wxT("FELastID"), - - wxT("FEFormatLabelID"), - wxT("FECodecLabelID"), - wxT("FEFormatNameID"), - wxT("FECodecNameID"), - wxT("FEPresetID"), - wxT("FESavePresetID"), - wxT("FELoadPresetID"), - wxT("FEDeletePresetID"), - wxT("FEAllFormatsID"), - wxT("FEAllCodecsID"), - wxT("FEImportPresetsID"), - wxT("FEExportPresetsID") -}; - /// Entry for the Applicability table struct ApplicableFor { bool enable; //!< true if this control should be enabled, false otherwise - FFmpegExportCtrlID control; //!< control ID + int control; //!< control ID CodecID codec; //!< Codec ID const char *format; //!< Format short name }; -/// Some controls (parameters they represent) are only applicable to a number -/// of codecs and/or formats. -/// Syntax: first, enable a control for each applicable format-codec combination -/// then disable it for anything else -/// "any" - any format -/// CODEC_ID_NONE - any codec -/// This list must end with {FALSE,FFmpegExportCtrlID(0),CODEC_ID_NONE,NULL} -static ApplicableFor apptable[] = -{ - {TRUE,FEQualityID,CODEC_ID_AAC,"any"}, - {TRUE,FEQualityID,CODEC_ID_MP3,"any"}, - {TRUE,FEQualityID,CODEC_ID_VORBIS,"any"}, - {FALSE,FEQualityID,CODEC_ID_NONE,"any"}, - - {TRUE,FECutoffID,CODEC_ID_AC3,"any"}, - {TRUE,FECutoffID,CODEC_ID_AAC,"any"}, - {TRUE,FECutoffID,CODEC_ID_VORBIS,"any"}, - {FALSE,FECutoffID,CODEC_ID_NONE,"any"}, - - {TRUE,FEFrameSizeID,CODEC_ID_FLAC,"any"}, - {FALSE,FEFrameSizeID,CODEC_ID_NONE,"any"}, - - {TRUE,FEProfileID,CODEC_ID_AAC,"any"}, - {FALSE,FEProfileID,CODEC_ID_NONE,"any"}, - - {TRUE,FECompLevelID,CODEC_ID_FLAC,"any"}, - {FALSE,FECompLevelID,CODEC_ID_NONE,"any"}, - - {TRUE,FEUseLPCID,CODEC_ID_FLAC,"any"}, - {FALSE,FEUseLPCID,CODEC_ID_NONE,"any"}, - - {TRUE,FELPCCoeffsID,CODEC_ID_FLAC,"any"}, - {FALSE,FELPCCoeffsID,CODEC_ID_NONE,"any"}, - - {TRUE,FEMinPredID,CODEC_ID_FLAC,"any"}, - {FALSE,FEMinPredID,CODEC_ID_NONE,"any"}, - - {TRUE,FEMaxPredID,CODEC_ID_FLAC,"any"}, - {FALSE,FEMaxPredID,CODEC_ID_NONE,"any"}, - - {TRUE,FEPredOrderID,CODEC_ID_FLAC,"any"}, - {FALSE,FEPredOrderID,CODEC_ID_NONE,"any"}, - - {TRUE,FEMinPartOrderID,CODEC_ID_FLAC,"any"}, - {FALSE,FEMinPartOrderID,CODEC_ID_NONE,"any"}, - - {TRUE,FEMaxPartOrderID,CODEC_ID_FLAC,"any"}, - {FALSE,FEMaxPartOrderID,CODEC_ID_NONE,"any"}, - - {TRUE,FEMuxRateID,CODEC_ID_NONE,"mpeg"}, - {TRUE,FEMuxRateID,CODEC_ID_NONE,"vcd"}, - {TRUE,FEMuxRateID,CODEC_ID_NONE,"vob"}, - {TRUE,FEMuxRateID,CODEC_ID_NONE,"svcd"}, - {TRUE,FEMuxRateID,CODEC_ID_NONE,"dvd"}, - {FALSE,FEMuxRateID,CODEC_ID_NONE,"any"}, - - {TRUE,FEPacketSizeID,CODEC_ID_NONE,"mpeg"}, - {TRUE,FEPacketSizeID,CODEC_ID_NONE,"vcd"}, - {TRUE,FEPacketSizeID,CODEC_ID_NONE,"vob"}, - {TRUE,FEPacketSizeID,CODEC_ID_NONE,"svcd"}, - {TRUE,FEPacketSizeID,CODEC_ID_NONE,"dvd"}, - {FALSE,FEPacketSizeID,CODEC_ID_NONE,"any"}, - - {TRUE,FELanguageID,CODEC_ID_NONE,"matroska"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"mov"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"3gp"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"mp4"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"psp"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"3g2"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"ipod"}, - {TRUE,FELanguageID,CODEC_ID_NONE,"mpegts"}, - {FALSE,FELanguageID,CODEC_ID_NONE,"any"}, - - {TRUE,FEBitReservoirID,CODEC_ID_MP3,"any"}, - {TRUE,FEBitReservoirID,CODEC_ID_WMAV1,"any"}, - {TRUE,FEBitReservoirID,CODEC_ID_WMAV2,"any"}, - {FALSE,FEBitReservoirID,CODEC_ID_NONE,"any"}, - - {TRUE,FEVariableBlockLenID,CODEC_ID_WMAV1,"any"}, - {TRUE,FEVariableBlockLenID,CODEC_ID_WMAV2,"any"}, - {FALSE,FEVariableBlockLenID,CODEC_ID_NONE,"any"}, - - {FALSE,FFmpegExportCtrlID(0),CODEC_ID_NONE,NULL} -}; - -/// Prediction order method - names. Labels are indices of this array. -static const wxChar *PredictionOrderMethodNames[] = { _("Estimate"), _("2-level"), _("4-level"), _("8-level"), _("Full search"), _("Log search")}; - class FFmpegPresets; /// Custom FFmpeg export dialog @@ -703,6 +200,15 @@ public: void OnImportPresets(wxCommandEvent& event); void OnExportPresets(wxCommandEvent& event); + // Static tables + static CompatibilityEntry CompatibilityList[]; + static int iAACProfileValues[]; + static const wxChar *iAACProfileNames[]; + static ExposedFormat fmts[]; + static const int iAACSampleRates[]; + static ApplicableFor apptable[]; + static const wxChar *PredictionOrderMethodNames[]; + private: wxArrayString mShownFormatNames;