[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 886, Fri Feb 21 14:49:29 2003 UTC
# Line 1  Line 1 
1  /**************************************************************************  #include "quant_matrix.h"
  *  
  *    XVID MPEG-4 VIDEO CODEC  
  *    mpeg-4 quantization matrix stuff  
  *  
  *    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.  
  *  
  *    This program is free software; you can redistribute it and/or modify  
  *    it under the terms of the GNU General Public License as published by  
  *    the Free Software Foundation; either version 2 of the License, or  
  *    (at your option) any later version.  
  *  
  *    This program is distributed in the hope that it will be useful,  
  *    but WITHOUT ANY WARRANTY; without even the implied warranty of  
  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
  *    GNU General Public License for more details.  
  *  
  *    You should have received a copy of the GNU General Public License  
  *    along with this program; if not, write to the Free Software  
  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
  *  
  *************************************************************************/  
   
 /**************************************************************************  
  *  
  *    History:  
  *  
  *      2.3.2002    inital version <suxen_drol@hotmail.com>  
  *  
  *************************************************************************/  
2    
3  #include "common.h"  #define FIX(X)   (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1))
4    #define FIXL(X)    ((1UL << 16) / (X) - 1)
5    
6    uint8_t custom_intra_matrix = 0;
7    uint8_t custom_inter_matrix = 0;
8    
9  static const int16_t default_intra_matrix[64] = {  uint8_t default_intra_matrix[64] = {
10       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
11      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
12      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 50  Line 17 
17      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
18  };  };
19    
20  static const int16_t default_inter_matrix[64] = {  int16_t intra_matrix[64] = {
21            8, 17, 18, 19, 21, 23, 25, 27,
22            17, 18, 19, 21, 23, 25, 27, 28,
23            20, 21, 22, 23, 24, 26, 28, 30,
24            21, 22, 23, 24, 26, 28, 30, 32,
25            22, 23, 24, 26, 28, 30, 32, 35,
26            23, 24, 26, 28, 30, 32, 35, 38,
27            25, 26, 28, 30, 32, 35, 38, 41,
28            27, 28, 30, 32, 35, 38, 41, 45
29    };
30    
31    uint16_t intra_matrix_fixfix[64] = {
32            0, 0, 0, 0, 0, 0, 0, 0,
33            0, 0, 0, 0, 0, 0, 0, 0,
34            0, 0, 0, 0, 0, 0, 0, 0,
35            0, 0, 0, 0, 0, 0, 0, 0,
36            0, 0, 0, 0, 0, 0, 0, 0,
37            0, 0, 0, 0, 0, 0, 0, 0,
38            0, 0, 0, 0, 0, 0, 0, 0,
39            0, 0, 0, 0, 0, 0, 0, 0
40    };
41    
42    uint16_t inter_matrix_fixfix[64] = {
43            0, 0, 0, 0, 0, 0, 0, 0,
44            0, 0, 0, 0, 0, 0, 0, 0,
45            0, 0, 0, 0, 0, 0, 0, 0,
46            0, 0, 0, 0, 0, 0, 0, 0,
47            0, 0, 0, 0, 0, 0, 0, 0,
48            0, 0, 0, 0, 0, 0, 0, 0,
49            0, 0, 0, 0, 0, 0, 0, 0,
50            0, 0, 0, 0, 0, 0, 0, 0
51    };
52    
53    uint16_t intra_matrix1[64] = {
54            8>>1, 17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1,
55            17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1, 28>>1,
56            20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1,
57            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1,
58            22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1,
59            23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1,
60            25>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1,
61            27>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1, 45>>1
62    };
63    
64    
65    uint16_t intra_matrix_fix[64] = {
66            FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
67            FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
68            FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
69            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
70            FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
71            FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
72            FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
73            FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
74    };
75    
76    uint16_t intra_matrix_fixl[64] = {
77            FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),
78            FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),
79            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),
80            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),
81            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),
82            FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),
83            FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),
84            FIXL(27), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41), FIXL(45)
85    };
86    
87    uint16_t inter_matrix_fixl[64] = {
88            FIXL(16), FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23),
89            FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24),
90            FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(25),
91            FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27),
92            FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(25), FIXL(26), FIXL(27), FIXL(28),
93            FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30),
94            FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30), FIXL(31),
95            FIXL(23), FIXL(24), FIXL(25), FIXL(27), FIXL(28), FIXL(30), FIXL(31), FIXL(33)
96    };
97    
98    uint8_t default_inter_matrix[64] = {
99            16, 17, 18, 19, 20, 21, 22, 23,
100            17, 18, 19, 20, 21, 22, 23, 24,
101            18, 19, 20, 21, 22, 23, 24, 25,
102            19, 20, 21, 22, 23, 24, 26, 27,
103            20, 21, 22, 23, 25, 26, 27, 28,
104            21, 22, 23, 24, 26, 27, 28, 30,
105            22, 23, 24, 26, 27, 28, 30, 31,
106            23, 24, 25, 27, 28, 30, 31, 33
107    };
108    
109    int16_t inter_matrix[64] = {
110      16,17,18,19,20,21,22,23,      16,17,18,19,20,21,22,23,
111      17,18,19,20,21,22,23,24,      17,18,19,20,21,22,23,24,
112      18,19,20,21,22,23,24,25,      18,19,20,21,22,23,24,25,
# Line 60  Line 116 
116      22,23,24,26,27,28,30,31,      22,23,24,26,27,28,30,31,
117      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
118  };  };
119    uint16_t inter_matrix1[64] = {
120            16>>1, 17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1,
121            17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1,
122            18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 25>>1,
123            19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1,
124            20>>1, 21>>1, 22>>1, 23>>1, 25>>1, 26>>1, 27>>1, 28>>1,
125            21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1,
126            22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1, 31>>1,
127            23>>1, 24>>1, 25>>1, 27>>1, 28>>1, 30>>1, 31>>1, 33>>1
128    };
129    
130    uint16_t inter_matrix_fix[64] = {
131            FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
132            FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
133            FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
134            FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
135            FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
136            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
137            FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
138            FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
139    };
140    
141  void quant4_intra_init(QMATRIX * qmatrix, int use_default)  uint8_t
142    get_intra_matrix_status(void)
143  {  {
144          if (use_default)          return custom_intra_matrix;
145    }
146    
147    uint8_t
148    get_inter_matrix_status(void)
149          {          {
150                  memcpy(qmatrix->intra, default_intra_matrix, 64 * sizeof (int16_t));          return custom_inter_matrix;
151          }          }
152    
153  #ifdef ARCH_X86  void
154          // TODO: generate mmx tables  set_intra_matrix_status(uint8_t status)
155  #endif  {
156            custom_intra_matrix = status;
157    }
158    
159    void
160    set_inter_matrix_status(uint8_t status)
161    {
162            custom_inter_matrix = status;
163  }  }
164    
165    int16_t *
166    get_intra_matrix(void)
167    {
168            return intra_matrix;
169    }
170    
171  void quant4_inter_init(QMATRIX * qmatrix, int use_default)  int16_t *
172    get_inter_matrix(void)
173  {  {
174          if (use_default)          return inter_matrix;
175    }
176    
177    uint8_t *
178    get_default_intra_matrix(void)
179          {          {
180                  memcpy(qmatrix->inter, default_inter_matrix, 64 * sizeof (int16_t));          return default_intra_matrix;
181          }          }
182    
183  #ifdef ARCH_X86  uint8_t *
184          // TODO: generate mmx tables  get_default_inter_matrix(void)
185  #endif  {
186            return default_inter_matrix;
187    }
188    
189    uint8_t
190    set_intra_matrix(uint8_t * matrix)
191    {
192            int i, change = 0;
193    
194            custom_intra_matrix = 0;
195    
196            for (i = 0; i < 64; i++) {
197                    if ((int16_t) default_intra_matrix[i] != matrix[i])
198                            custom_intra_matrix = 1;
199                    if (intra_matrix[i] != matrix[i])
200                            change = 1;
201    
202                    intra_matrix1[i] = ((intra_matrix[i] = (int16_t) matrix[i])>>1);
203                    intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);
204                    intra_matrix_fix[i] = FIX(intra_matrix[i]);
205                    intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
206            }
207            return custom_intra_matrix | change;
208    }
209    
210    
211    uint8_t
212    set_inter_matrix(uint8_t * matrix)
213    {
214            int i, change = 0;
215    
216            custom_inter_matrix = 0;
217    
218            for (i = 0; i < 64; i++) {
219                    if ((int16_t) default_inter_matrix[i] != matrix[i])
220                            custom_inter_matrix = 1;
221                    if (inter_matrix[i] != matrix[i])
222                            change = 1;
223    
224                    inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);
225                    inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);
226                    inter_matrix_fix[i] = FIX(inter_matrix[i]);
227                    inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
228            }
229            return custom_inter_matrix | change;
230  }  }

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

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