[cvs] / xvidcore / src / quant / quant_matrix.c Repository:
ViewVC logotype

Annotation of /xvidcore/src/quant/quant_matrix.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (view) (download)

1 : edgomez 1.6 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Custom matrix quantization functions -
5 :     *
6 : edgomez 1.10 * Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7 : edgomez 1.11 * 2002 Peter Ross <pross@xvid.org>
8 : edgomez 1.6 *
9 : edgomez 1.12 * This file is part of XviD, a free MPEG-4 video encoder/decoder
10 :     *
11 :     * XviD is free software; you can redistribute it and/or modify it
12 :     * under the terms of the GNU General Public License as published by
13 :     * the Free Software Foundation; either version 2 of the License, or
14 : edgomez 1.6 * (at your option) any later version.
15 :     *
16 :     * This program is distributed in the hope that it will be useful,
17 : edgomez 1.12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : edgomez 1.6 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 :     * GNU General Public License for more details.
20 :     *
21 :     * You should have received a copy of the GNU General Public License
22 : edgomez 1.12 * along with this program; if not, write to the Free Software
23 : edgomez 1.6 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 :     *
25 : edgomez 1.12 * Under section 8 of the GNU General Public License, the copyright
26 :     * holders of XVID explicitly forbid distribution in the following
27 :     * countries:
28 :     *
29 :     * - Japan
30 :     * - United States of America
31 :     *
32 :     * Linking XviD statically or dynamically with other modules is making a
33 :     * combined work based on XviD. Thus, the terms and conditions of the
34 :     * GNU General Public License cover the whole combination.
35 :     *
36 :     * As a special exception, the copyright holders of XviD give you
37 :     * permission to link XviD with independent modules that communicate with
38 :     * XviD solely through the VFW1.1 and DShow interfaces, regardless of the
39 :     * license terms of these independent modules, and to copy and distribute
40 :     * the resulting combined work under terms of your choice, provided that
41 :     * every copy of the combined work is accompanied by a complete copy of
42 :     * the source code of XviD (the version of XviD used to produce the
43 :     * combined work), being distributed under the terms of the GNU General
44 :     * Public License plus this exception. An independent module is a module
45 :     * which is not derived from or based on XviD.
46 :     *
47 :     * Note that people who make modified versions of XviD are not obligated
48 :     * to grant this special exception for their modified versions; it is
49 :     * their choice whether to do so. The GNU General Public License gives
50 :     * permission to release a modified version without this exception; this
51 :     * exception also makes it possible to release a modified version which
52 :     * carries forward this exception.
53 :     *
54 :     * $Id$
55 : edgomez 1.6 *
56 :     ****************************************************************************/
57 :    
58 : Isibaar 1.2 #include "quant_matrix.h"
59 : Isibaar 1.1
60 : Isibaar 1.2 #define FIX(X) (1 << 16) / (X) + 1
61 : Isibaar 1.1
62 : edgomez 1.6 /*****************************************************************************
63 :     * Local data
64 :     ****************************************************************************/
65 :    
66 :     /* ToDo : remove all this local to make this module thread safe */
67 : Isibaar 1.3 uint8_t custom_intra_matrix = 0;
68 :     uint8_t custom_inter_matrix = 0;
69 :    
70 : edgomez 1.8 uint8_t default_intra_matrix[64] = {
71 : edgomez 1.5 8, 17, 18, 19, 21, 23, 25, 27,
72 :     17, 18, 19, 21, 23, 25, 27, 28,
73 :     20, 21, 22, 23, 24, 26, 28, 30,
74 :     21, 22, 23, 24, 26, 28, 30, 32,
75 :     22, 23, 24, 26, 28, 30, 32, 35,
76 :     23, 24, 26, 28, 30, 32, 35, 38,
77 :     25, 26, 28, 30, 32, 35, 38, 41,
78 :     27, 28, 30, 32, 35, 38, 41, 45
79 : Isibaar 1.3 };
80 : Isibaar 1.1
81 : edgomez 1.7 int16_t intra_matrix[64] = {
82 : edgomez 1.5 8, 17, 18, 19, 21, 23, 25, 27,
83 :     17, 18, 19, 21, 23, 25, 27, 28,
84 :     20, 21, 22, 23, 24, 26, 28, 30,
85 :     21, 22, 23, 24, 26, 28, 30, 32,
86 :     22, 23, 24, 26, 28, 30, 32, 35,
87 :     23, 24, 26, 28, 30, 32, 35, 38,
88 :     25, 26, 28, 30, 32, 35, 38, 41,
89 :     27, 28, 30, 32, 35, 38, 41, 45
90 : Isibaar 1.1 };
91 :    
92 : edgomez 1.7 int16_t intra_matrix_fix[64] = {
93 : edgomez 1.5 FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
94 :     FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
95 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
96 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
97 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
98 :     FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
99 :     FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
100 :     FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
101 : Isibaar 1.2 };
102 :    
103 : edgomez 1.8 uint8_t default_inter_matrix[64] = {
104 : edgomez 1.5 16, 17, 18, 19, 20, 21, 22, 23,
105 :     17, 18, 19, 20, 21, 22, 23, 24,
106 :     18, 19, 20, 21, 22, 23, 24, 25,
107 :     19, 20, 21, 22, 23, 24, 26, 27,
108 :     20, 21, 22, 23, 25, 26, 27, 28,
109 :     21, 22, 23, 24, 26, 27, 28, 30,
110 :     22, 23, 24, 26, 27, 28, 30, 31,
111 :     23, 24, 25, 27, 28, 30, 31, 33
112 : Isibaar 1.3 };
113 :    
114 : edgomez 1.7 int16_t inter_matrix[64] = {
115 : edgomez 1.5 16, 17, 18, 19, 20, 21, 22, 23,
116 :     17, 18, 19, 20, 21, 22, 23, 24,
117 :     18, 19, 20, 21, 22, 23, 24, 25,
118 :     19, 20, 21, 22, 23, 24, 26, 27,
119 :     20, 21, 22, 23, 25, 26, 27, 28,
120 :     21, 22, 23, 24, 26, 27, 28, 30,
121 :     22, 23, 24, 26, 27, 28, 30, 31,
122 :     23, 24, 25, 27, 28, 30, 31, 33
123 : Isibaar 1.1 };
124 :    
125 : edgomez 1.7 int16_t inter_matrix_fix[64] = {
126 : edgomez 1.5 FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
127 :     FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
128 :     FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
129 :     FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
130 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
131 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
132 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
133 :     FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
134 : Isibaar 1.2 };
135 : edgomez 1.6
136 :     /*****************************************************************************
137 :     * Functions
138 :     ****************************************************************************/
139 : Isibaar 1.2
140 : edgomez 1.5 uint8_t
141 :     get_intra_matrix_status(void)
142 :     {
143 : Isibaar 1.3 return custom_intra_matrix;
144 : Isibaar 1.2 }
145 : Isibaar 1.1
146 : edgomez 1.5 uint8_t
147 :     get_inter_matrix_status(void)
148 :     {
149 : Isibaar 1.3 return custom_inter_matrix;
150 : Isibaar 1.2 }
151 :    
152 : edgomez 1.5 void
153 :     set_intra_matrix_status(uint8_t status)
154 :     {
155 : Isibaar 1.3 custom_intra_matrix = status;
156 : Isibaar 1.2 }
157 : Isibaar 1.1
158 : edgomez 1.5 void
159 :     set_inter_matrix_status(uint8_t status)
160 :     {
161 : Isibaar 1.3 custom_inter_matrix = status;
162 : Isibaar 1.2 }
163 : Isibaar 1.1
164 : edgomez 1.5 int16_t *
165 :     get_intra_matrix(void)
166 :     {
167 : Isibaar 1.2 return intra_matrix;
168 : Isibaar 1.1 }
169 :    
170 : edgomez 1.5 int16_t *
171 :     get_inter_matrix(void)
172 :     {
173 : Isibaar 1.4 return inter_matrix;
174 :     }
175 :    
176 : edgomez 1.5 uint8_t *
177 :     get_default_intra_matrix(void)
178 :     {
179 : Isibaar 1.3 return default_intra_matrix;
180 :     }
181 :    
182 : edgomez 1.5 uint8_t *
183 :     get_default_inter_matrix(void)
184 :     {
185 : Isibaar 1.3 return default_inter_matrix;
186 : Isibaar 1.2 }
187 : Isibaar 1.1
188 : edgomez 1.5 uint8_t
189 :     set_intra_matrix(uint8_t * matrix)
190 : Isibaar 1.1 {
191 : Isibaar 1.3 int i, change = 0;
192 : edgomez 1.5
193 : Isibaar 1.3 custom_intra_matrix = 0;
194 : Isibaar 1.2
195 : edgomez 1.5 for (i = 0; i < 64; i++) {
196 :     if ((int16_t) default_intra_matrix[i] != matrix[i])
197 : Isibaar 1.3 custom_intra_matrix = 1;
198 : edgomez 1.5 if (intra_matrix[i] != matrix[i])
199 : Isibaar 1.3 change = 1;
200 : Isibaar 1.2
201 :     intra_matrix[i] = (int16_t) matrix[i];
202 :     intra_matrix_fix[i] = FIX(intra_matrix[i]);
203 : Isibaar 1.1 }
204 : h 1.9 return /*custom_intra_matrix |*/ change;
205 : Isibaar 1.2 }
206 : Isibaar 1.1
207 : Isibaar 1.2
208 : edgomez 1.5 uint8_t
209 :     set_inter_matrix(uint8_t * matrix)
210 : Isibaar 1.2 {
211 : Isibaar 1.3 int i, change = 0;
212 : edgomez 1.5
213 : Isibaar 1.3 custom_inter_matrix = 0;
214 : Isibaar 1.2
215 : edgomez 1.5 for (i = 0; i < 64; i++) {
216 :     if ((int16_t) default_inter_matrix[i] != matrix[i])
217 : Isibaar 1.3 custom_inter_matrix = 1;
218 : edgomez 1.5 if (inter_matrix[i] != matrix[i])
219 : Isibaar 1.3 change = 1;
220 : Isibaar 1.2
221 :     inter_matrix[i] = (int16_t) matrix[i];
222 :     inter_matrix_fix[i] = FIX(inter_matrix[i]);
223 :     }
224 : h 1.9 return /*custom_inter_matrix |*/ change;
225 : Isibaar 1.1 }

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