aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2017-05-02 16:27:47 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2017-07-18 11:51:10 +0200
commit4c1aac893c27cba0388e5337552b49f0c75e8178 (patch)
tree7dd661f93bc59ce33c152c383a8ee2141bcc6e22
parentdad54e3c29dc1763b52d516a9d25722c3b4623e7 (diff)
downloadffmpeg-4c1aac893c27cba0388e5337552b49f0c75e8178.tar.gz
lavc/jpeg2000dec: Read the sample aspect ratio from the jp2 resolution box.
-rw-r--r--libavcodec/jpeg2000dec.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index c3d2747675..b67efc76bb 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -26,6 +26,7 @@
*/
#include <inttypes.h>
+#include <math.h>
#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
@@ -106,6 +107,7 @@ typedef struct Jpeg2000DecoderContext {
int tile_width, tile_height;
unsigned numXtiles, numYtiles;
int maxtilelen;
+ AVRational sar;
Jpeg2000CodingStyle codsty[4];
Jpeg2000QuantStyle qntsty[4];
@@ -2058,6 +2060,34 @@ static int jp2_find_codestream(Jpeg2000DecoderContext *s)
if (cn < 4 && asoc < 4)
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);
} 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)
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);