1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

lavc/jpeg2000dec: Read the sample aspect ratio from the jp2 resolution box.

This commit is contained in:
Carl Eugen Hoyos 2017-05-02 16:27:47 +02:00
parent dad54e3c29
commit 4c1aac893c

View File

@ -26,6 +26,7 @@
*/ */
#include <inttypes.h> #include <inttypes.h>
#include <math.h>
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
@ -106,6 +107,7 @@ typedef struct Jpeg2000DecoderContext {
int tile_width, tile_height; int tile_width, tile_height;
unsigned numXtiles, numYtiles; unsigned numXtiles, numYtiles;
int maxtilelen; int maxtilelen;
AVRational sar;
Jpeg2000CodingStyle codsty[4]; Jpeg2000CodingStyle codsty[4];
Jpeg2000QuantStyle qntsty[4]; Jpeg2000QuantStyle qntsty[4];
@ -2058,6 +2060,34 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s)
if (cn < 4 && asoc < 4) if (cn < 4 && asoc < 4)
s->cdef[cn] = asoc; s->cdef[cn] = asoc;
} }
} else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
int64_t vnum, vden, hnum, hden, vexp, hexp;
uint32_t resx;
bytestream2_skip(&s->g, 4);
resx = bytestream2_get_be32u(&s->g);
if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
bytestream2_seek(&s->g, atom2_end, SEEK_SET);
continue;
}
vnum = bytestream2_get_be16u(&s->g);
vden = bytestream2_get_be16u(&s->g);
hnum = bytestream2_get_be16u(&s->g);
hden = bytestream2_get_be16u(&s->g);
vexp = bytestream2_get_byteu(&s->g);
hexp = bytestream2_get_byteu(&s->g);
if (vexp > hexp) {
vexp -= hexp;
hexp = 0;
} else {
hexp -= vexp;
vexp = 0;
}
if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
&& INT64_MAX / (vnum * hden) > pow(10, vexp))
av_reduce(&s->sar.den, &s->sar.num,
hnum * vden * pow(10, hexp),
vnum * hden * pow(10, vexp),
INT32_MAX);
} }
bytestream2_seek(&s->g, atom2_end, SEEK_SET); bytestream2_seek(&s->g, atom2_end, SEEK_SET);
} while (atom_end - atom2_end >= 8); } while (atom_end - atom2_end >= 8);
@ -2140,6 +2170,9 @@ static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8) if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t)); memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
if (s->sar.num && s->sar.den)
avctx->sample_aspect_ratio = s->sar;
s->sar.num = s->sar.den = 0;
return bytestream2_tell(&s->g); return bytestream2_tell(&s->g);