diff --git a/configure b/configure index 3318cf4fef..03d21562fa 100755 --- a/configure +++ b/configure @@ -3414,6 +3414,14 @@ elif enabled mips; then enabled mipsfpu && add_cflags "-mhard-float" && add_asflags "-mhard-float" && check_inline_asm mipsfpu '"madd.d $f0, $f2, $f4, $f6"' +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 diff --git a/libavresample/utils.c b/libavresample/utils.c index 2a0aacd4c0..ad49e880af 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, diff --git a/libavresample/x86/audio_mix.asm b/libavresample/x86/audio_mix.asm index 7f3b5b9080..a3f1af5787 100644 --- a/libavresample/x86/audio_mix.asm +++ b/libavresample/x86/audio_mix.asm @@ -278,7 +278,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