diff rv34.c @ 6096:89140b93ae09 libavcodec

Direct blocks should use motion vectors from the second reference frame
author kostya
date Mon, 31 Dec 2007 07:12:50 +0000
parents ce3b68242317
children a2b438bcb1d2
line wrap: on
line diff
--- a/rv34.c	Sun Dec 30 22:58:20 2007 +0000
+++ b/rv34.c	Mon Dec 31 07:12:50 2007 +0000
@@ -474,6 +474,21 @@
 }
 
 /**
+ * Calculate motion vector component that should be added for direct blocks.
+ */
+static int calc_add_mv(MpegEncContext *s, int dir, int component)
+{
+    int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
+    int sum;
+
+    sum = (s->next_picture_ptr->motion_val[0][mv_pos][component] +
+           s->next_picture_ptr->motion_val[0][mv_pos + 1][component] +
+           s->next_picture_ptr->motion_val[0][mv_pos + s->b8_stride][component] +
+           s->next_picture_ptr->motion_val[0][mv_pos + s->b8_stride + 1][component]) >> 2;
+    return dir ? -(sum >> 1) : ((sum + 1) >> 1);
+}
+
+/**
  * Predict motion vector for B-frame macroblock.
  */
 static inline void rv34_pred_b_vector(int A[2], int B[2], int C[2],
@@ -536,7 +551,11 @@
 
     mx += r->dmv[dir][0];
     my += r->dmv[dir][1];
-    //XXX add vector for bidirectionally predicted blocks
+
+    if(block_type == RV34_MB_B_DIRECT){
+        mx += calc_add_mv(s, dir, 0);
+        my += calc_add_mv(s, dir, 1);
+    }
     for(j = 0; j < 2; j++){
         for(i = 0; i < 2; i++){
             cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx;