[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.7, Sat Sep 7 14:16:13 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   *  XVID MPEG-4 VIDEO CODEC
4   *  - Custom matrix quantization functions -   *  - Quantization matrix management code  -
5   *   *
6   *  Copyright(C) 2002 Michael Militzer   *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7   *   *               2002 Peter Ross <pross@xvid.org>
  *  This program is an implementation of a part of one or more MPEG-4  
  *  Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  
  *  to use this software module in hardware or software products are  
  *  advised that its use may infringe existing patents or copyrights, and  
  *  any such use would be at such party's own risk.  The original  
  *  developer of this software module and his/her company, and subsequent  
  *  editors and their companies, will have no liability for use of this  
  *  software or modifications or derivatives thereof.  
8   *   *
9   *  This program is free software ; you can redistribute it and/or modify   *  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   *  it under the terms of the GNU General Public License as published by
# Line 34  Line 26 
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   * Local data   * Default matrices
37   ****************************************************************************/   ****************************************************************************/
38    
39  /* ToDo : remove all this local to make this module thread safe */  static const uint8_t default_intra_matrix[64] = {
 uint8_t custom_intra_matrix = 0;  
 uint8_t custom_inter_matrix = 0;  
   
 uint8_t const 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 55  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 66  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 77  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 const 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 99  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 110  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    
 /*****************************************************************************  
  * Functions  
  ****************************************************************************/  
   
172  uint8_t  uint8_t
173  get_intra_matrix_status(void)  get_intra_matrix_status(void)
174  {  {
# Line 138  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 175  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 195  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.7  
changed lines
  Added in v.1.13.2.2

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