diff options
Diffstat (limited to 'Src/Plugins/Encoder/enc_fhgaac/config.cpp')
-rw-r--r-- | Src/Plugins/Encoder/enc_fhgaac/config.cpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/Src/Plugins/Encoder/enc_fhgaac/config.cpp b/Src/Plugins/Encoder/enc_fhgaac/config.cpp new file mode 100644 index 00000000..e899b052 --- /dev/null +++ b/Src/Plugins/Encoder/enc_fhgaac/config.cpp @@ -0,0 +1,258 @@ +#include "config.h" +#include <windows.h> +#include <strsafe.h> +#include <assert.h> +#include "mp4FastAAClib.h" +#include "preferences.h" + +AACConfigurationFile *AACConfig_Create(unsigned int type, const char *filename) +{ + AACConfigurationFile *cfg = (AACConfigurationFile*)calloc(1, sizeof(AACConfigurationFile)); + if (cfg) + { + cfg->type = type; + + if (filename) + lstrcpynA(cfg->config_file, filename, MAX_PATH); + else + cfg->config_file[0] = 0; + + AACConfig_Load(cfg); + } + return cfg; +} + +void AACConfig_Load(AACConfigurationFile *cfg) +{ + if (cfg->type == ENCODER_TYPE_MPEG4) + { + cfg->config.mode = GetPrivateProfileIntA("audio_fhgaac", "mode", AAC_DEFAULT_MODE, cfg->config_file); + cfg->config.profile = GetPrivateProfileIntA("audio_fhgaac", "profile", AAC_DEFAULT_PROFILE, cfg->config_file); + cfg->config.bitrate = GetPrivateProfileIntA("audio_fhgaac", "bitrate", AAC_DEFAULT_BITRATE, cfg->config_file); + cfg->config.preset = GetPrivateProfileIntA("audio_fhgaac", "preset", AAC_DEFAULT_PRESET, cfg->config_file); + cfg->config.surround = GetPrivateProfileIntA("audio_fhgaac", "surround", AAC_DEFAULT_SURROUND, cfg->config_file); + cfg->shoutcast = 0; + } + else + { + cfg->config.mode = AAC_MODE_CBR; + cfg->config.profile = GetPrivateProfileIntA("audio_adtsaac", "profile", AAC_PROFILE_HE, cfg->config_file); + cfg->config.bitrate = GetPrivateProfileIntA("audio_adtsaac", "bitrate", 64, cfg->config_file); + cfg->config.surround = GetPrivateProfileIntA("audio_adtsaac", "surround", AAC_DEFAULT_SURROUND, cfg->config_file); + cfg->shoutcast = GetPrivateProfileIntA("audio_adtsaac", "shoutcast", 0, cfg->config_file); + } +} + +void AACConfig_Save(const AACConfigurationFile *cfg) +{ + char temp[128] = {0}; + + if (cfg->type == ENCODER_TYPE_MPEG4) + { + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.mode); + WritePrivateProfileStringA("audio_fhgaac", "mode", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.profile); + WritePrivateProfileStringA("audio_fhgaac", "profile", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.bitrate); + WritePrivateProfileStringA("audio_fhgaac", "bitrate", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.preset); + WritePrivateProfileStringA("audio_fhgaac", "preset", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.surround); + WritePrivateProfileStringA("audio_fhgaac", "surround", temp, cfg->config_file); + } + else + { + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.profile); + WritePrivateProfileStringA("audio_adtsaac", "profile", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.bitrate); + WritePrivateProfileStringA("audio_adtsaac", "bitrate", temp, cfg->config_file); + + StringCbPrintfA(temp, sizeof(temp), "%u", cfg->config.surround); + WritePrivateProfileStringA("audio_adtsaac", "surround", temp, cfg->config_file); + } +} + +void AACConfig_GetBitrateRange(const AACConfiguration *cfg, int *low, int *high) +{ + switch(cfg->profile) + { + case AAC_PROFILE_AUTOMATIC: + *low = 12000; + *high = 448000; + break; + + case AAC_PROFILE_LC: + *low = 16000; + *high = 448000; + break; + + case AAC_PROFILE_HE: + *low = 16000; + *high = 128000; + break; + + case AAC_PROFILE_HE_V2: + *low = 12000; + *high = 56000; + break; + } +} + +AUD_OBJ_TYP AACConfig_GetAOT(const AACConfiguration *cfg) +{ + if (cfg->mode == AAC_MODE_VBR) + { + switch(cfg->preset) + { + case 1: + return AUD_OBJ_TYP_PS; + case 2: + return AUD_OBJ_TYP_HEAAC; + default: + return AUD_OBJ_TYP_LC; + } + } + else switch (cfg->profile) /* CBR */ + { + case AAC_PROFILE_AUTOMATIC: + if (cfg->bitrate <= 40) + return AUD_OBJ_TYP_PS; + else if (cfg->bitrate <= 80) + return AUD_OBJ_TYP_HEAAC; + else + return AUD_OBJ_TYP_LC; + case AAC_PROFILE_LC: + return AUD_OBJ_TYP_LC; + case AAC_PROFILE_HE: + return AUD_OBJ_TYP_HEAAC; + case AAC_PROFILE_HE_V2: + + return AUD_OBJ_TYP_PS; + + } + return AUD_OBJ_TYP_LC; +} + +int AACConfig_GetBitrate(const AACConfiguration *cfg, unsigned int channels) +{ + if (cfg->mode == AAC_MODE_VBR) + { + switch(cfg->preset) + { + case 1: + return 16000*channels; + case 2: + return 32000*channels; + case 3: + return 48000*channels; + case 4: + return 64000*channels; + case 5: + return 96000*channels; + case 6: + return 128000*channels; + default: + return 0; + } + } + else + return cfg->bitrate * 1000; +} + +MPEG4ENC_BITRATE_MODE AACConfig_GetBitrateMode(const AACConfiguration *cfg) +{ + if (cfg->mode == AAC_MODE_VBR) + { + /* by coincidence, these match + to help future maintainers, let's assert this fact */ + assert(MP4_BR_MODE_VBR_1 == (MPEG4ENC_BITRATE_MODE)1); + assert(MP4_BR_MODE_VBR_2 == (MPEG4ENC_BITRATE_MODE)2); + assert(MP4_BR_MODE_VBR_3 == (MPEG4ENC_BITRATE_MODE)3); + assert(MP4_BR_MODE_VBR_4 == (MPEG4ENC_BITRATE_MODE)4); + assert(MP4_BR_MODE_VBR_5 == (MPEG4ENC_BITRATE_MODE)5); + assert(MP4_BR_MODE_VBR_6 == (MPEG4ENC_BITRATE_MODE)6); + return (MPEG4ENC_BITRATE_MODE)cfg->preset; + } + else /* CBR */ + { + return MP4_BR_MODE_CBR; + } +} + +MPEG4ENC_CH_MODE AACConfig_GetChannelMode(const AACConfiguration *cfg, unsigned int channels) +{ + switch(channels) + { + case 1: + return MP4_CH_MODE_MONO; + case 2: + if (cfg->mode == AAC_MODE_VBR) + { + if (cfg->preset == 1) + return MP4_CH_MODE_PARAMETRIC_STEREO; + else + return MP4_CH_MODE_STEREO; + } + else /* CBR */ + { + if (AACConfig_GetAOT(cfg) == AUD_OBJ_TYP_PS) + return MP4_CH_MODE_PARAMETRIC_STEREO; + else + return MP4_CH_MODE_STEREO; + } + case 3: return MP4_CH_MODE_3; + case 4: return MP4_CH_MODE_4; + case 5: return MP4_CH_MODE_5; + case 6: return MP4_CH_MODE_5_1; + case 8: return MP4_CH_MODE_7_1; + default: + return MP4_CH_MODE_INVALID; + } +} + +void AACConfig_GetToolString(const MPEG4ENC_SETUP *setup, char tool[], size_t cch) +{ + char version[128] = {0}; + MPEG4ENC_GetVersionInfo(version, sizeof(version)/sizeof(*version)); + char *p = version; + while (p && *p) + { + if (*p != '.' && (*p < '0' || *p > '9')) + { + *p = 0; + break; + } + p++; + } + + + switch(setup->bitrateMode) + { + case MP4_BR_MODE_CBR: + StringCchPrintfA(tool, cch, "fhgaac v%s;CBR=%d", version, setup->nBitRate); + break; + case MP4_BR_MODE_VBR_1: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=1", version); + break; + case MP4_BR_MODE_VBR_2: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=2", version); + break; + case MP4_BR_MODE_VBR_3: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=3", version); + break; + case MP4_BR_MODE_VBR_4: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=4", version); + break; + case MP4_BR_MODE_VBR_5: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=5", version); + break; + case MP4_BR_MODE_VBR_6: + StringCchPrintfA(tool, cch, "fhgaac v%s;VBR=6", version); + break; + } +}
\ No newline at end of file |