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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 441 - (view) (download)

1 : edgomez 441 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Custom matrix quantization functions -
5 :     *
6 :     * Copyright(C) 2002 Michael Militzer
7 :     *
8 :     * This program is an implementation of a part of one or more MPEG-4
9 :     * Video tools as specified in ISO/IEC 14496-2 standard. Those intending
10 :     * to use this software module in hardware or software products are
11 :     * advised that its use may infringe existing patents or copyrights, and
12 :     * any such use would be at such party's own risk. The original
13 :     * developer of this software module and his/her company, and subsequent
14 :     * editors and their companies, will have no liability for use of this
15 :     * software or modifications or derivatives thereof.
16 :     *
17 :     * This program is free software ; you can redistribute it and/or modify
18 :     * it under the terms of the GNU General Public License as published by
19 :     * the Free Software Foundation ; either version 2 of the License, or
20 :     * (at your option) any later version.
21 :     *
22 :     * This program is distributed in the hope that it will be useful,
23 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
24 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 :     * GNU General Public License for more details.
26 :     *
27 :     * You should have received a copy of the GNU General Public License
28 :     * along with this program ; if not, write to the Free Software
29 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 :     *
31 :     * $Id: quant_matrix.c,v 1.6 2002-09-07 11:14:41 edgomez Exp $
32 :     *
33 :     ****************************************************************************/
34 :    
35 : Isibaar 4 #include "quant_matrix.h"
36 : Isibaar 3
37 : Isibaar 4 #define FIX(X) (1 << 16) / (X) + 1
38 : Isibaar 3
39 : edgomez 441 /*****************************************************************************
40 :     * Local data
41 :     ****************************************************************************/
42 :    
43 :     /* ToDo : remove all this local to make this module thread safe */
44 : Isibaar 20 uint8_t custom_intra_matrix = 0;
45 :     uint8_t custom_inter_matrix = 0;
46 : Isibaar 3
47 : edgomez 441 static uint8_t const default_intra_matrix[64] = {
48 : edgomez 195 8, 17, 18, 19, 21, 23, 25, 27,
49 :     17, 18, 19, 21, 23, 25, 27, 28,
50 :     20, 21, 22, 23, 24, 26, 28, 30,
51 :     21, 22, 23, 24, 26, 28, 30, 32,
52 :     22, 23, 24, 26, 28, 30, 32, 35,
53 :     23, 24, 26, 28, 30, 32, 35, 38,
54 :     25, 26, 28, 30, 32, 35, 38, 41,
55 :     27, 28, 30, 32, 35, 38, 41, 45
56 : Isibaar 20 };
57 :    
58 : edgomez 441 static int16_t intra_matrix[64] = {
59 : edgomez 195 8, 17, 18, 19, 21, 23, 25, 27,
60 :     17, 18, 19, 21, 23, 25, 27, 28,
61 :     20, 21, 22, 23, 24, 26, 28, 30,
62 :     21, 22, 23, 24, 26, 28, 30, 32,
63 :     22, 23, 24, 26, 28, 30, 32, 35,
64 :     23, 24, 26, 28, 30, 32, 35, 38,
65 :     25, 26, 28, 30, 32, 35, 38, 41,
66 :     27, 28, 30, 32, 35, 38, 41, 45
67 : Isibaar 3 };
68 :    
69 : edgomez 441 static int16_t intra_matrix_fix[64] = {
70 : edgomez 195 FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
71 :     FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
72 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
73 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
74 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
75 :     FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
76 :     FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
77 :     FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
78 : Isibaar 4 };
79 :    
80 : edgomez 441 static uint8_t const default_inter_matrix[64] = {
81 : edgomez 195 16, 17, 18, 19, 20, 21, 22, 23,
82 :     17, 18, 19, 20, 21, 22, 23, 24,
83 :     18, 19, 20, 21, 22, 23, 24, 25,
84 :     19, 20, 21, 22, 23, 24, 26, 27,
85 :     20, 21, 22, 23, 25, 26, 27, 28,
86 :     21, 22, 23, 24, 26, 27, 28, 30,
87 :     22, 23, 24, 26, 27, 28, 30, 31,
88 :     23, 24, 25, 27, 28, 30, 31, 33
89 : Isibaar 20 };
90 :    
91 : edgomez 441 static int16_t inter_matrix[64] = {
92 : edgomez 195 16, 17, 18, 19, 20, 21, 22, 23,
93 :     17, 18, 19, 20, 21, 22, 23, 24,
94 :     18, 19, 20, 21, 22, 23, 24, 25,
95 :     19, 20, 21, 22, 23, 24, 26, 27,
96 :     20, 21, 22, 23, 25, 26, 27, 28,
97 :     21, 22, 23, 24, 26, 27, 28, 30,
98 :     22, 23, 24, 26, 27, 28, 30, 31,
99 :     23, 24, 25, 27, 28, 30, 31, 33
100 : Isibaar 3 };
101 :    
102 : edgomez 441 static int16_t inter_matrix_fix[64] = {
103 : edgomez 195 FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
104 :     FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
105 :     FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
106 :     FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
107 :     FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
108 :     FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
109 :     FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
110 :     FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
111 : Isibaar 4 };
112 : Isibaar 3
113 : edgomez 441 /*****************************************************************************
114 :     * Functions
115 :     ****************************************************************************/
116 :    
117 : edgomez 195 uint8_t
118 :     get_intra_matrix_status(void)
119 :     {
120 : Isibaar 20 return custom_intra_matrix;
121 : Isibaar 4 }
122 :    
123 : edgomez 195 uint8_t
124 :     get_inter_matrix_status(void)
125 :     {
126 : Isibaar 20 return custom_inter_matrix;
127 : Isibaar 4 }
128 :    
129 : edgomez 195 void
130 :     set_intra_matrix_status(uint8_t status)
131 :     {
132 : Isibaar 20 custom_intra_matrix = status;
133 : Isibaar 4 }
134 :    
135 : edgomez 195 void
136 :     set_inter_matrix_status(uint8_t status)
137 :     {
138 : Isibaar 20 custom_inter_matrix = status;
139 : Isibaar 4 }
140 :    
141 : edgomez 195 int16_t *
142 :     get_intra_matrix(void)
143 :     {
144 : Isibaar 4 return intra_matrix;
145 :     }
146 :    
147 : edgomez 195 int16_t *
148 :     get_inter_matrix(void)
149 :     {
150 : Isibaar 21 return inter_matrix;
151 :     }
152 :    
153 : edgomez 195 uint8_t *
154 :     get_default_intra_matrix(void)
155 :     {
156 : Isibaar 20 return default_intra_matrix;
157 : Isibaar 4 }
158 :    
159 : edgomez 195 uint8_t *
160 :     get_default_inter_matrix(void)
161 :     {
162 : Isibaar 20 return default_inter_matrix;
163 :     }
164 :    
165 : edgomez 195 uint8_t
166 :     set_intra_matrix(uint8_t * matrix)
167 : Isibaar 3 {
168 : Isibaar 20 int i, change = 0;
169 : edgomez 195
170 : Isibaar 20 custom_intra_matrix = 0;
171 : Isibaar 3
172 : edgomez 195 for (i = 0; i < 64; i++) {
173 :     if ((int16_t) default_intra_matrix[i] != matrix[i])
174 : Isibaar 20 custom_intra_matrix = 1;
175 : edgomez 195 if (intra_matrix[i] != matrix[i])
176 : Isibaar 20 change = 1;
177 : Isibaar 3
178 : Isibaar 4 intra_matrix[i] = (int16_t) matrix[i];
179 :     intra_matrix_fix[i] = FIX(intra_matrix[i]);
180 :     }
181 : Isibaar 20 return custom_intra_matrix | change;
182 : Isibaar 3 }
183 :    
184 :    
185 : edgomez 195 uint8_t
186 :     set_inter_matrix(uint8_t * matrix)
187 : Isibaar 3 {
188 : Isibaar 20 int i, change = 0;
189 : edgomez 195
190 : Isibaar 20 custom_inter_matrix = 0;
191 : Isibaar 4
192 : edgomez 195 for (i = 0; i < 64; i++) {
193 :     if ((int16_t) default_inter_matrix[i] != matrix[i])
194 : Isibaar 20 custom_inter_matrix = 1;
195 : edgomez 195 if (inter_matrix[i] != matrix[i])
196 : Isibaar 20 change = 1;
197 : Isibaar 4
198 :     inter_matrix[i] = (int16_t) matrix[i];
199 :     inter_matrix_fix[i] = FIX(inter_matrix[i]);
200 : Isibaar 3 }
201 : Isibaar 20 return custom_inter_matrix | change;
202 : Isibaar 3 }

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