diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index ba16b2f306446a4b2b1a499299eca615718bae67..fe12846f4f3400608e31a8503547994481077321 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1003,6 +1003,9 @@ static void free_tables(H264Context *h, int free_rbsp)
     av_freep(&h->mb2b_xy);
     av_freep(&h->mb2br_xy);
 
+    for (i = 0; i < 3; i++)
+        av_freep(&h->visualization_buffer[i]);
+
     if (free_rbsp) {
         for (i = 0; i < h->picture_count && !h->avctx->internal->is_copy; i++)
             free_picture(h, &h->DPB[i]);
@@ -4781,6 +4784,9 @@ not_extra:
 
     assert(pict->data[0] || !*got_frame);
 
+    ff_print_debug_info2(h->avctx, pict, h->er.mbskip_table, h->visualization_buffer, &h->low_delay,
+                         h->mb_width, h->mb_height, h->mb_stride, 1);
+
     return get_consumed_bytes(buf_index, buf_size);
 }
 
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index cb693619b6f26f13fe40ac813201f56e6a7018d8..0c8c7ad40375049e69905e008abc84437ad373bb 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -644,6 +644,8 @@ typedef struct H264Context {
     int parse_last_mb;
     uint8_t *edge_emu_buffer;
     int16_t *dc_val_base;
+
+    uint8_t *visualization_buffer[3]; ///< temporary buffer vor MV visualization
 } H264Context;
 
 extern const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM + 1]; ///< One chroma qp table for each possible bit depth (8-14).