[svn] / branches / release-1_3-branch / xvidcore / src / quant / quant_matrix.c Repository:
ViewVC logotype

Diff of /branches/release-1_3-branch/xvidcore/src/quant/quant_matrix.c

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

revision 851, Sat Feb 15 15:22:19 2003 UTC revision 1382, Mon Mar 22 22:36:25 2004 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.14 2004-03-22 22:36:24 edgomez Exp $
24     *
25     ****************************************************************************/
26    
27  #include "quant_matrix.h"  #include "quant_matrix.h"
28    
29  #define FIX(X)   (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1))  #define FIX(X)   (((X)==1) ? 0xFFFF : ((1UL << 16) / (X) + 1))
30  #define FIXL(X)    ((1UL << 16) / (X) - 1)  #define FIXL(X)    ((1UL << 16) / (X) - 1)
31    
32  uint8_t custom_intra_matrix = 0;  /*****************************************************************************
33  uint8_t custom_inter_matrix = 0;   * Default matrices
34     ****************************************************************************/
35    
36  uint8_t default_intra_matrix[64] = {  static const uint8_t default_intra_matrix[64] = {
37          8, 17, 18, 19, 21, 23, 25, 27,          8, 17, 18, 19, 21, 23, 25, 27,
38          17, 18, 19, 21, 23, 25, 27, 28,          17, 18, 19, 21, 23, 25, 27, 28,
39          20, 21, 22, 23, 24, 26, 28, 30,          20, 21, 22, 23, 24, 26, 28, 30,
# Line 17  Line 44 
44          27, 28, 30, 32, 35, 38, 41, 45          27, 28, 30, 32, 35, 38, 41, 45
45  };  };
46    
47  int16_t intra_matrix[64] = {  static const uint8_t default_inter_matrix[64] = {
         8, 17, 18, 19, 21, 23, 25, 27,  
         17, 18, 19, 21, 23, 25, 27, 28,  
         20, 21, 22, 23, 24, 26, 28, 30,  
         21, 22, 23, 24, 26, 28, 30, 32,  
         22, 23, 24, 26, 28, 30, 32, 35,  
         23, 24, 26, 28, 30, 32, 35, 38,  
         25, 26, 28, 30, 32, 35, 38, 41,  
         27, 28, 30, 32, 35, 38, 41, 45  
 };  
   
 uint16_t intra_matrix_fixfix[64] = {  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0  
 };  
   
 uint16_t inter_matrix_fixfix[64] = {  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0,  
         0, 0, 0, 0, 0, 0, 0, 0  
 };  
   
 uint16_t intra_matrix1[64] = {  
         8>>1, 17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1,  
         17>>1, 18>>1, 19>>1, 21>>1, 23>>1, 25>>1, 27>>1, 28>>1,  
         20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1,  
         21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1,  
         22>>1, 23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1,  
         23>>1, 24>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1,  
         25>>1, 26>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1,  
         27>>1, 28>>1, 30>>1, 32>>1, 35>>1, 38>>1, 41>>1, 45>>1  
 };  
   
   
 uint16_t intra_matrix_fix[64] = {  
         FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),  
         FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),  
         FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),  
         FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),  
         FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),  
         FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),  
         FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),  
         FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)  
 };  
   
 uint16_t intra_matrix_fixl[64] = {  
         FIXL(8), FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27),  
         FIXL(17), FIXL(18), FIXL(19), FIXL(21), FIXL(23), FIXL(25), FIXL(27), FIXL(28),  
         FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30),  
         FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32),  
         FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35),  
         FIXL(23), FIXL(24), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38),  
         FIXL(25), FIXL(26), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41),  
         FIXL(27), FIXL(28), FIXL(30), FIXL(32), FIXL(35), FIXL(38), FIXL(41), FIXL(45)  
 };  
   
 uint16_t inter_matrix_fixl[64] = {  
         FIXL(16), FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23),  
         FIXL(17), FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24),  
         FIXL(18), FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(25),  
         FIXL(19), FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27),  
         FIXL(20), FIXL(21), FIXL(22), FIXL(23), FIXL(25), FIXL(26), FIXL(27), FIXL(28),  
         FIXL(21), FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30),  
         FIXL(22), FIXL(23), FIXL(24), FIXL(26), FIXL(27), FIXL(28), FIXL(30), FIXL(31),  
         FIXL(23), FIXL(24), FIXL(25), FIXL(27), FIXL(28), FIXL(30), FIXL(31), FIXL(33)  
 };  
   
 uint8_t default_inter_matrix[64] = {  
         16, 17, 18, 19, 20, 21, 22, 23,  
         17, 18, 19, 20, 21, 22, 23, 24,  
         18, 19, 20, 21, 22, 23, 24, 25,  
         19, 20, 21, 22, 23, 24, 26, 27,  
         20, 21, 22, 23, 25, 26, 27, 28,  
         21, 22, 23, 24, 26, 27, 28, 30,  
         22, 23, 24, 26, 27, 28, 30, 31,  
         23, 24, 25, 27, 28, 30, 31, 33  
 };  
   
 int16_t inter_matrix[64] = {  
48          16, 17, 18, 19, 20, 21, 22, 23,          16, 17, 18, 19, 20, 21, 22, 23,
49          17, 18, 19, 20, 21, 22, 23, 24,          17, 18, 19, 20, 21, 22, 23, 24,
50          18, 19, 20, 21, 22, 23, 24, 25,          18, 19, 20, 21, 22, 23, 24, 25,
# Line 116  Line 54 
54          22, 23, 24, 26, 27, 28, 30, 31,          22, 23, 24, 26, 27, 28, 30, 31,
55          23, 24, 25, 27, 28, 30, 31, 33          23, 24, 25, 27, 28, 30, 31, 33
56  };  };
 uint16_t inter_matrix1[64] = {  
         16>>1, 17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1,  
         17>>1, 18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1,  
         18>>1, 19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 25>>1,  
         19>>1, 20>>1, 21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1,  
         20>>1, 21>>1, 22>>1, 23>>1, 25>>1, 26>>1, 27>>1, 28>>1,  
         21>>1, 22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1,  
         22>>1, 23>>1, 24>>1, 26>>1, 27>>1, 28>>1, 30>>1, 31>>1,  
         23>>1, 24>>1, 25>>1, 27>>1, 28>>1, 30>>1, 31>>1, 33>>1  
 };  
57    
58  uint16_t inter_matrix_fix[64] = {  const uint16_t *
59          FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),  get_intra_matrix(const uint16_t * mpeg_quant_matrices)
         FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),  
         FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),  
         FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),  
         FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),  
         FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),  
         FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),  
         FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)  
 };  
   
 uint8_t  
 get_intra_matrix_status(void)  
60  {  {
61          return custom_intra_matrix;          return(mpeg_quant_matrices + 0*64);
62  }  }
63    
64  uint8_t  const uint16_t *
65  get_inter_matrix_status(void)  get_inter_matrix(const uint16_t * mpeg_quant_matrices)
66  {  {
67          return custom_inter_matrix;          return(mpeg_quant_matrices + 4*64);
68  }  }
69    
70  void  const uint8_t *
71  set_intra_matrix_status(uint8_t status)  get_default_intra_matrix(void)
72  {  {
73          custom_intra_matrix = status;          return default_intra_matrix;
74  }  }
75    
76  void  const uint8_t *
77  set_inter_matrix_status(uint8_t status)  get_default_inter_matrix(void)
78  {  {
79          custom_inter_matrix = status;          return default_inter_matrix;
80  }  }
81    
82  int16_t *  int
83  get_intra_matrix(void)  is_custom_intra_matrix(const uint16_t * mpeg_quant_matrices)
84  {  {
85          return intra_matrix;          int i;
86  }          const uint16_t *intra_matrix = get_intra_matrix(mpeg_quant_matrices);
87            const uint8_t *def_intra_matrix = get_default_intra_matrix();
88    
89  int16_t *          for (i = 0; i < 64; i++) {
90  get_inter_matrix(void)                  if(intra_matrix[i] != def_intra_matrix[i])
91  {                          return 1;
         return inter_matrix;  
92  }  }
93            return 0;
 uint8_t *  
 get_default_intra_matrix(void)  
 {  
         return default_intra_matrix;  
94  }  }
95    
96  uint8_t *  int
97  get_default_inter_matrix(void)  is_custom_inter_matrix(const uint16_t * mpeg_quant_matrices)
98  {  {
99          return default_inter_matrix;          int i;
100            const uint16_t *inter_matrix = get_inter_matrix(mpeg_quant_matrices);
101            const uint8_t *def_inter_matrix = get_default_inter_matrix();
102    
103            for (i = 0; i < 64; i++) {
104                    if(inter_matrix[i] != (uint16_t)def_inter_matrix[i])
105                            return 1;
106            }
107            return 0;
108  }  }
109    
110  uint8_t  void
111  set_intra_matrix(uint8_t * matrix)  set_intra_matrix(uint16_t * mpeg_quant_matrices, const uint8_t * matrix)
112  {  {
113          int i, change = 0;          int i;
114            uint16_t *intra_matrix = mpeg_quant_matrices + 0*64;
115          custom_intra_matrix = 0;          uint16_t *intra_matrix1 = mpeg_quant_matrices + 1*64;
116            uint16_t *intra_matrix_fix = mpeg_quant_matrices + 2*64;
117            uint16_t *intra_matrix_fixl = mpeg_quant_matrices + 3*64;
118    
119          for (i = 0; i < 64; i++) {          for (i = 0; i < 64; i++) {
120                  if ((int16_t) default_intra_matrix[i] != matrix[i])                  intra_matrix[i] = (!i) ? (uint16_t)8: (uint16_t)matrix[i];
121                          custom_intra_matrix = 1;                  intra_matrix1[i] = (intra_matrix[i]>>1);
                 if (intra_matrix[i] != matrix[i])  
                         change = 1;  
   
                 intra_matrix1[i] = ((intra_matrix[i] = (int16_t) matrix[i])>>1);  
122                  intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);                  intra_matrix1[i] += ((intra_matrix[i] == 1) ? 1: 0);
123                  intra_matrix_fix[i] = FIX(intra_matrix[i]);                  intra_matrix_fix[i] = FIX(intra_matrix[i]);
124                  intra_matrix_fixl[i] = FIXL(intra_matrix[i]);                  intra_matrix_fixl[i] = FIXL(intra_matrix[i]);
125          }          }
         return custom_intra_matrix | change;  
126  }  }
127    
128    void
129  uint8_t  set_inter_matrix(uint16_t * mpeg_quant_matrices, const uint8_t * matrix)
 set_inter_matrix(uint8_t * matrix)  
130  {  {
131          int i, change = 0;          int i;
132            uint16_t *inter_matrix = mpeg_quant_matrices + 4*64;
133          custom_inter_matrix = 0;          uint16_t *inter_matrix1 = mpeg_quant_matrices + 5*64;
134            uint16_t *inter_matrix_fix = mpeg_quant_matrices + 6*64;
135            uint16_t *inter_matrix_fixl = mpeg_quant_matrices + 7*64;
136    
137          for (i = 0; i < 64; i++) {          for (i = 0; i < 64; i++) {
                 if ((int16_t) default_inter_matrix[i] != matrix[i])  
                         custom_inter_matrix = 1;  
                 if (inter_matrix[i] != matrix[i])  
                         change = 1;  
   
138                  inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);                  inter_matrix1[i] = ((inter_matrix[i] = (int16_t) matrix[i])>>1);
139                  inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);                  inter_matrix1[i] += ((inter_matrix[i] == 1) ? 1: 0);
140                  inter_matrix_fix[i] = FIX(inter_matrix[i]);                  inter_matrix_fix[i] = FIX(inter_matrix[i]);
141                  inter_matrix_fixl[i] = FIXL(inter_matrix[i]);                  inter_matrix_fixl[i] = FIXL(inter_matrix[i]);
142          }          }
143          return custom_inter_matrix | change;  }
144    
145    void
146    init_mpeg_matrix(uint16_t * mpeg_quant_matrices) {
147    
148            set_intra_matrix(mpeg_quant_matrices, default_intra_matrix);
149            set_inter_matrix(mpeg_quant_matrices, default_inter_matrix);
150  }  }

Legend:
Removed from v.851  
changed lines
  Added in v.1382

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