diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-08-04 22:39:25 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-08-04 23:51:43 +0200 |
commit | e776ee8f294984f7643a3c45db803c7266e1edfd (patch) | |
tree | a1fd00ab7a0760ec0f2848aed9dc3f79d889e816 /libavresample | |
parent | 88fc1438c693ffb7793aeb111d89775440491840 (diff) | |
parent | 8821ae649e61097ec57ca58472c3e4239c82913c (diff) | |
download | ffmpeg-e776ee8f294984f7643a3c45db803c7266e1edfd.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
lavr: fix handling of custom mix matrices
fate: force pix_fmt in lagarith-rgb32 test
fate: add tests for lagarith lossless video codec.
ARMv6: vp8: fix stack allocation with Apple's assembler
ARM: vp56: allow inline asm to build with clang
fft: 3dnow: fix register name typo in DECL_IMDCT macro
x86: dct32: port to cpuflags
x86: build: replace mmx2 by mmxext
Revert "wmapro: prevent division by zero when sample rate is unspecified"
wmapro: prevent division by zero when sample rate is unspecified
lagarith: fix color plane inversion for YUY2 output.
lagarith: pad RGB buffer by 1 byte.
dsputil: make add_hfyu_left_prediction_sse4() support unaligned src.
Conflicts:
doc/APIchanges
libavcodec/lagarith.c
libavfilter/x86/gradfun.c
libavutil/cpu.h
libavutil/version.h
libswscale/utils.c
libswscale/version.h
libswscale/x86/yuv2rgb.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavresample')
-rw-r--r-- | libavresample/audio_mix.c | 10 | ||||
-rw-r--r-- | libavresample/audio_mix_matrix.c | 21 | ||||
-rw-r--r-- | libavresample/utils.c | 5 |
3 files changed, 26 insertions, 10 deletions
diff --git a/libavresample/audio_mix.c b/libavresample/audio_mix.c index 2c2a356844..e8ab2e3ee7 100644 --- a/libavresample/audio_mix.c +++ b/libavresample/audio_mix.c @@ -314,7 +314,15 @@ int ff_audio_mix_init(AVAudioResampleContext *avr) } /* build matrix if the user did not already set one */ - if (!avr->am->matrix) { + if (avr->am->matrix) { + if (avr->am->coeff_type != avr->mix_coeff_type || + avr->am->in_layout != avr->in_channel_layout || + avr->am->out_layout != avr->out_channel_layout) { + av_log(avr, AV_LOG_ERROR, + "Custom matrix does not match current parameters\n"); + return AVERROR(EINVAL); + } + } else { int i, j; char in_layout_name[128]; char out_layout_name[128]; diff --git a/libavresample/audio_mix_matrix.c b/libavresample/audio_mix_matrix.c index f7121c846d..522a177f20 100644 --- a/libavresample/audio_mix_matrix.c +++ b/libavresample/audio_mix_matrix.c @@ -294,8 +294,8 @@ int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix, in_channels = av_get_channel_layout_nb_channels(avr->in_channel_layout); out_channels = av_get_channel_layout_nb_channels(avr->out_channel_layout); - if ( in_channels < 0 || in_channels > AVRESAMPLE_MAX_CHANNELS || - out_channels < 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) { + if ( in_channels <= 0 || in_channels > AVRESAMPLE_MAX_CHANNELS || + out_channels <= 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) { av_log(avr, AV_LOG_ERROR, "Invalid channel layouts\n"); return AVERROR(EINVAL); } @@ -332,6 +332,7 @@ int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix, av_log(avr, AV_LOG_ERROR, "Invalid mix coeff type\n"); return AVERROR(EINVAL); } + return 0; } @@ -343,14 +344,16 @@ int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, in_channels = av_get_channel_layout_nb_channels(avr->in_channel_layout); out_channels = av_get_channel_layout_nb_channels(avr->out_channel_layout); - if ( in_channels < 0 || in_channels > AVRESAMPLE_MAX_CHANNELS || - out_channels < 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) { + if ( in_channels <= 0 || in_channels > AVRESAMPLE_MAX_CHANNELS || + out_channels <= 0 || out_channels > AVRESAMPLE_MAX_CHANNELS) { av_log(avr, AV_LOG_ERROR, "Invalid channel layouts\n"); return AVERROR(EINVAL); } - if (avr->am->matrix) - av_freep(avr->am->matrix); + if (avr->am->matrix) { + av_free(avr->am->matrix[0]); + avr->am->matrix = NULL; + } #define CONVERT_MATRIX(type, expr) \ avr->am->matrix_## type[0] = av_mallocz(out_channels * in_channels * \ @@ -386,5 +389,11 @@ int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, /* TODO: detect situations where we can just swap around pointers instead of doing matrix multiplications with 0.0 and 1.0 */ + /* set AudioMix params */ + avr->am->in_layout = avr->in_channel_layout; + avr->am->out_layout = avr->out_channel_layout; + avr->am->in_channels = in_channels; + avr->am->out_channels = out_channels; + return 0; } diff --git a/libavresample/utils.c b/libavresample/utils.c index 05ee65c68d..7588111003 100644 --- a/libavresample/utils.c +++ b/libavresample/utils.c @@ -48,9 +48,8 @@ int avresample_open(AVAudioResampleContext *avr) avr->resample_channels = FFMIN(avr->in_channels, avr->out_channels); avr->downmix_needed = avr->in_channels > avr->out_channels; avr->upmix_needed = avr->out_channels > avr->in_channels || - avr->am->matrix || - (avr->out_channels == avr->in_channels && - avr->in_channel_layout != avr->out_channel_layout); + (!avr->downmix_needed && (avr->am->matrix || + avr->in_channel_layout != avr->out_channel_layout)); avr->mixing_needed = avr->downmix_needed || avr->upmix_needed; /* set resampling parameters */ |