Skip to content

Commit

Permalink
avcodec/mjpegdec: export display matrix frame side data when available
Browse files Browse the repository at this point in the history
Finishes fixing ticket #6945.

Signed-off-by: James Almer <jamrial@gmail.com>
  • Loading branch information
jamrial committed Sep 16, 2021
1 parent 42fce6f commit e93c998
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions libavcodec/mjpegdec.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
* MJPEG decoder.
*/

#include "libavutil/display.h"
#include "libavutil/imgutils.h"
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -2864,6 +2866,57 @@ int ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
}
}

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);

Expand Down

0 comments on commit e93c998

Please sign in to comment.