[svn] / branches / dev-api-4 / xvidcore / src / quant / quant_matrix.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/quant/quant_matrix.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1054 - (view) (download)

1 : edgomez 1054 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Quantization matrix management code -
5 :     *
6 :     * Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7 :     * 2002 Peter Ross <pross@xvid.org>
8 :     *
9 :     * This program is free software ; you can redistribute it and/or modify
10 :     * it under the terms of the GNU General Public License as published by
11 :     * the Free Software Foundation ; either version 2 of the License, or
12 :     * (at your option) any later version.
13 :     *
14 :     * This program is distributed in the hope that it will be useful,
15 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
16 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 :     * GNU General Public License for more details.
18 :     *
19 :     * You should have received a copy of the GNU General Public License
20 :     * along with this program ; if not, write to the Free Software
21 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 :     *
23 :     * $Id: quant_matrix.c,v 1.13.2.1 2003-06-09 13:55:19 edgomez Exp $
24 :     *
25 :     ****************************************************************************/
26 :    
27 : Isibaar 4 #include "quant_matrix.h"
28 : Isibaar 3
29 : edgomez 851 #define FIX(X) (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1))
30 :     #define FIXL(X) ((1UL << 16) / (X) - 1)
31 : Isibaar 3
32 : Isibaar 20 uint8_t custom_intra_matrix = 0;
33 :     uint8_t custom_inter_matrix = 0;
34 : Isibaar 3
35 : edgomez 457 uint8_t default_intra_matrix[64] = {
36 : edgomez 195 8, 17, 18, 19, 21, 23, 25, 27,
37 :     17, 18, 19, 21, 23, 25, 27, 28,
38 :     20, 21, 22, 23, 24, 26, 28, 30,
39 :     21, 22, 23, 24, 26, 28, 30, 32,
40 :     22, 23, 24, 26, 28, 30, 32, 35,
41 :     23, 24, 26, 28, 30, 32, 35, 38,
42 :     25, 26, 28, 30, 32, 35, 38, 41,
43 :     27, 28, 30, 32, 35, 38, 41, 45
44 : Isibaar 20 };
45 :    
46 : edgomez 447 int16_t intra_matrix[64] = {
47 : edgomez 195 8, 17, 18, 19, 21, 23, 25, 27,
48 :     17, 18, 19, 21, 23, 25, 27, 28,
49 :     20, 21, 22, 23, 24, 26, 28, 30,
50 :     21, 22, 23, 24, 26, 28, 30, 32,
51 :     22, 23, 24, 26, 28, 30, 32, 35,
52 :     23, 24, 26, 28, 30, 32, 35, 38,
53 :     25, 26, 28, 30, 32, 35, 38, 41,
54 :     27, 28, 30, 32, 35, 38, 41, 45
55 : Isibaar 3 };
56 :    
57 : edgomez 851 uint16_t intra_matrix_fixfix[64] = {
58 :     0, 0, 0, 0, 0, 0, 0, 0,
59 :     0, 0, 0, 0, 0, 0, 0, 0,
60 :     0, 0, 0, 0, 0, 0, 0, 0,
61 :     0, 0, 0, 0, 0, 0, 0, 0,
62 :     0, 0, 0, 0, 0, 0, 0, 0,
63 :     0, 0, 0, 0, 0, 0, 0, 0,
64 :     0, 0, 0, 0, 0, 0, 0, 0,
65 :     0, 0, 0, 0, 0, 0, 0, 0
66 :     };
67 :    
68 :     uint16_t inter_matrix_fixfix[64] = {
69 :     0, 0, 0, 0, 0, 0, 0, 0,
70 :     0, 0, 0, 0, 0, 0, 0, 0,
71 :     0, 0, 0, 0, 0, 0, 0, 0,
72 :     0, 0, 0, 0, 0, 0, 0, 0,
73 :     0, 0, 0, 0, 0, 0, 0, 0,
74 :     0, 0, 0, 0, 0, 0, 0, 0,
75 :     0, 0, 0, 0, 0, 0, 0, 0,
76 :     0, 0, 0, 0, 0, 0, 0, 0
77 :     };
78 :    
79 :     uint16_t intra_matrix1[64] = {
80 :     8>>1, 17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1,
81 :     17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1, 28>>1,
82 :     20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1,
83 :     21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1,
84 :     22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1,
85 :     23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1,
86 :     25>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1,
87 :     27>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1, 45>>1
88 :     };
89 :    
90 :    
91 :     uint16_t intra_matrix_fix[64] = {
92 : edgomez 195 FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
93 :     FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
94 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
95 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
96 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
97 :     FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
98 :     FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
99 :     FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
100 : Isibaar 4 };
101 :    
102 : edgomez 851 uint16_t intra_matrix_fixl[64] = {
103 :     FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),
104 :     FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),
105 :     FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),
106 :     FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),
107 :     FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),
108 :     FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),
109 :     FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),
110 :     FIXL(27), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41), FIXL(45)
111 :     };
112 :    
113 :     uint16_t inter_matrix_fixl[64] = {
114 :     FIXL(16), FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23),
115 :     FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24),
116 :     FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(25),
117 :     FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27),
118 :     FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(25), FIXL(26), FIXL(27), FIXL(28),
119 :     FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30),
120 :     FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30), FIXL(31),
121 :     FIXL(23), FIXL(24), FIXL(25), FIXL(27), FIXL(28), FIXL(30), FIXL(31), FIXL(33)
122 :     };
123 :    
124 : edgomez 457 uint8_t default_inter_matrix[64] = {
125 : edgomez 195 16, 17, 18, 19, 20, 21, 22, 23,
126 :     17, 18, 19, 20, 21, 22, 23, 24,
127 :     18, 19, 20, 21, 22, 23, 24, 25,
128 :     19, 20, 21, 22, 23, 24, 26, 27,
129 :     20, 21, 22, 23, 25, 26, 27, 28,
130 :     21, 22, 23, 24, 26, 27, 28, 30,
131 :     22, 23, 24, 26, 27, 28, 30, 31,
132 :     23, 24, 25, 27, 28, 30, 31, 33
133 : Isibaar 20 };
134 :    
135 : edgomez 447 int16_t inter_matrix[64] = {
136 : edgomez 195 16, 17, 18, 19, 20, 21, 22, 23,
137 :     17, 18, 19, 20, 21, 22, 23, 24,
138 :     18, 19, 20, 21, 22, 23, 24, 25,
139 :     19, 20, 21, 22, 23, 24, 26, 27,
140 :     20, 21, 22, 23, 25, 26, 27, 28,
141 :     21, 22, 23, 24, 26, 27, 28, 30,
142 :     22, 23, 24, 26, 27, 28, 30, 31,
143 :     23, 24, 25, 27, 28, 30, 31, 33
144 : Isibaar 3 };
145 : edgomez 851 uint16_t inter_matrix1[64] = {
146 :     16>>1, 17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1,
147 :     17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1,
148 :     18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 25>>1,
149 :     19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1,
150 :     20>>1, 21>>1, 22>>1, 23>>1, 25>>1, 26>>1, 27>>1, 28>>1,
151 :     21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1,
152 :     22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1, 31>>1,
153 :     23>>1, 24>>1, 25>>1, 27>>1, 28>>1, 30>>1, 31>>1, 33>>1
154 :     };
155 : Isibaar 3
156 : edgomez 851 uint16_t inter_matrix_fix[64] = {
157 : edgomez 195 FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
158 :     FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
159 :     FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
160 :     FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
161 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
162 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
163 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
164 :     FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
165 : Isibaar 4 };
166 : Isibaar 3
167 : edgomez 195 uint8_t
168 :     get_intra_matrix_status(void)
169 :     {
170 : Isibaar 20 return custom_intra_matrix;
171 : Isibaar 4 }
172 :    
173 : edgomez 195 uint8_t
174 :     get_inter_matrix_status(void)
175 :     {
176 : Isibaar 20 return custom_inter_matrix;
177 : Isibaar 4 }
178 :    
179 : edgomez 195 void
180 :     set_intra_matrix_status(uint8_t status)
181 :     {
182 : Isibaar 20 custom_intra_matrix = status;
183 : Isibaar 4 }
184 :    
185 : edgomez 195 void
186 :     set_inter_matrix_status(uint8_t status)
187 :     {
188 : Isibaar 20 custom_inter_matrix = status;
189 : Isibaar 4 }
190 :    
191 : edgomez 195 int16_t *
192 :     get_intra_matrix(void)
193 :     {
194 : Isibaar 4 return intra_matrix;
195 :     }
196 :    
197 : edgomez 195 int16_t *
198 :     get_inter_matrix(void)
199 :     {
200 : Isibaar 21 return inter_matrix;
201 :     }
202 :    
203 : edgomez 195 uint8_t *
204 :     get_default_intra_matrix(void)
205 :     {
206 : Isibaar 20 return default_intra_matrix;
207 : Isibaar 4 }
208 :    
209 : edgomez 195 uint8_t *
210 :     get_default_inter_matrix(void)
211 :     {
212 : Isibaar 20 return default_inter_matrix;
213 :     }
214 :    
215 : edgomez 195 uint8_t
216 :     set_intra_matrix(uint8_t * matrix)
217 : Isibaar 3 {
218 : Isibaar 20 int i, change = 0;
219 : edgomez 195
220 : Isibaar 20 custom_intra_matrix = 0;
221 : Isibaar 3
222 : edgomez 195 for (i = 0; i < 64; i++) {
223 :     if ((int16_t) default_intra_matrix[i] != matrix[i])
224 : Isibaar 20 custom_intra_matrix = 1;
225 : edgomez 195 if (intra_matrix[i] != matrix[i])
226 : Isibaar 20 change = 1;
227 : Isibaar 3
228 : edgomez 851 intra_matrix1[i] = ((intra_matrix[i] = (int16_t) matrix[i])>>1);
229 :     intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);
230 : Isibaar 4 intra_matrix_fix[i] = FIX(intra_matrix[i]);
231 : edgomez 851 intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
232 : Isibaar 4 }
233 : edgomez 851 return custom_intra_matrix | change;
234 : Isibaar 3 }
235 :    
236 :    
237 : edgomez 195 uint8_t
238 :     set_inter_matrix(uint8_t * matrix)
239 : Isibaar 3 {
240 : Isibaar 20 int i, change = 0;
241 : edgomez 195
242 : Isibaar 20 custom_inter_matrix = 0;
243 : Isibaar 4
244 : edgomez 195 for (i = 0; i < 64; i++) {
245 :     if ((int16_t) default_inter_matrix[i] != matrix[i])
246 : Isibaar 20 custom_inter_matrix = 1;
247 : edgomez 195 if (inter_matrix[i] != matrix[i])
248 : Isibaar 20 change = 1;
249 : Isibaar 4
250 : edgomez 851 inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);
251 :     inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);
252 : Isibaar 4 inter_matrix_fix[i] = FIX(inter_matrix[i]);
253 : edgomez 851 inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
254 : Isibaar 3 }
255 : edgomez 851 return custom_inter_matrix | change;
256 : Isibaar 3 }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4