@ -139,11 +139,9 @@ typedef struct {
float * coeffs ; ///< pointer to the subframe decode buffer
uint16_t num_vec_coeffs ; ///< number of vector coded coefficients
DECLARE_ALIGNED ( 16 , float , out ) [ WMALL_BLOCK_MAX_SIZE + WMALL_BLOCK_MAX_SIZE / 2 ] ; ///< output buffer
int transient_counter ; ///< number of transient samples from the beginning of transient zone
} WmallChannelCtx ;
/* XXX: probably we don't need subframe_config[],
WmallChannelCtx holds all the necessary data . */
/**
* @ brief channel group for channel transformations
*/
@ -310,6 +308,19 @@ static void av_cold dump_context(WmallDecodeCtx *s)
PRINT ( " num channels " , s - > num_channels ) ;
}
static int dump_int_buffer ( int * buffer , int length , int delimiter )
{
int i ;
for ( i = 0 ; i < length ; i + + ) {
if ( ! ( i % delimiter ) )
av_log ( 0 , 0 , " \n [%d] " , i ) ;
av_log ( 0 , 0 , " %d, " , buffer [ i ] ) ;
}
av_log ( 0 , 0 , " \n " ) ;
}
/**
* @ brief Uninitialize the decoder and free all resources .
* @ param avctx codec context
@ -434,8 +445,8 @@ static int decode_subframe_length(WmallDecodeCtx *s, int offset)
if ( offset = = s - > samples_per_frame - s - > min_samples_per_subframe )
return s - > min_samples_per_subframe ;
len = av_log2 ( s - > max_num_subframes - 1 ) + 1 ; // XXX: 5.3.3
frame_len_ratio = get_bits ( & s - > gb , len ) ; // XXX: tile_size_ratio
len = av_log2 ( s - > max_num_subframes - 1 ) + 1 ;
frame_len_ratio = get_bits ( & s - > gb , len ) ;
subframe_len = s - > min_samples_per_subframe * ( frame_len_ratio + 1 ) ;
@ -469,7 +480,7 @@ static int decode_subframe_length(WmallDecodeCtx *s, int offset)
* @ param s context
* @ return 0 on success , < 0 in case of an error
*/
static int decode_tilehdr ( WmallDecodeCtx * s ) /* XXX: decode_tile_configuration() [Table 9] */
static int decode_tilehdr ( WmallDecodeCtx * s )
{
uint16_t num_samples [ WMALL_MAX_CHANNELS ] ; /**< sum of samples for all currently known subframes of a channel */
uint8_t contains_subframe [ WMALL_MAX_CHANNELS ] ; /**< flag indicating if a channel contains the current subframe */
@ -490,8 +501,8 @@ static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configur
memset ( num_samples , 0 , sizeof ( num_samples ) ) ;
if ( s - > max_num_subframes = = 1 | | get_bits1 ( & s - > gb ) ) // XXX: locate in the spec
fixed_channel_layout = 1 ; // XXX: tile_aligned ?
if ( s - > max_num_subframes = = 1 | | get_bits1 ( & s - > gb ) )
fixed_channel_layout = 1 ;
/** loop until the frame data is split between the subframes */
do {
@ -505,14 +516,14 @@ static int decode_tilehdr(WmallDecodeCtx *s) /* XXX: decode_tile_configur
contains_subframe [ c ] = 1 ;
}
else {
contains_subframe [ c ] = get_bits1 ( & s - > gb ) ; // XXX: locate in the spec
contains_subframe [ c ] = get_bits1 ( & s - > gb ) ;
}
} else
contains_subframe [ c ] = 0 ;
}
/** get subframe length, subframe_len == 0 is not allowed */
if ( ( subframe_len = decode_subframe_length ( s , min_channel_len ) ) < = 0 ) //XXX: this reads tile_size_ratio
if ( ( subframe_len = decode_subframe_length ( s , min_channel_len ) ) < = 0 )
return AVERROR_INVALIDDATA ;
/** add subframes to the individual channels and find new min_channel_len */
min_channel_len + = subframe_len ;
@ -663,8 +674,14 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
int i = 0 ;
unsigned int ave_mean ;
s - > transient [ ch ] = get_bits1 ( & s - > gb ) ;
if ( s - > transient [ ch ] )
if ( s - > transient [ ch ] ) {
s - > transient_pos [ ch ] = get_bits ( & s - > gb , av_log2 ( tile_size ) ) ;
if ( s - > transient_pos [ ch ] )
s - > transient [ ch ] = 0 ;
s - > channel [ ch ] . transient_counter =
FFMAX ( s - > channel [ ch ] . transient_counter , s - > samples_per_frame / 2 ) ;
} else if ( s - > channel [ ch ] . transient_counter )
s - > transient [ ch ] = 1 ;
if ( s - > seekable_tile ) {
ave_mean = get_bits ( & s - > gb , s - > bits_per_sample ) ;
@ -679,7 +696,7 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
s - > channel_residues [ ch ] [ 0 ] = get_sbits ( & s - > gb , s - > bits_per_sample ) ;
i + + ;
}
av_log ( 0 , 0 , " %8d: " , num_logged_tiles + + ) ;
//av_log(0, 0, "%8d: ", num_logged_tiles++);
for ( ; i < tile_size ; i + + ) {
int quo = 0 , rem , rem_bits , residue ;
while ( get_bits1 ( & s - > gb ) )
@ -700,11 +717,10 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
residue = residue > > 1 ;
s - > channel_residues [ ch ] [ i ] = residue ;
//if (num_logged_tiles < 1)
av_log ( 0 , 0 , " %4d " , residue ) ;
// dprintf(s->avctx, "%5d: %5d %10d %12d %12d %5d %-16d %04x\n",i, quo, ave_mean, s->ave_sum[ch], rem, rem_bits, s->channel_residues[ch][i], show_bits(&s->gb, 16));
/*if (num_logged_tiles < 1)
av_log ( 0 , 0 , " %4d " , residue ) ; */
}
av_log ( 0 , 0 , " \n Tile size = %d \n " , tile_size ) ;
dump_int_buffer ( s - > channel_residues [ ch ] , tile_size , 16 ) ;
return 0 ;
@ -752,13 +768,21 @@ static void clear_codec_buffers(WmallDecodeCtx *s)
}
}
/**
* @ brief Resets filter parameters and transient area at new seekable tile
*/
static void reset_codec ( WmallDecodeCtx * s )
{
int ich , ilms ;
s - > mclms_recent = s - > mclms_order * s - > num_channels ;
for ( ich = 0 ; ich < s - > num_channels ; ich + + )
for ( ich = 0 ; ich < s - > num_channels ; ich + + ) {
for ( ilms = 0 ; ilms < s - > cdlms_ttl [ ich ] ; ilms + + )
s - > cdlms [ ich ] [ ilms ] . recent = s - > cdlms [ ich ] [ ilms ] . order ;
/* first sample of a seekable subframe is considered as the starting of
a transient area which is samples_per_frame samples long */
s - > channel [ ich ] . transient_counter = s - > samples_per_frame ;
s - > transient [ ich ] = 1 ;
}
}
@ -861,6 +885,39 @@ static void use_normal_update_speed(WmallDecodeCtx *s, int ich)
}
}
static void revert_cdlms ( WmallDecodeCtx * s , int tile_size )
{
int icoef , ich ;
int32_t pred , channel_coeff ;
int ilms , num_lms ;
for ( ich = 0 ; ich < s - > num_channels ; ich + + ) {
if ( ! s - > is_channel_coded [ ich ] )
continue ;
for ( icoef = 0 ; icoef < tile_size ; icoef + + ) {
num_lms = s - > cdlms_ttl [ ich ] ;
channel_coeff = s - > channel_residues [ ich ] [ icoef ] ;
if ( icoef = = s - > transient_pos [ ich ] ) {
s - > transient [ ich ] = 1 ;
use_high_update_speed ( s , ich ) ;
}
for ( ilms = num_lms ; ilms > = 0 ; ilms - - ) {
pred = lms_predict ( s , ich , ilms ) ;
channel_coeff + = pred ;
lms_update ( s , ich , ilms , channel_coeff , pred ) ;
}
if ( s - > transient [ ich ] ) {
- - s - > channel [ ich ] . transient_counter ;
if ( ! s - > channel [ ich ] . transient_counter )
use_normal_update_speed ( s , ich ) ;
}
s - > channel_coeffs [ ich ] [ icoef ] = channel_coeff ;
}
}
}
/**
* @ brief Decode a single subframe ( block ) .
* @ param s codec context
@ -996,7 +1053,7 @@ static int decode_subframe(WmallDecodeCtx *s)
av_log ( s - > avctx , AV_LOG_ERROR , " broken subframe \n " ) ;
return AVERROR_INVALIDDATA ;
}
+ + s - > channel [ c ] . cur_subframe ; // XXX: 6.4
+ + s - > channel [ c ] . cur_subframe ;
}
return 0 ;
}
@ -1025,17 +1082,17 @@ static int decode_frame(WmallDecodeCtx *s)
/** get frame length */
if ( s - > len_prefix )
len = get_bits ( gb , s - > log2_frame_size ) ; // XXX: compressed_frame_size_bits [Table 8]
len = get_bits ( gb , s - > log2_frame_size ) ;
/** decode tile information */
if ( decode_tilehdr ( s ) ) { // should include decode_tile_configuration() [Table 9]
if ( decode_tilehdr ( s ) ) {
s - > packet_loss = 1 ;
return 0 ;
}
/** read drc info */
if ( s - > dynamic_range_compression ) {
s - > drc_gain = get_bits ( gb , 8 ) ; // XXX: drc_frame_scale_factor [Table 8]
s - > drc_gain = get_bits ( gb , 8 ) ;
}
/** no idea what these are for, might be the number of samples