[FFmpeg-devel] [PATCH] fftools/ffplay.c: fix rotate error when displaymatrix contains flip

1035567130 at qq.com 1035567130 at qq.com
Thu Mar 9 11:49:50 EET 2023


From: Wang Yaqiang <wangyaqiang03 at kuaishou.com>

The angle is calculated by the get_rotation function,
but it needs to be combined with the displaymatrix to determine whether flip or rotate,
which is consistent with the processing logic in ffmpeg_filter.c

Signed-off-by: Wang Yaqiang <wangyaqiang03 at kuaishou.com>
---
 fftools/ffplay.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index d6479aef5f..860bac367a 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -1925,16 +1925,24 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
         theta = get_rotation(displaymatrix);
 
         if (fabs(theta - 90) < 1.0) {
-            INSERT_FILT("transpose", "clock");
+            INSERT_FILT("transpose", displaymatrix[3] > 0 ? "cclock_flip" : "clock");
         } else if (fabs(theta - 180) < 1.0) {
-            INSERT_FILT("hflip", NULL);
-            INSERT_FILT("vflip", NULL);
+            if (displaymatrix[0] < 0) {
+                INSERT_FILT("hflip", NULL);
+            }
+            if (displaymatrix[4] < 0) {
+                INSERT_FILT("vflip", NULL);
+            }
         } else if (fabs(theta - 270) < 1.0) {
-            INSERT_FILT("transpose", "cclock");
+            INSERT_FILT("transpose", displaymatrix[3] < 0 ? "clock_flip" : "cclock");
         } else if (fabs(theta) > 1.0) {
             char rotate_buf[64];
             snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
             INSERT_FILT("rotate", rotate_buf);
+        } else if (fabs(theta) < 1.0) {
+            if (displaymatrix && displaymatrix[4] < 0) {
+                INSERT_FILT("vflip", NULL);
+            }
         }
     }
 
-- 
2.39.2



More information about the ffmpeg-devel mailing list