[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

revision 3, Fri Mar 8 02:46:11 2002 UTC revision 457, Sun Sep 8 17:28:22 2002 UTC
# Line 1  Line 1 
1  /**************************************************************************  /*****************************************************************************
2   *   *
3   *    XVID MPEG-4 VIDEO CODEC   *    XVID MPEG-4 VIDEO CODEC
4   *    mpeg-4 quantization matrix stuff   *  - Custom matrix quantization functions -
5     *
6     *  Copyright(C) 2002 Michael Militzer
7   *   *
8   *    This program is an implementation of a part of one or more MPEG-4   *    This program is an implementation of a part of one or more MPEG-4
9   *    Video tools as specified in ISO/IEC 14496-2 standard.  Those intending   *    Video tools as specified in ISO/IEC 14496-2 standard.  Those intending
# Line 24  Line 26 
26   *   *
27   *    You should have received a copy of the GNU General Public License   *    You should have received a copy of the GNU General Public License
28   *    along with this program; if not, write to the Free Software   *    along with this program; if not, write to the Free Software
29   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  *  
  *************************************************************************/  
   
 /**************************************************************************  
  *  
  *    History:  
30   *   *
31   *      2.3.2002    inital version <suxen_drol@hotmail.com>   *  $Id: quant_matrix.c,v 1.8 2002-09-08 17:28:22 edgomez Exp $
32   *   *
33   *************************************************************************/   ****************************************************************************/
34    
35    #include "quant_matrix.h"
36    
37    #define FIX(X) (1 << 16) / (X) + 1
38    
39    /*****************************************************************************
40     * Local data
41     ****************************************************************************/
42    
43  #include "common.h"  /* ToDo : remove all this local to make this module thread safe */
44    uint8_t custom_intra_matrix = 0;
45    uint8_t custom_inter_matrix = 0;
46    
47    uint8_t default_intra_matrix[64] = {
48            8, 17, 18, 19, 21, 23, 25, 27,
49            17, 18, 19, 21, 23, 25, 27, 28,
50            20, 21, 22, 23, 24, 26, 28, 30,
51            21, 22, 23, 24, 26, 28, 30, 32,
52            22, 23, 24, 26, 28, 30, 32, 35,
53            23, 24, 26, 28, 30, 32, 35, 38,
54            25, 26, 28, 30, 32, 35, 38, 41,
55            27, 28, 30, 32, 35, 38, 41, 45
56    };
57    
58  static const int16_t default_intra_matrix[64] = {  int16_t intra_matrix[64] = {
59       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
60      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
61      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 50  Line 66 
66      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
67  };  };
68    
69  static const int16_t default_inter_matrix[64] = {  int16_t intra_matrix_fix[64] = {
70            FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
71            FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
72            FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
73            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
74            FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
75            FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
76            FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
77            FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
78    };
79    
80    uint8_t default_inter_matrix[64] = {
81      16,17,18,19,20,21,22,23,      16,17,18,19,20,21,22,23,
82      17,18,19,20,21,22,23,24,      17,18,19,20,21,22,23,24,
83      18,19,20,21,22,23,24,25,      18,19,20,21,22,23,24,25,
# Line 61  Line 88 
88      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
89  };  };
90    
91    int16_t inter_matrix[64] = {
92            16, 17, 18, 19, 20, 21, 22, 23,
93            17, 18, 19, 20, 21, 22, 23, 24,
94            18, 19, 20, 21, 22, 23, 24, 25,
95            19, 20, 21, 22, 23, 24, 26, 27,
96            20, 21, 22, 23, 25, 26, 27, 28,
97            21, 22, 23, 24, 26, 27, 28, 30,
98            22, 23, 24, 26, 27, 28, 30, 31,
99            23, 24, 25, 27, 28, 30, 31, 33
100    };
101    
102  void quant4_intra_init(QMATRIX * qmatrix, int use_default)  int16_t inter_matrix_fix[64] = {
103            FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
104            FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
105            FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
106            FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
107            FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
108            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
109            FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
110            FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
111    };
112    
113    /*****************************************************************************
114     * Functions
115     ****************************************************************************/
116    
117    uint8_t
118    get_intra_matrix_status(void)
119  {  {
120          if (use_default)          return custom_intra_matrix;
121    }
122    
123    uint8_t
124    get_inter_matrix_status(void)
125    {
126            return custom_inter_matrix;
127    }
128    
129    void
130    set_intra_matrix_status(uint8_t status)
131          {          {
132                  memcpy(qmatrix->intra, default_intra_matrix, 64 * sizeof (int16_t));          custom_intra_matrix = status;
133          }          }
134    
135  #ifdef ARCH_X86  void
136          // TODO: generate mmx tables  set_inter_matrix_status(uint8_t status)
137  #endif  {
138            custom_inter_matrix = status;
139    }
140    
141    int16_t *
142    get_intra_matrix(void)
143    {
144            return intra_matrix;
145  }  }
146    
147    int16_t *
148    get_inter_matrix(void)
149    {
150            return inter_matrix;
151    }
152    
153  void quant4_inter_init(QMATRIX * qmatrix, int use_default)  uint8_t *
154    get_default_intra_matrix(void)
155  {  {
156          if (use_default)          return default_intra_matrix;
157    }
158    
159    uint8_t *
160    get_default_inter_matrix(void)
161          {          {
162                  memcpy(qmatrix->inter, default_inter_matrix, 64 * sizeof (int16_t));          return default_inter_matrix;
163          }          }
164    
165  #ifdef ARCH_X86  uint8_t
166          // TODO: generate mmx tables  set_intra_matrix(uint8_t * matrix)
167  #endif  {
168            int i, change = 0;
169    
170            custom_intra_matrix = 0;
171    
172            for (i = 0; i < 64; i++) {
173                    if ((int16_t) default_intra_matrix[i] != matrix[i])
174                            custom_intra_matrix = 1;
175                    if (intra_matrix[i] != matrix[i])
176                            change = 1;
177    
178                    intra_matrix[i] = (int16_t) matrix[i];
179                    intra_matrix_fix[i] = FIX(intra_matrix[i]);
180            }
181            return custom_intra_matrix | change;
182    }
183    
184    
185    uint8_t
186    set_inter_matrix(uint8_t * matrix)
187    {
188            int i, change = 0;
189    
190            custom_inter_matrix = 0;
191    
192            for (i = 0; i < 64; i++) {
193                    if ((int16_t) default_inter_matrix[i] != matrix[i])
194                            custom_inter_matrix = 1;
195                    if (inter_matrix[i] != matrix[i])
196                            change = 1;
197    
198                    inter_matrix[i] = (int16_t) matrix[i];
199                    inter_matrix_fix[i] = FIX(inter_matrix[i]);
200            }
201            return custom_inter_matrix | change;
202  }  }

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

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