direct blocksize in bframes fix (might fix qpel+bframe bug)
Originally committed as revision 1557 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									16e83cbbc4
								
							
						
					
					
						commit
						c40c34828a
					
				@ -16,8 +16,8 @@ extern "C" {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define LIBAVCODEC_VERSION_INT 0x000406
 | 
					#define LIBAVCODEC_VERSION_INT 0x000406
 | 
				
			||||||
#define LIBAVCODEC_VERSION     "0.4.6"
 | 
					#define LIBAVCODEC_VERSION     "0.4.6"
 | 
				
			||||||
#define LIBAVCODEC_BUILD       4654
 | 
					#define LIBAVCODEC_BUILD       4655
 | 
				
			||||||
#define LIBAVCODEC_BUILD_STR   "4654"
 | 
					#define LIBAVCODEC_BUILD_STR   "4655"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum CodecID {
 | 
					enum CodecID {
 | 
				
			||||||
    CODEC_ID_NONE, 
 | 
					    CODEC_ID_NONE, 
 | 
				
			||||||
@ -531,6 +531,7 @@ typedef struct AVCodecContext {
 | 
				
			|||||||
#define FF_BUG_QPEL_CHROMA      64
 | 
					#define FF_BUG_QPEL_CHROMA      64
 | 
				
			||||||
#define FF_BUG_STD_QPEL         128
 | 
					#define FF_BUG_STD_QPEL         128
 | 
				
			||||||
#define FF_BUG_QPEL_CHROMA2     256
 | 
					#define FF_BUG_QPEL_CHROMA2     256
 | 
				
			||||||
 | 
					#define FF_BUG_DIRECT_BLOCKSIZE 512
 | 
				
			||||||
//#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
 | 
					//#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -407,13 +407,16 @@ void ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
 | 
				
			|||||||
    //FIXME avoid divides
 | 
					    //FIXME avoid divides
 | 
				
			||||||
    switch(s->co_located_type_table[mb_index]){
 | 
					    switch(s->co_located_type_table[mb_index]){
 | 
				
			||||||
    case 0:
 | 
					    case 0:
 | 
				
			||||||
        s->mv_type= MV_TYPE_16X16;
 | 
					        s->mv[0][0][0] = s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
 | 
				
			||||||
        s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
 | 
					        s->mv[0][0][1] = s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
 | 
				
			||||||
        s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
 | 
					        s->mv[1][0][0] = s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
 | 
				
			||||||
        s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
 | 
					 | 
				
			||||||
                            : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
 | 
					                            : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
 | 
				
			||||||
        s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
 | 
					        s->mv[1][0][1] = s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
 | 
				
			||||||
                            : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
 | 
					                            : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
 | 
				
			||||||
 | 
					        if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
 | 
				
			||||||
 | 
					            s->mv_type= MV_TYPE_16X16;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            s->mv_type= MV_TYPE_8X8;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case CO_LOCATED_TYPE_4MV:
 | 
					    case CO_LOCATED_TYPE_4MV:
 | 
				
			||||||
        s->mv_type = MV_TYPE_8X8;
 | 
					        s->mv_type = MV_TYPE_8X8;
 | 
				
			||||||
 | 
				
			|||||||
@ -332,6 +332,13 @@ static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){
 | 
				
			|||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * draws an line from (ex, ey) -> (sx, sy).
 | 
				
			||||||
 | 
					 * @param w width of the image
 | 
				
			||||||
 | 
					 * @param h height of the image
 | 
				
			||||||
 | 
					 * @param stride stride/linesize of the image
 | 
				
			||||||
 | 
					 * @param color color of the arrow
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
 | 
					static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
 | 
				
			||||||
    int t, x, y, f;
 | 
					    int t, x, y, f;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -368,6 +375,13 @@ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * draws an arrow from (ex, ey) -> (sx, sy).
 | 
				
			||||||
 | 
					 * @param w width of the image
 | 
				
			||||||
 | 
					 * @param h height of the image
 | 
				
			||||||
 | 
					 * @param stride stride/linesize of the image
 | 
				
			||||||
 | 
					 * @param color color of the arrow
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ 
 | 
					static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){ 
 | 
				
			||||||
    int dx= ex - sx;
 | 
					    int dx= ex - sx;
 | 
				
			||||||
    int dy= ey - sy;
 | 
					    int dy= ey - sy;
 | 
				
			||||||
@ -510,6 +524,11 @@ retry:
 | 
				
			|||||||
        if(s->lavc_build && s->lavc_build<4653)
 | 
					        if(s->lavc_build && s->lavc_build<4653)
 | 
				
			||||||
            s->workaround_bugs|= FF_BUG_STD_QPEL;
 | 
					            s->workaround_bugs|= FF_BUG_STD_QPEL;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        if(s->lavc_build && s->lavc_build<4655)
 | 
				
			||||||
 | 
					            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(s->divx_version)
 | 
				
			||||||
 | 
					            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
 | 
				
			||||||
//printf("padding_bug_score: %d\n", s->padding_bug_score);
 | 
					//printf("padding_bug_score: %d\n", s->padding_bug_score);
 | 
				
			||||||
#if 0
 | 
					#if 0
 | 
				
			||||||
        if(s->divx_version==500)
 | 
					        if(s->divx_version==500)
 | 
				
			||||||
 | 
				
			|||||||
@ -241,8 +241,14 @@ if((x) >= xmin && 4*(x) + (dx) <= 4*xmax && (y) >= ymin && 4*(y) + (dy) <= 4*yma
 | 
				
			|||||||
        int fxy= (fx&3) + 4*(fy&3);\
 | 
					        int fxy= (fx&3) + 4*(fy&3);\
 | 
				
			||||||
        int bxy= (bx&3) + 4*(by&3);\
 | 
					        int bxy= (bx&3) + 4*(by&3);\
 | 
				
			||||||
\
 | 
					\
 | 
				
			||||||
        qpel_put[0][fxy](s->me.scratchpad, (ref_y ) + (fx>>2) + (fy>>2)*(stride), stride);\
 | 
					        qpel_put[1][fxy](s->me.scratchpad               , (ref_y ) + (fx>>2) + (fy>>2)*(stride)               , stride);\
 | 
				
			||||||
        qpel_avg[0][bxy](s->me.scratchpad, (ref2_y) + (bx>>2) + (by>>2)*(stride), stride);\
 | 
					        qpel_put[1][fxy](s->me.scratchpad + 8           , (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8           , stride);\
 | 
				
			||||||
 | 
					        qpel_put[1][fxy](s->me.scratchpad     + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride)     + 8*stride, stride);\
 | 
				
			||||||
 | 
					        qpel_put[1][fxy](s->me.scratchpad + 8 + 8*stride, (ref_y ) + (fx>>2) + (fy>>2)*(stride) + 8 + 8*stride, stride);\
 | 
				
			||||||
 | 
					        qpel_avg[1][bxy](s->me.scratchpad               , (ref2_y) + (bx>>2) + (by>>2)*(stride)               , stride);\
 | 
				
			||||||
 | 
					        qpel_avg[1][bxy](s->me.scratchpad + 8           , (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8           , stride);\
 | 
				
			||||||
 | 
					        qpel_avg[1][bxy](s->me.scratchpad     + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride)     + 8*stride, stride);\
 | 
				
			||||||
 | 
					        qpel_avg[1][bxy](s->me.scratchpad + 8 + 8*stride, (ref2_y) + (bx>>2) + (by>>2)*(stride) + 8 + 8*stride, stride);\
 | 
				
			||||||
    }\
 | 
					    }\
 | 
				
			||||||
    d = cmp_func(s, s->me.scratchpad, src_y, stride);\
 | 
					    d = cmp_func(s, s->me.scratchpad, src_y, stride);\
 | 
				
			||||||
}else\
 | 
					}else\
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user