[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.3, Sat Mar 9 21:41:19 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  uint8_t custom_intra_matrix = 0;  /*****************************************************************************
36  uint8_t custom_inter_matrix = 0;   * Default matrices
37     ****************************************************************************/
38    
39  uint8_t default_intra_matrix[64] = {  static const uint8_t default_intra_matrix[64] = {
40       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
41      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
42      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 16  Line 47 
47      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
48  };  };
49    
50    static const uint8_t default_inter_matrix[64] = {
51            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,
63      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
# Line 27  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 38  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  uint8_t default_inter_matrix[64] = {  uint16_t intra_matrix_fixl[64] = {
118      16,17,18,19,20,21,22,23,          FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),
119      17,18,19,20,21,22,23,24,          FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),
120      18,19,20,21,22,23,24,25,          FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),
121      19,20,21,22,23,24,26,27,          FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),
122      20,21,22,23,25,26,27,28,          FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),
123      21,22,23,24,26,27,28,30,          FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),
124      22,23,24,26,27,28,30,31,          FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),
125      23,24,25,27,28,30,31,33          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] = {
# Line 60  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 71  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    get_intra_matrix_status(void)
174    {
175          return custom_intra_matrix;          return custom_intra_matrix;
176  }  }
177    
178  uint8_t get_inter_matrix_status(void) {  uint8_t
179    get_inter_matrix_status(void)
180    {
181          return custom_inter_matrix;          return custom_inter_matrix;
182  }  }
183    
184  void set_intra_matrix_status(uint8_t status) {  void
185    set_intra_matrix_status(uint8_t status)
186    {
187          custom_intra_matrix = status;          custom_intra_matrix = status;
188  }  }
189    
190  void set_inter_matrix_status(uint8_t status) {  void
191    set_inter_matrix_status(uint8_t status)
192    {
193          custom_inter_matrix = status;          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  uint8_t *get_default_intra_matrix(void) {  const int16_t *
203    get_inter_matrix(void)
204    {
205            return inter_matrix;
206    }
207    
208    const uint8_t *
209    get_default_intra_matrix(void)
210    {
211          return default_intra_matrix;          return default_intra_matrix;
212  }  }
213    
214  uint8_t *get_default_inter_matrix(void) {  const uint8_t *
215    get_default_inter_matrix(void)
216    {
217          return default_inter_matrix;          return default_inter_matrix;
218  }  }
219    
220  uint8_t set_intra_matrix(uint8_t *matrix)  uint8_t
221    set_intra_matrix(const uint8_t * matrix)
222  {  {
223          int i, change = 0;          int i, change = 0;
224    
# Line 111  Line 230 
230                  if(intra_matrix[i] != matrix[i])                  if(intra_matrix[i] != matrix[i])
231                          change = 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 custom_intra_matrix | change;          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, change = 0;          int i, change = 0;
246    
# Line 130  Line 252 
252                  if(inter_matrix[i] != matrix[i])                  if(inter_matrix[i] != matrix[i])
253                          change = 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 custom_inter_matrix | change;          return custom_inter_matrix | change;
261  }  }

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

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