diff options
author | James Almer <jamrial@gmail.com> | 2021-09-08 15:34:25 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2021-09-16 12:46:07 -0300 |
commit | 535a835e5176a5f2d5e03776030bacbc3e19d604 (patch) | |
tree | aea1837b695e9f01c7b6999cc3169acd48897730 /fftools/ffmpeg_filter.c | |
parent | a8bd8d46f9d32582c5b89cdc57f9cb7169e94066 (diff) |
ffmpeg: use display matrix frame side data for autorotation
And give it priority over stream side data when present.
Fixes part of ticket #6945.
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'fftools/ffmpeg_filter.c')
-rw-r--r-- | fftools/ffmpeg_filter.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 6b7b6ca1b3..a4c2de07da 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -757,7 +757,12 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter, last_filter = ifilter->filter; if (ist->autorotate) { - double theta = get_rotation(ist->st); + int32_t *displaymatrix = ifilter->displaymatrix; + double theta; + + if (!displaymatrix) + displaymatrix = (int32_t *)av_stream_get_side_data(ist->st, AV_PKT_DATA_DISPLAYMATRIX, NULL); + theta = get_rotation(displaymatrix); if (fabs(theta - 90) < 1.0) { ret = insert_filter(&last_filter, &pad_idx, "transpose", "clock"); @@ -1127,6 +1132,8 @@ fail: int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame) { + AVFrameSideData *sd; + av_buffer_unref(&ifilter->hw_frames_ctx); ifilter->format = frame->format; @@ -1139,6 +1146,11 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame) ifilter->channels = frame->channels; ifilter->channel_layout = frame->channel_layout; + av_freep(&ifilter->displaymatrix); + sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX); + if (sd) + ifilter->displaymatrix = av_memdup(sd->data, sizeof(int32_t) * 9); + if (frame->hw_frames_ctx) { ifilter->hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx); if (!ifilter->hw_frames_ctx) |