[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 653, Sun Nov 17 00:41:20 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   *    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 file is part of XviD, a free MPEG-4 video encoder/decoder
10   *    it under the terms of the GNU General Public License as published by   *
11     *  XviD is free software; you can redistribute it and/or modify it
12     *  under the terms of the GNU General Public License as published by
13   *    the Free Software Foundation; either version 2 of the License, or   *    the Free Software Foundation; either version 2 of the License, or
14   *    (at your option) any later version.   *    (at your option) any later version.
15   *   *
# Line 24  Line 20 
20   *   *
21   *    You should have received a copy of the GNU General Public License   *    You should have received a copy of the GNU General Public License
22   *    along with this program; if not, write to the Free Software   *    along with this program; if not, write to the Free Software
23   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
24   *   *
25   *************************************************************************/   *  Under section 8 of the GNU General Public License, the copyright
26     *  holders of XVID explicitly forbid distribution in the following
27  /**************************************************************************   *  countries:
28   *   *
29   *    History:   *    - Japan
30   *   *    - United States of America
31   *      2.3.2002    inital version <suxen_drol@hotmail.com>   *
32   *   *  Linking XviD statically or dynamically with other modules is making a
33   *************************************************************************/   *  combined work based on XviD.  Thus, the terms and conditions of the
34     *  GNU General Public License cover the whole combination.
35  #include "common.h"   *
36     *  As a special exception, the copyright holders of XviD give you
37     *  permission to link XviD with independent modules that communicate with
38     *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the
39     *  license terms of these independent modules, and to copy and distribute
40     *  the resulting combined work under terms of your choice, provided that
41     *  every copy of the combined work is accompanied by a complete copy of
42     *  the source code of XviD (the version of XviD used to produce the
43     *  combined work), being distributed under the terms of the GNU General
44     *  Public License plus this exception.  An independent module is a module
45     *  which is not derived from or based on XviD.
46     *
47     *  Note that people who make modified versions of XviD are not obligated
48     *  to grant this special exception for their modified versions; it is
49     *  their choice whether to do so.  The GNU General Public License gives
50     *  permission to release a modified version without this exception; this
51     *  exception also makes it possible to release a modified version which
52     *  carries forward this exception.
53     *
54     * $Id: quant_matrix.c,v 1.12 2002-11-17 00:41:19 edgomez Exp $
55     *
56     ****************************************************************************/
57    
58    #include "quant_matrix.h"
59    
60    #define FIX(X) (1 << 16) / (X) + 1
61    
62    /*****************************************************************************
63     * Local data
64     ****************************************************************************/
65    
66    /* ToDo : remove all this local to make this module thread safe */
67    uint8_t custom_intra_matrix = 0;
68    uint8_t custom_inter_matrix = 0;
69    
70    uint8_t default_intra_matrix[64] = {
71            8, 17, 18, 19, 21, 23, 25, 27,
72            17, 18, 19, 21, 23, 25, 27, 28,
73            20, 21, 22, 23, 24, 26, 28, 30,
74            21, 22, 23, 24, 26, 28, 30, 32,
75            22, 23, 24, 26, 28, 30, 32, 35,
76            23, 24, 26, 28, 30, 32, 35, 38,
77            25, 26, 28, 30, 32, 35, 38, 41,
78            27, 28, 30, 32, 35, 38, 41, 45
79    };
80    
81  static const int16_t default_intra_matrix[64] = {  int16_t intra_matrix[64] = {
82       8,17,18,19,21,23,25,27,       8,17,18,19,21,23,25,27,
83      17,18,19,21,23,25,27,28,      17,18,19,21,23,25,27,28,
84      20,21,22,23,24,26,28,30,      20,21,22,23,24,26,28,30,
# Line 50  Line 89 
89      27,28,30,32,35,38,41,45      27,28,30,32,35,38,41,45
90  };  };
91    
92  static const int16_t default_inter_matrix[64] = {  int16_t intra_matrix_fix[64] = {
93            FIX(8), FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27),
94            FIX(17), FIX(18), FIX(19), FIX(21), FIX(23), FIX(25), FIX(27), FIX(28),
95            FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30),
96            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32),
97            FIX(22), FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35),
98            FIX(23), FIX(24), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38),
99            FIX(25), FIX(26), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41),
100            FIX(27), FIX(28), FIX(30), FIX(32), FIX(35), FIX(38), FIX(41), FIX(45)
101    };
102    
103    uint8_t default_inter_matrix[64] = {
104            16, 17, 18, 19, 20, 21, 22, 23,
105            17, 18, 19, 20, 21, 22, 23, 24,
106            18, 19, 20, 21, 22, 23, 24, 25,
107            19, 20, 21, 22, 23, 24, 26, 27,
108            20, 21, 22, 23, 25, 26, 27, 28,
109            21, 22, 23, 24, 26, 27, 28, 30,
110            22, 23, 24, 26, 27, 28, 30, 31,
111            23, 24, 25, 27, 28, 30, 31, 33
112    };
113    
114    int16_t inter_matrix[64] = {
115      16,17,18,19,20,21,22,23,      16,17,18,19,20,21,22,23,
116      17,18,19,20,21,22,23,24,      17,18,19,20,21,22,23,24,
117      18,19,20,21,22,23,24,25,      18,19,20,21,22,23,24,25,
# Line 61  Line 122 
122      23,24,25,27,28,30,31,33      23,24,25,27,28,30,31,33
123  };  };
124    
125    int16_t inter_matrix_fix[64] = {
126            FIX(16), FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23),
127            FIX(17), FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24),
128            FIX(18), FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(25),
129            FIX(19), FIX(20), FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27),
130            FIX(20), FIX(21), FIX(22), FIX(23), FIX(25), FIX(26), FIX(27), FIX(28),
131            FIX(21), FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30),
132            FIX(22), FIX(23), FIX(24), FIX(26), FIX(27), FIX(28), FIX(30), FIX(31),
133            FIX(23), FIX(24), FIX(25), FIX(27), FIX(28), FIX(30), FIX(31), FIX(33)
134    };
135    
136    /*****************************************************************************
137     * Functions
138     ****************************************************************************/
139    
140  void quant4_intra_init(QMATRIX * qmatrix, int use_default)  uint8_t
141    get_intra_matrix_status(void)
142  {  {
143          if (use_default)          return custom_intra_matrix;
144    }
145    
146    uint8_t
147    get_inter_matrix_status(void)
148    {
149            return custom_inter_matrix;
150    }
151    
152    void
153    set_intra_matrix_status(uint8_t status)
154          {          {
155                  memcpy(qmatrix->intra, default_intra_matrix, 64 * sizeof (int16_t));          custom_intra_matrix = status;
156          }          }
157    
158  #ifdef ARCH_X86  void
159          // TODO: generate mmx tables  set_inter_matrix_status(uint8_t status)
160  #endif  {
161            custom_inter_matrix = status;
162    }
163    
164    int16_t *
165    get_intra_matrix(void)
166    {
167            return intra_matrix;
168  }  }
169    
170    int16_t *
171    get_inter_matrix(void)
172    {
173            return inter_matrix;
174    }
175    
176  void quant4_inter_init(QMATRIX * qmatrix, int use_default)  uint8_t *
177    get_default_intra_matrix(void)
178  {  {
179          if (use_default)          return default_intra_matrix;
180    }
181    
182    uint8_t *
183    get_default_inter_matrix(void)
184          {          {
185                  memcpy(qmatrix->inter, default_inter_matrix, 64 * sizeof (int16_t));          return default_inter_matrix;
186          }          }
187    
188  #ifdef ARCH_X86  uint8_t
189          // TODO: generate mmx tables  set_intra_matrix(uint8_t * matrix)
190  #endif  {
191            int i, change = 0;
192    
193            custom_intra_matrix = 0;
194    
195            for (i = 0; i < 64; i++) {
196                    if ((int16_t) default_intra_matrix[i] != matrix[i])
197                            custom_intra_matrix = 1;
198                    if (intra_matrix[i] != matrix[i])
199                            change = 1;
200    
201                    intra_matrix[i] = (int16_t) matrix[i];
202                    intra_matrix_fix[i] = FIX(intra_matrix[i]);
203            }
204            return /*custom_intra_matrix |*/ change;
205    }
206    
207    
208    uint8_t
209    set_inter_matrix(uint8_t * matrix)
210    {
211            int i, change = 0;
212    
213            custom_inter_matrix = 0;
214    
215            for (i = 0; i < 64; i++) {
216                    if ((int16_t) default_inter_matrix[i] != matrix[i])
217                            custom_inter_matrix = 1;
218                    if (inter_matrix[i] != matrix[i])
219                            change = 1;
220    
221                    inter_matrix[i] = (int16_t) matrix[i];
222                    inter_matrix_fix[i] = FIX(inter_matrix[i]);
223            }
224            return /*custom_inter_matrix |*/ change;
225  }  }

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

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