Signed-off-by: Mans Rullgard <mans@mansr.com>
| ... | ... |
@@ -28,6 +28,7 @@ int ff_ac3_max_msb_abs_int16_neon(const int16_t *src, int len); |
| 28 | 28 |
void ff_ac3_lshift_int16_neon(int16_t *src, unsigned len, unsigned shift); |
| 29 | 29 |
void ff_ac3_rshift_int32_neon(int32_t *src, unsigned len, unsigned shift); |
| 30 | 30 |
void ff_float_to_fixed24_neon(int32_t *dst, const float *src, unsigned int len); |
| 31 |
+void ff_ac3_extract_exponents_neon(uint8_t *exp, int32_t *coef, int nb_coefs); |
|
| 31 | 32 |
|
| 32 | 33 |
void ff_ac3_bit_alloc_calc_bap_armv6(int16_t *mask, int16_t *psd, |
| 33 | 34 |
int start, int end, |
| ... | ... |
@@ -50,5 +51,6 @@ av_cold void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact) |
| 50 | 50 |
c->ac3_lshift_int16 = ff_ac3_lshift_int16_neon; |
| 51 | 51 |
c->ac3_rshift_int32 = ff_ac3_rshift_int32_neon; |
| 52 | 52 |
c->float_to_fixed24 = ff_float_to_fixed24_neon; |
| 53 |
+ c->extract_exponents = ff_ac3_extract_exponents_neon; |
|
| 53 | 54 |
} |
| 54 | 55 |
} |
| ... | ... |
@@ -92,3 +92,23 @@ function ff_float_to_fixed24_neon, export=1 |
| 92 | 92 |
bgt 1b |
| 93 | 93 |
bx lr |
| 94 | 94 |
endfunc |
| 95 |
+ |
|
| 96 |
+function ff_ac3_extract_exponents_neon, export=1 |
|
| 97 |
+ vmov.i32 q14, #24 |
|
| 98 |
+ vmov.i32 q15, #8 |
|
| 99 |
+1: |
|
| 100 |
+ vld1.32 {q0}, [r1,:128]
|
|
| 101 |
+ vabs.s32 q1, q0 |
|
| 102 |
+ vclz.i32 q3, q1 |
|
| 103 |
+ vsub.i32 q3, q3, q15 |
|
| 104 |
+ vcge.s32 q2, q3, q14 |
|
| 105 |
+ vbit q3, q14, q2 |
|
| 106 |
+ vbic q0, q0, q2 |
|
| 107 |
+ vmovn.i32 d6, q3 |
|
| 108 |
+ vmovn.i16 d6, q3 |
|
| 109 |
+ vst1.32 {q0}, [r1,:128]!
|
|
| 110 |
+ vst1.32 {d6[0]}, [r0,:32]!
|
|
| 111 |
+ subs r2, r2, #4 |
|
| 112 |
+ bgt 1b |
|
| 113 |
+ bx lr |
|
| 114 |
+endfunc |