1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

avcodec/mjpegdec: export display matrix frame side data when available

Finishes fixing ticket #6945.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2021-09-08 15:34:27 -03:00
parent 42fce6fffe
commit e93c998602

View File

@ -30,6 +30,7 @@
* MJPEG decoder.
*/
#include "libavutil/display.h"
#include "libavutil/imgutils.h"
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
@ -2406,6 +2407,7 @@ int ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
int i, index;
int ret = 0;
int is16bit;
AVDictionaryEntry *e = NULL;
s->force_pal8 = 0;
@ -2864,6 +2866,57 @@ the_end:
}
}
if (e = av_dict_get(s->exif_metadata, "Orientation", e, AV_DICT_IGNORE_SUFFIX)) {
char *value = e->value + strspn(e->value, " \n\t\r"), *endptr;
int orientation = strtol(value, &endptr, 0);
if (!*endptr) {
AVFrameSideData *sd = NULL;
if (orientation >= 2 && orientation <= 8) {
int32_t *matrix;
sd = av_frame_new_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9);
if (!sd) {
av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
return AVERROR(ENOMEM);
}
matrix = (int32_t *)sd->data;
switch (orientation) {
case 2:
av_display_rotation_set(matrix, 0.0);
av_display_matrix_flip(matrix, 1, 0);
break;
case 3:
av_display_rotation_set(matrix, 180.0);
break;
case 4:
av_display_rotation_set(matrix, 180.0);
av_display_matrix_flip(matrix, 1, 0);
break;
case 5:
av_display_rotation_set(matrix, 90.0);
av_display_matrix_flip(matrix, 0, 1);
break;
case 6:
av_display_rotation_set(matrix, 90.0);
break;
case 7:
av_display_rotation_set(matrix, -90.0);
av_display_matrix_flip(matrix, 0, 1);
break;
case 8:
av_display_rotation_set(matrix, -90.0);
break;
default:
av_assert0(0);
}
}
}
}
av_dict_copy(&frame->metadata, s->exif_metadata, 0);
av_dict_free(&s->exif_metadata);