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

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

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

trunk/xvidcore/src/quant/quant_matrix.c revision 195, Wed Jun 12 20:38:41 2002 UTC branches/dev-api-4/xvidcore/src/quant/quant_matrix.c revision 1174, 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: quant_matrix.c,v 1.13.2.2 2003-10-07 13:02:35 edgomez Exp $
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 95  Line 193 
193          custom_inter_matrix = status;          custom_inter_matrix = status;
194  }  }
195    
196  int16_t *  const int16_t *
197  get_intra_matrix(void)  get_intra_matrix(void)
198  {  {
199          return intra_matrix;          return intra_matrix;
200  }  }
201    
202  int16_t *  const int16_t *
203  get_inter_matrix(void)  get_inter_matrix(void)
204  {  {
205          return inter_matrix;          return inter_matrix;
206  }  }
207    
208  uint8_t *  const uint8_t *
209  get_default_intra_matrix(void)  get_default_intra_matrix(void)
210  {  {
211          return default_intra_matrix;          return default_intra_matrix;
212  }  }
213    
214  uint8_t *  const uint8_t *
215  get_default_inter_matrix(void)  get_default_inter_matrix(void)
216  {  {
217          return default_inter_matrix;          return default_inter_matrix;
218  }  }
219    
220  uint8_t  uint8_t
221  set_intra_matrix(uint8_t * matrix)  set_intra_matrix(const uint8_t * matrix)
222  {  {
223          int i, change = 0;          int i, change = 0;
224    
# Line 132  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  uint8_t
243  set_inter_matrix(uint8_t * matrix)  set_inter_matrix(const uint8_t * matrix)
244  {  {
245          int i, change = 0;          int i, change = 0;
246    
# Line 152  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.195  
changed lines
  Added in v.1174

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