Mercurial > libavcodec.hg
comparison rv34.c @ 8099:bc786a34f6eb libavcodec
Introduce RV3-specific motion vector prediction.
Now B-frames in RV3 look almost correct.
author | kostya |
---|---|
date | Sat, 01 Nov 2008 17:57:44 +0000 |
parents | ae146e429003 |
children | 2d01559f824c |
comparison
equal
deleted
inserted
replaced
8098:c2ab7a8958ed | 8099:bc786a34f6eb |
---|---|
552 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my; | 552 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my; |
553 } | 553 } |
554 } | 554 } |
555 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD) | 555 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD) |
556 fill_rectangle(cur_pic->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4); | 556 fill_rectangle(cur_pic->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4); |
557 } | |
558 | |
559 /** | |
560 * motion vector prediction - RV3 version | |
561 */ | |
562 static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir) | |
563 { | |
564 MpegEncContext *s = &r->s; | |
565 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; | |
566 int A[2] = {0}, B[2], C[2]; | |
567 int i, j; | |
568 int mx, my; | |
569 int avail_index = avail_indexes[0]; | |
570 | |
571 if(r->avail_cache[avail_index - 1]){ | |
572 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0]; | |
573 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1]; | |
574 } | |
575 if(r->avail_cache[avail_index - 4]){ | |
576 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0]; | |
577 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1]; | |
578 }else{ | |
579 B[0] = A[0]; | |
580 B[1] = A[1]; | |
581 } | |
582 if(!r->avail_cache[avail_index - 4 + 2]){ | |
583 if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1])){ | |
584 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0]; | |
585 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1]; | |
586 }else{ | |
587 C[0] = A[0]; | |
588 C[1] = A[1]; | |
589 } | |
590 }else{ | |
591 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][0]; | |
592 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][1]; | |
593 } | |
594 mx = mid_pred(A[0], B[0], C[0]); | |
595 my = mid_pred(A[1], B[1], C[1]); | |
596 mx += r->dmv[0][0]; | |
597 my += r->dmv[0][1]; | |
598 for(j = 0; j < 2; j++){ | |
599 for(i = 0; i < 2; i++){ | |
600 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx; | |
601 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my; | |
602 } | |
603 } | |
604 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD) | |
605 fill_rectangle(s->current_picture_ptr->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4); | |
557 } | 606 } |
558 | 607 |
559 static const int chroma_coeffs[3] = { 0, 3, 5 }; | 608 static const int chroma_coeffs[3] = { 0, 3, 5 }; |
560 | 609 |
561 /** | 610 /** |
739 break; | 788 break; |
740 case RV34_MB_B_FORWARD: | 789 case RV34_MB_B_FORWARD: |
741 case RV34_MB_B_BACKWARD: | 790 case RV34_MB_B_BACKWARD: |
742 r->dmv[1][0] = r->dmv[0][0]; | 791 r->dmv[1][0] = r->dmv[0][0]; |
743 r->dmv[1][1] = r->dmv[0][1]; | 792 r->dmv[1][1] = r->dmv[0][1]; |
744 rv34_pred_mv_b (r, block_type, block_type == RV34_MB_B_BACKWARD); | 793 if(r->rv30) |
794 rv34_pred_mv_rv3(r, block_type, block_type == RV34_MB_B_BACKWARD); | |
795 else | |
796 rv34_pred_mv_b (r, block_type, block_type == RV34_MB_B_BACKWARD); | |
745 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, block_type == RV34_MB_B_BACKWARD); | 797 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, block_type == RV34_MB_B_BACKWARD); |
746 break; | 798 break; |
747 case RV34_MB_P_16x8: | 799 case RV34_MB_P_16x8: |
748 case RV34_MB_P_8x16: | 800 case RV34_MB_P_8x16: |
749 rv34_pred_mv(r, block_type, 0, 0); | 801 rv34_pred_mv(r, block_type, 0, 0); |