# HG changeset patch # User michaelni # Date 1028583374 0 # Node ID 0c950f816d61ce935613da4c7a87a206b3837b93 # Parent d5d0c11ea4cf3e21f2477d11be6e1a8e09c18199 4mv + bframe decoding bugfix diff -r d5d0c11ea4cf -r 0c950f816d61 h263.c --- a/h263.c Mon Aug 05 19:05:02 2002 +0000 +++ b/h263.c Mon Aug 05 21:36:14 2002 +0000 @@ -2643,14 +2643,12 @@ case 0: /* direct */ mx = h263_decode_motion(s, 0, 1); my = h263_decode_motion(s, 0, 1); - PRINT_MB_TYPE("S"); case 4: /* direct with mx=my=0 */ s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; xy= s->block_index[0]; time_pp= s->pp_time; time_pb= time_pp - s->bp_time; //if(time_pp>3000 )printf("%d %d ", time_pp, time_pb); - //FIXME 4MV //FIXME avoid divides s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my; @@ -2658,11 +2656,26 @@ : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx; s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my; + if(s->non_b_mv4_table[xy]){ + int i; + s->mv_type = MV_TYPE_8X8; + for(i=1; i<4; i++){ + xy= s->block_index[i]; + s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx; + s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my; + s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0] + : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp + mx; + s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1] + : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my; + } + PRINT_MB_TYPE("4"); + }else{ + PRINT_MB_TYPE(mb_type==4 ? "D" : "S"); + } /* s->mv[0][0][0] = s->mv[0][0][1] = s->mv[1][0][0] = s->mv[1][0][1] = 1000;*/ - if(mb_type==4) PRINT_MB_TYPE("D"); break; case 1: s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; diff -r d5d0c11ea4cf -r 0c950f816d61 mpegvideo.c --- a/mpegvideo.c Mon Aug 05 19:05:02 2002 +0000 +++ b/mpegvideo.c Mon Aug 05 21:36:14 2002 +0000 @@ -236,6 +236,9 @@ /* MV prediction */ size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(INT16)); + + /* 4mv direct mode decoding table */ + CHECKED_ALLOCZ(s->non_b_mv4_table, size * sizeof(UINT8)) } if (s->h263_pred || s->h263_plus) { @@ -324,7 +327,8 @@ av_freep(&s->tex_pb_buffer); av_freep(&s->pb2_buffer); av_freep(&s->edge_emu_buffer); - + av_freep(&s->non_b_mv4_table); + for(i=0;i<3;i++) { int j; if(!(s->flags&CODEC_FLAG_DR1)){ @@ -1453,6 +1457,9 @@ s->motion_val[xy + wrap][1] = motion_y; s->motion_val[xy + 1 + wrap][0] = motion_x; s->motion_val[xy + 1 + wrap][1] = motion_y; + s->non_b_mv4_table[xy]=0; + } else { /* 8X8 */ + s->non_b_mv4_table[xy]=1; } } diff -r d5d0c11ea4cf -r 0c950f816d61 mpegvideo.h --- a/mpegvideo.h Mon Aug 05 19:05:02 2002 +0000 +++ b/mpegvideo.h Mon Aug 05 21:36:14 2002 +0000 @@ -362,6 +362,7 @@ uint8_t *tex_pb_buffer; uint8_t *pb2_buffer; int mpeg_quant; + INT8 *non_b_mv4_table; /* divx specific, used to workaround (many) bugs in divx5 */ int divx_version;