From 650cec0c8c9b07943d4dbfdbbe56fb8f5d99d7ee Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Mon, 20 Dec 2004 03:03:37 +0000 Subject: [PATCH] vismv for h264 displayed incorrect motion vectors. Originally committed as revision 3765 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 6 +++--- libavcodec/mpegvideo.c | 23 +++++++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index e672028cd0..1b774329db 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -203,7 +203,7 @@ typedef struct H264Context{ uint16_t *mb2b_xy; //FIXME are these 4 a good idea? uint16_t *mb2b8_xy; - int b_stride; + int b_stride; //FIXME use s->b4_stride int b8_stride; int halfpel_flag; @@ -3035,8 +3035,8 @@ static int decode_slice_header(H264Context *h){ s->mb_width= h->sps.mb_width; s->mb_height= h->sps.mb_height; - h->b_stride= s->mb_width*4; - h->b8_stride= s->mb_width*2; + h->b_stride= s->mb_width*4 + 1; + h->b8_stride= s->mb_width*2 + 1; s->resync_mb_x = s->mb_x = first_mb_in_slice % s->mb_width; s->resync_mb_y = s->mb_y = first_mb_in_slice / s->mb_width; //FIXME AFFW diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 0190c91b5d..60867f0181 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1762,6 +1762,8 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ int h_chroma_shift, v_chroma_shift; const int width = s->avctx->width; const int height= s->avctx->height; + const int mv_sample_log2= 4 - pict->motion_subsample_log2; + const int mv_stride= (s->mb_width << mv_sample_log2) + 1; s->low_delay=0; //needed to see the vectors without trashing the buffers avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift); @@ -1797,13 +1799,12 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ if(!USES_LIST(pict->mb_type[mb_index], direction)) continue; - //FIXME for h264 if(IS_8X8(pict->mb_type[mb_index])){ int i; for(i=0; i<4; i++){ int sx= mb_x*16 + 4 + 8*(i&1); int sy= mb_y*16 + 4 + 8*(i>>1); - int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride; + int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << mv_sample_log2-1; int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; int my= (pict->motion_val[direction][xy][1]>>shift) + sy; draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100); @@ -1813,7 +1814,21 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ for(i=0; i<2; i++){ int sx=mb_x*16 + 8; int sy=mb_y*16 + 4 + 8*i; - int xy= mb_x*2 + (mb_y*2 + i)*s->b8_stride; + int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << mv_sample_log2-1; + int mx=(pict->motion_val[direction][xy][0]>>shift); + int my=(pict->motion_val[direction][xy][1]>>shift); + + if(IS_INTERLACED(pict->mb_type[mb_index])) + my*=2; + + draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100); + } + }else if(IS_8X16(pict->mb_type[mb_index])){ + int i; + for(i=0; i<2; i++){ + int sx=mb_x*16 + 4 + 8*i; + int sy=mb_y*16 + 8; + int xy= (mb_x*2 + i + mb_y*2*mv_stride) << mv_sample_log2-1; int mx=(pict->motion_val[direction][xy][0]>>shift); int my=(pict->motion_val[direction][xy][1]>>shift); @@ -1825,7 +1840,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ }else{ int sx= mb_x*16 + 8; int sy= mb_y*16 + 8; - int xy= mb_x*2 + mb_y*2*s->b8_stride; + int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2; int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; int my= (pict->motion_val[direction][xy][1]>>shift) + sy; draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);