[FFmpeg-devel] [PATCH] fftools/ffplay: fix rotation incorrect when frame contains the side_data(type is AV_FRAME_DATA_DISPLAYMATRIX)

1035567130 at qq.com 1035567130 at qq.com
Wed Aug 31 13:45:23 EEST 2022


From: Wang Yaqiang <wangyaqiang03 at kuaishou.com>

For example, if the jpeg contains exif information and the rotation direction is included in the exif,
the displaymatrix will be set on the side_data of the frame when decoding.
However, when ffplay is used to play the image, only the side data in the stream will be determined.
It does not check whether the frame also contains rotation information, causing it to play in the wrong direction
---
 fftools/ffplay.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 9242047f5c..868123dc65 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -1917,7 +1917,8 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
     if (autorotate) {
         int32_t *displaymatrix = (int32_t *)av_stream_get_side_data(is->video_st, AV_PKT_DATA_DISPLAYMATRIX, NULL);
         double theta = get_rotation(displaymatrix);
-
+        int frame_rotation_checked = 0;
+    rotation:
         if (fabs(theta - 90) < 1.0) {
             INSERT_FILT("transpose", "clock");
         } else if (fabs(theta - 180) < 1.0) {
@@ -1930,6 +1931,15 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c
             snprintf(rotate_buf, sizeof(rotate_buf), "%f*PI/180", theta);
             INSERT_FILT("rotate", rotate_buf);
         }
+        if (!frame_rotation_checked) {
+            frame_rotation_checked = 1;
+            AVFrameSideData *sd = av_frame_get_side_data(frame,AV_FRAME_DATA_DISPLAYMATRIX);
+            if (sd) {
+                displaymatrix = (int32_t *)sd->data;
+                theta = get_rotation(displaymatrix);
+                goto rotation;
+            }
+        }
     }
 
     if ((ret = configure_filtergraph(graph, vfilters, filt_src, last_filter)) < 0)
-- 
2.33.0



More information about the ffmpeg-devel mailing list