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 
vp8_dequant_idct_add_y_block_v6(short * q,short * dq,unsigned char * dst,int stride,char * eobs)15 void vp8_dequant_idct_add_y_block_v6(short *q, short *dq,
16                                      unsigned char *dst,
17                                      int stride, char *eobs)
18 {
19     int i;
20 
21     for (i = 0; i < 4; i++)
22     {
23         if (eobs[0] > 1)
24             vp8_dequant_idct_add_v6 (q, dq, dst, stride);
25         else if (eobs[0] == 1)
26         {
27             vp8_dc_only_idct_add_v6 (q[0]*dq[0], dst, stride, dst, stride);
28             ((int *)q)[0] = 0;
29         }
30 
31         if (eobs[1] > 1)
32             vp8_dequant_idct_add_v6 (q+16, dq, dst+4, stride);
33         else if (eobs[1] == 1)
34         {
35             vp8_dc_only_idct_add_v6 (q[16]*dq[0], dst+4, stride, dst+4, stride);
36             ((int *)(q+16))[0] = 0;
37         }
38 
39         if (eobs[2] > 1)
40             vp8_dequant_idct_add_v6 (q+32, dq, dst+8, stride);
41         else if (eobs[2] == 1)
42         {
43             vp8_dc_only_idct_add_v6 (q[32]*dq[0], dst+8, stride, dst+8, stride);
44             ((int *)(q+32))[0] = 0;
45         }
46 
47         if (eobs[3] > 1)
48             vp8_dequant_idct_add_v6 (q+48, dq, dst+12, stride);
49         else if (eobs[3] == 1)
50         {
51             vp8_dc_only_idct_add_v6 (q[48]*dq[0], dst+12, stride,dst+12,stride);
52             ((int *)(q+48))[0] = 0;
53         }
54 
55         q    += 64;
56         dst  += 4*stride;
57         eobs += 4;
58     }
59 }
60 
vp8_dequant_idct_add_uv_block_v6(short * q,short * dq,unsigned char * dstu,unsigned char * dstv,int stride,char * eobs)61 void vp8_dequant_idct_add_uv_block_v6(short *q, short *dq,
62                                       unsigned char *dstu,
63                                       unsigned char *dstv,
64                                       int stride, char *eobs)
65 {
66     int i;
67 
68     for (i = 0; i < 2; i++)
69     {
70         if (eobs[0] > 1)
71             vp8_dequant_idct_add_v6 (q, dq, dstu, stride);
72         else if (eobs[0] == 1)
73         {
74             vp8_dc_only_idct_add_v6 (q[0]*dq[0], dstu, stride, dstu, stride);
75             ((int *)q)[0] = 0;
76         }
77 
78         if (eobs[1] > 1)
79             vp8_dequant_idct_add_v6 (q+16, dq, dstu+4, stride);
80         else if (eobs[1] == 1)
81         {
82             vp8_dc_only_idct_add_v6 (q[16]*dq[0], dstu+4, stride,
83                                                   dstu+4, stride);
84             ((int *)(q+16))[0] = 0;
85         }
86 
87         q    += 32;
88         dstu += 4*stride;
89         eobs += 2;
90     }
91 
92     for (i = 0; i < 2; i++)
93     {
94         if (eobs[0] > 1)
95             vp8_dequant_idct_add_v6 (q, dq, dstv, stride);
96         else if (eobs[0] == 1)
97         {
98             vp8_dc_only_idct_add_v6 (q[0]*dq[0], dstv, stride, dstv, stride);
99             ((int *)q)[0] = 0;
100         }
101 
102         if (eobs[1] > 1)
103             vp8_dequant_idct_add_v6 (q+16, dq, dstv+4, stride);
104         else if (eobs[1] == 1)
105         {
106             vp8_dc_only_idct_add_v6 (q[16]*dq[0], dstv+4, stride,
107                                                   dstv+4, stride);
108             ((int *)(q+16))[0] = 0;
109         }
110 
111         q    += 32;
112         dstv += 4*stride;
113         eobs += 2;
114     }
115 }
116