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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2, Fri Mar 8 19:16:35 2002 UTC revision 1.13.2.2, Tue Oct 7 13:02:35 2003 UTC
# Line 1  Line 1 
1    /*****************************************************************************
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$
24     *
25     ****************************************************************************/
26    
27  #include "quant_matrix.h"  #include "quant_matrix.h"
28    
29  #define FIX(X) (1 << 16) / (X) + 1  #define FIX(X)   (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1))
30    #define FIXL(X)    ((1UL << 16) / (X) - 1)
31    
32    static uint8_t custom_intra_matrix = 0;
33    static uint8_t custom_inter_matrix = 0;
34    
35    /*****************************************************************************
36     * Default matrices
37     ****************************************************************************/
38    
39    static const uint8_t default_intra_matrix[64] = {
40             8, 17, 18, 19, 21, 23, 25, 27,
41            17, 18, 19, 21, 23, 25, 27, 28,
42            20, 21, 22, 23, 24, 26, 28, 30,
43            21, 22, 23, 24, 26, 28, 30, 32,
44            22, 23, 24, 26, 28, 30, 32, 35,
45            23, 24, 26, 28, 30, 32, 35, 38,
46            25, 26, 28, 30, 32, 35, 38, 41,
47            27, 28, 30, 32, 35, 38, 41, 45
48    };
49    
50  uint8_t intra_matrix_changed;  static const uint8_t default_inter_matrix[64] = {
51  uint8_t inter_matrix_changed;          16, 17, 18, 19, 20, 21, 22, 23,
52            17, 18, 19, 20, 21, 22, 23, 24,
53            18, 19, 20, 21, 22, 23, 24, 25,
54            19, 20, 21, 22, 23, 24, 26, 27,
55            20, 21, 22, 23, 25, 26, 27, 28,
56            21, 22, 23, 24, 26, 27, 28, 30,
57            22, 23, 24, 26, 27, 28, 30, 31,
58            23, 24, 25, 27, 28, 30, 31, 33
59    };
60    
61  int16_t intra_matrix[64] = {  int16_t intra_matrix[64] = {
62       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
# Line 16  Line 69 
69      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
70  };  };
71    
72  int16_t intra_matrix_fix[64] = {  uint16_t intra_matrix_fixfix[64] = {
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            0, 0, 0, 0, 0, 0, 0, 0,
78            0, 0, 0, 0, 0, 0, 0, 0,
79            0, 0, 0, 0, 0, 0, 0, 0,
80            0, 0, 0, 0, 0, 0, 0, 0
81    };
82    
83    uint16_t inter_matrix_fixfix[64] = {
84            0, 0, 0, 0, 0, 0, 0, 0,
85            0, 0, 0, 0, 0, 0, 0, 0,
86            0, 0, 0, 0, 0, 0, 0, 0,
87            0, 0, 0, 0, 0, 0, 0, 0,
88            0, 0, 0, 0, 0, 0, 0, 0,
89            0, 0, 0, 0, 0, 0, 0, 0,
90            0, 0, 0, 0, 0, 0, 0, 0,
91            0, 0, 0, 0, 0, 0, 0, 0
92    };
93    
94    uint16_t intra_matrix1[64] = {
95             8>>1, 17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1,
96            17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1, 28>>1,
97            20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1,
98            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1,
99            22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1,
100            23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1,
101            25>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1,
102            27>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1, 45>>1
103    };
104    
105    
106    uint16_t intra_matrix_fix[64] = {
107       FIX(8),FIX(17),FIX(18),FIX(19),FIX(21),FIX(23),FIX(25),FIX(27),       FIX(8),FIX(17),FIX(18),FIX(19),FIX(21),FIX(23),FIX(25),FIX(27),
108      FIX(17),FIX(18),FIX(19),FIX(21),FIX(23),FIX(25),FIX(27),FIX(28),      FIX(17),FIX(18),FIX(19),FIX(21),FIX(23),FIX(25),FIX(27),FIX(28),
109      FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),FIX(26),FIX(28),FIX(30),      FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),FIX(26),FIX(28),FIX(30),
# Line 27  Line 114 
114      FIX(27),FIX(28),FIX(30),FIX(32),FIX(35),FIX(38),FIX(41),FIX(45)      FIX(27),FIX(28),FIX(30),FIX(32),FIX(35),FIX(38),FIX(41),FIX(45)
115  };  };
116    
117    uint16_t intra_matrix_fixl[64] = {
118            FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),
119            FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),
120            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),
121            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),
122            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),
123            FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),
124            FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),
125            FIXL(27), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41), FIXL(45)
126    };
127    
128    uint16_t inter_matrix_fixl[64] = {
129            FIXL(16), FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23),
130            FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24),
131            FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(25),
132            FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27),
133            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(25), FIXL(26), FIXL(27), FIXL(28),
134            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30),
135            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30), FIXL(31),
136            FIXL(23), FIXL(24), FIXL(25), FIXL(27), FIXL(28), FIXL(30), FIXL(31), FIXL(33)
137    };
138    
139  int16_t inter_matrix[64] = {  int16_t inter_matrix[64] = {
140      16,17,18,19,20,21,22,23,      16,17,18,19,20,21,22,23,
141      17,18,19,20,21,22,23,24,      17,18,19,20,21,22,23,24,
# Line 38  Line 147 
147      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
148  };  };
149    
150  int16_t inter_matrix_fix[64] = {  uint16_t inter_matrix1[64] = {
151            16>>1, 17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1,
152            17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1,
153            18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 25>>1,
154            19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1,
155            20>>1, 21>>1, 22>>1, 23>>1, 25>>1, 26>>1, 27>>1, 28>>1,
156            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1,
157            22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1, 31>>1,
158            23>>1, 24>>1, 25>>1, 27>>1, 28>>1, 30>>1, 31>>1, 33>>1
159    };
160    
161    uint16_t inter_matrix_fix[64] = {
162      FIX(16),FIX(17),FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),      FIX(16),FIX(17),FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),
163      FIX(17),FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),      FIX(17),FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),
164      FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),FIX(25),      FIX(18),FIX(19),FIX(20),FIX(21),FIX(22),FIX(23),FIX(24),FIX(25),
# Line 49  Line 169 
169      FIX(23),FIX(24),FIX(25),FIX(27),FIX(28),FIX(30),FIX(31),FIX(33)      FIX(23),FIX(24),FIX(25),FIX(27),FIX(28),FIX(30),FIX(31),FIX(33)
170  };  };
171    
172  uint8_t get_intra_matrix_status(void) {  uint8_t
173          return intra_matrix_changed;  get_intra_matrix_status(void)
174    {
175            return custom_intra_matrix;
176  }  }
177    
178  uint8_t get_inter_matrix_status(void) {  uint8_t
179          return inter_matrix_changed;  get_inter_matrix_status(void)
180    {
181            return custom_inter_matrix;
182  }  }
183    
184  void set_intra_matrix_status(uint8_t status) {  void
185          intra_matrix_changed = status;  set_intra_matrix_status(uint8_t status)
186    {
187            custom_intra_matrix = status;
188  }  }
189    
190  void set_inter_matrix_status(uint8_t status) {  void
191          inter_matrix_changed = status;  set_inter_matrix_status(uint8_t status)
192    {
193            custom_inter_matrix = status;
194  }  }
195    
196  int16_t *get_intra_matrix(void) {  const int16_t *
197    get_intra_matrix(void)
198    {
199          return intra_matrix;          return intra_matrix;
200  }  }
201    
202  int16_t *get_inter_matrix(void) {  const int16_t *
203    get_inter_matrix(void)
204    {
205          return inter_matrix;          return inter_matrix;
206  }  }
207    
208  uint8_t set_intra_matrix(uint8_t *matrix)  const uint8_t *
209    get_default_intra_matrix(void)
210    {
211            return default_intra_matrix;
212    }
213    
214    const uint8_t *
215    get_default_inter_matrix(void)
216    {
217            return default_inter_matrix;
218    }
219    
220    uint8_t
221    set_intra_matrix(const uint8_t * matrix)
222  {  {
223          int i;          int i, change = 0;
224    
225          intra_matrix_changed = 0;          custom_intra_matrix = 0;
226    
227          for(i = 0; i < 64; i++) {          for(i = 0; i < 64; i++) {
228                    if ((int16_t) default_intra_matrix[i] != matrix[i])
229                            custom_intra_matrix = 1;
230                  if(intra_matrix[i] != matrix[i])                  if(intra_matrix[i] != matrix[i])
231                          intra_matrix_changed = 1;                          change = 1;
232    
233                  intra_matrix[i] = (int16_t) matrix[i];                  intra_matrix1[i] = ((intra_matrix[i] = (int16_t) matrix[i])>>1);
234                    intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);
235                  intra_matrix_fix[i] = FIX(intra_matrix[i]);                  intra_matrix_fix[i] = FIX(intra_matrix[i]);
236                    intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
237          }          }
238          return intra_matrix_changed;          return custom_intra_matrix | change;
239  }  }
240    
241    
242  uint8_t set_inter_matrix(uint8_t *matrix)  uint8_t
243    set_inter_matrix(const uint8_t * matrix)
244  {  {
245          int i;          int i, change = 0;
246    
247          inter_matrix_changed = 0;          custom_inter_matrix = 0;
248    
249          for(i = 0; i < 64; i++) {          for(i = 0; i < 64; i++) {
250                    if ((int16_t) default_inter_matrix[i] != matrix[i])
251                            custom_inter_matrix = 1;
252                  if(inter_matrix[i] != matrix[i])                  if(inter_matrix[i] != matrix[i])
253                          inter_matrix_changed = 1;                          change = 1;
254    
255                  inter_matrix[i] = (int16_t) matrix[i];                  inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);
256                    inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);
257                  inter_matrix_fix[i] = FIX(inter_matrix[i]);                  inter_matrix_fix[i] = FIX(inter_matrix[i]);
258                    inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
259          }          }
260          return inter_matrix_changed;          return custom_inter_matrix | change;
261  }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.13.2.2

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