ref: 7af9c20656f528fe2329d91197d4f83094d7715a
dir: /libfaad/rvlc_scale_factors.c/
/* ** FAAD - Freeware Advanced Audio Decoder ** Copyright (C) 2002 M. Bakker ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: rvlc_scale_factors.c,v 1.1 2002/08/05 20:33:38 menno Exp $ **/ #include "common.h" #include <stdlib.h> #include "syntax.h" #include "bits.h" #include "rvlc_scale_factors.h" #ifdef ERROR_RESILIENCE #if 0 uint32_t bits_used, length_of_rvlc_sf; uint8_t bits = 11; sf_concealment = faad_get1bit(ld DEBUGVAR(1,149,"scale_factor_data(): sf_concealment")); rev_global_gain = faad_getbits(ld, 8 DEBUGVAR(1,150,"scale_factor_data(): rev_global_gain")); if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) bits = 9; /* the number of bits used for the huffman codewords */ length_of_rvlc_sf = faad_getbits(ld, bits DEBUGVAR(1,151,"scale_factor_data(): length_of_rvlc_sf")); /* check how many bits are used in decoding the scalefactors A better solution would be to read length_of_rvlc_sf ahead in a buffer and use that to decode the scale factors */ bits_used = faad_get_processed_bits(ld); decode_scale_factors(ics, ld); bits_used = faad_get_processed_bits(ld) - bits_used; /* return an error if the number of decoded bits is not correct FAAD should be able to recover from this, for example by setting all scalefactors to 0 (e.g. muting the frame) */ if (bits_used != length_of_rvlc_sf) return 8; sf_escapes_present; 1 uimsbf if (sf_escapes_present) { length_of_rvlc_escapes; 8 uimsbf for (g = 0; g < num_window_groups; g++) { for (sfb = 0; sfb < max_sfb; sfb++) { if (sect_cb[g][sfb] != ZERO_HCB) { if (is_intensity(g, sfb) && dpcm_is_position[g][sfb] == ESC_FLAG) { rvlc_esc_sf[dpcm_is_position[g][sfb]]; 2..20 vlclbf } else { if (is_noise(g, sfb) && dpcm_noise_nrg[g][sfb] == ESC_FLAG) { rvlc_esc_sf[dpcm_noise_nrg[g][sfb]]; 2..20 vlclbf } else { if (dpcm_sf[g][sfb] == ESC_FLAG) { rvlc_esc_sf[dpcm_sf[g][sfb]]; 2..20 vlclbf } } } } } } if (intensity_used && dpcm_is_position[g][sfb] == ESC_FLAG) { rvlc_esc_sf[dpcm_is_last_position]; 2..20 vlclbf } } if (noise_used) { dpcm_noise_last_position; 9 uimsbf } #endif uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) { uint8_t bits = 9; ics->sf_concealment = faad_get1bit(ld DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment")); ics->rev_global_gain = faad_getbits(ld, 8 DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain")); if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) bits = 11; /* the number of bits used for the huffman codewords */ ics->length_of_rvlc_sf = faad_getbits(ld, bits DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf")); if (ics->noise_used) { ics->dpcm_noise_nrg = faad_getbits(ld, 9 DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg")); ics->length_of_rvlc_sf -= 9; } ics->sf_escapes_present = faad_get1bit(ld DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present")); if (ics->sf_escapes_present) { ics->length_of_rvlc_escapes = faad_getbits(ld, 8 DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes")); } if (ics->noise_used) { ics->dpcm_noise_last_position = faad_getbits(ld, 9 DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position")); } return 0; } uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld) { void *rvlc_buffer = NULL; void *rvlc_esc_buffer = NULL; if (ics->length_of_rvlc_sf > 0) { rvlc_buffer = malloc((bit2byte(ics->length_of_rvlc_sf)+1)*sizeof(uint8_t)); /* We read length_of_rvlc_sf bits here to put it in a seperate bitfile. */ faad_getbitbuffer(ld, rvlc_buffer, ics->length_of_rvlc_sf DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf")); } if (ics->sf_escapes_present) { rvlc_esc_buffer = malloc((bit2byte(ics->length_of_rvlc_escapes)+1)*sizeof(uint8_t)); /* We read length_of_rvlc_escapes bits here to put it in a seperate bitfile. */ faad_getbitbuffer(ld, rvlc_esc_buffer, ics->length_of_rvlc_escapes DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes")); } if (rvlc_esc_buffer) free(rvlc_esc_buffer); if (rvlc_buffer) free(rvlc_buffer); return 0; } #endif