[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 3, Fri Mar 8 02:46:11 2002 UTC branches/dev-api-4/xvidcore/src/quant/quant_matrix.c revision 1054, Mon Jun 9 13:55:56 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: quant_matrix.c,v 1.13.2.1 2003-06-09 13:55:19 edgomez Exp $
   
 /**************************************************************************  
  *  
  *    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    uint8_t custom_intra_matrix = 0;
33    uint8_t custom_inter_matrix = 0;
34    
35    uint8_t default_intra_matrix[64] = {
36            8, 17, 18, 19, 21, 23, 25, 27,
37            17, 18, 19, 21, 23, 25, 27, 28,
38            20, 21, 22, 23, 24, 26, 28, 30,
39            21, 22, 23, 24, 26, 28, 30, 32,
40            22, 23, 24, 26, 28, 30, 32, 35,
41            23, 24, 26, 28, 30, 32, 35, 38,
42            25, 26, 28, 30, 32, 35, 38, 41,
43            27, 28, 30, 32, 35, 38, 41, 45
44    };
45    
46  static const int16_t default_intra_matrix[64] = {  int16_t intra_matrix[64] = {
47       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
48      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
49      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 50  Line 54 
54      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
55  };  };
56    
57  static const int16_t default_inter_matrix[64] = {  uint16_t intra_matrix_fixfix[64] = {
58            0, 0, 0, 0, 0, 0, 0, 0,
59            0, 0, 0, 0, 0, 0, 0, 0,
60            0, 0, 0, 0, 0, 0, 0, 0,
61            0, 0, 0, 0, 0, 0, 0, 0,
62            0, 0, 0, 0, 0, 0, 0, 0,
63            0, 0, 0, 0, 0, 0, 0, 0,
64            0, 0, 0, 0, 0, 0, 0, 0,
65            0, 0, 0, 0, 0, 0, 0, 0
66    };
67    
68    uint16_t inter_matrix_fixfix[64] = {
69            0, 0, 0, 0, 0, 0, 0, 0,
70            0, 0, 0, 0, 0, 0, 0, 0,
71            0, 0, 0, 0, 0, 0, 0, 0,
72            0, 0, 0, 0, 0, 0, 0, 0,
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    };
78    
79    uint16_t intra_matrix1[64] = {
80            8>>1, 17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1,
81            17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1, 28>>1,
82            20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1,
83            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1,
84            22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1,
85            23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1,
86            25>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1,
87            27>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1, 45>>1
88    };
89    
90    
91    uint16_t intra_matrix_fix[64] = {
92            FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
93            FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
94            FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
95            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
96            FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
97            FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
98            FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
99            FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
100    };
101    
102    uint16_t intra_matrix_fixl[64] = {
103            FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),
104            FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),
105            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),
106            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),
107            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),
108            FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),
109            FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),
110            FIXL(27), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41), FIXL(45)
111    };
112    
113    uint16_t inter_matrix_fixl[64] = {
114            FIXL(16), FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23),
115            FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24),
116            FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(25),
117            FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27),
118            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(25), FIXL(26), FIXL(27), FIXL(28),
119            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30),
120            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30), FIXL(31),
121            FIXL(23), FIXL(24), FIXL(25), FIXL(27), FIXL(28), FIXL(30), FIXL(31), FIXL(33)
122    };
123    
124    uint8_t default_inter_matrix[64] = {
125            16, 17, 18, 19, 20, 21, 22, 23,
126            17, 18, 19, 20, 21, 22, 23, 24,
127            18, 19, 20, 21, 22, 23, 24, 25,
128            19, 20, 21, 22, 23, 24, 26, 27,
129            20, 21, 22, 23, 25, 26, 27, 28,
130            21, 22, 23, 24, 26, 27, 28, 30,
131            22, 23, 24, 26, 27, 28, 30, 31,
132            23, 24, 25, 27, 28, 30, 31, 33
133    };
134    
135    int16_t inter_matrix[64] = {
136      16,17,18,19,20,21,22,23,      16,17,18,19,20,21,22,23,
137      17,18,19,20,21,22,23,24,      17,18,19,20,21,22,23,24,
138      18,19,20,21,22,23,24,25,      18,19,20,21,22,23,24,25,
# Line 60  Line 142 
142      22,23,24,26,27,28,30,31,      22,23,24,26,27,28,30,31,
143      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
144  };  };
145    uint16_t inter_matrix1[64] = {
146            16>>1, 17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1,
147            17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1,
148            18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 25>>1,
149            19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1,
150            20>>1, 21>>1, 22>>1, 23>>1, 25>>1, 26>>1, 27>>1, 28>>1,
151            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1,
152            22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1, 31>>1,
153            23>>1, 24>>1, 25>>1, 27>>1, 28>>1, 30>>1, 31>>1, 33>>1
154    };
155    
156    uint16_t inter_matrix_fix[64] = {
157            FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
158            FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
159            FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
160            FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
161            FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
162            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
163            FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
164            FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
165    };
166    
167  void quant4_intra_init(QMATRIX * qmatrix, int use_default)  uint8_t
168    get_intra_matrix_status(void)
169  {  {
170          if (use_default)          return custom_intra_matrix;
171    }
172    
173    uint8_t
174    get_inter_matrix_status(void)
175          {          {
176                  memcpy(qmatrix->intra, default_intra_matrix, 64 * sizeof (int16_t));          return custom_inter_matrix;
177          }          }
178    
179  #ifdef ARCH_X86  void
180          // TODO: generate mmx tables  set_intra_matrix_status(uint8_t status)
181  #endif  {
182            custom_intra_matrix = status;
183    }
184    
185    void
186    set_inter_matrix_status(uint8_t status)
187    {
188            custom_inter_matrix = status;
189  }  }
190    
191    int16_t *
192    get_intra_matrix(void)
193    {
194            return intra_matrix;
195    }
196    
197  void quant4_inter_init(QMATRIX * qmatrix, int use_default)  int16_t *
198    get_inter_matrix(void)
199  {  {
200          if (use_default)          return inter_matrix;
201    }
202    
203    uint8_t *
204    get_default_intra_matrix(void)
205    {
206            return default_intra_matrix;
207    }
208    
209    uint8_t *
210    get_default_inter_matrix(void)
211          {          {
212                  memcpy(qmatrix->inter, default_inter_matrix, 64 * sizeof (int16_t));          return default_inter_matrix;
213          }          }
214    
215  #ifdef ARCH_X86  uint8_t
216          // TODO: generate mmx tables  set_intra_matrix(uint8_t * matrix)
217  #endif  {
218            int i, change = 0;
219    
220            custom_intra_matrix = 0;
221    
222            for (i = 0; i < 64; i++) {
223                    if ((int16_t) default_intra_matrix[i] != matrix[i])
224                            custom_intra_matrix = 1;
225                    if (intra_matrix[i] != matrix[i])
226                            change = 1;
227    
228                    intra_matrix1[i] = ((intra_matrix[i] = (int16_t) matrix[i])>>1);
229                    intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);
230                    intra_matrix_fix[i] = FIX(intra_matrix[i]);
231                    intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
232            }
233            return custom_intra_matrix | change;
234    }
235    
236    
237    uint8_t
238    set_inter_matrix(uint8_t * matrix)
239    {
240            int i, change = 0;
241    
242            custom_inter_matrix = 0;
243    
244            for (i = 0; i < 64; i++) {
245                    if ((int16_t) default_inter_matrix[i] != matrix[i])
246                            custom_inter_matrix = 1;
247                    if (inter_matrix[i] != matrix[i])
248                            change = 1;
249    
250                    inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);
251                    inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);
252                    inter_matrix_fix[i] = FIX(inter_matrix[i]);
253                    inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
254            }
255            return custom_inter_matrix | change;
256  }  }

Legend:
Removed from v.3  
changed lines
  Added in v.1054

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