summaryrefslogtreecommitdiff
path: root/fftools/ffmpeg_filter.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2021-09-08 15:34:25 -0300
committerJames Almer <jamrial@gmail.com>2021-09-16 12:46:07 -0300
commit535a835e5176a5f2d5e03776030bacbc3e19d604 (patch)
treeaea1837b695e9f01c7b6999cc3169acd48897730 /fftools/ffmpeg_filter.c
parenta8bd8d46f9d32582c5b89cdc57f9cb7169e94066 (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.c14
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)