# HG changeset patch # User kostya # Date 1230546003 0 # Node ID 3bfb7a2ea222708bf3aa6bfa2b6341572022b2d7 # Parent 7c82ed8d48247eaeae87506dae8e828f252c3668 It turned out that RV30 uses motion vectors for forward motion B-frame macroblocks to predict motion vectors for backward motion B-frame macroblocks and vice versa. diff -r 7c82ed8d4824 -r 3bfb7a2ea222 rv34.c --- a/rv34.c Sun Dec 28 23:26:12 2008 +0000 +++ b/rv34.c Mon Dec 29 10:20:03 2008 +0000 @@ -564,7 +564,7 @@ MpegEncContext *s = &r->s; int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; int A[2] = {0}, B[2], C[2]; - int i, j; + int i, j, k; int mx, my; int avail_index = avail_indexes[0]; @@ -597,12 +597,12 @@ my += r->dmv[0][1]; for(j = 0; j < 2; j++){ for(i = 0; i < 2; i++){ - s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx; - s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my; + for(k = 0; k < 2; k++){ + s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx; + s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][1] = my; + } } } - if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD) - fill_rectangle(s->current_picture_ptr->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4); } static const int chroma_coeffs[3] = { 0, 3, 5 };