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

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

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