From 5af530f5a95e6e1a8c82dd86bf625aea75fce670 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Wed, 14 Nov 2012 15:56:46 +0000 Subject: [PATCH 1/3] parisc: work around bug in gcc 4.3 and later A bug in tail call optimisation in gcc 4.3 and later on parisc causes numerous tests to fail. Disabling this optimisation gives a working build. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55023 Signed-off-by: Mans Rullgard --- configure | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/configure b/configure index 14a887eaa2..e6d4ecb8d8 100755 --- a/configure +++ b/configure @@ -3077,6 +3077,14 @@ elif enabled mips; then check_inline_asm loongson '"dmult.g $1, $2, $3"' +elif enabled parisc; then + + if enabled gcc; then + case $($cc -dumpversion) in + 4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;; + esac + fi + elif enabled ppc; then enable local_aligned_8 local_aligned_16 From 02738792c5cd18cff8b94deb838db57dbfb4be0a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 1 Nov 2012 10:13:51 -0400 Subject: [PATCH 2/3] lavr: fix the decision for writing directly to the output buffer If there are any samples remaining in the output fifo from previous conversion calls, we have to output those samples first instead of doing direct output of the current samples. --- libavresample/utils.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libavresample/utils.c b/libavresample/utils.c index 378dd483db..2d15e37c4b 100644 --- a/libavresample/utils.c +++ b/libavresample/utils.c @@ -254,7 +254,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr, AudioData input_buffer; AudioData output_buffer; AudioData *current_buffer; - int ret; + int ret, direct_output; /* reset internal buffers */ if (avr->in_buffer) { @@ -276,6 +276,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr, av_dlog(avr, "[start conversion]\n"); /* initialize output_buffer with output data */ + direct_output = output && av_audio_fifo_size(avr->out_fifo) == 0; if (output) { ret = ff_audio_data_init(&output_buffer, output, out_plane_size, avr->out_channels, out_samples, @@ -295,7 +296,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr, current_buffer = &input_buffer; if (avr->upmix_needed && !avr->in_convert_needed && !avr->resample_needed && - !avr->out_convert_needed && output && out_samples >= in_samples) { + !avr->out_convert_needed && direct_output && out_samples >= in_samples) { /* in some rare cases we can copy input to output and upmix directly in the output buffer */ av_dlog(avr, "[copy] %s to output\n", current_buffer->name); @@ -343,7 +344,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr, AudioData *resample_out; int consumed = 0; - if (!avr->out_convert_needed && output && out_samples > 0) + if (!avr->out_convert_needed && direct_output && out_samples > 0) resample_out = &output_buffer; else resample_out = avr->resample_out_buffer; @@ -377,7 +378,7 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr, } if (avr->out_convert_needed) { - if (output && out_samples >= current_buffer->nb_samples) { + if (direct_output && out_samples >= current_buffer->nb_samples) { /* convert directly to output */ av_dlog(avr, "[convert] %s to output\n", current_buffer->name); ret = ff_audio_convert(avr->ac_out, &output_buffer, current_buffer, From 7a9e65aceee678ee2677480579cb3b2208474140 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Mon, 29 Oct 2012 16:18:04 -0400 Subject: [PATCH 3/3] x86: lavr: fix stack allocation for 7 and 8 channel downmixing on x86-32 Fixes crashes on Win32 and stack overruns on x86-32 in general. --- libavresample/x86/audio_mix.asm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libavresample/x86/audio_mix.asm b/libavresample/x86/audio_mix.asm index 47c23e4584..daf0a7b335 100644 --- a/libavresample/x86/audio_mix.asm +++ b/libavresample/x86/audio_mix.asm @@ -272,7 +272,15 @@ cglobal mix_%1_to_%2_%3_flt, 3,in_channels+2,needed_mmregs+matrix_elements_mm, s and rsp, ~(mmsize-1) sub rsp, matrix_elements_stack * mmsize %else - %assign pad matrix_elements_stack * mmsize + (mmsize - gprsize) - (stack_offset & (mmsize - gprsize)) + %assign matrix_stack_size matrix_elements_stack * mmsize + %assign pad matrix_stack_size + (mmsize - gprsize) - (stack_offset & (mmsize - gprsize)) + ; on x86-32 for 7 and 8 channels we need more stack space for src pointers + %if ARCH_X86_32 && in_channels >= 7 + %assign pad pad + 0x10 + %define src5m [rsp+matrix_stack_size+0] + %define src6m [rsp+matrix_stack_size+4] + %define src7m [rsp+matrix_stack_size+8] + %endif SUB rsp, pad %endif %endif