From 6b75e0cbd664310726e69be0e72e55bc792ccfaf Mon Sep 17 00:00:00 2001
From: dsmudhar <ds.mudhar@gmail.com>
Date: Sun, 8 May 2016 03:26:54 +0530
Subject: [PATCH 3/3] vf_codecview: ignore frame types ifnset

---
 libavfilter/vf_codecview.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/libavfilter/vf_codecview.c b/libavfilter/vf_codecview.c
index 6ffa3fc..d2c9254 100644
--- a/libavfilter/vf_codecview.c
+++ b/libavfilter/vf_codecview.c
@@ -57,10 +57,10 @@ static const AVOption codecview_options[] = {
     { "mv", "set motion vectors to visualize", OFFSET(mv), AV_OPT_TYPE_FLAGS, {.i64=0}, 0, INT_MAX, FLAGS, "mv" },
         CONST("fp", "forward predicted MVs",  MV_FOR,  "mv"),
         CONST("bp", "backward predicted MVs", MV_BACK, "mv"),
-    { "frames", "set frame types to display MVs of", OFFSET(frames), AV_OPT_TYPE_FLAGS, {.i64=7}, 0, INT_MAX, FLAGS, "frames" },
-        CONST("if", "i-frames", FRAME_TYPE_I, "frames"),
-        CONST("pf", "p-frames", FRAME_TYPE_P, "frames"),
-        CONST("bf", "b-frames", FRAME_TYPE_B, "frames"),
+    { "frames", "set frame types to display MVs of", OFFSET(frames), AV_OPT_TYPE_FLAGS, {.i64=0}, 0, INT_MAX, FLAGS, "frames" },
+        CONST("if", "I-frames", FRAME_TYPE_I, "frames"),
+        CONST("pf", "P-frames", FRAME_TYPE_P, "frames"),
+        CONST("bf", "B-frames", FRAME_TYPE_B, "frames"),
     { "qp", NULL, OFFSET(qp), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, .flags = FLAGS },
     { NULL }
 };
@@ -237,17 +237,23 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
         if (sd) {
             int i;
             const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
+            const int is_iframe = (s->frames & FRAME_TYPE_I) && frame->pict_type == AV_PICTURE_TYPE_I;
+            const int is_pframe = (s->frames & FRAME_TYPE_P) && frame->pict_type == AV_PICTURE_TYPE_P;
+            const int is_bframe = (s->frames & FRAME_TYPE_B) && frame->pict_type == AV_PICTURE_TYPE_B;
+
             for (i = 0; i < sd->size / sizeof(*mvs); i++) {
                 const AVMotionVector *mv = &mvs[i];
                 const int direction = mv->source > 0;
-                if ((direction == 0 && (s->mv & MV_FOR)  && (s->frames & FRAME_TYPE_I) && frame->pict_type == AV_PICTURE_TYPE_I) ||
-                    (direction == 0 && (s->mv & MV_FOR)  && (s->frames & FRAME_TYPE_P) && frame->pict_type == AV_PICTURE_TYPE_P) ||
-                    (direction == 0 && (s->mv & MV_FOR)  && (s->frames & FRAME_TYPE_B) && frame->pict_type == AV_PICTURE_TYPE_B) ||
-                    (direction == 1 && (s->mv & MV_BACK) && (s->frames & FRAME_TYPE_I) && frame->pict_type == AV_PICTURE_TYPE_I) ||
-                    (direction == 1 && (s->mv & MV_BACK) && (s->frames & FRAME_TYPE_B) && frame->pict_type == AV_PICTURE_TYPE_B))
+                const int is_fp = direction == 0 && (s->mv & MV_FOR);
+                const int is_bp = direction == 1 && (s->mv & MV_BACK);
+
+                if ((!s->frames && (is_fp || is_bp)) ||
+                    is_iframe && is_fp || is_iframe && is_bp ||
+                    is_pframe && is_fp ||
+                    is_bframe && is_fp || is_bframe && is_bp)
                     draw_arrow(frame->data[0], mv->dst_x, mv->dst_y, mv->src_x, mv->src_y,
                                frame->width, frame->height, frame->linesize[0],
-                               100, 0, mv->source > 0);
+                               100, 0, direction);
             }
         }
     }
-- 
2.7.4 (Apple Git-66)

