@ -336,7 +336,7 @@ typedef struct {
int scale_factor [ DCA_PRIM_CHANNELS_MAX ] [ DCA_SUBBANDS ] [ 2 ] ; ///< scale factors (2 if transient)
int joint_huff [ DCA_PRIM_CHANNELS_MAX ] ; ///< joint subband scale factors codebook
int joint_scale_factor [ DCA_PRIM_CHANNELS_MAX ] [ DCA_SUBBANDS ] ; ///< joint subband scale factors
float downmix_coef [ DCA_PRIM_CHANNELS_MAX ] [ 2 ] ; ///< stereo downmix coefficients
float downmix_coef [ DCA_PRIM_CHANNELS_MAX + 1 ] [ 2 ] ; ///< stereo downmix coefficients
int dynrange_coef ; ///< dynamic range coefficient
/* Core substream's embedded downmix coefficients (cf. ETSI TS 102 114 V1.4.1)
@ -991,8 +991,8 @@ static void lfe_interpolation_fir(DCAContext *s, int decimation_select,
op2 \
}
static void dca_downmix ( float * * samples , int srcfmt ,
float coef [ DCA_PRIM_CHANNELS_MAX ] [ 2 ] ,
static void dca_downmix ( float * * samples , int srcfmt , int lfe_present ,
float coef [ DCA_PRIM_CHANNELS_MAX + 1 ] [ 2 ] ,
const int8_t * channel_mapping )
{
int c , l , r , sl , sr , s ;
@ -1042,6 +1042,14 @@ static void dca_downmix(float **samples, int srcfmt,
MIX_REAR2 ( samples , sl , sr , 3 , coef ) ) ;
break ;
}
if ( lfe_present ) {
int lf_buf = dca_lfe_index [ srcfmt ] ;
int lf_idx = dca_channels [ srcfmt ] ;
for ( i = 0 ; i < 256 ; i + + ) {
samples [ 0 ] [ i ] + = samples [ lf_buf ] [ i ] * coef [ lf_idx ] [ 0 ] ;
samples [ 1 ] [ i ] + = samples [ lf_buf ] [ i ] * coef [ lf_idx ] [ 1 ] ;
}
}
}
@ -1249,12 +1257,6 @@ static int dca_filter_channels(DCAContext *s, int block_index)
M_SQRT1_2 / 32768.0 /* pcm_to_double[s->source_pcm_res] */ ) ;
}
/* Down mixing */
if ( s - > prim_channels > 2 & &
s - > avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
dca_downmix ( s - > samples_chanptr , s - > amode , s - > downmix_coef , s - > channel_order_tab ) ;
}
/* Generate LFE samples for this subsubframe FIXME!!! */
if ( s - > output & DCA_LFE ) {
lfe_interpolation_fir ( s , s - > lfe , 2 * s - > lfe ,
@ -1264,6 +1266,13 @@ static int dca_filter_channels(DCAContext *s, int block_index)
/* Outputs 20bits pcm samples */
}
/* Downmixing to Stereo */
if ( s - > prim_channels + ! ! s - > lfe > 2 & &
s - > avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
dca_downmix ( s - > samples_chanptr , s - > amode , ! ! s - > lfe , s - > downmix_coef ,
s - > channel_order_tab ) ;
}
return 0 ;
}
@ -1858,7 +1867,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
s - > channel_order_tab [ channels - 1 - ! ! s - > lfe ] < 0 )
return AVERROR_INVALIDDATA ;
if ( s - > prim_channels > 2 & &
if ( s - > prim_channels + ! ! s - > lfe > 2 & &
avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
channels = 2 ;
s - > output = DCA_STEREO ;
@ -1868,12 +1877,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
*
* The decoder can only downmix to 2 - channel , so we need to ensure
* embedded downmix coefficients are actually targeting 2 - channel .
*
* Coefficients for the LFE channel are ignored ( not supported ) */
*/
if ( s - > core_downmix & & ( s - > core_downmix_amode = = DCA_STEREO | |
s - > core_downmix_amode = = DCA_STEREO_TOTAL ) ) {
int sign , code ;
for ( i = 0 ; i < s - > prim_channels ; i + + ) {
for ( i = 0 ; i < s - > prim_channels + ! ! s - > lfe ; i + + ) {
sign = s - > core_downmix_codes [ i ] [ 0 ] & 0x100 ? 1 : - 1 ;
code = s - > core_downmix_codes [ i ] [ 0 ] & 0x0FF ;
s - > downmix_coef [ i ] [ 0 ] = ( ! code ? 0.0f :
@ -1890,18 +1898,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
" Invalid channel mode %d \n " , am ) ;
return AVERROR_INVALIDDATA ;
}
if ( s - > prim_channels > FF_ARRAY_ELEMS ( dca_default_coeffs [ 0 ] ) ) {
if ( s - > prim_channels + ! ! s - > lfe >
FF_ARRAY_ELEMS ( dca_default_coeffs [ 0 ] ) ) {
avpriv_request_sample ( s - > avctx , " Downmixing %d channels " ,
s - > prim_channels ) ;
s - > prim_channels + ! ! s - > lfe ) ;
return AVERROR_PATCHWELCOME ;
}
for ( i = 0 ; i < s - > prim_channels ; i + + ) {
for ( i = 0 ; i < s - > prim_channels + ! ! s - > lfe ; i + + ) {
s - > downmix_coef [ i ] [ 0 ] = dca_default_coeffs [ am ] [ i ] [ 0 ] ;
s - > downmix_coef [ i ] [ 1 ] = dca_default_coeffs [ am ] [ i ] [ 1 ] ;
}
}
av_dlog ( s - > avctx , " Stereo downmix coeffs: \n " ) ;
for ( i = 0 ; i < s - > prim_channels ; i + + ) {
for ( i = 0 ; i < s - > prim_channels + ! ! s - > lfe ; i + + ) {
av_dlog ( s - > avctx , " L, input channel %d = %f \n " , i ,
s - > downmix_coef [ i ] [ 0 ] ) ;
av_dlog ( s - > avctx , " R, input channel %d = %f \n " , i ,