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.
|
* MJPEG decoder.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/display.h"
|
||||||
#include "libavutil/imgutils.h"
|
#include "libavutil/imgutils.h"
|
||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/opt.h"
|
#include "libavutil/opt.h"
|
||||||
@ -2406,6 +2407,7 @@ int ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
|
|||||||
int i, index;
|
int i, index;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int is16bit;
|
int is16bit;
|
||||||
|
AVDictionaryEntry *e = NULL;
|
||||||
|
|
||||||
s->force_pal8 = 0;
|
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_copy(&frame->metadata, s->exif_metadata, 0);
|
||||||
av_dict_free(&s->exif_metadata);
|
av_dict_free(&s->exif_metadata);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user