X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Faacenc.c;h=a6984fec8a94aa0216a7d02dea358f8879bf2717;hb=71e47640625d1e4db5314a9db0236d82ac267338;hp=00c37f333da6b5d5a916326ca428b55f44f80c0f;hpb=3c0f152d39a935dbabba2e32db23a6c954f5854f;p=fdkaac.git diff --git a/src/aacenc.c b/src/aacenc.c index 00c37f3..a6984fe 100644 --- a/src/aacenc.c +++ b/src/aacenc.c @@ -13,6 +13,17 @@ #include #include "aacenc.h" +int aacenc_is_sbr_ratio_available() +{ +#if AACENCODER_LIB_VL0 < 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1<4) + return 0; +#else + LIB_INFO lib_info; + aacenc_get_lib_info(&lib_info); + return lib_info.version > 0x03040000; +#endif +} + int aacenc_is_sbr_active(const aacenc_param_t *params) { switch (params->profile) { @@ -26,66 +37,31 @@ int aacenc_is_sbr_active(const aacenc_param_t *params) return 0; } -static const unsigned aacenc_sampling_freq_tab[] = { - 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, - 16000, 12000, 11025, 8000, 7350, 0, 0, 0 -}; - -static -unsigned sampling_freq_index(unsigned rate) +int aacenc_is_dual_rate_sbr(const aacenc_param_t *params) { - unsigned i; - for (i = 0; aacenc_sampling_freq_tab[i]; ++i) - if (aacenc_sampling_freq_tab[i] == rate) - return i; - return 0xf; + if (params->profile == AOT_PS || params->profile == AOT_MP2_PS) + return 1; + else if (params->profile == AOT_SBR || params->profile == AOT_MP2_SBR) + return params->sbr_ratio == 0 || params->sbr_ratio == 2; + else if (params->profile == AOT_ER_AAC_ELD && params->lowdelay_sbr) + return params->sbr_ratio == 2; + return 0; } -/* - * Append backward compatible SBR/PS signaling to implicit signaling ASC, - * if SBR/PS is present. - */ -int aacenc_mp4asc(const aacenc_param_t *params, - const uint8_t *asc, uint32_t ascsize, - uint8_t *outasc, uint32_t *outsize) +void aacenc_get_lib_info(LIB_INFO *info) { - unsigned asc_sfreq = aacenc_sampling_freq_tab[(asc[0]&0x7)<<1 |asc[1]>>7]; - - switch (params->profile) { - case AOT_SBR: - case AOT_PS: - if (*outsize < ascsize + 3) - return -1; - memcpy(outasc, asc, ascsize); - /* syncExtensionType:11 (value:0x2b7) */ - outasc[ascsize+0] = 0x2b << 1; - outasc[ascsize+1] = 0x7 << 5; - /* extensionAudioObjectType:5 (value:5)*/ - outasc[ascsize+1] |= 5; - /* sbrPresentFlag:1 (value:1) */ - outasc[ascsize+2] = 0x80; - /* extensionSamplingFrequencyIndex:4 */ - outasc[ascsize+2] |= sampling_freq_index(asc_sfreq << 1) << 3; - if (params->profile == AOT_SBR) { - *outsize = ascsize + 3; - break; + LIB_INFO *lib_info = 0; + lib_info = calloc(FDK_MODULE_LAST, sizeof(LIB_INFO)); + if (aacEncGetLibInfo(lib_info) == AACENC_OK) { + int i; + for (i = 0; i < FDK_MODULE_LAST; ++i) { + if (lib_info[i].module_id == FDK_AACENC) { + memcpy(info, &lib_info[i], sizeof(LIB_INFO)); + break; + } } - if (*outsize < ascsize + 5) - return -1; - /* syncExtensionType:11 (value:0x548) */ - outasc[ascsize+2] |= 0x5; - outasc[ascsize+3] = 0x48; - /* psPresentFlag:1 (value:1) */ - outasc[ascsize+4] = 0x80; - *outsize = ascsize + 5; - break; - default: - if (*outsize < ascsize) - return -1; - memcpy(outasc, asc, ascsize); - *outsize = ascsize; } - return 0; + free(lib_info); } static @@ -122,8 +98,11 @@ int aacenc_init(HANDLE_AACENCODER *encoder, const aacenc_param_t *params, { int channel_mode; int aot; + LIB_INFO lib_info; *encoder = 0; + aacenc_get_lib_info(&lib_info); + if ((channel_mode = aacenc_channel_mode(format)) == 0) { fprintf(stderr, "ERROR: unsupported channel layout\n"); goto FAIL; @@ -149,13 +128,21 @@ int aacenc_init(HANDLE_AACENCODER *encoder, const aacenc_param_t *params, fprintf(stderr, "ERROR: unsupported sample rate\n"); goto FAIL; } - aacEncoder_SetParam(*encoder, AACENC_CHANNELMODE, channel_mode); + if (aacEncoder_SetParam(*encoder, AACENC_CHANNELMODE, + channel_mode) != AACENC_OK) { + fprintf(stderr, "ERROR: unsupported channel mode\n"); + goto FAIL; + } aacEncoder_SetParam(*encoder, AACENC_BANDWIDTH, params->bandwidth); aacEncoder_SetParam(*encoder, AACENC_CHANNELORDER, 1); aacEncoder_SetParam(*encoder, AACENC_AFTERBURNER, !!params->afterburner); - if (aot == AOT_ER_AAC_ELD && params->lowdelay_sbr) - aacEncoder_SetParam(*encoder, AACENC_SBR_MODE, 1); + aacEncoder_SetParam(*encoder, AACENC_SBR_MODE, params->lowdelay_sbr); + +#if AACENCODER_LIB_VL0 > 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1>=4) + if (lib_info.version > 0x03040000) + aacEncoder_SetParam(*encoder, AACENC_SBR_RATIO, params->sbr_ratio); +#endif if (aacEncoder_SetParam(*encoder, AACENC_TRANSMUX, params->transport_format) != AACENC_OK) {