@ -572,11 +572,22 @@ static void reduce_matrix(AudioMix *am, const double *matrix, int stride)
int skip = 1 ;
for ( o = 0 ; o < am - > out_channels ; o + + ) {
int i0 ;
if ( ( o ! = i & & matrix [ o * stride + i ] ! = 0.0 ) | |
( o = = i & & matrix [ o * stride + i ] ! = 1.0 ) ) {
skip = 0 ;
break ;
}
/* if the input contributes fully to the output, also check that no
other inputs contribute to this output */
if ( o = = i ) {
for ( i0 = 0 ; i0 < am - > in_channels ; i0 + + ) {
if ( i0 ! = i & & matrix [ o * stride + i0 ] ! = 0.0 ) {
skip = 0 ;
break ;
}
}
}
}
if ( skip ) {
am - > input_skip [ i ] = 1 ;
@ -607,6 +618,7 @@ static void reduce_matrix(AudioMix *am, const double *matrix, int stride)
corresponding input channel */
for ( o = 0 ; o < FFMIN ( am - > in_channels , am - > out_channels ) ; o + + ) {
int skip = 1 ;
int o0 ;
for ( i = 0 ; i < am - > in_channels ; i + + ) {
if ( ( o ! = i & & matrix [ o * stride + i ] ! = 0.0 ) | |
@ -615,6 +627,15 @@ static void reduce_matrix(AudioMix *am, const double *matrix, int stride)
break ;
}
}
/* check if the corresponding input channel makes a contribution to
any other output channel */
i = o ;
for ( o0 = 0 ; o0 < am - > out_channels ; o0 + + ) {
if ( o0 ! = i & & matrix [ o0 * stride + i ] ! = 0.0 ) {
skip = 0 ;
break ;
}
}
if ( skip ) {
am - > output_skip [ o ] = 1 ;
am - > out_matrix_channels - - ;
@ -673,20 +694,20 @@ int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride)
am - > matrix = ( void * * ) am - > matrix_ # # type ;
if ( am - > in_matrix_channels & & am - > out_matrix_channels ) {
switch ( am - > coeff_type ) {
case AV_MIX_COEFF_TYPE_Q8 :
CONVERT_MATRIX ( q8 , av_clip_int16 ( lrint ( 256.0 * v ) ) )
break ;
case AV_MIX_COEFF_TYPE_Q15 :
CONVERT_MATRIX ( q15 , av_clipl_int32 ( llrint ( 32768.0 * v ) ) )
break ;
case AV_MIX_COEFF_TYPE_FLT :
CONVERT_MATRIX ( flt , v )
break ;
default :
av_log ( am - > avr , AV_LOG_ERROR , " Invalid mix coeff type \n " ) ;
return AVERROR ( EINVAL ) ;
}
switch ( am - > coeff_type ) {
case AV_MIX_COEFF_TYPE_Q8 :
CONVERT_MATRIX ( q8 , av_clip_int16 ( lrint ( 256.0 * v ) ) )
break ;
case AV_MIX_COEFF_TYPE_Q15 :
CONVERT_MATRIX ( q15 , av_clipl_int32 ( llrint ( 32768.0 * v ) ) )
break ;
case AV_MIX_COEFF_TYPE_FLT :
CONVERT_MATRIX ( flt , v )
break ;
default :
av_log ( am - > avr , AV_LOG_ERROR , " Invalid mix coeff type \n " ) ;
return AVERROR ( EINVAL ) ;
}
}
ret = mix_function_init ( am ) ;