aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpegvideo.c
diff options
context:
space:
mode:
authorLoren Merritt <lorenm@u.washington.edu>2004-12-20 03:03:37 +0000
committerLoren Merritt <lorenm@u.washington.edu>2004-12-20 03:03:37 +0000
commit650cec0c8c9b07943d4dbfdbbe56fb8f5d99d7ee (patch)
tree3844ed05956bc732030da2c44cbe5263e2f515e3 /libavcodec/mpegvideo.c
parentae895a40c55e25d0b62687cda2a871dfa1b1b8b0 (diff)
downloadffmpeg-650cec0c8c9b07943d4dbfdbbe56fb8f5d99d7ee.tar.gz
vismv for h264 displayed incorrect motion vectors.
Originally committed as revision 3765 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r--libavcodec/mpegvideo.c23
1 files changed, 19 insertions, 4 deletions
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);