* qatar/master: opt/eval: Include mathematics.h for NAN/INFINITY mathematics: Don't use division by zero in NAN/INFINITY macros wma: Lower the maximum number of channels to 2 x86: cpu: clean up check for cpuid instruction support ARM: generate position independent code to access data symbols Conflicts: libavutil/opt.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
| @@ -26,8 +26,8 @@ function ff_ac3_bit_alloc_calc_bap_armv6, export=1 | |||||
| beq 4f | beq 4f | ||||
| push {r4-r11,lr} | push {r4-r11,lr} | ||||
| add r5, sp, #40 | add r5, sp, #40 | ||||
| movrel r4, X(ff_ac3_bin_to_band_tab) | |||||
| movrel lr, X(ff_ac3_band_start_tab) | |||||
| movrelx r4, X(ff_ac3_bin_to_band_tab), r11 | |||||
| movrelx lr, X(ff_ac3_band_start_tab) | |||||
| ldm r5, {r5-r7} | ldm r5, {r5-r7} | ||||
| ldrb r4, [r4, r2] | ldrb r4, [r4, r2] | ||||
| add r1, r1, r2, lsl #1 @ psd + start | add r1, r1, r2, lsl #1 @ psd + start | ||||
| @@ -214,7 +214,7 @@ function fft\n\()_neon | |||||
| bl fft\n4\()_neon | bl fft\n4\()_neon | ||||
| mov r0, r4 | mov r0, r4 | ||||
| pop {r4, lr} | pop {r4, lr} | ||||
| movrel r1, X(ff_cos_\n\()_fixed) | |||||
| movrelx r1, X(ff_cos_\n\()_fixed) | |||||
| mov r2, #\n4/2 | mov r2, #\n4/2 | ||||
| b fft_pass_neon | b fft_pass_neon | ||||
| endfunc | endfunc | ||||
| @@ -143,7 +143,7 @@ function fft16_neon | |||||
| vswp d29, d30 @ q14{r12,i12,i14,r15} q15{r13,i13,i15,r14} | vswp d29, d30 @ q14{r12,i12,i14,r15} q15{r13,i13,i15,r14} | ||||
| vadd.f32 q0, q12, q13 @ {t1,t2,t5,t6} | vadd.f32 q0, q12, q13 @ {t1,t2,t5,t6} | ||||
| vadd.f32 q1, q14, q15 @ {t1a,t2a,t5a,t6a} | vadd.f32 q1, q14, q15 @ {t1a,t2a,t5a,t6a} | ||||
| movrel r2, X(ff_cos_16) | |||||
| movrelx r2, X(ff_cos_16) | |||||
| vsub.f32 q13, q12, q13 @ {t3,t4,t7,t8} | vsub.f32 q13, q12, q13 @ {t3,t4,t7,t8} | ||||
| vrev64.32 d1, d1 | vrev64.32 d1, d1 | ||||
| vsub.f32 q15, q14, q15 @ {t3a,t4a,t7a,t8a} | vsub.f32 q15, q14, q15 @ {t3a,t4a,t7a,t8a} | ||||
| @@ -290,7 +290,7 @@ function fft\n\()_neon | |||||
| bl fft\n4\()_neon | bl fft\n4\()_neon | ||||
| mov r0, r4 | mov r0, r4 | ||||
| pop {r4, lr} | pop {r4, lr} | ||||
| movrel r1, X(ff_cos_\n) | |||||
| movrelx r1, X(ff_cos_\n) | |||||
| mov r2, #\n4/2 | mov r2, #\n4/2 | ||||
| b fft_pass_neon | b fft_pass_neon | ||||
| endfunc | endfunc | ||||
| @@ -307,8 +307,8 @@ function ff_sbr_hf_apply_noise_0_neon, export=1 | |||||
| vmov.i32 d3, #0 | vmov.i32 d3, #0 | ||||
| .Lhf_apply_noise_0: | .Lhf_apply_noise_0: | ||||
| push {r4,lr} | push {r4,lr} | ||||
| movrelx r4, X(ff_sbr_noise_table) | |||||
| ldr r12, [sp, #12] | ldr r12, [sp, #12] | ||||
| movrel r4, X(ff_sbr_noise_table) | |||||
| add r3, r3, #1 | add r3, r3, #1 | ||||
| bfc r3, #9, #23 | bfc r3, #9, #23 | ||||
| sub r12, r12, #1 | sub r12, r12, #1 | ||||
| @@ -355,8 +355,8 @@ function ff_sbr_hf_apply_noise_1_neon, export=1 | |||||
| eor lr, r12, #1<<31 | eor lr, r12, #1<<31 | ||||
| vmov d3, r12, lr | vmov d3, r12, lr | ||||
| .Lhf_apply_noise_1: | .Lhf_apply_noise_1: | ||||
| movrelx r4, X(ff_sbr_noise_table) | |||||
| ldr r12, [sp, #12] | ldr r12, [sp, #12] | ||||
| movrel r4, X(ff_sbr_noise_table) | |||||
| add r3, r3, #1 | add r3, r3, #1 | ||||
| bfc r3, #9, #23 | bfc r3, #9, #23 | ||||
| sub r12, r12, #1 | sub r12, r12, #1 | ||||
| @@ -116,9 +116,8 @@ function vp3_idct_start_neon | |||||
| vadd.s16 q1, q8, q12 | vadd.s16 q1, q8, q12 | ||||
| vsub.s16 q8, q8, q12 | vsub.s16 q8, q8, q12 | ||||
| vld1.64 {d28-d31}, [r2,:128]! | vld1.64 {d28-d31}, [r2,:128]! | ||||
| endfunc | |||||
| function vp3_idct_core_neon | |||||
| vp3_idct_core_neon: | |||||
| vmull.s16 q2, d18, xC1S7 // (ip[1] * C1) << 16 | vmull.s16 q2, d18, xC1S7 // (ip[1] * C1) << 16 | ||||
| vmull.s16 q3, d19, xC1S7 | vmull.s16 q3, d19, xC1S7 | ||||
| vmull.s16 q4, d2, xC4S4 // ((ip[0] + ip[4]) * C4) << 16 | vmull.s16 q4, d2, xC4S4 // ((ip[0] + ip[4]) * C4) << 16 | ||||
| @@ -65,7 +65,7 @@ T orrcs \cw, \cw, \t1 | |||||
| function ff_decode_block_coeffs_armv6, export=1 | function ff_decode_block_coeffs_armv6, export=1 | ||||
| push {r0,r1,r4-r11,lr} | push {r0,r1,r4-r11,lr} | ||||
| movrel lr, X(ff_vp56_norm_shift) | |||||
| movrelx lr, X(ff_vp56_norm_shift) | |||||
| ldrd r4, r5, [sp, #44] @ token_prob, qmul | ldrd r4, r5, [sp, #44] @ token_prob, qmul | ||||
| cmp r3, #0 | cmp r3, #0 | ||||
| ldr r11, [r5] | ldr r11, [r5] | ||||
| @@ -206,7 +206,7 @@ A orrcs r8, r8, r10, lsl r6 | |||||
| mov r9, #8 | mov r9, #8 | ||||
| it ge | it ge | ||||
| addge r12, r12, #1 | addge r12, r12, #1 | ||||
| movrel r4, X(ff_vp8_dct_cat_prob) | |||||
| movrelx r4, X(ff_vp8_dct_cat_prob), r1 | |||||
| lsl r9, r9, r12 | lsl r9, r9, r12 | ||||
| ldr r4, [r4, r12, lsl #2] | ldr r4, [r4, r12, lsl #2] | ||||
| add r12, r9, #3 | add r12, r9, #3 | ||||
| @@ -78,7 +78,7 @@ int ff_wma_init(AVCodecContext *avctx, int flags2) | |||||
| int coef_vlc_table; | int coef_vlc_table; | ||||
| if ( avctx->sample_rate <= 0 || avctx->sample_rate > 50000 | if ( avctx->sample_rate <= 0 || avctx->sample_rate > 50000 | ||||
| || avctx->channels <= 0 || avctx->channels > 8 | |||||
| || avctx->channels <= 0 || avctx->channels > 2 | |||||
| || avctx->bit_rate <= 0) | || avctx->bit_rate <= 0) | ||||
| return -1; | return -1; | ||||
| @@ -109,11 +109,6 @@ static int wma_decode_init(AVCodecContext * avctx) | |||||
| } | } | ||||
| } | } | ||||
| if(avctx->channels > MAX_CHANNELS){ | |||||
| av_log(avctx, AV_LOG_ERROR, "Invalid number of channels (%d)\n", avctx->channels); | |||||
| return -1; | |||||
| } | |||||
| if(ff_wma_init(avctx, flags2)<0) | if(ff_wma_init(avctx, flags2)<0) | ||||
| return -1; | return -1; | ||||
| @@ -62,7 +62,14 @@ ELF .eabi_attribute 25, \val | |||||
| .endm | .endm | ||||
| .macro function name, export=0 | .macro function name, export=0 | ||||
| .set .Lpic_idx, 0 | |||||
| .set .Lpic_gp, 0 | |||||
| .macro endfunc | .macro endfunc | ||||
| .if .Lpic_idx | |||||
| .altmacro | |||||
| put_pic %(.Lpic_idx - 1) | |||||
| .noaltmacro | |||||
| .endif | |||||
| ELF .size \name, . - \name | ELF .size \name, . - \name | ||||
| .endfunc | .endfunc | ||||
| .purgem endfunc | .purgem endfunc | ||||
| @@ -106,8 +113,44 @@ ELF .size \name, . - \name | |||||
| #endif | #endif | ||||
| .endm | .endm | ||||
| .macro put_pic num | |||||
| put_pic_\num | |||||
| .endm | |||||
| .macro do_def_pic num, val, label | |||||
| .macro put_pic_\num | |||||
| .if \num | |||||
| .altmacro | |||||
| put_pic %(\num - 1) | |||||
| .noaltmacro | |||||
| .endif | |||||
| \label: .word \val | |||||
| .purgem put_pic_\num | |||||
| .endm | |||||
| .endm | |||||
| .macro def_pic val, label | |||||
| .altmacro | |||||
| do_def_pic %.Lpic_idx, \val, \label | |||||
| .noaltmacro | |||||
| .set .Lpic_idx, .Lpic_idx + 1 | |||||
| .endm | |||||
| .macro ldpic rd, val, indir=0 | |||||
| ldr \rd, .Lpicoff\@ | |||||
| .Lpic\@: | |||||
| .if \indir | |||||
| ldr \rd, [pc, \rd] | |||||
| .else | |||||
| add \rd, pc, \rd | |||||
| .endif | |||||
| def_pic \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@ | |||||
| .endm | |||||
| .macro movrel rd, val | .macro movrel rd, val | ||||
| #if HAVE_ARMV6T2 && !CONFIG_PIC && !defined(__APPLE__) | |||||
| #if CONFIG_PIC | |||||
| ldpic \rd, \val | |||||
| #elif HAVE_ARMV6T2 && !defined(__APPLE__) | |||||
| movw \rd, #:lower16:\val | movw \rd, #:lower16:\val | ||||
| movt \rd, #:upper16:\val | movt \rd, #:upper16:\val | ||||
| #else | #else | ||||
| @@ -115,6 +158,34 @@ ELF .size \name, . - \name | |||||
| #endif | #endif | ||||
| .endm | .endm | ||||
| .macro movrelx rd, val, gp | |||||
| #if CONFIG_PIC && defined(__ELF__) | |||||
| .ifnb \gp | |||||
| .if .Lpic_gp | |||||
| .unreq gp | |||||
| .endif | |||||
| gp .req \gp | |||||
| ldpic gp, _GLOBAL_OFFSET_TABLE_ | |||||
| .elseif !.Lpic_gp | |||||
| gp .req r12 | |||||
| ldpic gp, _GLOBAL_OFFSET_TABLE_ | |||||
| .endif | |||||
| .set .Lpic_gp, 1 | |||||
| ldr \rd, .Lpicoff\@ | |||||
| ldr \rd, [gp, \rd] | |||||
| def_pic \val(GOT), .Lpicoff\@ | |||||
| #elif CONFIG_PIC && defined(__APPLE__) | |||||
| ldpic \rd, .Lpic\@, indir=1 | |||||
| .non_lazy_symbol_pointer | |||||
| .Lpic\@: | |||||
| .indirect_symbol \val | |||||
| .word 0 | |||||
| .text | |||||
| #else | |||||
| movrel \rd, \val | |||||
| #endif | |||||
| .endm | |||||
| .macro ldr_pre rt, rn, rm:vararg | .macro ldr_pre rt, rn, rm:vararg | ||||
| A ldr \rt, [\rn, \rm]! | A ldr \rt, [\rn, \rm]! | ||||
| T add \rn, \rn, \rm | T add \rn, \rn, \rm | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "avutil.h" | #include "avutil.h" | ||||
| #include "eval.h" | #include "eval.h" | ||||
| #include "log.h" | #include "log.h" | ||||
| #include "mathematics.h" | |||||
| typedef struct Parser { | typedef struct Parser { | ||||
| const AVClass *class; | const AVClass *class; | ||||
| @@ -25,6 +25,7 @@ | |||||
| #include <math.h> | #include <math.h> | ||||
| #include "attributes.h" | #include "attributes.h" | ||||
| #include "rational.h" | #include "rational.h" | ||||
| #include "intfloat.h" | |||||
| #ifndef M_E | #ifndef M_E | ||||
| #define M_E 2.7182818284590452354 /* e */ | #define M_E 2.7182818284590452354 /* e */ | ||||
| @@ -51,10 +52,10 @@ | |||||
| #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ | #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ | ||||
| #endif | #endif | ||||
| #ifndef NAN | #ifndef NAN | ||||
| #define NAN (0.0/0.0) | |||||
| #define NAN av_int2float(0x7fc00000) | |||||
| #endif | #endif | ||||
| #ifndef INFINITY | #ifndef INFINITY | ||||
| #define INFINITY (1.0/0.0) | |||||
| #define INFINITY av_int2float(0x7f800000) | |||||
| #endif | #endif | ||||
| /** | /** | ||||
| @@ -33,6 +33,7 @@ | |||||
| #include "log.h" | #include "log.h" | ||||
| #include "parseutils.h" | #include "parseutils.h" | ||||
| #include "pixdesc.h" | #include "pixdesc.h" | ||||
| #include "mathematics.h" | |||||
| #if FF_API_FIND_OPT | #if FF_API_FIND_OPT | ||||
| //FIXME order them and do a bin search | //FIXME order them and do a bin search | ||||