Mercurial > libavcodec.hg
comparison h263.c @ 249:42a0b7b16738 libavcodec
- Bug fixes in H.263+ Advanced INTRA Coding decoder.
- H.263+ should be able to decode streams with AIC now :)
author | pulento |
---|---|
date | Tue, 19 Feb 2002 19:23:34 +0000 |
parents | 56ee684c48bb |
children | 3449316664b5 |
comparison
equal
deleted
inserted
replaced
248:56ee684c48bb | 249:42a0b7b16738 |
---|---|
271 h263_encode_block(s, block[i], i); | 271 h263_encode_block(s, block[i], i); |
272 } | 272 } |
273 } | 273 } |
274 } | 274 } |
275 | 275 |
276 static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr) | 276 |
277 { | 277 void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n) |
278 int a, c, x, y, wrap, pred, scale; | 278 { |
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 /* find prediction */ | 282 /* find prediction */ |
282 if (n < 4) { | 283 if (n < 4) { |
283 x = 2 * s->mb_x + 1 + (n & 1); | 284 x = 2 * s->mb_x + 1 + (n & 1); |
284 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); | 285 y = 2 * s->mb_y + 1 + ((n & 2) >> 1); |
285 wrap = s->mb_width * 2 + 2; | 286 wrap = s->mb_width * 2 + 2; |
286 dc_val = s->dc_val[0]; | 287 dc_val = s->dc_val[0]; |
288 ac_val = s->ac_val[0][0]; | |
287 scale = s->y_dc_scale; | 289 scale = s->y_dc_scale; |
288 } else { | 290 } else { |
289 x = s->mb_x + 1; | 291 x = s->mb_x + 1; |
290 y = s->mb_y + 1; | 292 y = s->mb_y + 1; |
291 wrap = s->mb_width + 2; | 293 wrap = s->mb_width + 2; |
292 dc_val = s->dc_val[n - 4 + 1]; | 294 dc_val = s->dc_val[n - 4 + 1]; |
295 ac_val = s->ac_val[n - 4 + 1][0]; | |
293 scale = s->c_dc_scale; | 296 scale = s->c_dc_scale; |
294 } | 297 } |
295 | 298 |
299 ac_val += ((y) * wrap + (x)) * 16; | |
300 ac_val1 = ac_val; | |
301 | |
296 /* B C | 302 /* B C |
297 * A X | 303 * A X |
298 */ | 304 */ |
299 a = dc_val[(x - 1) + (y) * wrap]; | 305 a = dc_val[(x - 1) + (y) * wrap]; |
300 c = dc_val[(x) + (y - 1) * wrap]; | 306 c = dc_val[(x) + (y - 1) * wrap]; |
301 | 307 |
302 if (s->ac_pred) { | 308 pred_dc = 1024; |
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 | |
344 if (s->ac_pred) { | 309 if (s->ac_pred) { |
345 if (s->h263_aic_dir) { | 310 if (s->h263_aic_dir) { |
346 /* left prediction */ | 311 /* left prediction */ |
347 ac_val -= 16; | 312 if (a != 1024) { |
348 for(i=1;i<8;i++) { | 313 ac_val -= 16; |
349 block[block_permute_op(i*8)] += ac_val[i]; | 314 for(i=1;i<8;i++) { |
315 block[block_permute_op(i*8)] += ac_val[i]; | |
316 } | |
317 pred_dc = a; | |
350 } | 318 } |
351 } else { | 319 } else { |
352 /* top prediction */ | 320 /* top prediction */ |
353 ac_val -= 16 * wrap; | 321 if (c != 1024) { |
354 for(i=1;i<8;i++) { | 322 ac_val -= 16 * wrap; |
355 block[block_permute_op(i)] += ac_val[i + 8]; | 323 for(i=1;i<8;i++) { |
356 } | 324 block[block_permute_op(i)] += ac_val[i + 8]; |
357 } | 325 } |
358 } | 326 pred_dc = c; |
327 } | |
328 } | |
329 } else { | |
330 /* just DC prediction */ | |
331 if (a != 1024 && c != 1024) | |
332 pred_dc = (a + c) >> 1; | |
333 else if (a != 1024) | |
334 pred_dc = a; | |
335 else | |
336 pred_dc = c; | |
337 } | |
338 | |
339 /* we assume pred is positive */ | |
340 block[0]=block[0]*scale + pred_dc; | |
341 | |
342 if (block[0] < 0) | |
343 block[0] = 0; | |
344 else if (!(block[0] & 1)) | |
345 block[0]++; | |
346 | |
347 /* Update AC/DC tables */ | |
348 dc_val[(x) + (y) * wrap] = block[0]; | |
349 | |
359 /* left copy */ | 350 /* left copy */ |
360 for(i=1;i<8;i++) | 351 for(i=1;i<8;i++) |
361 ac_val1[i] = block[block_permute_op(i * 8)]; | 352 ac_val1[i] = block[block_permute_op(i * 8)]; |
362 /* top copy */ | 353 /* top copy */ |
363 for(i=1;i<8;i++) | 354 for(i=1;i<8;i++) |
364 ac_val1[8 + i] = block[block_permute_op(i)]; | 355 ac_val1[8 + i] = block[block_permute_op(i)]; |
365 } | 356 } |
357 | |
366 | 358 |
367 static inline int mid_pred(int a, int b, int c) | 359 static inline int mid_pred(int a, int b, int c) |
368 { | 360 { |
369 int vmin, vmax; | 361 int vmin, vmax; |
370 vmax = vmin = a; | 362 vmax = vmin = a; |
1055 if (s->h263_pred || s->h263_aic) { | 1047 if (s->h263_pred || s->h263_aic) { |
1056 s->ac_pred = get_bits1(&s->gb); | 1048 s->ac_pred = get_bits1(&s->gb); |
1057 if (s->ac_pred && s->h263_aic) | 1049 if (s->ac_pred && s->h263_aic) |
1058 s->h263_aic_dir = get_bits1(&s->gb); | 1050 s->h263_aic_dir = get_bits1(&s->gb); |
1059 } | 1051 } |
1052 if (s->h263_aic) { | |
1053 s->y_dc_scale = 2 * s->qscale; | |
1054 s->c_dc_scale = 2 * s->qscale; | |
1055 } | |
1060 cbpy = get_vlc(&s->gb, &cbpy_vlc); | 1056 cbpy = get_vlc(&s->gb, &cbpy_vlc); |
1061 cbp = (cbpc & 3) | (cbpy << 2); | 1057 cbp = (cbpc & 3) | (cbpy << 2); |
1062 if (dquant) { | 1058 if (dquant) { |
1063 s->qscale += quant_tab[get_bits(&s->gb, 2)]; | 1059 s->qscale += quant_tab[get_bits(&s->gb, 2)]; |
1064 if (s->qscale < 1) | 1060 if (s->qscale < 1) |
1152 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, | 1148 static int h263_decode_block(MpegEncContext * s, DCTELEM * block, |
1153 int n, int coded) | 1149 int n, int coded) |
1154 { | 1150 { |
1155 int code, level, i, j, last, run; | 1151 int code, level, i, j, last, run; |
1156 RLTable *rl = &rl_inter; | 1152 RLTable *rl = &rl_inter; |
1157 UINT16 *dc_val; | |
1158 const UINT8 *scan_table; | 1153 const UINT8 *scan_table; |
1159 | 1154 |
1160 scan_table = zigzag_direct; | 1155 scan_table = zigzag_direct; |
1161 if (s->h263_aic) { | 1156 if (s->h263_aic && s->mb_intra) { |
1162 rl = &rl_intra_aic; | 1157 rl = &rl_intra_aic; |
1163 i = 0; | 1158 i = 0; |
1164 if (s->ac_pred) { | 1159 if (s->ac_pred) { |
1165 if (s->h263_aic_dir) | 1160 if (s->h263_aic_dir) |
1166 scan_table = ff_alternate_vertical_scan; /* left */ | 1161 scan_table = ff_alternate_vertical_scan; /* left */ |
1192 i = 1; | 1187 i = 1; |
1193 } else { | 1188 } else { |
1194 i = 0; | 1189 i = 0; |
1195 } | 1190 } |
1196 if (!coded) { | 1191 if (!coded) { |
1197 if (s->mb_intra && s->h263_aic) { | 1192 if (s->mb_intra && s->h263_aic) |
1198 level = h263_pred_dc(s, n, &dc_val); | 1193 goto not_coded; |
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 } | |
1207 s->block_last_index[n] = i - 1; | 1194 s->block_last_index[n] = i - 1; |
1208 return 0; | 1195 return 0; |
1209 } | 1196 } |
1210 | 1197 |
1211 for(;;) { | 1198 for(;;) { |
1227 level = rl->table_level[code]; | 1214 level = rl->table_level[code]; |
1228 last = code >= rl->last; | 1215 last = code >= rl->last; |
1229 if (get_bits1(&s->gb)) | 1216 if (get_bits1(&s->gb)) |
1230 level = -level; | 1217 level = -level; |
1231 } | 1218 } |
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 i += run; | 1219 i += run; |
1242 if (i >= 64) | 1220 if (i >= 64) |
1243 return -1; | 1221 return -1; |
1244 j = scan_table[i]; | 1222 j = scan_table[i]; |
1245 block[j] = level; | 1223 block[j] = level; |
1246 if (last) | 1224 if (last) |
1247 break; | 1225 break; |
1248 i++; | 1226 i++; |
1249 } | 1227 } |
1250 | 1228 not_coded: |
1251 if (s->h263_aic) { | 1229 if (s->mb_intra && s->h263_aic) { |
1252 h263_pred_ac(s, block, n); | 1230 h263_pred_acdc(s, block, n); |
1253 i = 64; | 1231 i = 64; |
1254 } | 1232 } |
1255 s->block_last_index[n] = i; | 1233 s->block_last_index[n] = i; |
1256 return 0; | 1234 return 0; |
1257 } | 1235 } |