---
 libswscale/arm/swscale_unscaled.c | 18 +++++++++---------
 libswscale/arm/yuv2rgb_neon.S     | 40 +++++++++++++++++++++------------------
 2 files changed, 31 insertions(+), 27 deletions(-)

diff --git a/libswscale/arm/swscale_unscaled.c 
b/libswscale/arm/swscale_unscaled.c
index 149208c..e1597ab 100644
--- a/libswscale/arm/swscale_unscaled.c
+++ b/libswscale/arm/swscale_unscaled.c
@@ -62,10 +62,10 @@ static int rgbx_to_nv12_neon_16_wrapper(SwsContext 
*context, const uint8_t *src[
 }
 
 #define YUV_TO_RGB_TABLE                                                       
             \
-        c->yuv2rgb_v2r_coeff / (1 << 7),                                       
             \
-        c->yuv2rgb_u2g_coeff / (1 << 7),                                       
             \
-        c->yuv2rgb_v2g_coeff / (1 << 7),                                       
             \
-        c->yuv2rgb_u2b_coeff / (1 << 7),                                       
             \
+        c->yuv2rgb_v2r_coeff,                                                  
             \
+        c->yuv2rgb_u2g_coeff,                                                  
             \
+        c->yuv2rgb_v2g_coeff,                                                  
             \
+        c->yuv2rgb_u2b_coeff,                                                  
             \
 
 #define DECLARE_FF_YUVX_TO_RGBX_FUNCS(ifmt, ofmt)                              
             \
 int ff_##ifmt##_to_##ofmt##_neon(int w, int h,                                 
             \
@@ -88,8 +88,8 @@ static int ifmt##_to_##ofmt##_neon_wrapper(SwsContext *c, 
const uint8_t *src[],
                                  src[1], srcStride[1],                         
             \
                                  src[2], srcStride[2],                         
             \
                                  yuv2rgb_table,                                
             \
-                                 c->yuv2rgb_y_offset >> 9,                     
             \
-                                 c->yuv2rgb_y_coeff / (1 << 7));               
             \
+                                 c->yuv2rgb_y_offset >> 6,                     
             \
+                                 c->yuv2rgb_y_coeff);                          
             \
                                                                                
             \
     return 0;                                                                  
             \
 }                                                                              
             \
@@ -117,12 +117,12 @@ static int ifmt##_to_##ofmt##_neon_wrapper(SwsContext *c, 
const uint8_t *src[],
                                            uint8_t *dst[], int dstStride[]) {  
             \
     const int16_t yuv2rgb_table[] = { YUV_TO_RGB_TABLE };                      
             \
                                                                                
             \
-    ff_##ifmt##_to_##ofmt##_neon(c->srcW, srcSliceH,                           
 \
+    ff_##ifmt##_to_##ofmt##_neon(c->srcW, srcSliceH,                           
             \
                                  dst[0] + srcSliceY * dstStride[0], 
dstStride[0],           \
                                  src[0], srcStride[0], src[1], srcStride[1],   
             \
                                  yuv2rgb_table,                                
             \
-                                 c->yuv2rgb_y_offset >> 9,                     
             \
-                                 c->yuv2rgb_y_coeff / (1 << 7));               
             \
+                                 c->yuv2rgb_y_offset >> 6,                     
             \
+                                 c->yuv2rgb_y_coeff);                          
             \
                                                                                
             \
     return 0;                                                                  
             \
 }                                                                              
             \
diff --git a/libswscale/arm/yuv2rgb_neon.S b/libswscale/arm/yuv2rgb_neon.S
index 6b911c8..741928d 100644
--- a/libswscale/arm/yuv2rgb_neon.S
+++ b/libswscale/arm/yuv2rgb_neon.S
@@ -23,17 +23,20 @@
 
 
 .macro compute_premult
-    vmul.s16            q8, q15, d1[0]                                 @ q8  = 
V * v2r
-    vmul.s16            q9, q14, d1[1]                                 @ q9  = 
U * u2g
-    vmla.s16            q9, q15, d1[2]                                 @ q9  = 
U * u2g + V * v2g
-    vmul.s16            q10,q14, d1[3]                                 @ q10 = 
U * u2b
+    vsub.u16            q14,q11                                        @ q14 = 
U * (1 << 3) - 128 * (1 << 3)
+    vsub.u16            q15,q11                                        @ q15 = 
V * (1 << 3) - 128 * (1 << 3)
+    vqdmulh.s16         q8, q15, d1[0]                                 @ q8  = 
V * v2r
+    vqdmulh.s16         q9, q14, d1[1]                                 @ q9  = 
U * u2g
+    vqdmulh.s16         q5, q15, d1[2]                                 @ q5  = 
V * v2g
+    vadd.s16            q9, q5                                         @ q9  = 
U * u2g + V * v2g
+    vqdmulh.s16         q10,q14, d1[3]                                 @ q10 = 
U * u2b
 .endm
 
 .macro compute_color dst_comp1 dst_comp2 pre
     vadd.s16            q1, q14, \pre
     vadd.s16            q2, q15, \pre
-    vqrshrun.s16        \dst_comp1, q1, #6
-    vqrshrun.s16        \dst_comp2, q2, #6
+    vqrshrun.s16        \dst_comp1, q1, #1
+    vqrshrun.s16        \dst_comp2, q2, #1
 .endm
 
 .macro compute_rgba r1 g1 b1 a1 r2 g2 b2 a2
@@ -45,12 +48,12 @@
 .endm
 
 .macro compute dst ofmt
-    vmovl.u8            q14, d14                                       @ q14 = 
Y
-    vmovl.u8            q15, d15                                       @ q15 = 
Y
+    vshll.u8            q14, d14, #3                                   @ q14 = 
Y * (1 << 3)
+    vshll.u8            q15, d15, #3                                   @ q15 = 
Y * (1 << 3)
     vsub.s16            q14, q12                                       @ q14 = 
(srcY - y_offset)
     vsub.s16            q15, q12                                       @ q15 = 
(srcY - y_offset)
-    vmul.s16            q14, q13                                       @ q14 = 
(srcY - y_offset) * y_coeff (left)
-    vmul.s16            q15, q13                                       @ q15 = 
(srcY - y_offset) * y_coeff (right)
+    vqdmulh.s16         q14, q13                                       @ q14 = 
(srcY - y_offset) * y_coeff (left)
+    vqdmulh.s16         q15, q13                                       @ q15 = 
(srcY - y_offset) * y_coeff (right)
 
 .ifc \ofmt,argb
     compute_rgba        d7, d8, d9, d6, d11, d12, d13, d10
@@ -161,16 +164,16 @@
     pld [r12, #64*3]
 
     vld2.8              {d2, d3}, [r6]!                                @ q1: 
interleaved chroma line
-    vsubl.u8            q14, d2, d10                                   @ q14 = 
U - 128
-    vsubl.u8            q15, d3, d10                                   @ q15 = 
V - 128
+    vshll.u8            q14, d2, #3                                    @ q14 = 
U * (1 << 3)
+    vshll.u8            q15, d3, #3                                    @ q15 = 
V * (1 << 3)
 .endm
 
 .macro load_chroma_nv21
     pld [r12, #64*3]
 
     vld2.8              {d2, d3}, [r6]!                                @ q1: 
interleaved chroma line
-    vsubl.u8            q14, d3, d10                                   @ q14 = 
U - 128
-    vsubl.u8            q15, d2, d10                                   @ q15 = 
V - 128
+    vshll.u8            q14, d3, #3                                    @ q14 = 
U * (1 << 3)
+    vshll.u8            q15, d2, #3                                    @ q15 = 
V * (1 << 3)
 .endm
 
 .macro load_chroma_yuv420p
@@ -179,8 +182,8 @@
 
     vld1.8              d2, [r6]!                                      @ d2: 
chroma red line
     vld1.8              d3, [r10]!                                     @ d3: 
chroma blue line
-    vsubl.u8            q14, d2, d10                                   @ q14 = 
U - 128
-    vsubl.u8            q15, d3, d10                                   @ q15 = 
V - 128
+    vshll.u8            q14, d2, #3                                    @ q14 = 
U * (1 << 3)
+    vshll.u8            q15, d3, #3                                    @ q15 = 
V * (1 << 3)
 .endm
 
 .macro load_chroma_yuv422p
@@ -188,8 +191,8 @@
 
     vld1.8              d2, [r6]!                                      @ d2: 
chroma red line
     vld1.8              d3, [r10]!                                     @ d3: 
chroma blue line
-    vsubl.u8            q14, d2, d10                                   @ q14 = 
U - 128
-    vsubl.u8            q15, d3, d10                                   @ q15 = 
V - 128
+    vshll.u8            q14, d2, #3                                    @ q14 = 
U * (1 << 3)
+    vshll.u8            q15, d3, #3                                    @ q15 = 
V * (1 << 3)
 .endm
 
 .macro increment_nv12
@@ -240,6 +243,7 @@
 .macro declare_func ifmt ofmt
 function ff_\ifmt\()_to_\ofmt\()_neon, export=1
     load_args_\ifmt
+    vmov.u16            q11, #1024                                     @ q11 = 
128 * (1 << 3)
     vdup.16             q12, r9                                        @ q12 = 
y_offset
     vmov                d26, d0                                        @ q13 = 
y_coeff
     vmov                d27, d0                                        @ q13 = 
y_coeff
-- 
2.7.4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to