Originally committed as revision 311 to svn://svn.ffmpeg.org/ffmpeg/trunk
Juanjo authored on 2002/02/20 04:23:34... | ... |
@@ -273,10 +273,11 @@ void h263_encode_mb(MpegEncContext * s, |
273 | 273 |
} |
274 | 274 |
} |
275 | 275 |
|
276 |
-static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) |
|
276 |
+ |
|
277 |
+void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) |
|
277 | 278 |
{ |
278 |
- int a, c, x, y, wrap, pred, scale; |
|
279 |
- UINT16 *dc_val; |
|
279 |
+ int x, y, wrap, a, c, pred_dc, scale, i; |
|
280 |
+ INT16 *dc_val, *ac_val, *ac_val1; |
|
280 | 281 |
|
281 | 282 |
/* find prediction */ |
282 | 283 |
if (n < 4) { |
... | ... |
@@ -284,78 +285,68 @@ static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) |
284 | 284 |
y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
285 | 285 |
wrap = s->mb_width * 2 + 2; |
286 | 286 |
dc_val = s->dc_val[0]; |
287 |
+ ac_val = s->ac_val[0][0]; |
|
287 | 288 |
scale = s->y_dc_scale; |
288 | 289 |
} else { |
289 | 290 |
x = s->mb_x + 1; |
290 | 291 |
y = s->mb_y + 1; |
291 | 292 |
wrap = s->mb_width + 2; |
292 | 293 |
dc_val = s->dc_val[n - 4 + 1]; |
294 |
+ ac_val = s->ac_val[n - 4 + 1][0]; |
|
293 | 295 |
scale = s->c_dc_scale; |
294 | 296 |
} |
295 |
- |
|
297 |
+ |
|
298 |
+ ac_val += ((y) * wrap + (x)) * 16; |
|
299 |
+ ac_val1 = ac_val; |
|
300 |
+ |
|
296 | 301 |
/* B C |
297 | 302 |
* A X |
298 | 303 |
*/ |
299 | 304 |
a = dc_val[(x - 1) + (y) * wrap]; |
300 | 305 |
c = dc_val[(x) + (y - 1) * wrap]; |
301 | 306 |
|
302 |
- if (s->ac_pred) { |
|
303 |
- if (s->h263_aic_dir) |
|
304 |
- pred = a; |
|
305 |
- else |
|
306 |
- pred = c; |
|
307 |
- } else if (a != 1024 && c != 1024) |
|
308 |
- pred = (a + c) >> 1; |
|
309 |
- else if (a != 1024) |
|
310 |
- pred = a; |
|
311 |
- else |
|
312 |
- pred = c; |
|
313 |
- |
|
314 |
- |
|
315 |
- /* we assume pred is positive */ |
|
316 |
- pred = (pred) / scale; |
|
317 |
- |
|
318 |
- /* prepare address for prediction update */ |
|
319 |
- *dc_val_ptr = &dc_val[(x) + (y) * wrap]; |
|
320 |
- |
|
321 |
- return pred; |
|
322 |
-} |
|
323 |
- |
|
324 |
-void h263_pred_ac(MpegEncContext * s, INT16 *block, int n) |
|
325 |
-{ |
|
326 |
- int x, y, wrap, i; |
|
327 |
- INT16 *ac_val, *ac_val1; |
|
328 |
- |
|
329 |
- /* find prediction */ |
|
330 |
- if (n < 4) { |
|
331 |
- x = 2 * s->mb_x + 1 + (n & 1); |
|
332 |
- y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
|
333 |
- wrap = s->mb_width * 2 + 2; |
|
334 |
- ac_val = s->ac_val[0][0]; |
|
335 |
- } else { |
|
336 |
- x = s->mb_x + 1; |
|
337 |
- y = s->mb_y + 1; |
|
338 |
- wrap = s->mb_width + 2; |
|
339 |
- ac_val = s->ac_val[n - 4 + 1][0]; |
|
340 |
- } |
|
341 |
- ac_val += ((y) * wrap + (x)) * 16; |
|
342 |
- ac_val1 = ac_val; |
|
343 |
- |
|
307 |
+ pred_dc = 1024; |
|
344 | 308 |
if (s->ac_pred) { |
345 | 309 |
if (s->h263_aic_dir) { |
346 | 310 |
/* left prediction */ |
347 |
- ac_val -= 16; |
|
348 |
- for(i=1;i<8;i++) { |
|
349 |
- block[block_permute_op(i*8)] += ac_val[i]; |
|
311 |
+ if (a != 1024) { |
|
312 |
+ ac_val -= 16; |
|
313 |
+ for(i=1;i<8;i++) { |
|
314 |
+ block[block_permute_op(i*8)] += ac_val[i]; |
|
315 |
+ } |
|
316 |
+ pred_dc = a; |
|
350 | 317 |
} |
351 | 318 |
} else { |
352 | 319 |
/* top prediction */ |
353 |
- ac_val -= 16 * wrap; |
|
354 |
- for(i=1;i<8;i++) { |
|
355 |
- block[block_permute_op(i)] += ac_val[i + 8]; |
|
320 |
+ if (c != 1024) { |
|
321 |
+ ac_val -= 16 * wrap; |
|
322 |
+ for(i=1;i<8;i++) { |
|
323 |
+ block[block_permute_op(i)] += ac_val[i + 8]; |
|
324 |
+ } |
|
325 |
+ pred_dc = c; |
|
356 | 326 |
} |
357 | 327 |
} |
328 |
+ } else { |
|
329 |
+ /* just DC prediction */ |
|
330 |
+ if (a != 1024 && c != 1024) |
|
331 |
+ pred_dc = (a + c) >> 1; |
|
332 |
+ else if (a != 1024) |
|
333 |
+ pred_dc = a; |
|
334 |
+ else |
|
335 |
+ pred_dc = c; |
|
358 | 336 |
} |
337 |
+ |
|
338 |
+ /* we assume pred is positive */ |
|
339 |
+ block[0]=block[0]*scale + pred_dc; |
|
340 |
+ |
|
341 |
+ if (block[0] < 0) |
|
342 |
+ block[0] = 0; |
|
343 |
+ else if (!(block[0] & 1)) |
|
344 |
+ block[0]++; |
|
345 |
+ |
|
346 |
+ /* Update AC/DC tables */ |
|
347 |
+ dc_val[(x) + (y) * wrap] = block[0]; |
|
348 |
+ |
|
359 | 349 |
/* left copy */ |
360 | 350 |
for(i=1;i<8;i++) |
361 | 351 |
ac_val1[i] = block[block_permute_op(i * 8)]; |
... | ... |
@@ -364,6 +355,7 @@ void h263_pred_ac(MpegEncContext * s, INT16 *block, int n) |
364 | 364 |
ac_val1[8 + i] = block[block_permute_op(i)]; |
365 | 365 |
} |
366 | 366 |
|
367 |
+ |
|
367 | 368 |
static inline int mid_pred(int a, int b, int c) |
368 | 369 |
{ |
369 | 370 |
int vmin, vmax; |
... | ... |
@@ -1057,6 +1049,10 @@ int h263_decode_mb(MpegEncContext *s, |
1057 | 1057 |
if (s->ac_pred && s->h263_aic) |
1058 | 1058 |
s->h263_aic_dir = get_bits1(&s->gb); |
1059 | 1059 |
} |
1060 |
+ if (s->h263_aic) { |
|
1061 |
+ s->y_dc_scale = 2 * s->qscale; |
|
1062 |
+ s->c_dc_scale = 2 * s->qscale; |
|
1063 |
+ } |
|
1060 | 1064 |
cbpy = get_vlc(&s->gb, &cbpy_vlc); |
1061 | 1065 |
cbp = (cbpc & 3) | (cbpy << 2); |
1062 | 1066 |
if (dquant) { |
... | ... |
@@ -1154,11 +1150,10 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
1154 | 1154 |
{ |
1155 | 1155 |
int code, level, i, j, last, run; |
1156 | 1156 |
RLTable *rl = &rl_inter; |
1157 |
- UINT16 *dc_val; |
|
1158 | 1157 |
const UINT8 *scan_table; |
1159 | 1158 |
|
1160 | 1159 |
scan_table = zigzag_direct; |
1161 |
- if (s->h263_aic) { |
|
1160 |
+ if (s->h263_aic && s->mb_intra) { |
|
1162 | 1161 |
rl = &rl_intra_aic; |
1163 | 1162 |
i = 0; |
1164 | 1163 |
if (s->ac_pred) { |
... | ... |
@@ -1194,16 +1189,8 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
1194 | 1194 |
i = 0; |
1195 | 1195 |
} |
1196 | 1196 |
if (!coded) { |
1197 |
- if (s->mb_intra && s->h263_aic) { |
|
1198 |
- level = h263_pred_dc(s, n, &dc_val); |
|
1199 |
- if (level < 0) |
|
1200 |
- level = 0; |
|
1201 |
- *dc_val = level * s->y_dc_scale; |
|
1202 |
- block[0] = level; |
|
1203 |
- h263_pred_ac(s, block, n); |
|
1204 |
- i = 64; |
|
1205 |
- //i = 1; |
|
1206 |
- } |
|
1197 |
+ if (s->mb_intra && s->h263_aic) |
|
1198 |
+ goto not_coded; |
|
1207 | 1199 |
s->block_last_index[n] = i - 1; |
1208 | 1200 |
return 0; |
1209 | 1201 |
} |
... | ... |
@@ -1229,15 +1216,6 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
1229 | 1229 |
if (get_bits1(&s->gb)) |
1230 | 1230 |
level = -level; |
1231 | 1231 |
} |
1232 |
- if (!i && s->h263_aic) { |
|
1233 |
- level += h263_pred_dc(s, n, &dc_val); |
|
1234 |
- if (level < 0) |
|
1235 |
- level = 0; |
|
1236 |
- else if (level & 1) |
|
1237 |
- level++; |
|
1238 |
- *dc_val = level * s->y_dc_scale; |
|
1239 |
- |
|
1240 |
- } |
|
1241 | 1232 |
i += run; |
1242 | 1233 |
if (i >= 64) |
1243 | 1234 |
return -1; |
... | ... |
@@ -1247,9 +1225,9 @@ static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
1247 | 1247 |
break; |
1248 | 1248 |
i++; |
1249 | 1249 |
} |
1250 |
- |
|
1251 |
- if (s->h263_aic) { |
|
1252 |
- h263_pred_ac(s, block, n); |
|
1250 |
+not_coded: |
|
1251 |
+ if (s->mb_intra && s->h263_aic) { |
|
1252 |
+ h263_pred_acdc(s, block, n); |
|
1253 | 1253 |
i = 64; |
1254 | 1254 |
} |
1255 | 1255 |
s->block_last_index[n] = i; |
... | ... |
@@ -156,9 +156,6 @@ static int h263_decode_frame(AVCodecContext *avctx, |
156 | 156 |
msmpeg4_dc_scale(s); |
157 | 157 |
} else if (s->h263_pred) { |
158 | 158 |
h263_dc_scale(s); |
159 |
- } else if (s->h263_aic) { |
|
160 |
- s->y_dc_scale = s->qscale; |
|
161 |
- s->c_dc_scale = s->qscale; |
|
162 | 159 |
} else { |
163 | 160 |
/* default quantization values */ |
164 | 161 |
s->y_dc_scale = 8; |
... | ... |
@@ -89,26 +89,27 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s, |
89 | 89 |
qadd = (s->qscale - 1) | 1; |
90 | 90 |
|
91 | 91 |
if (s->mb_intra) { |
92 |
- if (n < 4) |
|
93 |
- block[0] = block[0] * s->y_dc_scale; |
|
94 |
- else |
|
95 |
- block[0] = block[0] * s->c_dc_scale; |
|
96 |
- |
|
97 |
- for(i=1; i<8; i++) { |
|
98 |
- level = block[i]; |
|
99 |
- if (level) { |
|
100 |
- if (level < 0) { |
|
101 |
- level = level * qmul - qadd; |
|
102 |
- } else { |
|
103 |
- level = level * qmul + qadd; |
|
104 |
- } |
|
105 |
- block[i] = level; |
|
106 |
- } |
|
107 |
- } |
|
108 |
- nCoeffs=64; |
|
92 |
+ if (!s->h263_aic) { |
|
93 |
+ if (n < 4) |
|
94 |
+ block[0] = block[0] * s->y_dc_scale; |
|
95 |
+ else |
|
96 |
+ block[0] = block[0] * s->c_dc_scale; |
|
97 |
+ } |
|
98 |
+ for(i=1; i<8; i++) { |
|
99 |
+ level = block[i]; |
|
100 |
+ if (level) { |
|
101 |
+ if (level < 0) { |
|
102 |
+ level = level * qmul - qadd; |
|
103 |
+ } else { |
|
104 |
+ level = level * qmul + qadd; |
|
105 |
+ } |
|
106 |
+ block[i] = level; |
|
107 |
+ } |
|
108 |
+ } |
|
109 |
+ nCoeffs=64; |
|
109 | 110 |
} else { |
110 | 111 |
i = 0; |
111 |
- nCoeffs= zigzag_end[ s->block_last_index[n] ]; |
|
112 |
+ nCoeffs= zigzag_end[ s->block_last_index[n] ]; |
|
112 | 113 |
} |
113 | 114 |
//printf("%d %d ", qmul, qadd); |
114 | 115 |
asm volatile( |
... | ... |
@@ -745,7 +745,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
745 | 745 |
|
746 | 746 |
/* update DC predictors for P macroblocks */ |
747 | 747 |
if (!s->mb_intra) { |
748 |
- if (s->h263_pred) { |
|
748 |
+ if (s->h263_pred || s->h263_aic) { |
|
749 | 749 |
if(s->mbintra_table[mb_x + mb_y*s->mb_width]) |
750 | 750 |
{ |
751 | 751 |
int wrap, xy, v; |
... | ... |
@@ -754,7 +754,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
754 | 754 |
xy = 2 * mb_x + 1 + (2 * mb_y + 1) * wrap; |
755 | 755 |
v = 1024; |
756 | 756 |
|
757 |
- s->dc_val[0][xy] = v; |
|
757 |
+ s->dc_val[0][xy] = v; |
|
758 | 758 |
s->dc_val[0][xy + 1] = v; |
759 | 759 |
s->dc_val[0][xy + wrap] = v; |
760 | 760 |
s->dc_val[0][xy + 1 + wrap] = v; |
... | ... |
@@ -784,7 +784,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
784 | 784 |
s->last_dc[2] = 128 << s->intra_dc_precision; |
785 | 785 |
} |
786 | 786 |
} |
787 |
- else if (s->h263_pred) |
|
787 |
+ else if (s->h263_pred || s->h263_aic) |
|
788 | 788 |
s->mbintra_table[mb_x + mb_y*s->mb_width]=1; |
789 | 789 |
|
790 | 790 |
/* update motion predictor */ |
... | ... |
@@ -1327,12 +1327,14 @@ static void dct_unquantize_h263_c(MpegEncContext *s, |
1327 | 1327 |
{ |
1328 | 1328 |
int i, level, qmul, qadd; |
1329 | 1329 |
int nCoeffs; |
1330 |
- |
|
1330 |
+ |
|
1331 | 1331 |
if (s->mb_intra) { |
1332 |
- if (n < 4) |
|
1333 |
- block[0] = block[0] * s->y_dc_scale; |
|
1334 |
- else |
|
1335 |
- block[0] = block[0] * s->c_dc_scale; |
|
1332 |
+ if (!s->h263_aic) { |
|
1333 |
+ if (n < 4) |
|
1334 |
+ block[0] = block[0] * s->y_dc_scale; |
|
1335 |
+ else |
|
1336 |
+ block[0] = block[0] * s->c_dc_scale; |
|
1337 |
+ } |
|
1336 | 1338 |
i = 1; |
1337 | 1339 |
nCoeffs= 64; //does not allways use zigzag table |
1338 | 1340 |
} else { |