2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
39 #include "sbr_syntax.h"
41 #include "sbr_hfgen.h"
42 #include "sbr_hfadj.h"
46 #if (defined(PS_DEC) || defined(DRM_PS))
47 /* In case of PS_DEC or DRM_PS we need larger buffer data when calling
48 * ps_decode() or drm_ps_decode(). */
49 qmf_t X_L
[MAX_NTSRPS
][64];
50 qmf_t X_R
[MAX_NTSRPS
][64];
52 /* No PS functions called. Keep using MAX_NTSR as array size. */
53 qmf_t X_L
[MAX_NTSR
][64];
54 qmf_t X_R
[MAX_NTSR
][64];
58 /* static variables */
59 static XLR_t
*p_XLR
= NULL
;
60 #if defined(FAAD_STATIC_ALLOC) || defined(IBSS_ATTR_FAAD_XLR)
61 static XLR_t s_XLR IBSS_ATTR_FAAD_XLR MEM_ALIGN_ATTR
;
63 #if defined(FAAD_STATIC_ALLOC)
64 static sbr_info s_sbr
[MAX_SYNTAX_ELEMENTS
];
67 static real_t deg
[64] MEM_ALIGN_ATTR
;
70 /* static function declarations */
71 static uint8_t sbr_save_prev_data(sbr_info
*sbr
, uint8_t ch
);
72 static void sbr_save_matrix(sbr_info
*sbr
, uint8_t ch
);
75 sbr_info
*sbrDecodeInit(uint16_t framelength
, uint8_t id_aac
, uint8_t id_ele
,
76 uint32_t sample_rate
, uint8_t downSampledSBR
,
84 /* Allocate sbr_info. */
85 #if defined(FAAD_STATIC_ALLOC)
86 sbr_info
*sbr
= &s_sbr
[id_ele
];
89 sbr_info
*sbr
= (sbr_info
*)faad_malloc(sizeof(sbr_info
));
92 /* could not allocate memory */
96 memset(sbr
, 0, sizeof(sbr_info
));
99 /* initialize PS variables */
103 /* Allocate XLR temporary variable. Use static allocation if either
104 * FAAD_STATIC_ALLOC is set or XLR fits to IRAM. */
105 #if defined(FAAD_STATIC_ALLOC) || defined(IBSS_ATTR_FAAD_XLR)
108 p_XLR
= (XLR_t
*)faad_malloc(sizeof(XLR_t
));
111 /* could not allocate memory */
115 memset(p_XLR
, 0, sizeof(XLR_t
));
117 /* save id of the parent element */
118 sbr
->id_aac
= id_aac
;
119 sbr
->sample_rate
= sample_rate
;
121 sbr
->bs_freq_scale
= 2;
122 sbr
->bs_alter_scale
= 1;
123 sbr
->bs_noise_bands
= 2;
124 sbr
->bs_limiter_bands
= 2;
125 sbr
->bs_limiter_gains
= 2;
126 sbr
->bs_interpol_freq
= 1;
127 sbr
->bs_smoothing_mode
= 1;
128 sbr
->bs_start_freq
= 5;
130 sbr
->bs_samplerate_mode
= 1;
131 sbr
->prevEnvIsShort
[0] = -1;
132 sbr
->prevEnvIsShort
[1] = -1;
133 sbr
->header_count
= 0;
137 sbr
->Is_DRM_SBR
= IsDRM
;
139 sbr
->tHFGen
= T_HFGEN
;
140 sbr
->tHFAdj
= T_HFADJ
;
145 sbr
->frame_len
= framelength
;
147 /* force sbr reset */
148 sbr
->bs_start_freq_prev
= -1;
150 if (framelength
== 960)
152 sbr
->numTimeSlotsRate
= RATE
* NO_TIME_SLOTS_960
;
153 sbr
->numTimeSlots
= NO_TIME_SLOTS_960
;
155 sbr
->numTimeSlotsRate
= RATE
* NO_TIME_SLOTS
;
156 sbr
->numTimeSlots
= NO_TIME_SLOTS
;
159 sbr
->GQ_ringbuf_index
[0] = 0;
160 sbr
->GQ_ringbuf_index
[1] = 0;
162 memset(sbr
->qmfa
, 0, 2*sizeof(qmfa_info
));
163 memset(sbr
->qmfs
, 0, 2*sizeof(qmfs_info
));
165 memset(sbr
->Xsbr
[0], 0, (sbr
->numTimeSlotsRate
+sbr
->tHFGen
)*64 * sizeof(qmf_t
));
166 memset(sbr
->Xsbr
[1], 0, (sbr
->numTimeSlotsRate
+sbr
->tHFGen
)*64 * sizeof(qmf_t
));
171 static uint8_t sbr_save_prev_data(sbr_info
*sbr
, uint8_t ch
)
175 /* save data for next frame */
176 sbr
->kx_prev
= sbr
->kx
;
177 sbr
->M_prev
= sbr
->M
;
178 sbr
->bsco_prev
= sbr
->bsco
;
180 sbr
->L_E_prev
[ch
] = sbr
->L_E
[ch
];
182 /* sbr->L_E[ch] can become 0 on files with bit errors */
183 if (sbr
->L_E
[ch
] <= 0)
186 sbr
->f_prev
[ch
] = sbr
->f
[ch
][sbr
->L_E
[ch
] - 1];
187 for (i
= 0; i
< MAX_M
; i
++)
189 sbr
->E_prev
[ch
][i
] = sbr
->E
[ch
][i
][sbr
->L_E
[ch
] - 1];
190 sbr
->Q_prev
[ch
][i
] = sbr
->Q
[ch
][i
][sbr
->L_Q
[ch
] - 1];
193 for (i
= 0; i
< MAX_M
; i
++)
195 sbr
->bs_add_harmonic_prev
[ch
][i
] = sbr
->bs_add_harmonic
[ch
][i
];
197 sbr
->bs_add_harmonic_flag_prev
[ch
] = sbr
->bs_add_harmonic_flag
[ch
];
199 if (sbr
->l_A
[ch
] == sbr
->L_E
[ch
])
200 sbr
->prevEnvIsShort
[ch
] = 0;
202 sbr
->prevEnvIsShort
[ch
] = -1;
207 static void sbr_save_matrix(sbr_info
*sbr
, uint8_t ch
)
211 for (i
= 0; i
< sbr
->tHFGen
; i
++)
213 memmove(sbr
->Xsbr
[ch
][i
], sbr
->Xsbr
[ch
][i
+sbr
->numTimeSlotsRate
], 64 * sizeof(qmf_t
));
215 for (i
= sbr
->tHFGen
; i
< MAX_NTSRHFG
; i
++)
217 memset(sbr
->Xsbr
[ch
][i
], 0, 64 * sizeof(qmf_t
));
221 static void sbr_process_channel(sbr_info
*sbr
, real_t
*channel_buf
, qmf_t X
[MAX_NTSR
][64],
222 uint8_t ch
, uint8_t dont_process
,
223 const uint8_t downSampledSBR
)
227 (void)downSampledSBR
;
231 sbr
->bsco
= max((int32_t)sbr
->maxAACLine
*32/(int32_t)sbr
->frame_len
- (int32_t)sbr
->kx
, 0);
240 //#define PRE_QMF_PRINT
244 for (i
= 0; i
< 1024; i
++)
246 printf("%d\n", channel_buf
[i
]);
252 /* subband analysis */
254 sbr_qmf_analysis_32(sbr
, &sbr
->qmfa
[ch
], channel_buf
, sbr
->Xsbr
[ch
], sbr
->tHFGen
, 32);
256 sbr_qmf_analysis_32(sbr
, &sbr
->qmfa
[ch
], channel_buf
, sbr
->Xsbr
[ch
], sbr
->tHFGen
, sbr
->kx
);
261 /* insert high frequencies here */
262 /* hf generation using patching */
263 hf_generation(sbr
, sbr
->Xsbr
[ch
], sbr
->Xsbr
[ch
]
271 for (l
= sbr
->t_E
[ch
][0]; l
< sbr
->t_E
[ch
][sbr
->L_E
[ch
]]; l
++)
273 for (k
= 0; k
< sbr
->kx
; k
++)
275 QMF_RE(sbr
->Xsbr
[ch
][sbr
->tHFAdj
+ l
][k
]) = 0;
282 hf_adjustment(sbr
, sbr
->Xsbr
[ch
]
290 if ((sbr
->just_seeked
!= 0) || dont_process
)
292 for (l
= 0; l
< sbr
->numTimeSlotsRate
; l
++)
294 for (k
= 0; k
< 32; k
++)
296 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
297 #ifndef SBR_LOW_POWER
298 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
301 for (k
= 32; k
< 64; k
++)
304 #ifndef SBR_LOW_POWER
310 for (l
= 0; l
< sbr
->numTimeSlotsRate
; l
++)
312 uint8_t kx_band
, M_band
, bsco_band
;
314 if (l
< sbr
->t_E
[ch
][0])
316 kx_band
= sbr
->kx_prev
;
317 M_band
= sbr
->M_prev
;
318 bsco_band
= sbr
->bsco_prev
;
322 bsco_band
= sbr
->bsco
;
325 #ifndef SBR_LOW_POWER
326 for (k
= 0; k
< kx_band
+ bsco_band
; k
++)
328 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
329 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
331 for (k
= kx_band
+ bsco_band
; k
< kx_band
+ M_band
; k
++)
333 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
334 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
336 for (k
= max(kx_band
+ bsco_band
, kx_band
+ M_band
); k
< 64; k
++)
342 for (k
= 0; k
< kx_band
+ bsco_band
; k
++)
344 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
346 for (k
= kx_band
+ bsco_band
; k
< min(kx_band
+ M_band
, 63); k
++)
348 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
350 for (k
= max(kx_band
+ bsco_band
, kx_band
+ M_band
); k
< 64; k
++)
354 QMF_RE(X
[l
][kx_band
- 1 + bsco_band
]) +=
355 QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][kx_band
- 1 + bsco_band
]);
361 uint8_t sbrDecodeCoupleFrame(sbr_info
*sbr
, real_t
*left_chan
, real_t
*right_chan
,
362 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
364 uint8_t dont_process
= 0;
370 /* case can occur due to bit errors */
371 if (sbr
->id_aac
!= ID_CPE
)
374 if (sbr
->ret
|| (sbr
->header_count
== 0))
376 /* don't process just upsample */
379 /* Re-activate reset for next frame */
380 if (sbr
->ret
&& sbr
->Reset
)
381 sbr
->bs_start_freq_prev
= -1;
386 sbr
->just_seeked
= 1;
388 sbr
->just_seeked
= 0;
391 sbr_process_channel(sbr
, left_chan
, p_XLR
->X_L
, 0, dont_process
, downSampledSBR
);
392 /* subband synthesis */
395 sbr_qmf_synthesis_32(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, left_chan
);
397 sbr_qmf_synthesis_64(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, left_chan
);
400 sbr_process_channel(sbr
, right_chan
, p_XLR
->X_R
, 1, dont_process
, downSampledSBR
);
401 /* subband synthesis */
404 sbr_qmf_synthesis_32(sbr
, &sbr
->qmfs
[1], p_XLR
->X_R
, right_chan
);
406 sbr_qmf_synthesis_64(sbr
, &sbr
->qmfs
[1], p_XLR
->X_R
, right_chan
);
409 if (sbr
->bs_header_flag
)
410 sbr
->just_seeked
= 0;
412 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
414 ret
= sbr_save_prev_data(sbr
, 0);
416 ret
= sbr_save_prev_data(sbr
, 1);
420 sbr_save_matrix(sbr
, 0);
421 sbr_save_matrix(sbr
, 1);
425 //#define POST_QMF_PRINT
426 #ifdef POST_QMF_PRINT
429 for (i
= 0; i
< 2048; i
++)
431 printf("%d\n", left_chan
[i
]);
433 for (i
= 0; i
< 2048; i
++)
435 printf("%d\n", right_chan
[i
]);
443 uint8_t sbrDecodeSingleFrame(sbr_info
*sbr
, real_t
*channel
,
444 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
446 uint8_t dont_process
= 0;
452 /* case can occur due to bit errors */
453 if (sbr
->id_aac
!= ID_SCE
&& sbr
->id_aac
!= ID_LFE
)
456 if (sbr
->ret
|| (sbr
->header_count
== 0))
458 /* don't process just upsample */
461 /* Re-activate reset for next frame */
462 if (sbr
->ret
&& sbr
->Reset
)
463 sbr
->bs_start_freq_prev
= -1;
468 sbr
->just_seeked
= 1;
470 sbr
->just_seeked
= 0;
473 sbr_process_channel(sbr
, channel
, p_XLR
->X_L
, 0, dont_process
, downSampledSBR
);
474 /* subband synthesis */
477 sbr_qmf_synthesis_32(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, channel
);
479 sbr_qmf_synthesis_64(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, channel
);
482 if (sbr
->bs_header_flag
)
483 sbr
->just_seeked
= 0;
485 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
487 ret
= sbr_save_prev_data(sbr
, 0);
491 sbr_save_matrix(sbr
, 0);
495 //#define POST_QMF_PRINT
496 #ifdef POST_QMF_PRINT
499 for (i
= 0; i
< 2048; i
++)
501 printf("%d\n", channel
[i
]);
510 #if (defined(PS_DEC) || defined(DRM_PS))
511 uint8_t sbrDecodeSingleFramePS(sbr_info
*sbr
, real_t
*left_channel
, real_t
*right_channel
,
512 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
515 uint8_t dont_process
= 0;
518 memset(p_XLR
->X_L
, 0, sizeof(*p_XLR
->X_L
));
519 memset(p_XLR
->X_R
, 0, sizeof(*p_XLR
->X_R
));
523 /* case can occur due to bit errors */
524 if (sbr
->id_aac
!= ID_SCE
&& sbr
->id_aac
!= ID_LFE
)
527 if (sbr
->ret
|| (sbr
->header_count
== 0))
529 /* don't process just upsample */
532 /* Re-activate reset for next frame */
533 if (sbr
->ret
&& sbr
->Reset
)
534 sbr
->bs_start_freq_prev
= -1;
539 sbr
->just_seeked
= 1;
541 sbr
->just_seeked
= 0;
544 sbr_process_channel(sbr
, left_channel
, p_XLR
->X_L
, 0, dont_process
, downSampledSBR
);
546 /* copy some extra data for PS */
547 for (l
= 32; l
< 38; l
++)
549 for (k
= 0; k
< 5; k
++)
551 QMF_RE(p_XLR
->X_L
[l
][k
]) = QMF_RE(sbr
->Xsbr
[0][sbr
->tHFAdj
+l
][k
]);
552 QMF_IM(p_XLR
->X_L
[l
][k
]) = QMF_IM(sbr
->Xsbr
[0][sbr
->tHFAdj
+l
][k
]);
556 /* perform parametric stereo */
560 drm_ps_decode(sbr
->drm_ps
, (sbr
->ret
> 0), sbr
->sample_rate
, p_XLR
->X_L
, p_XLR
->X_R
);
564 ps_decode(&sbr
->ps
, p_XLR
->X_L
, p_XLR
->X_R
);
570 /* subband synthesis */
573 sbr_qmf_synthesis_32(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, left_channel
);
574 sbr_qmf_synthesis_32(sbr
, &sbr
->qmfs
[1], p_XLR
->X_R
, right_channel
);
576 sbr_qmf_synthesis_64(sbr
, &sbr
->qmfs
[0], p_XLR
->X_L
, left_channel
);
577 sbr_qmf_synthesis_64(sbr
, &sbr
->qmfs
[1], p_XLR
->X_R
, right_channel
);
580 if (sbr
->bs_header_flag
)
581 sbr
->just_seeked
= 0;
583 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
585 ret
= sbr_save_prev_data(sbr
, 0);
589 sbr_save_matrix(sbr
, 0);