[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