1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "vpx_config.h"
12 #include "vp8_rtcd.h"
13 
14 /* place these declarations here because we don't want to maintain them
15  * outside of this scope
16  */
17 void idct_dequant_full_2x_neon(short *q, short *dq,
18                                unsigned char *dst, int stride);
19 void idct_dequant_0_2x_neon(short *q, short dq,
20                             unsigned char *dst, int stride);
21 
22 
vp8_dequant_idct_add_y_block_neon(short * q,short * dq,unsigned char * dst,int stride,char * eobs)23 void vp8_dequant_idct_add_y_block_neon(short *q, short *dq,
24                                        unsigned char *dst,
25                                        int stride, char *eobs)
26 {
27     int i;
28 
29     for (i = 0; i < 4; i++)
30     {
31         if (((short *)(eobs))[0])
32         {
33             if (((short *)eobs)[0] & 0xfefe)
34                 idct_dequant_full_2x_neon (q, dq, dst, stride);
35             else
36                 idct_dequant_0_2x_neon (q, dq[0], dst, stride);
37         }
38 
39         if (((short *)(eobs))[1])
40         {
41             if (((short *)eobs)[1] & 0xfefe)
42                 idct_dequant_full_2x_neon (q+32, dq, dst+8, stride);
43             else
44                 idct_dequant_0_2x_neon (q+32, dq[0], dst+8, stride);
45         }
46         q    += 64;
47         dst  += 4*stride;
48         eobs += 4;
49     }
50 }
51 
vp8_dequant_idct_add_uv_block_neon(short * q,short * dq,unsigned char * dstu,unsigned char * dstv,int stride,char * eobs)52 void vp8_dequant_idct_add_uv_block_neon(short *q, short *dq,
53                                         unsigned char *dstu,
54                                         unsigned char *dstv,
55                                         int stride, char *eobs)
56 {
57     if (((short *)(eobs))[0])
58     {
59         if (((short *)eobs)[0] & 0xfefe)
60             idct_dequant_full_2x_neon (q, dq, dstu, stride);
61         else
62             idct_dequant_0_2x_neon (q, dq[0], dstu, stride);
63     }
64 
65     q    += 32;
66     dstu += 4*stride;
67 
68     if (((short *)(eobs))[1])
69     {
70         if (((short *)eobs)[1] & 0xfefe)
71             idct_dequant_full_2x_neon (q, dq, dstu, stride);
72         else
73             idct_dequant_0_2x_neon (q, dq[0], dstu, stride);
74     }
75 
76     q += 32;
77 
78     if (((short *)(eobs))[2])
79     {
80         if (((short *)eobs)[2] & 0xfefe)
81             idct_dequant_full_2x_neon (q, dq, dstv, stride);
82         else
83             idct_dequant_0_2x_neon (q, dq[0], dstv, stride);
84     }
85 
86     q    += 32;
87     dstv += 4*stride;
88 
89     if (((short *)(eobs))[3])
90     {
91         if (((short *)eobs)[3] & 0xfefe)
92             idct_dequant_full_2x_neon (q, dq, dstv, stride);
93         else
94             idct_dequant_0_2x_neon (q, dq[0], dstv, stride);
95     }
96 }
97