#include "config.h" #include #include #include #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; } }