348 lines
9.3 KiB
C++
348 lines
9.3 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
ExportFFmpegDialogs.h
|
|
|
|
LRN
|
|
|
|
**********************************************************************/
|
|
|
|
#if !defined(__EXPORT_FFMPEG_DIALOGS_H__)
|
|
#define __EXPORT_FFMPEG_DIALOGS_H__
|
|
|
|
#include "../Audacity.h" // keep ffmpeg before wx because they interact // for USE_* macros
|
|
|
|
#if defined(USE_FFMPEG)
|
|
|
|
#include "../FFmpeg.h" // and Audacity.h before FFmpeg for config*.h
|
|
|
|
#include "../xml/XMLFileReader.h"
|
|
#include "../FileNames.h"
|
|
|
|
#include <unordered_map>
|
|
#include "audacity/Types.h"
|
|
|
|
class wxArrayStringEx;
|
|
|
|
class wxArrayString;
|
|
class wxCheckBox;
|
|
class wxStaticText;
|
|
class wxTextCtrl;
|
|
|
|
/// Identifiers for pre-set export types.
|
|
enum FFmpegExposedFormat
|
|
{
|
|
FMT_M4A,
|
|
FMT_AC3,
|
|
FMT_AMRNB,
|
|
FMT_OPUS,
|
|
FMT_WMA2,
|
|
FMT_OTHER,
|
|
FMT_LAST
|
|
};
|
|
|
|
#define AV_CANMETA (AV_VERSION_INT(255, 255, 255))
|
|
|
|
/// Describes export type
|
|
struct ExposedFormat
|
|
{
|
|
FFmpegExposedFormat fmtid; //!< one of the FFmpegExposedFormat
|
|
const wxChar *name; //!< format name (internal, should be unique; if not - export dialog may show unusual behaviour)
|
|
const FileExtension extension; //!< default extension for this format. More extensions may be added later via AddExtension.
|
|
const wxChar *shortname; //!< used to guess the format
|
|
unsigned maxchannels; //!< how many channels this format could handle
|
|
const int canmetadata; //!< !=0 if format supports metadata, AV_CANMETA any avformat version, otherwise version support added
|
|
bool canutf8; //!< true if format supports metadata in UTF-8, false otherwise
|
|
const TranslatableString description; //!< format description (will be shown in export dialog)
|
|
AVCodecID codecid; //!< codec ID (see libavcodec/avcodec.h)
|
|
bool compiledIn; //!< support for this codec/format is compiled in (checked at runtime)
|
|
};
|
|
|
|
|
|
/// Describes format-codec compatibility
|
|
struct CompatibilityEntry
|
|
{
|
|
const wxChar *fmt; //!< format, recognizable by guess_format()
|
|
AVCodecID codec; //!< codec ID
|
|
};
|
|
|
|
|
|
/// AC3 export options dialog
|
|
class ExportFFmpegAC3Options final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegAC3Options(wxWindow *parent, int format);
|
|
virtual ~ExportFFmpegAC3Options();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
|
|
/// Sample Rates supported by AC3 encoder (must end with zero-element)
|
|
/// It is not used in dialog anymore, but will be required later
|
|
static const int iAC3SampleRates[];
|
|
|
|
private:
|
|
|
|
wxChoice *mBitRateChoice;
|
|
int mBitRateFromChoice;
|
|
};
|
|
|
|
class ExportFFmpegAACOptions final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegAACOptions(wxWindow *parent, int format);
|
|
virtual ~ExportFFmpegAACOptions();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
};
|
|
|
|
class ExportFFmpegAMRNBOptions final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegAMRNBOptions(wxWindow *parent, int format);
|
|
virtual ~ExportFFmpegAMRNBOptions();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
|
|
private:
|
|
|
|
wxChoice *mBitRateChoice;
|
|
int mBitRateFromChoice;
|
|
};
|
|
|
|
class ExportFFmpegOPUSOptions final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegOPUSOptions(wxWindow *parent, int format);
|
|
~ExportFFmpegOPUSOptions();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
|
|
static const int iOPUSSampleRates[];
|
|
|
|
private:
|
|
|
|
wxSlider *mBitRateSlider;
|
|
int mBitRateFromSlider;
|
|
|
|
wxChoice *mVbrChoice;
|
|
int mVbrFromChoice;
|
|
|
|
wxSlider *mComplexitySlider;
|
|
int mComplexityFromSlider;
|
|
|
|
wxChoice *mFramesizeChoice;
|
|
int mFramesizeFromChoice;
|
|
|
|
wxChoice *mApplicationChoice;
|
|
int mApplicationFromChoice;
|
|
|
|
wxChoice *mCuttoffChoice;
|
|
int mCutoffFromChoice;
|
|
};
|
|
|
|
class ExportFFmpegWMAOptions final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegWMAOptions(wxWindow *parent, int format);
|
|
~ExportFFmpegWMAOptions();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
|
|
static const int iWMASampleRates[];
|
|
|
|
private:
|
|
|
|
wxChoice *mBitRateChoice;
|
|
int mBitRateFromChoice;
|
|
};
|
|
|
|
class ExportFFmpegCustomOptions final : public wxPanelWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegCustomOptions(wxWindow *parent, int format);
|
|
~ExportFFmpegCustomOptions();
|
|
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
bool TransferDataToWindow() override;
|
|
bool TransferDataFromWindow() override;
|
|
|
|
void OnOpen(wxCommandEvent & evt);
|
|
|
|
private:
|
|
wxTextCtrl *mFormat;
|
|
wxTextCtrl *mCodec;
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
/// Entry for the Applicability table
|
|
struct ApplicableFor
|
|
{
|
|
bool enable; //!< true if this control should be enabled, false otherwise
|
|
int control; //!< control ID
|
|
AVCodecID codec; //!< Codec ID
|
|
const char *format; //!< Format short name
|
|
};
|
|
|
|
class FFmpegPresets;
|
|
|
|
/// Custom FFmpeg export dialog
|
|
class ExportFFmpegOptions final : public wxDialogWrapper
|
|
{
|
|
public:
|
|
|
|
ExportFFmpegOptions(wxWindow *parent);
|
|
~ExportFFmpegOptions();
|
|
void PopulateOrExchange(ShuttleGui & S);
|
|
void OnOK(wxCommandEvent& event);
|
|
void OnGetURL(wxCommandEvent& event);
|
|
void OnFormatList(wxCommandEvent& event);
|
|
void DoOnFormatList();
|
|
void OnCodecList(wxCommandEvent& event);
|
|
void DoOnCodecList();
|
|
void OnAllFormats(wxCommandEvent& event);
|
|
void OnAllCodecs(wxCommandEvent& event);
|
|
void OnSavePreset(wxCommandEvent& event);
|
|
void OnLoadPreset(wxCommandEvent& event);
|
|
void OnDeletePreset(wxCommandEvent& event);
|
|
void OnImportPresets(wxCommandEvent& event);
|
|
void OnExportPresets(wxCommandEvent& event);
|
|
bool SavePreset( bool bCheckForOverwrite);
|
|
|
|
|
|
// Static tables
|
|
static CompatibilityEntry CompatibilityList[];
|
|
static ExposedFormat fmts[];
|
|
static const int iAACSampleRates[];
|
|
static ApplicableFor apptable[];
|
|
|
|
private:
|
|
|
|
wxArrayString mShownFormatNames;
|
|
wxArrayString mShownFormatLongNames;
|
|
wxArrayString mShownCodecNames;
|
|
wxArrayString mShownCodecLongNames;
|
|
wxArrayStringEx mFormatNames;
|
|
wxArrayString mFormatLongNames;
|
|
wxArrayStringEx mCodecNames;
|
|
wxArrayString mCodecLongNames;
|
|
|
|
wxListBox *mFormatList;
|
|
wxListBox *mCodecList;
|
|
|
|
wxStaticText *mFormatName;
|
|
wxStaticText *mCodecName;
|
|
|
|
wxComboBox *mPresetCombo;
|
|
|
|
int mBitRateFromChoice;
|
|
int mSampleRateFromChoice;
|
|
|
|
std::unique_ptr<FFmpegPresets> mPresets;
|
|
|
|
wxArrayStringEx mPresetNames;
|
|
|
|
/// Finds the format currently selected and returns its name and description
|
|
void FindSelectedFormat(wxString **name, wxString **longname);
|
|
|
|
/// Finds the codec currently selected and returns its name and description
|
|
void FindSelectedCodec(wxString **name, wxString **longname);
|
|
|
|
/// Retrieves format list from libavformat
|
|
void FetchFormatList();
|
|
|
|
/// Retrieves a list of formats compatible to codec
|
|
///\param id Codec ID
|
|
///\param selfmt format selected at the moment
|
|
///\return index of the selfmt in NEW format list or -1 if it is not in the list
|
|
int FetchCompatibleFormatList(AVCodecID id, wxString *selfmt);
|
|
|
|
/// Retrieves codec list from libavcodec
|
|
void FetchCodecList();
|
|
|
|
/// Retrieves a list of codecs compatible to format
|
|
///\param fmt Format short name
|
|
///\param id id of the codec selected at the moment
|
|
///\return index of the id in NEW codec list or -1 if it is not in the list
|
|
int FetchCompatibleCodecList(const wxChar *fmt, AVCodecID id);
|
|
|
|
/// Retrieves list of presets from configuration file
|
|
void FetchPresetList();
|
|
|
|
bool ReportIfBadCombination();
|
|
|
|
|
|
// Enables/disables controls based on format/codec combination,
|
|
// leaving only relevant controls enabled.
|
|
// Hiding the controls may have been a better idea,
|
|
// but it's hard to hide their text labels too
|
|
void EnableDisableControls(AVCodec *cdc, wxString *selfmt);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
// FFmpegPresets
|
|
//----------------------------------------------------------------------------
|
|
|
|
class FFmpegPreset
|
|
{
|
|
public:
|
|
FFmpegPreset();
|
|
~FFmpegPreset();
|
|
|
|
wxString mPresetName;
|
|
wxArrayString mControlState;
|
|
|
|
};
|
|
|
|
using FFmpegPresetMap = std::unordered_map<wxString, FFmpegPreset>;
|
|
|
|
class FFmpegPresets : XMLTagHandler
|
|
{
|
|
public:
|
|
FFmpegPresets();
|
|
~FFmpegPresets();
|
|
|
|
void GetPresetList(wxArrayString &list);
|
|
void LoadPreset(ExportFFmpegOptions *parent, wxString &name);
|
|
bool SavePreset(ExportFFmpegOptions *parent, wxString &name);
|
|
void DeletePreset(wxString &name);
|
|
bool OverwriteIsOk( wxString &name );
|
|
FFmpegPreset *FindPreset(wxString &name);
|
|
|
|
void ImportPresets(wxString &filename);
|
|
void ExportPresets(wxString &filename);
|
|
|
|
bool HandleXMLTag(const wxChar *tag, const wxChar **attrs) override;
|
|
XMLTagHandler *HandleXMLChild(const wxChar *tag) override;
|
|
void WriteXMLHeader(XMLWriter &xmlFile) const;
|
|
void WriteXML(XMLWriter &xmlFile) const;
|
|
|
|
private:
|
|
|
|
FFmpegPresetMap mPresets;
|
|
FFmpegPreset *mPreset; // valid during XML parsing only
|
|
bool mAbortImport; // tells importer to ignore the rest of the import
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif //__EXPORT_FFMPEG_DIALOGS_H__
|