Present afterburner to init api, allow setting VBR via negative bitrate

This commit is contained in:
DataHoarder 2022-05-15 17:26:03 +02:00
parent c4b73b260d
commit 1d11096c2f
Signed by: DataHoarder
SSH key fingerprint: SHA256:OLTRf6Fl87G52SiR7sWLGNzlJt4WOX+tfI2yxo0z7xk
3 changed files with 25 additions and 15 deletions

View file

@ -40,7 +40,7 @@ typedef struct {
int bitrate;
} aacenc_t;
int aacenc_init(aacenc_t* h, int aot, int channels, int sample_rate, int bitrate, int muxingMode) {
int aacenc_init(aacenc_t* h, int aot, int channels, int sample_rate, int bitrate, int muxingMode, int afterburner) {
AACENC_ERROR err = AACENC_OK;
h->aot = aot;
@ -60,7 +60,6 @@ int aacenc_init(aacenc_t* h, int aot, int channels, int sample_rate, int bitrate
int trans_mux = muxingMode; // adts
int signaling = 0; // Implicit backward compatible signaling (default for ADIF and ADTS)
int afterburner = 1; // 1 or 0(default)
// -------------------------------------------------------------------------------
// ChannelMode | ChCfg | front_El | side_El | back_El | lfe_El
@ -115,9 +114,20 @@ int aacenc_init(aacenc_t* h, int aot, int channels, int sample_rate, int bitrate
return err;
}
if ((err = aacEncoder_SetParam(h->enc, AACENC_BITRATE, bitrate)) != AACENC_OK) {
return err;
}
if (bitrate >= 0) {
//CBR mode
if ((err = aacEncoder_SetParam(h->enc, AACENC_BITRATEMODE, 0)) != AACENC_OK) {
return err;
}
if ((err = aacEncoder_SetParam(h->enc, AACENC_BITRATE, bitrate)) != AACENC_OK) {
return err;
}
} else {
//VBR mode
if ((err = aacEncoder_SetParam(h->enc, AACENC_BITRATEMODE, -bitrate)) != AACENC_OK) {
return err;
}
}
if ((err = aacEncoder_SetParam(h->enc, AACENC_TRANSMUX, trans_mux)) != AACENC_OK) {
return err;
@ -243,30 +253,30 @@ const (
MuxingModeADTS = 2
)
// Initialize the encoder in LC profile.
// InitLc Initialize the encoder in LC profile.
// @remark the encoder use sampleRate and channels, user should resample the PCM to fit it,
// that is, the channels and sampleRate of PCM should always equals to encoder's.
// @remark for the fdkaac always use 16bits sample, so the bits of pcm always 16,
// which must be: [SHORT PCM] [SHORT PCM] ... ...
func (v *AacEncoder) InitLc(channels, sampleRate, bitrateBps, muxingMode int) (err error) {
func (v *AacEncoder) InitLc(channels, sampleRate, bitrateBps, muxingMode, afterburner int) (err error) {
v.channels = channels
r := C.aacenc_init(&v.m, C.AOT_AAC_LC, C.int(channels), C.int(sampleRate), C.int(bitrateBps), C.int(muxingMode))
r := C.aacenc_init(&v.m, C.AOT_AAC_LC, C.int(channels), C.int(sampleRate), C.int(bitrateBps), C.int(muxingMode), C.int(afterburner))
if int(r) != 0 {
return fmt.Errorf("Initialize encoder failed, code=%v", int(r))
}
return
}
// Initialize the encoder in HEv2 profile.
// InitHEv2 Initialize the encoder in HEv2 profile.
// @remark the encoder use sampleRate and channels, user should resample the PCM to fit it,
// that is, the channels and sampleRate of PCM should always equals to encoder's.
// @remark for the fdkaac always use 16bits sample, so the bits of pcm always 16,
// which must be: [SHORT PCM] [SHORT PCM] ... ...
func (v *AacEncoder) InitHEv2(channels, sampleRate, bitrateBps, muxingMode int) (err error) {
func (v *AacEncoder) InitHEv2(channels, sampleRate, bitrateBps, muxingMode, afterburner int) (err error) {
v.channels = channels
r := C.aacenc_init(&v.m, C.AOT_PS, C.int(channels), C.int(sampleRate), C.int(bitrateBps), C.int(muxingMode))
r := C.aacenc_init(&v.m, C.AOT_PS, C.int(channels), C.int(sampleRate), C.int(bitrateBps), C.int(muxingMode), C.int(afterburner))
if int(r) != 0 {
return fmt.Errorf("Initialize encoder failed, code=%v", int(r))
}

View file

@ -31,7 +31,7 @@ func TestLcInit(t *testing.T) {
var err error
e := fdkaac.NewAacEncoder()
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS); err != nil {
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS, 1); err != nil {
t.Error("Init encoder failed, err is", err)
return
}
@ -47,7 +47,7 @@ func TestLcEncode(t *testing.T) {
var err error
e := fdkaac.NewAacEncoder()
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS); err != nil {
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS, 1); err != nil {
t.Error("Init encoder failed, err is", err)
return
}
@ -135,7 +135,7 @@ func TestLcFlush(t *testing.T) {
var err error
e := fdkaac.NewAacEncoder()
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS); err != nil {
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS, 1); err != nil {
t.Error("Init encoder failed, err is", err)
return
}

View file

@ -330,7 +330,7 @@ func ExampleAacEncoder_LC() {
var err error
e := fdkaac.NewAacEncoder()
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS); err != nil {
if err = e.InitLc(2, 44100, 48000, fdkaac.MuxingModeADTS, 1); err != nil {
fmt.Println("Init encoder failed, err is", err)
return
}