Author: kostya Date: Mon Dec 31 08:12:50 2007 New Revision: 11361 Log: Direct blocks should use motion vectors from the second reference frame Modified: trunk/libavcodec/rv34.c Modified: trunk/libavcodec/rv34.c ============================================================================== --- trunk/libavcodec/rv34.c (original) +++ trunk/libavcodec/rv34.c Mon Dec 31 08:12:50 2007 @@ -474,6 +474,21 @@ static void rv34_pred_mv(RV34DecContext } /** + * 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 @@ static void rv34_pred_mv_b(RV34DecContex 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;
On Mon, Dec 31, 2007 at 08:12:50AM +0100, kostya wrote:
Author: kostya Date: Mon Dec 31 08:12:50 2007 New Revision: 11361
Log: Direct blocks should use motion vectors from the second reference frame
Modified: trunk/libavcodec/rv34.c
Modified: trunk/libavcodec/rv34.c ============================================================================== --- trunk/libavcodec/rv34.c (original) +++ trunk/libavcodec/rv34.c Mon Dec 31 08:12:50 2007 @@ -474,6 +474,21 @@ static void rv34_pred_mv(RV34DecContext }
/** + * 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); +}
normally direct MBs have seperate MVs for each block instead of one averaged one ... [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB The educated differ from the uneducated as much as the living from the dead. -- Aristotle
participants (2)
-
michaelni@gmx.at -
subversion@mplayerhq.hu