diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 65c8535359..4287555a31 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1344,6 +1344,7 @@ typedef struct AVCodecContext {
 #define FF_DEBUG_THREADS     0x00010000
 #define FF_DEBUG_GREEN_MD    0x00800000
 #define FF_DEBUG_NOMC        0x01000000
+#define FF_DEBUG_MOTION_VEC  0x02000000
 
     /**
      * Error recognition; may misdetect some more or less valid parts as errors.
diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c
index ff9418232b..d0a94784fb 100644
--- a/libavcodec/mpegutils.c
+++ b/libavcodec/mpegutils.c
@@ -246,8 +246,11 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict,
         return;
 
 
-    if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
+    if (avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE | FF_DEBUG_MOTION_VEC)) {
         int x,y;
+        const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
+        const int mv_stride      = (mb_width << mv_sample_log2) +
+                                   (avctx->codec->id == AV_CODEC_ID_H264 ? 0 : 1);
 
         av_log(avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
                av_get_picture_type_char(pict->pict_type));
@@ -271,6 +274,46 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict,
                            get_segmentation_char(mb_type),
                            get_interlacement_char(mb_type));
                 }
+                if (avctx->debug & FF_DEBUG_MOTION_VEC) {
+                    int i, direction, mb_type = mbtype_table[x + y * mb_stride];
+                    if (IS_8X8(mb_type)) {
+                        for (i = 0; i < 4; i++) {
+                            int xy = (x * 2 + (i & 1) +
+                                      (y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
+                            int mx = motion_val[direction][xy][0];
+                            int my = motion_val[direction][xy][1];
+                            av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        }
+                    } else if (IS_16X8(mb_type)) {
+                        for (i = 0; i < 2; i++) {
+                            int xy = (x * 2 + (y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
+                            int mx = motion_val[direction][xy][0];
+                            int my = motion_val[direction][xy][1];
+                            if (IS_INTERLACED(mb_type))
+                                my *= 2;
+                            av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                            av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        }
+                    } else if (IS_8X16(mb_type)) {
+                        for (i = 0; i < 2; i++) {
+                            int xy = (x * 2 + i + y * 2 * mv_stride) << (mv_sample_log2 - 1);
+                            int mx = motion_val[direction][xy][0];
+                            int my = motion_val[direction][xy][1];
+                            if (IS_INTERLACED(mb_type))
+                                my *= 2;
+                            av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                            av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        }
+                    } else {
+                        int xy = (x + y * mv_stride) << mv_sample_log2;
+                        int mx = motion_val[direction][xy][0];
+                        int my = motion_val[direction][xy][1];
+                        av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                        av_log(avctx, AV_LOG_DEBUG, "%4d %4d", mx, my);
+                    }
+                }
             }
             av_log(avctx, AV_LOG_DEBUG, "\n");
         }
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index cd02f5096f..0d100069e1 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -198,6 +198,7 @@ static const AVOption avcodec_options[] = {
 {"startcode", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_STARTCODE }, INT_MIN, INT_MAX, V|D, "debug"},
 {"er", "error recognition", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_ER }, INT_MIN, INT_MAX, V|D, "debug"},
 {"mmco", "memory management control operations (H.264)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MMCO }, INT_MIN, INT_MAX, V|D, "debug"},
+{"motion_vec", "macroblock (MB) motion vector values", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_MOTION_VEC }, INT_MIN, INT_MAX, V|D, "debug"},
 {"bugs", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUGS }, INT_MIN, INT_MAX, V|D, "debug"},
 {"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"},
 {"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"},
