2 * Copyright (C) 2013 nu774
3 * For conditions of distribution and use, see copyright notice in COPYING
16 int aacenc_is_explicit_bw_compatible_sbr_signaling_available()
19 aacenc_get_lib_info(&lib_info
);
20 return lib_info
.version
> 0x03040900;
23 int aacenc_is_sbr_ratio_available()
25 #if AACENCODER_LIB_VL0 < 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1<4)
29 aacenc_get_lib_info(&lib_info
);
30 return lib_info
.version
> 0x03040800;
34 int aacenc_is_sbr_active(const aacenc_param_t
*params
)
36 switch (params
->profile
) {
37 case AOT_SBR
: case AOT_PS
:
38 case AOT_DRM_SBR
: case AOT_DRM_MPEG_PS
:
41 if (params
->profile
== AOT_ER_AAC_ELD
&& params
->lowdelay_sbr
)
46 int aacenc_is_dual_rate_sbr(const aacenc_param_t
*params
)
48 if (params
->profile
== AOT_PS
)
50 else if (params
->profile
== AOT_SBR
)
51 return params
->sbr_ratio
== 0 || params
->sbr_ratio
== 2;
52 else if (params
->profile
== AOT_ER_AAC_ELD
&& params
->lowdelay_sbr
)
53 return params
->sbr_ratio
== 2;
57 void aacenc_get_lib_info(LIB_INFO
*info
)
59 LIB_INFO
*lib_info
= 0;
60 lib_info
= calloc(FDK_MODULE_LAST
, sizeof(LIB_INFO
));
61 if (aacEncGetLibInfo(lib_info
) == AACENC_OK
) {
63 for (i
= 0; i
< FDK_MODULE_LAST
; ++i
) {
64 if (lib_info
[i
].module_id
== FDK_AACENC
) {
65 memcpy(info
, &lib_info
[i
], sizeof(LIB_INFO
));
73 static const unsigned aacenc_sampling_freq_tab
[] = {
74 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
75 16000, 12000, 11025, 8000, 7350, 0, 0, 0
79 unsigned sampling_freq_index(unsigned rate
)
82 for (i
= 0; aacenc_sampling_freq_tab
[i
]; ++i
)
83 if (aacenc_sampling_freq_tab
[i
] == rate
)
89 * Append backward compatible SBR/PS signaling to implicit signaling ASC,
90 * if SBR/PS is present.
92 int aacenc_mp4asc(const aacenc_param_t
*params
,
93 const uint8_t *asc
, uint32_t ascsize
,
94 uint8_t *outasc
, uint32_t *outsize
)
96 unsigned asc_sfreq
= aacenc_sampling_freq_tab
[(asc
[0]&0x7)<<1 |asc
[1]>>7];
97 unsigned shift
= aacenc_is_dual_rate_sbr(params
);
99 switch (params
->profile
) {
104 if (*outsize
< ascsize
+ 3)
106 memcpy(outasc
, asc
, ascsize
);
107 /* syncExtensionType:11 (value:0x2b7) */
108 outasc
[ascsize
+0] = 0x2b << 1;
109 outasc
[ascsize
+1] = 0x7 << 5;
110 /* extensionAudioObjectType:5 (value:5)*/
111 outasc
[ascsize
+1] |= 5;
112 /* sbrPresentFlag:1 (value:1) */
113 outasc
[ascsize
+2] = 0x80;
114 /* extensionSamplingFrequencyIndex:4 */
115 outasc
[ascsize
+2] |= sampling_freq_index(asc_sfreq
<< shift
) << 3;
116 if (params
->profile
== AOT_SBR
) {
117 *outsize
= ascsize
+ 3;
120 if (*outsize
< ascsize
+ 5)
122 /* syncExtensionType:11 (value:0x548) */
123 outasc
[ascsize
+2] |= 0x5;
124 outasc
[ascsize
+3] = 0x48;
125 /* psPresentFlag:1 (value:1) */
126 outasc
[ascsize
+4] = 0x80;
127 *outsize
= ascsize
+ 5;
130 if (*outsize
< ascsize
)
132 memcpy(outasc
, asc
, ascsize
);
138 int aacenc_channel_mode(const pcm_sample_description_t
*format
)
140 uint32_t chanmask
= format
->channel_mask
;
142 if (format
->channels_per_frame
> 8)
145 static uint32_t defaults
[] = { 0x4, 0x3, 0x7, 0, 0x37, 0x3f, 0, 0x63f };
146 chanmask
= defaults
[format
->channels_per_frame
- 1];
149 case 0x3: return MODE_2
;
150 case 0x4: return MODE_1
;
151 case 0x7: return MODE_1_2
;
152 case 0x37: return MODE_1_2_2
;
153 case 0x3f: return MODE_1_2_2_1
;
154 case 0x107: return MODE_1_2_1
;
155 case 0x607: return MODE_1_2_2
;
156 case 0x60f: return MODE_1_2_2_1
;
157 #if AACENCODER_LIB_VL0 > 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1>=4)
158 case 0xff: return MODE_1_2_2_2_1
;
159 case 0x63f: return MODE_7_1_REAR_SURROUND
;
165 int aacenc_init(HANDLE_AACENCODER
*encoder
, const aacenc_param_t
*params
,
166 const pcm_sample_description_t
*format
,
167 AACENC_InfoStruct
*info
)
174 aacenc_get_lib_info(&lib_info
);
176 if ((channel_mode
= aacenc_channel_mode(format
)) == 0) {
177 fprintf(stderr
, "ERROR: unsupported channel layout\n");
180 if (aacEncOpen(encoder
, 0, 0) != AACENC_OK
) {
181 fprintf(stderr
, "ERROR: aacEncOpen() failed\n");
184 aot
= (params
->profile
? params
->profile
: AOT_AAC_LC
);
185 if (aacEncoder_SetParam(*encoder
, AACENC_AOT
, aot
) != AACENC_OK
) {
186 fprintf(stderr
, "ERROR: unsupported profile\n");
189 if (params
->bitrate_mode
== 0)
190 aacEncoder_SetParam(*encoder
, AACENC_BITRATE
, params
->bitrate
);
191 else if (aacEncoder_SetParam(*encoder
, AACENC_BITRATEMODE
,
192 params
->bitrate_mode
) != AACENC_OK
) {
193 fprintf(stderr
, "ERROR: unsupported bitrate mode\n");
196 if (aacEncoder_SetParam(*encoder
, AACENC_SAMPLERATE
,
197 format
->sample_rate
) != AACENC_OK
) {
198 fprintf(stderr
, "ERROR: unsupported sample rate\n");
201 if (aacEncoder_SetParam(*encoder
, AACENC_CHANNELMODE
,
202 channel_mode
) != AACENC_OK
) {
203 fprintf(stderr
, "ERROR: unsupported channel mode\n");
206 aacEncoder_SetParam(*encoder
, AACENC_BANDWIDTH
, params
->bandwidth
);
207 aacEncoder_SetParam(*encoder
, AACENC_CHANNELORDER
, 1);
208 aacEncoder_SetParam(*encoder
, AACENC_AFTERBURNER
, !!params
->afterburner
);
210 aacEncoder_SetParam(*encoder
, AACENC_SBR_MODE
, params
->lowdelay_sbr
);
212 #if AACENCODER_LIB_VL0 > 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1>=4)
213 if (lib_info
.version
> 0x03040800)
214 aacEncoder_SetParam(*encoder
, AACENC_SBR_RATIO
, params
->sbr_ratio
);
217 if (aacEncoder_SetParam(*encoder
, AACENC_TRANSMUX
,
218 params
->transport_format
) != AACENC_OK
) {
219 fprintf(stderr
, "ERROR: unsupported transport format\n");
222 if (aacEncoder_SetParam(*encoder
, AACENC_SIGNALING_MODE
,
223 params
->sbr_signaling
) != AACENC_OK
) {
224 fprintf(stderr
, "ERROR: failed to set SBR signaling mode\n");
227 if (params
->adts_crc_check
)
228 aacEncoder_SetParam(*encoder
, AACENC_PROTECTION
, 1);
229 if (params
->header_period
)
230 aacEncoder_SetParam(*encoder
, AACENC_HEADER_PERIOD
,
231 params
->header_period
);
233 if (aacEncEncode(*encoder
, 0, 0, 0, 0) != AACENC_OK
) {
234 fprintf(stderr
, "ERROR: encoder initialization failed\n");
237 if (aacEncInfo(*encoder
, info
) != AACENC_OK
) {
238 fprintf(stderr
, "ERROR: cannot retrieve encoder info\n");
244 aacEncClose(encoder
);
248 int aac_encode_frame(HANDLE_AACENCODER encoder
,
249 const pcm_sample_description_t
*format
,
250 const int16_t *input
, unsigned iframes
,
251 aacenc_frame_t
*output
)
253 uint32_t ilen
= iframes
* format
->channels_per_frame
;
254 AACENC_BufDesc ibdesc
= { 0 }, obdesc
= { 0 };
255 AACENC_InArgs iargs
= { 0 };
256 AACENC_OutArgs oargs
= { 0 };
257 void *ibufs
[] = { (void*)input
};
259 INT ibuf_ids
[] = { IN_AUDIO_DATA
};
260 INT obuf_ids
[] = { OUT_BITSTREAM_DATA
};
261 INT ibuf_sizes
[] = { ilen
* sizeof(int16_t) };
263 INT ibuf_el_sizes
[] = { sizeof(int16_t) };
264 INT obuf_el_sizes
[] = { 1 };
266 unsigned channel_mode
, obytes
;
268 channel_mode
= aacEncoder_GetParam(encoder
, AACENC_CHANNELMODE
);
269 obytes
= 6144 / 8 * channel_mode
;
270 if (!output
->data
|| output
->capacity
< obytes
) {
271 uint8_t *p
= realloc(output
->data
, obytes
);
273 output
->capacity
= obytes
;
276 obufs
[0] = output
->data
;
277 obuf_sizes
[0] = obytes
;
279 iargs
.numInSamples
= ilen
? ilen
: -1; /* -1 for signaling EOF */
282 ibdesc
.bufferIdentifiers
= ibuf_ids
;
283 ibdesc
.bufSizes
= ibuf_sizes
;
284 ibdesc
.bufElSizes
= ibuf_el_sizes
;
287 obdesc
.bufferIdentifiers
= obuf_ids
;
288 obdesc
.bufSizes
= obuf_sizes
;
289 obdesc
.bufElSizes
= obuf_el_sizes
;
291 err
= aacEncEncode(encoder
, &ibdesc
, &obdesc
, &iargs
, &oargs
);
292 if (err
!= AACENC_ENCODE_EOF
&& err
!= AACENC_OK
) {
293 fprintf(stderr
, "ERROR: aacEncEncode() failed\n");
296 output
->size
= oargs
.numOutBytes
;
297 return oargs
.numInSamples
/ format
->channels_per_frame
;