[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 4, Fri Mar 8 19:17:46 2002 UTC revision 653, Sun Nov 17 00:41:20 2002 UTC
# Line 1  Line 1 
1    /*****************************************************************************
2     *
3     *  XVID MPEG-4 VIDEO CODEC
4     *  - Custom matrix quantization functions -
5     *
6     *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7     *               2002 Peter Ross <pross@xvid.org>
8     *
9     *  This file is part of XviD, a free MPEG-4 video encoder/decoder
10     *
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
14     *  (at your option) any later version.
15     *
16     *  This program is distributed in the hope that it will be useful,
17     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     *  GNU General Public License for more details.
20     *
21     *  You should have received a copy of the GNU General Public License
22     *  along with this program; if not, write to the Free Software
23     *  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     *    - Japan
30     *    - United States of America
31     *
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     *
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"  #include "quant_matrix.h"
59    
60  #define FIX(X) (1 << 16) / (X) + 1  #define FIX(X) (1 << 16) / (X) + 1
61    
62  uint8_t intra_matrix_changed;  /*****************************************************************************
63  uint8_t inter_matrix_changed;   * 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  int16_t 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,
# Line 27  Line 100 
100      FIX(27),FIX(28),FIX(30),FIX(32),FIX(35),FIX(38),FIX(41),FIX(45)      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] = {  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,
# Line 49  Line 133 
133      FIX(23),FIX(24),FIX(25),FIX(27),FIX(28),FIX(30),FIX(31),FIX(33)      FIX(23),FIX(24),FIX(25),FIX(27),FIX(28),FIX(30),FIX(31),FIX(33)
134  };  };
135    
136  uint8_t get_intra_matrix_status(void) {  /*****************************************************************************
137          return intra_matrix_changed;   * Functions
138     ****************************************************************************/
139    
140    uint8_t
141    get_intra_matrix_status(void)
142    {
143            return custom_intra_matrix;
144  }  }
145    
146  uint8_t get_inter_matrix_status(void) {  uint8_t
147          return inter_matrix_changed;  get_inter_matrix_status(void)
148    {
149            return custom_inter_matrix;
150  }  }
151    
152  void set_intra_matrix_status(uint8_t status) {  void
153          intra_matrix_changed = status;  set_intra_matrix_status(uint8_t status)
154    {
155            custom_intra_matrix = status;
156  }  }
157    
158  void set_inter_matrix_status(uint8_t status) {  void
159          inter_matrix_changed = status;  set_inter_matrix_status(uint8_t status)
160    {
161            custom_inter_matrix = status;
162  }  }
163    
164  int16_t *get_intra_matrix(void) {  int16_t *
165    get_intra_matrix(void)
166    {
167          return intra_matrix;          return intra_matrix;
168  }  }
169    
170  int16_t *get_inter_matrix(void) {  int16_t *
171    get_inter_matrix(void)
172    {
173          return inter_matrix;          return inter_matrix;
174  }  }
175    
176  uint8_t set_intra_matrix(uint8_t *matrix)  uint8_t *
177    get_default_intra_matrix(void)
178    {
179            return default_intra_matrix;
180    }
181    
182    uint8_t *
183    get_default_inter_matrix(void)
184    {
185            return default_inter_matrix;
186    }
187    
188    uint8_t
189    set_intra_matrix(uint8_t * matrix)
190  {  {
191          int i;          int i, change = 0;
192    
193          intra_matrix_changed = 0;          custom_intra_matrix = 0;
194    
195          for(i = 0; i < 64; i++) {          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])                  if(intra_matrix[i] != matrix[i])
199                          intra_matrix_changed = 1;                          change = 1;
200    
201                  intra_matrix[i] = (int16_t) matrix[i];                  intra_matrix[i] = (int16_t) matrix[i];
202                  intra_matrix_fix[i] = FIX(intra_matrix[i]);                  intra_matrix_fix[i] = FIX(intra_matrix[i]);
203          }          }
204          return intra_matrix_changed;          return /*custom_intra_matrix |*/ change;
205  }  }
206    
207    
208  uint8_t set_inter_matrix(uint8_t *matrix)  uint8_t
209    set_inter_matrix(uint8_t * matrix)
210  {  {
211          int i;          int i, change = 0;
212    
213          inter_matrix_changed = 0;          custom_inter_matrix = 0;
214    
215          for(i = 0; i < 64; i++) {          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])                  if(inter_matrix[i] != matrix[i])
219                          inter_matrix_changed = 1;                          change = 1;
220    
221                  inter_matrix[i] = (int16_t) matrix[i];                  inter_matrix[i] = (int16_t) matrix[i];
222                  inter_matrix_fix[i] = FIX(inter_matrix[i]);                  inter_matrix_fix[i] = FIX(inter_matrix[i]);
223          }          }
224          return inter_matrix_changed;          return /*custom_inter_matrix |*/ change;
225  }  }

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

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