@ -545,6 +545,13 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {
floor_setup - > data . t0 . rate = get_bits ( gb , 16 ) ;
floor_setup - > data . t0 . bark_map_size = get_bits ( gb , 16 ) ;
floor_setup - > data . t0 . amplitude_bits = get_bits ( gb , 6 ) ;
/* zero would result in a div by zero later *
* 2 ^ 0 - 1 = = 0 */
if ( floor_setup - > data . t0 . amplitude_bits = = 0 ) {
av_log ( vc - > avccontext , AV_LOG_ERROR ,
" Floor 0 amplitude bits is 0. \n " ) ;
return 1 ;
}
floor_setup - > data . t0 . amplitude_offset = get_bits ( gb , 8 ) ;
floor_setup - > data . t0 . num_books = get_bits ( gb , 4 ) + 1 ;
@ -574,7 +581,7 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc) {
floor_setup - > data . t0 . lsp =
av_malloc ( ( floor_setup - > data . t0 . order + 1 + max_codebook_dim )
* sizeof ( float ) ) ;
if ( ! floor_setup - > data . t0 . book_list ) { return 1 ; }
if ( ! floor_setup - > data . t0 . lsp ) { return 1 ; }
}
# ifdef V_DEBUG /* debug output parsed headers */
@ -1067,14 +1074,9 @@ static uint_fast8_t vorbis_floor0_decode(vorbis_context *vc,
/* calculate linear floor value */
{
int_fast32_t pow_of_two = 2 , exponent = vf - > amplitude_bits ;
if ( vf - > amplitude_bits ) {
while ( - - exponent ) { pow_of_two < < = 1 ; }
}
else { pow_of_two = 1 ; }
q = exp ( (
( ( amplitude * vf - > amplitude_offset ) /
( ( pow_of_two - 1 ) * sqrt ( p + q ) ) )
( ( ( 1 < < vf - > amplitude_bits ) - 1 ) * sqrt ( p + q ) ) )
- vf - > amplitude_offset ) * .11512925f
) ;
}