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 static qmf_t X_left
[MAX_NTSRHFG
][64] MEM_ALIGN_ATTR
;// = {{0}};
47 static qmf_t X_right
[MAX_NTSRHFG
][64] MEM_ALIGN_ATTR
;// = {{0}}; /* must set this to 0 */
50 /* static function declarations */
51 static uint8_t sbr_save_prev_data(sbr_info
*sbr
, uint8_t ch
);
52 static void sbr_save_matrix(sbr_info
*sbr
, uint8_t ch
);
55 sbr_info
*sbrDecodeInit(uint16_t framelength
, uint8_t id_aac
,
56 uint32_t sample_rate
, uint8_t downSampledSBR
62 sbr_info
*sbr
= faad_malloc(sizeof(sbr_info
));
63 memset(sbr
, 0, sizeof(sbr_info
));
65 /* save id of the parent element */
67 sbr
->sample_rate
= sample_rate
;
69 sbr
->bs_freq_scale
= 2;
70 sbr
->bs_alter_scale
= 1;
71 sbr
->bs_noise_bands
= 2;
72 sbr
->bs_limiter_bands
= 2;
73 sbr
->bs_limiter_gains
= 2;
74 sbr
->bs_interpol_freq
= 1;
75 sbr
->bs_smoothing_mode
= 1;
76 sbr
->bs_start_freq
= 5;
78 sbr
->bs_samplerate_mode
= 1;
79 sbr
->prevEnvIsShort
[0] = -1;
80 sbr
->prevEnvIsShort
[1] = -1;
81 sbr
->header_count
= 0;
85 sbr
->Is_DRM_SBR
= IsDRM
;
87 sbr
->tHFGen
= T_HFGEN
;
88 sbr
->tHFAdj
= T_HFADJ
;
93 sbr
->frame_len
= framelength
;
96 sbr
->bs_start_freq_prev
= -1;
98 if (framelength
== 960)
100 sbr
->numTimeSlotsRate
= RATE
* NO_TIME_SLOTS_960
;
101 sbr
->numTimeSlots
= NO_TIME_SLOTS_960
;
103 sbr
->numTimeSlotsRate
= RATE
* NO_TIME_SLOTS
;
104 sbr
->numTimeSlots
= NO_TIME_SLOTS
;
107 sbr
->GQ_ringbuf_index
[0] = 0;
108 sbr
->GQ_ringbuf_index
[1] = 0;
110 if (id_aac
== ID_CPE
)
114 sbr
->qmfa
[0] = qmfa_init(32);
115 sbr
->qmfa
[1] = qmfa_init(32);
116 sbr
->qmfs
[0] = qmfs_init((downSampledSBR
)?32:64);
117 sbr
->qmfs
[1] = qmfs_init((downSampledSBR
)?32:64);
119 for (j
= 0; j
< 5; j
++)
121 sbr
->G_temp_prev
[0][j
] = faad_malloc(64*sizeof(real_t
));
122 sbr
->G_temp_prev
[1][j
] = faad_malloc(64*sizeof(real_t
));
123 sbr
->Q_temp_prev
[0][j
] = faad_malloc(64*sizeof(real_t
));
124 sbr
->Q_temp_prev
[1][j
] = faad_malloc(64*sizeof(real_t
));
127 memset(sbr
->Xsbr
[0], 0, (sbr
->numTimeSlotsRate
+sbr
->tHFGen
)*64 * sizeof(qmf_t
));
128 memset(sbr
->Xsbr
[1], 0, (sbr
->numTimeSlotsRate
+sbr
->tHFGen
)*64 * sizeof(qmf_t
));
132 sbr
->qmfa
[0] = qmfa_init(32);
133 sbr
->qmfs
[0] = qmfs_init((downSampledSBR
)?32:64);
136 for (j
= 0; j
< 5; j
++)
138 sbr
->G_temp_prev
[0][j
] = faad_malloc(64*sizeof(real_t
));
139 sbr
->Q_temp_prev
[0][j
] = faad_malloc(64*sizeof(real_t
));
142 memset(sbr
->Xsbr
[0], 0, (sbr
->numTimeSlotsRate
+sbr
->tHFGen
)*64 * sizeof(qmf_t
));
148 void sbrDecodeEnd(sbr_info
*sbr
)
154 qmfa_end(sbr
->qmfa
[0]);
155 qmfs_end(sbr
->qmfs
[0]);
156 if (sbr
->qmfs
[1] != NULL
)
158 qmfa_end(sbr
->qmfa
[1]);
159 qmfs_end(sbr
->qmfs
[1]);
162 for (j
= 0; j
< 5; j
++)
164 if (sbr
->G_temp_prev
[0][j
]) faad_free(sbr
->G_temp_prev
[0][j
]);
165 if (sbr
->Q_temp_prev
[0][j
]) faad_free(sbr
->Q_temp_prev
[0][j
]);
166 if (sbr
->G_temp_prev
[1][j
]) faad_free(sbr
->G_temp_prev
[1][j
]);
167 if (sbr
->Q_temp_prev
[1][j
]) faad_free(sbr
->Q_temp_prev
[1][j
]);
176 if (sbr
->drm_ps
!= NULL
)
177 drm_ps_free(sbr
->drm_ps
);
184 static uint8_t sbr_save_prev_data(sbr_info
*sbr
, uint8_t ch
)
188 /* save data for next frame */
189 sbr
->kx_prev
= sbr
->kx
;
190 sbr
->M_prev
= sbr
->M
;
191 sbr
->bsco_prev
= sbr
->bsco
;
193 sbr
->L_E_prev
[ch
] = sbr
->L_E
[ch
];
195 /* sbr->L_E[ch] can become 0 on files with bit errors */
196 if (sbr
->L_E
[ch
] <= 0)
199 sbr
->f_prev
[ch
] = sbr
->f
[ch
][sbr
->L_E
[ch
] - 1];
200 for (i
= 0; i
< MAX_M
; i
++)
202 sbr
->E_prev
[ch
][i
] = sbr
->E
[ch
][i
][sbr
->L_E
[ch
] - 1];
203 sbr
->Q_prev
[ch
][i
] = sbr
->Q
[ch
][i
][sbr
->L_Q
[ch
] - 1];
206 for (i
= 0; i
< MAX_M
; i
++)
208 sbr
->bs_add_harmonic_prev
[ch
][i
] = sbr
->bs_add_harmonic
[ch
][i
];
210 sbr
->bs_add_harmonic_flag_prev
[ch
] = sbr
->bs_add_harmonic_flag
[ch
];
212 if (sbr
->l_A
[ch
] == sbr
->L_E
[ch
])
213 sbr
->prevEnvIsShort
[ch
] = 0;
215 sbr
->prevEnvIsShort
[ch
] = -1;
220 static void sbr_save_matrix(sbr_info
*sbr
, uint8_t ch
)
224 for (i
= 0; i
< sbr
->tHFGen
; i
++)
226 memmove(sbr
->Xsbr
[ch
][i
], sbr
->Xsbr
[ch
][i
+sbr
->numTimeSlotsRate
], 64 * sizeof(qmf_t
));
228 for (i
= sbr
->tHFGen
; i
< MAX_NTSRHFG
; i
++)
230 memset(sbr
->Xsbr
[ch
][i
], 0, 64 * sizeof(qmf_t
));
235 real_t deg
[64] MEM_ALIGN_ATTR
;
238 static void sbr_process_channel(sbr_info
*sbr
, real_t
*channel_buf
, qmf_t X
[MAX_NTSR
][64],
239 uint8_t ch
, uint8_t dont_process
,
240 const uint8_t downSampledSBR
)
244 (void)downSampledSBR
;
248 sbr
->bsco
= max((int32_t)sbr
->maxAACLine
*32/(int32_t)sbr
->frame_len
- (int32_t)sbr
->kx
, 0);
257 //#define PRE_QMF_PRINT
261 for (i
= 0; i
< 1024; i
++)
263 printf("%d\n", channel_buf
[i
]);
269 /* subband analysis */
271 sbr_qmf_analysis_32(sbr
, sbr
->qmfa
[ch
], channel_buf
, sbr
->Xsbr
[ch
], sbr
->tHFGen
, 32);
273 sbr_qmf_analysis_32(sbr
, sbr
->qmfa
[ch
], channel_buf
, sbr
->Xsbr
[ch
], sbr
->tHFGen
, sbr
->kx
);
278 /* insert high frequencies here */
279 /* hf generation using patching */
280 hf_generation(sbr
, sbr
->Xsbr
[ch
], sbr
->Xsbr
[ch
]
288 for (l
= sbr
->t_E
[ch
][0]; l
< sbr
->t_E
[ch
][sbr
->L_E
[ch
]]; l
++)
290 for (k
= 0; k
< sbr
->kx
; k
++)
292 QMF_RE(sbr
->Xsbr
[ch
][sbr
->tHFAdj
+ l
][k
]) = 0;
299 hf_adjustment(sbr
, sbr
->Xsbr
[ch
]
307 if ((sbr
->just_seeked
!= 0) || dont_process
)
309 for (l
= 0; l
< sbr
->numTimeSlotsRate
; l
++)
311 for (k
= 0; k
< 32; k
++)
313 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
314 #ifndef SBR_LOW_POWER
315 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
318 for (k
= 32; k
< 64; k
++)
321 #ifndef SBR_LOW_POWER
327 for (l
= 0; l
< sbr
->numTimeSlotsRate
; l
++)
329 uint8_t kx_band
, M_band
, bsco_band
;
331 if (l
< sbr
->t_E
[ch
][0])
333 kx_band
= sbr
->kx_prev
;
334 M_band
= sbr
->M_prev
;
335 bsco_band
= sbr
->bsco_prev
;
339 bsco_band
= sbr
->bsco
;
342 #ifndef SBR_LOW_POWER
343 for (k
= 0; k
< kx_band
+ bsco_band
; k
++)
345 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
346 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
348 for (k
= kx_band
+ bsco_band
; k
< kx_band
+ M_band
; k
++)
350 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
351 QMF_IM(X
[l
][k
]) = QMF_IM(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
353 for (k
= max(kx_band
+ bsco_band
, kx_band
+ M_band
); k
< 64; k
++)
359 for (k
= 0; k
< kx_band
+ bsco_band
; k
++)
361 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
363 for (k
= kx_band
+ bsco_band
; k
< min(kx_band
+ M_band
, 63); k
++)
365 QMF_RE(X
[l
][k
]) = QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][k
]);
367 for (k
= max(kx_band
+ bsco_band
, kx_band
+ M_band
); k
< 64; k
++)
371 QMF_RE(X
[l
][kx_band
- 1 + bsco_band
]) +=
372 QMF_RE(sbr
->Xsbr
[ch
][l
+ sbr
->tHFAdj
][kx_band
- 1 + bsco_band
]);
378 uint8_t sbrDecodeCoupleFrame(sbr_info
*sbr
, real_t
*left_chan
, real_t
*right_chan
,
379 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
381 uint8_t dont_process
= 0;
387 /* case can occur due to bit errors */
388 if (sbr
->id_aac
!= ID_CPE
)
391 if (sbr
->ret
|| (sbr
->header_count
== 0))
393 /* don't process just upsample */
396 /* Re-activate reset for next frame */
397 if (sbr
->ret
&& sbr
->Reset
)
398 sbr
->bs_start_freq_prev
= -1;
403 sbr
->just_seeked
= 1;
405 sbr
->just_seeked
= 0;
408 sbr_process_channel(sbr
, left_chan
, X_left
, 0, dont_process
, downSampledSBR
);
409 /* subband synthesis */
412 sbr_qmf_synthesis_32(sbr
, sbr
->qmfs
[0], X_left
, left_chan
);
414 sbr_qmf_synthesis_64(sbr
, sbr
->qmfs
[0], X_left
, left_chan
);
417 sbr_process_channel(sbr
, right_chan
, X_right
, 1, dont_process
, downSampledSBR
);
418 /* subband synthesis */
421 sbr_qmf_synthesis_32(sbr
, sbr
->qmfs
[1], X_right
, right_chan
);
423 sbr_qmf_synthesis_64(sbr
, sbr
->qmfs
[1], X_right
, right_chan
);
426 if (sbr
->bs_header_flag
)
427 sbr
->just_seeked
= 0;
429 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
431 ret
= sbr_save_prev_data(sbr
, 0);
433 ret
= sbr_save_prev_data(sbr
, 1);
437 sbr_save_matrix(sbr
, 0);
438 sbr_save_matrix(sbr
, 1);
442 //#define POST_QMF_PRINT
443 #ifdef POST_QMF_PRINT
446 for (i
= 0; i
< 2048; i
++)
448 printf("%d\n", left_chan
[i
]);
450 for (i
= 0; i
< 2048; i
++)
452 printf("%d\n", right_chan
[i
]);
460 uint8_t sbrDecodeSingleFrame(sbr_info
*sbr
, real_t
*channel
,
461 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
463 uint8_t dont_process
= 0;
469 /* case can occur due to bit errors */
470 if (sbr
->id_aac
!= ID_SCE
&& sbr
->id_aac
!= ID_LFE
)
473 if (sbr
->ret
|| (sbr
->header_count
== 0))
475 /* don't process just upsample */
478 /* Re-activate reset for next frame */
479 if (sbr
->ret
&& sbr
->Reset
)
480 sbr
->bs_start_freq_prev
= -1;
485 sbr
->just_seeked
= 1;
487 sbr
->just_seeked
= 0;
490 sbr_process_channel(sbr
, channel
, X_left
, 0, dont_process
, downSampledSBR
);
491 /* subband synthesis */
494 sbr_qmf_synthesis_32(sbr
, sbr
->qmfs
[0], X_left
, channel
);
496 sbr_qmf_synthesis_64(sbr
, sbr
->qmfs
[0], X_left
, channel
);
499 if (sbr
->bs_header_flag
)
500 sbr
->just_seeked
= 0;
502 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
504 ret
= sbr_save_prev_data(sbr
, 0);
508 sbr_save_matrix(sbr
, 0);
512 //#define POST_QMF_PRINT
513 #ifdef POST_QMF_PRINT
516 for (i
= 0; i
< 2048; i
++)
518 printf("%d\n", channel
[i
]);
527 #if (defined(PS_DEC) || defined(DRM_PS))
528 uint8_t sbrDecodeSingleFramePS(sbr_info
*sbr
, real_t
*left_channel
, real_t
*right_channel
,
529 const uint8_t just_seeked
, const uint8_t downSampledSBR
)
532 uint8_t dont_process
= 0;
535 memset(X_left
,0,sizeof(X_left
));
536 memset(X_right
,0,sizeof(X_right
));
540 /* case can occur due to bit errors */
541 if (sbr
->id_aac
!= ID_SCE
&& sbr
->id_aac
!= ID_LFE
)
544 if (sbr
->ret
|| (sbr
->header_count
== 0))
546 /* don't process just upsample */
549 /* Re-activate reset for next frame */
550 if (sbr
->ret
&& sbr
->Reset
)
551 sbr
->bs_start_freq_prev
= -1;
556 sbr
->just_seeked
= 1;
558 sbr
->just_seeked
= 0;
561 if (sbr
->qmfs
[1] == NULL
)
563 sbr
->qmfs
[1] = qmfs_init((downSampledSBR
)?32:64);
566 sbr_process_channel(sbr
, left_channel
, X_left
, 0, dont_process
, downSampledSBR
);
568 /* copy some extra data for PS */
569 for (l
= 32; l
< 38; l
++)
571 for (k
= 0; k
< 5; k
++)
573 QMF_RE(X_left
[l
][k
]) = QMF_RE(sbr
->Xsbr
[0][sbr
->tHFAdj
+l
][k
]);
574 QMF_IM(X_left
[l
][k
]) = QMF_IM(sbr
->Xsbr
[0][sbr
->tHFAdj
+l
][k
]);
578 /* perform parametric stereo */
582 drm_ps_decode(sbr
->drm_ps
, (sbr
->ret
> 0), sbr
->sample_rate
, X_left
, X_right
);
586 ps_decode(sbr
->ps
, X_left
, X_right
);
592 /* subband synthesis */
595 sbr_qmf_synthesis_32(sbr
, sbr
->qmfs
[0], X_left
, left_channel
);
596 sbr_qmf_synthesis_32(sbr
, sbr
->qmfs
[1], X_right
, right_channel
);
598 sbr_qmf_synthesis_64(sbr
, sbr
->qmfs
[0], X_left
, left_channel
);
599 sbr_qmf_synthesis_64(sbr
, sbr
->qmfs
[1], X_right
, right_channel
);
602 if (sbr
->bs_header_flag
)
603 sbr
->just_seeked
= 0;
605 if (sbr
->header_count
!= 0 && sbr
->ret
== 0)
607 ret
= sbr_save_prev_data(sbr
, 0);
611 sbr_save_matrix(sbr
, 0);