[svn] / branches / dev-api-4 / xvidcore / src / quant / adapt_quant.c Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/quant/adapt_quant.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 653 - (view) (download)
Original Path: trunk/xvidcore/src/quant/adapt_quant.c

1 : edgomez 443 /*****************************************************************************
2 :     *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Adaptive quantization functions -
5 :     *
6 : suxen_drol 499 * Copyright(C) 2002 Peter Ross <pross@xvid.org>
7 : edgomez 605 * 2002 Christoph Lampert <gruel@web.de>
8 : edgomez 443 *
9 : edgomez 653 * This file is part of XviD, a free MPEG-4 video encoder/decoder
10 : edgomez 443 *
11 : edgomez 653 * 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 : edgomez 443 * (at your option) any later version.
15 :     *
16 :     * This program is distributed in the hope that it will be useful,
17 : edgomez 653 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : edgomez 443 * 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 : edgomez 653 * along with this program; if not, write to the Free Software
23 : edgomez 443 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 :     *
25 : edgomez 653 * Under section 8 of the GNU General Public License, the copyright
26 :     * holders of XVID explicitly forbid distribution in the following
27 :     * countries:
28 : edgomez 443 *
29 : edgomez 653 * - 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: adapt_quant.c,v 1.12 2002-11-17 00:41:19 edgomez Exp $
55 :     *
56 : edgomez 443 ****************************************************************************/
57 :    
58 : Isibaar 3 #include "../portab.h"
59 :     #include "adapt_quant.h"
60 :    
61 : edgomez 195 #include <stdlib.h> /* free, malloc */
62 : edgomez 18
63 : Isibaar 3 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
64 :     #define RDIFF(a,b) ((int)(a+0.5)-(int)(b+0.5))
65 :    
66 : edgomez 443 /*****************************************************************************
67 :     * Functions
68 :     ****************************************************************************/
69 :    
70 : edgomez 195 int
71 :     normalize_quantizer_field(float *in,
72 :     int *out,
73 :     int num,
74 :     int min_quant,
75 :     int max_quant)
76 : Isibaar 3 {
77 :     int i;
78 :     int finished;
79 : edgomez 195
80 :     do {
81 : Isibaar 3 finished = 1;
82 : edgomez 195 for (i = 1; i < num; i++) {
83 :     if (RDIFF(in[i], in[i - 1]) > 2) {
84 : Isibaar 3 in[i] -= (float) 0.5;
85 :     finished = 0;
86 : edgomez 195 } else if (RDIFF(in[i], in[i - 1]) < -2) {
87 :     in[i - 1] -= (float) 0.5;
88 : Isibaar 3 finished = 0;
89 :     }
90 : edgomez 195
91 :     if (in[i] > max_quant) {
92 : edgomez 18 in[i] = (float) max_quant;
93 :     finished = 0;
94 :     }
95 : edgomez 195 if (in[i] < min_quant) {
96 : edgomez 18 in[i] = (float) min_quant;
97 :     finished = 0;
98 :     }
99 : edgomez 195 if (in[i - 1] > max_quant) {
100 :     in[i - 1] = (float) max_quant;
101 : edgomez 18 finished = 0;
102 :     }
103 : edgomez 195 if (in[i - 1] < min_quant) {
104 :     in[i - 1] = (float) min_quant;
105 : edgomez 18 finished = 0;
106 :     }
107 : Isibaar 3 }
108 : edgomez 195 } while (!finished);
109 :    
110 : Isibaar 3 out[0] = 0;
111 :     for (i = 1; i < num; i++)
112 : edgomez 195 out[i] = RDIFF(in[i], in[i - 1]);
113 :    
114 : Isibaar 3 return (int) (in[0] + 0.5);
115 :     }
116 :    
117 : edgomez 195 int
118 :     adaptive_quantization(unsigned char *buf,
119 :     int stride,
120 :     int *intquant,
121 :     int framequant,
122 :     int min_quant,
123 :     int max_quant,
124 :     int mb_width,
125 :     int mb_height) // no qstride because normalization
126 : Isibaar 3 {
127 : edgomez 195 int i, j, k, l;
128 :    
129 : edgomez 391 float *quant;
130 : Isibaar 3 unsigned char *ptr;
131 :     float *val;
132 : Isibaar 357 float global = 0.;
133 :     uint32_t mid_range = 0;
134 : Isibaar 3
135 : Isibaar 357 const float DarkAmpl = 14 / 2;
136 :     const float BrightAmpl = 10 / 2;
137 :     const float DarkThres = 70;
138 :     const float BrightThres = 200;
139 : Isibaar 3
140 : Isibaar 357 const float GlobalDarkThres = 60;
141 :     const float GlobalBrightThres = 170;
142 : Isibaar 3
143 : Isibaar 357 const float MidRangeThres = 20;
144 :     const float UpperLimit = 200;
145 :     const float LowerLimit = 25;
146 : Isibaar 3
147 : Isibaar 357
148 : edgomez 391 if (!(quant = (float *) malloc(mb_width * mb_height * sizeof(float))))
149 :     return(-1);
150 : Isibaar 3
151 : edgomez 496 if(!(val = (float *) malloc(mb_width * mb_height * sizeof(float)))) {
152 :     free(quant);
153 : edgomez 391 return(-1);
154 : edgomez 496 }
155 : Isibaar 3
156 : edgomez 195 for (k = 0; k < mb_height; k++) {
157 :     for (l = 0; l < mb_width; l++) // do this for all macroblocks individually
158 : Isibaar 3 {
159 : edgomez 195 quant[k * mb_width + l] = (float) framequant;
160 :    
161 : Isibaar 3 // calculate luminance-masking
162 : edgomez 195 ptr = &buf[16 * k * stride + 16 * l]; // address of MB
163 : Isibaar 3
164 : edgomez 195 val[k * mb_width + l] = 0.;
165 :    
166 :     for (i = 0; i < 16; i++)
167 :     for (j = 0; j < 16; j++)
168 :     val[k * mb_width + l] += ptr[i * stride + j];
169 :     val[k * mb_width + l] /= 256.;
170 : Isibaar 357 global +=val[k * mb_width + l];
171 :    
172 :     if ((val[k * mb_width + l] > LowerLimit) &&
173 :     (val[k * mb_width + l] < UpperLimit))
174 :     mid_range++;
175 : Isibaar 3 }
176 :     }
177 :    
178 : Isibaar 357 global /=mb_width * mb_height;
179 : Isibaar 3
180 : Isibaar 357 if (((global <GlobalBrightThres) &&(global >GlobalDarkThres))
181 :     || (mid_range < MidRangeThres)) {
182 :     for (k = 0; k < mb_height; k++) {
183 :     for (l = 0; l < mb_width; l++) // do this for all macroblocks individually
184 :     {
185 :     if (val[k * mb_width + l] < DarkThres)
186 :     quant[k * mb_width + l] +=
187 :     DarkAmpl * (DarkThres -
188 :     val[k * mb_width + l]) / DarkThres;
189 :     else if (val[k * mb_width + l] > BrightThres)
190 :     quant[k * mb_width + l] +=
191 :     BrightAmpl * (val[k * mb_width + l] -
192 :     BrightThres) / (255 - BrightThres);
193 :     }
194 : Isibaar 3 }
195 :     }
196 : edgomez 495
197 :     i = normalize_quantizer_field(quant, intquant,
198 :     mb_width * mb_height,
199 :     min_quant, max_quant);
200 :    
201 : Isibaar 3 free(val);
202 : edgomez 391 free(quant);
203 : edgomez 495
204 :     return(i);
205 :    
206 : edgomez 18 }

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