Mercurial > libavcodec.hg
comparison svq3.c @ 1330:c05c381a9c47 libavcodec
- fix PLANE_PRED8x8 prediction (H/V are swapped, this is correct!)
- fix B-frame motion compensation
- cleanup motion vector math and other blocks of common code
author | tmmm |
---|---|
date | Fri, 27 Jun 2003 15:05:29 +0000 |
parents | 2365b4dfc450 |
children | 932d306bf1dc |
comparison
equal
deleted
inserted
replaced
1329:2114c1e206e8 | 1330:c05c381a9c47 |
---|---|
44 */ | 44 */ |
45 | 45 |
46 #define FULLPEL_MODE 1 | 46 #define FULLPEL_MODE 1 |
47 #define HALFPEL_MODE 2 | 47 #define HALFPEL_MODE 2 |
48 #define THIRDPEL_MODE 3 | 48 #define THIRDPEL_MODE 3 |
49 #define PREDICT_MODE 4 | |
49 | 50 |
50 /* dual scan (from some older h264 draft) | 51 /* dual scan (from some older h264 draft) |
51 o-->o-->o o | 52 o-->o-->o o |
52 | /| | 53 | /| |
53 o o o / o | 54 o o o / o |
322 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height); | 323 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height); |
323 } | 324 } |
324 } | 325 } |
325 } | 326 } |
326 | 327 |
328 static inline int svq3_mc_dir (H264Context *h, int size, int mode, int dir, int avg) { | |
329 | |
330 int i, j, k, mx, my, dx, dy, x, y; | |
331 MpegEncContext *const s = (MpegEncContext *) h; | |
332 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1); | |
333 const int part_height = 16 >> ((unsigned) (size + 1) / 3); | |
334 const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0; | |
335 const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width; | |
336 const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width; | |
337 | |
338 for (i=0; i < 16; i+=part_height) { | |
339 for (j=0; j < 16; j+=part_width) { | |
340 const int b_xy = (4*s->mb_x+(j>>2)) + (4*s->mb_y+(i>>2))*h->b_stride; | |
341 int dxy; | |
342 x = 16*s->mb_x + j; | |
343 y = 16*s->mb_y + i; | |
344 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8); | |
345 | |
346 if (mode != PREDICT_MODE) { | |
347 pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my); | |
348 } else { | |
349 mx = s->next_picture.motion_val[0][b_xy][0]<<1; | |
350 my = s->next_picture.motion_val[0][b_xy][1]<<1; | |
351 | |
352 if (dir == 0) { | |
353 mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1; | |
354 my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1; | |
355 } else { | |
356 mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1; | |
357 my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1; | |
358 } | |
359 } | |
360 | |
361 /* clip motion vector prediction to frame border */ | |
362 mx = clip (mx, extra_width - 6*x, h_edge_pos - 6*x); | |
363 my = clip (my, extra_width - 6*y, v_edge_pos - 6*y); | |
364 | |
365 /* get (optional) motion vector differential */ | |
366 if (mode == PREDICT_MODE) { | |
367 dx = dy = 0; | |
368 } else { | |
369 dy = svq3_get_se_golomb (&s->gb); | |
370 dx = svq3_get_se_golomb (&s->gb); | |
371 | |
372 if (dx == INVALID_VLC || dy == INVALID_VLC) { | |
373 return -1; | |
374 } | |
375 } | |
376 | |
377 /* compute motion vector */ | |
378 if (mode == THIRDPEL_MODE) { | |
379 int fx, fy; | |
380 mx = ((mx + 1)>>1) + dx; | |
381 my = ((my + 1)>>1) + dy; | |
382 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000; | |
383 fy= ((unsigned)(my + 0x3000))/3 - 0x1000; | |
384 dxy= (mx - 3*fx) + 4*(my - 3*fy); | |
385 | |
386 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg); | |
387 mx += mx; | |
388 my += my; | |
389 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) { | |
390 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000; | |
391 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000; | |
392 dxy= (mx&1) + 2*(my&1); | |
393 | |
394 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg); | |
395 mx *= 3; | |
396 my *= 3; | |
397 } else { | |
398 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000; | |
399 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000; | |
400 | |
401 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg); | |
402 mx *= 6; | |
403 my *= 6; | |
404 } | |
405 | |
406 /* update mv_cache */ | |
407 if (mode != PREDICT_MODE) { | |
408 int32_t mv = pack16to32(mx,my); | |
409 | |
410 if (part_height == 8 && i < 8) { | |
411 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv; | |
412 | |
413 if (part_width == 8 && j < 8) { | |
414 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv; | |
415 } | |
416 } | |
417 if (part_width == 8 && j < 8) { | |
418 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv; | |
419 } | |
420 if (part_width == 4 || part_height == 4) { | |
421 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv; | |
422 } | |
423 } | |
424 | |
425 /* write back motion vectors */ | |
426 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4); | |
427 } | |
428 } | |
429 | |
430 return 0; | |
431 } | |
432 | |
327 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { | 433 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { |
328 int cbp, dir, mode, mx, my, dx, dy, x, y, part_width, part_height; | 434 int i, j, k, m, dir, mode; |
329 int i, j, k, l, m; | 435 int cbp = 0; |
330 uint32_t vlc; | 436 uint32_t vlc; |
331 int8_t *top, *left; | 437 int8_t *top, *left; |
332 MpegEncContext *const s = (MpegEncContext *) h; | 438 MpegEncContext *const s = (MpegEncContext *) h; |
333 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; | 439 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; |
334 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; | 440 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride; |
336 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; | 442 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; |
337 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; | 443 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; |
338 h->topright_samples_available = 0xFFFF; | 444 h->topright_samples_available = 0xFFFF; |
339 | 445 |
340 if (mb_type == 0) { /* SKIP */ | 446 if (mb_type == 0) { /* SKIP */ |
341 if (s->pict_type == P_TYPE) { | 447 if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) { |
342 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0); | 448 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0); |
343 | 449 |
344 cbp = 0; | 450 if (s->pict_type == B_TYPE) { |
451 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1); | |
452 } | |
453 | |
345 mb_type = MB_TYPE_SKIP; | 454 mb_type = MB_TYPE_SKIP; |
346 } else { | 455 } else { |
347 for (dir=0; dir < 2; dir++) { | 456 svq3_mc_dir (h, s->next_picture.mb_type[mb_xy], PREDICT_MODE, 0, 0); |
348 for (i=0; i < 4; i++) { | 457 svq3_mc_dir (h, s->next_picture.mb_type[mb_xy], PREDICT_MODE, 1, 1); |
349 for (j=0; j < 4; j++) { | 458 |
350 int dxy; | |
351 x = 16*s->mb_x + 4*j; | |
352 y = 16*s->mb_y + 4*i; | |
353 | |
354 mx = 2*s->next_picture.motion_val[0][b_xy + j + i*h->b_stride][0]; | |
355 my = 2*s->next_picture.motion_val[0][b_xy + j + i*h->b_stride][1]; | |
356 | |
357 if (dir == 0) { | |
358 mx = (mx * h->frame_num_offset) / h->prev_frame_num_offset; | |
359 my = (my * h->frame_num_offset) / h->prev_frame_num_offset; | |
360 } else { | |
361 mx = (mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset; | |
362 my = (my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset; | |
363 } | |
364 | |
365 mx = ((unsigned)(mx + 3 + 0x6000))/6 - 0x1000; | |
366 my = ((unsigned)(my + 3 + 0x6000))/6 - 0x1000; | |
367 dxy= (mx&1) + 2*(my&1); | |
368 | |
369 /* update mv_cache */ | |
370 s->current_picture.motion_val[dir][b_xy + j + i*h->b_stride][0] = 3*mx; | |
371 s->current_picture.motion_val[dir][b_xy + j + i*h->b_stride][1] = 3*my; | |
372 | |
373 svq3_mc_dir_part (s, x, y, 4, 4, mx>>1, my>>1, dxy, 0, dir, (dir == 1)); | |
374 } | |
375 } | |
376 } | |
377 | |
378 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) | |
379 return -1; | |
380 | |
381 cbp = golomb_to_inter_cbp[vlc]; | |
382 mb_type = MB_TYPE_16x16; | 459 mb_type = MB_TYPE_16x16; |
383 } | 460 } |
384 } else if (mb_type < 8) { /* INTER */ | 461 } else if (mb_type < 8) { /* INTER */ |
385 int dir0, dir1; | |
386 | |
387 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) { | 462 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) { |
388 mode = THIRDPEL_MODE; | 463 mode = THIRDPEL_MODE; |
389 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) { | 464 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) { |
390 mode = HALFPEL_MODE; | 465 mode = HALFPEL_MODE; |
391 } else { | 466 } else { |
422 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 || | 497 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 || |
423 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1; | 498 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1; |
424 }else | 499 }else |
425 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; | 500 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; |
426 if (s->mb_x > 0) { | 501 if (s->mb_x > 0) { |
427 *(uint32_t *) h->mv_cache[0][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; | 502 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; |
428 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1; | 503 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1; |
429 }else | 504 }else |
430 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; | 505 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; |
431 }else | 506 }else |
432 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8); | 507 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8); |
435 break; | 510 break; |
436 } | 511 } |
437 | 512 |
438 /* decode motion vector(s) and form prediction(s) */ | 513 /* decode motion vector(s) and form prediction(s) */ |
439 if (s->pict_type == P_TYPE) { | 514 if (s->pict_type == P_TYPE) { |
440 part_width = ((mb_type & 5) == 5) ? 4 : 8 << (mb_type & 1); | 515 svq3_mc_dir (h, (mb_type - 1), mode, 0, 0); |
441 part_height = 16 >> ((unsigned) mb_type / 3); | |
442 dir0 = 0; | |
443 dir1 = 0; | |
444 } else { /* B_TYPE */ | 516 } else { /* B_TYPE */ |
445 part_width = 16; | 517 if (mb_type != 2) { |
446 part_height = 16; | 518 svq3_mc_dir (h, 0, mode, 0, 0); |
447 dir0 = (mb_type == 2) ? 1 : 0; | 519 } else { |
448 dir1 = (mb_type == 1) ? 0 : 1; | 520 for (i=0; i < 4; i++) { |
449 } | 521 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); |
450 | 522 } |
451 for (dir=dir0; dir <= dir1; dir++) { | 523 } |
452 for (i=0; i < 16; i+=part_height) { | |
453 for (j=0; j < 16; j+=part_width) { | |
454 int avg=(dir == 1 && dir0 != dir1); | |
455 int dxy; | |
456 x = 16*s->mb_x + j; | |
457 y = 16*s->mb_y + i; | |
458 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8); | |
459 | |
460 pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my); | |
461 | |
462 /* clip motion vector prediction to frame border */ | |
463 mx = clip (mx, -6*x, 6*(s->h_edge_pos - part_width - x)); | |
464 my = clip (my, -6*y, 6*(s->v_edge_pos - part_height - y)); | |
465 | |
466 /* get motion vector differential */ | |
467 dy = svq3_get_se_golomb (&s->gb); | |
468 dx = svq3_get_se_golomb (&s->gb); | |
469 | |
470 if (dx == INVALID_VLC || dy == INVALID_VLC) { | |
471 return -1; | |
472 } | |
473 /* compute motion vector */ | |
474 if (mode == THIRDPEL_MODE) { | |
475 int fx, fy; | |
476 mx = ((mx + 1)>>1) + dx; | |
477 my = ((my + 1)>>1) + dy; | |
478 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000; | |
479 fy= ((unsigned)(my + 0x3000))/3 - 0x1000; | |
480 dxy= (mx - 3*fx) + 4*(my - 3*fy); | |
481 | |
482 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg); | |
483 mx += mx; | |
484 my += my; | |
485 } else if (mode == HALFPEL_MODE) { | |
486 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000; | |
487 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000; | |
488 dxy= (mx&1) + 2*(my&1); | |
489 | |
490 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg); | |
491 mx *= 3; | |
492 my *= 3; | |
493 } else { | |
494 assert(mode == FULLPEL_MODE); | |
495 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000; | |
496 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000; | |
497 | |
498 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg); | |
499 mx *= 6; | |
500 my *= 6; | |
501 } | |
502 | |
503 /* update mv_cache */ | |
504 fill_rectangle(h->mv_cache[dir][scan8[k]], part_width>>2, part_height>>2, 8, pack16to32(mx,my), 4); | |
505 } | |
506 } | |
507 } | |
508 | |
509 /* write back or clear motion vectors */ | |
510 if (s->pict_type == P_TYPE || mb_type != 2) { | |
511 for (i=0; i < 4; i++) { | |
512 memcpy (s->current_picture.motion_val[0][b_xy + i*h->b_stride], h->mv_cache[0][scan8[0] + 8*i], 4*2*sizeof(int16_t)); | |
513 } | |
514 } else { | |
515 for (i=0; i < 4; i++) { | |
516 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); | |
517 } | |
518 } | |
519 if (s->pict_type == B_TYPE) { | |
520 if (mb_type != 1) { | 524 if (mb_type != 1) { |
521 for (i=0; i < 4; i++) { | 525 svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)); |
522 memcpy (s->current_picture.motion_val[1][b_xy + i*h->b_stride], h->mv_cache[1][scan8[0] + 8*i], 4*2*sizeof(int16_t)); | |
523 } | |
524 } else { | 526 } else { |
525 for (i=0; i < 4; i++) { | 527 for (i=0; i < 4; i++) { |
526 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); | 528 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); |
527 } | 529 } |
528 } | 530 } |
529 } | 531 } |
530 | 532 |
531 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) | |
532 return -1; | |
533 | |
534 cbp = golomb_to_inter_cbp[vlc]; | |
535 mb_type = MB_TYPE_16x16; | 533 mb_type = MB_TYPE_16x16; |
536 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ | 534 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ |
537 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); | 535 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); |
538 | 536 |
539 if (mb_type == 8) { | 537 if (mb_type == 8) { |
570 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; | 568 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; |
571 | 569 |
572 if (left[1] == -1 || left[2] == -1) | 570 if (left[1] == -1 || left[2] == -1) |
573 return -1; | 571 return -1; |
574 } | 572 } |
575 } else { | 573 } else { /* mb_type == 33, DC_128_PRED block type */ |
576 /* DC_128_PRED block type */ | |
577 for (i=0; i < 4; i++) { | 574 for (i=0; i < 4; i++) { |
578 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4); | 575 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4); |
579 } | 576 } |
580 } | 577 } |
581 | 578 |
593 | 590 |
594 h->top_samples_available = 0x33FF; | 591 h->top_samples_available = 0x33FF; |
595 h->left_samples_available = 0x5F5F; | 592 h->left_samples_available = 0x5F5F; |
596 } | 593 } |
597 | 594 |
598 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) | |
599 return -1; | |
600 | |
601 cbp = golomb_to_intra4x4_cbp[vlc]; | |
602 mb_type = MB_TYPE_INTRA4x4; | 595 mb_type = MB_TYPE_INTRA4x4; |
603 } else { /* INTRA16x16 */ | 596 } else { /* INTRA16x16 */ |
604 dir = i_mb_type_info[mb_type - 8].pred_mode; | 597 dir = i_mb_type_info[mb_type - 8].pred_mode; |
605 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; | 598 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; |
606 | 599 |
622 } | 615 } |
623 } | 616 } |
624 if (!IS_INTRA4x4(mb_type)) { | 617 if (!IS_INTRA4x4(mb_type)) { |
625 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8); | 618 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8); |
626 } | 619 } |
627 if (!IS_SKIP(mb_type)) { | 620 if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) { |
628 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); | 621 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t)); |
629 s->dsp.clear_blocks(h->mb); | 622 s->dsp.clear_blocks(h->mb); |
630 } | 623 } |
631 | 624 |
625 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) { | |
626 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) | |
627 return -1; | |
628 | |
629 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc]; | |
630 } | |
632 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) { | 631 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) { |
633 s->qscale += svq3_get_se_golomb (&s->gb); | 632 s->qscale += svq3_get_se_golomb (&s->gb); |
634 | 633 |
635 if (s->qscale > 31) | 634 if (s->qscale > 31) |
636 return -1; | 635 return -1; |
638 if (IS_INTRA16x16(mb_type)) { | 637 if (IS_INTRA16x16(mb_type)) { |
639 if (svq3_decode_block (&s->gb, h->mb, 0, 0)) | 638 if (svq3_decode_block (&s->gb, h->mb, 0, 0)) |
640 return -1; | 639 return -1; |
641 } | 640 } |
642 | 641 |
643 if (!IS_SKIP(mb_type) && cbp) { | 642 if (cbp) { |
644 l = IS_INTRA16x16(mb_type) ? 1 : 0; | 643 const int index = IS_INTRA16x16(mb_type) ? 1 : 0; |
645 m = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1); | 644 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1); |
646 | 645 |
647 for (i=0; i < 4; i++) { | 646 for (i=0; i < 4; i++) { |
648 if ((cbp & (1 << i))) { | 647 if ((cbp & (1 << i))) { |
649 for (j=0; j < 4; j++) { | 648 for (j=0; j < 4; j++) { |
650 k = l ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j); | 649 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j); |
651 h->non_zero_count_cache[ scan8[k] ] = 1; | 650 h->non_zero_count_cache[ scan8[k] ] = 1; |
652 | 651 |
653 if (svq3_decode_block (&s->gb, &h->mb[16*k], l, m)) | 652 if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type)) |
654 return -1; | 653 return -1; |
655 } | 654 } |
656 } | 655 } |
657 } | 656 } |
658 | 657 |
926 } | 925 } |
927 | 926 |
928 if (mb_type != 0) { | 927 if (mb_type != 0) { |
929 hl_decode_mb (h); | 928 hl_decode_mb (h); |
930 } | 929 } |
930 | |
931 if (s->pict_type != B_TYPE && !s->low_delay) { | |
932 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] = | |
933 (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1; | |
934 } | |
931 } | 935 } |
932 | 936 |
933 ff_draw_horiz_band(s, 16*s->mb_y, 16); | 937 ff_draw_horiz_band(s, 16*s->mb_y, 16); |
934 } | 938 } |
935 | 939 |