[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.1.1.1, Fri Mar 8 02:44:55 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   *    mpeg-4 quantization matrix stuff   *  - Quantization matrix management code  -
5   *   *
6   *    This program is an implementation of a part of one or more MPEG-4   *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7   *    Video tools as specified in ISO/IEC 14496-2 standard.  Those intending   *               2002 Peter Ross <pross@xvid.org>
  *    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 24  Line 18 
18   *   *
19   *    You should have received a copy of the GNU General Public License   *    You should have received a copy of the GNU General Public License
20   *    along with this program; if not, write to the Free Software   *    along with this program; if not, write to the Free Software
21   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
22   *   *
23   *************************************************************************/   * $Id$
   
 /**************************************************************************  
  *  
  *    History:  
24   *   *
25   *      2.3.2002    inital version <suxen_drol@hotmail.com>   ****************************************************************************/
26   *  
27   *************************************************************************/  #include "quant_matrix.h"
28    
29  #include "common.h"  #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    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  static const int16_t default_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,
64      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 50  Line 69 
69      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
70  };  };
71    
72  static const int16_t default_inter_matrix[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),
108            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),
110            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
111            FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
112            FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
113            FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
114            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] = {
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,
142      18,19,20,21,22,23,24,25,      18,19,20,21,22,23,24,25,
# Line 61  Line 147 
147      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
148  };  };
149    
150    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),
163            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),
165            FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
166            FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
167            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
168            FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
169            FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
170    };
171    
172    uint8_t
173    get_intra_matrix_status(void)
174    {
175            return custom_intra_matrix;
176    }
177    
178  void quant4_intra_init(QMATRIX * qmatrix, int use_default)  uint8_t
179    get_inter_matrix_status(void)
180  {  {
181          if (use_default)          return custom_inter_matrix;
182    }
183    
184    void
185    set_intra_matrix_status(uint8_t status)
186    {
187            custom_intra_matrix = status;
188    }
189    
190    void
191    set_inter_matrix_status(uint8_t status)
192          {          {
193                  memcpy(qmatrix->intra, default_intra_matrix, 64 * sizeof (int16_t));          custom_inter_matrix = status;
194          }          }
195    
196  #ifdef ARCH_X86  const int16_t *
197          // TODO: generate mmx tables  get_intra_matrix(void)
198  #endif  {
199            return intra_matrix;
200    }
201    
202    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;
212    }
213    
214  void quant4_inter_init(QMATRIX * qmatrix, int use_default)  const uint8_t *
215    get_default_inter_matrix(void)
216  {  {
217          if (use_default)          return default_inter_matrix;
218    }
219    
220    uint8_t
221    set_intra_matrix(const uint8_t * matrix)
222          {          {
223                  memcpy(qmatrix->inter, default_inter_matrix, 64 * sizeof (int16_t));          int i, change = 0;
224    
225            custom_intra_matrix = 0;
226    
227            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])
231                            change = 1;
232    
233                    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]);
236                    intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
237          }          }
238            return custom_intra_matrix | change;
239    }
240    
241    
242  #ifdef ARCH_X86  uint8_t
243          // TODO: generate mmx tables  set_inter_matrix(const uint8_t * matrix)
244  #endif  {
245            int i, change = 0;
246    
247            custom_inter_matrix = 0;
248    
249            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])
253                            change = 1;
254    
255                    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]);
258                    inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
259            }
260            return custom_inter_matrix | change;
261  }  }

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

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