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:
parent
42fce6fffe
commit
e93c998602
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user