aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl Eugen Hoyos <cehoyos@ag.or.at>2014-04-07 10:39:55 +0200
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2014-04-07 15:30:48 +0200
commit993a5afaada4596f6b387d0a2a7cf7ca8170f56d (patch)
tree3677582abca2ae9fe509a1e7e4d75e07b4637d3a
parent845414bbb122ca022f72729090378a3a06a81144 (diff)
downloadffmpeg-993a5afaada4596f6b387d0a2a7cf7ca8170f56d.tar.gz
Read aspect ratio from tiff image files.
-rw-r--r--libavcodec/tiff.c21
-rw-r--r--tests/ref/fate/exif-image-tiff2
2 files changed, 21 insertions, 2 deletions
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index cbc526acc5..e0629dbad8 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -58,6 +58,7 @@ typedef struct TiffContext {
int fax_opts;
int predictor;
int fill_order;
+ uint32_t res[4];
int strips, rps, sstype;
int sot;
@@ -566,9 +567,19 @@ static int init_image(TiffContext *s, ThreadFrame *frame)
return 0;
}
+static void set_sar(TiffContext *s, unsigned tag, unsigned num, unsigned den)
+{
+ int offset = tag == TIFF_YRES ? 2 : 0;
+ s->res[offset++] = num;
+ s->res[offset] = den;
+ if (s->res[0] && s->res[1] && s->res[2] && s->res[3])
+ av_reduce(&s->avctx->sample_aspect_ratio.num, &s->avctx->sample_aspect_ratio.den,
+ s->res[2] * (uint64_t)s->res[1], s->res[0] * (uint64_t)s->res[3], INT32_MAX);
+}
+
static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
{
- unsigned tag, type, count, off, value = 0;
+ unsigned tag, type, count, off, value = 0, value2 = 0;
int i, j, k, pos, start;
int ret;
uint32_t *pal;
@@ -587,6 +598,10 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
case TIFF_LONG:
value = ff_tget(&s->gb, type, s->le);
break;
+ case TIFF_RATIONAL:
+ value = ff_tget(&s->gb, TIFF_LONG, s->le);
+ value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
+ break;
case TIFF_STRING:
if (count <= 4) {
break;
@@ -717,6 +732,10 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
return AVERROR_INVALIDDATA;
}
break;
+ case TIFF_XRES:
+ case TIFF_YRES:
+ set_sar(s, tag, value, value2);
+ break;
case TIFF_TILE_BYTE_COUNTS:
case TIFF_TILE_LENGTH:
case TIFF_TILE_OFFSETS:
diff --git a/tests/ref/fate/exif-image-tiff b/tests/ref/fate/exif-image-tiff
index 6ccc48e130..515e3f186d 100644
--- a/tests/ref/fate/exif-image-tiff
+++ b/tests/ref/fate/exif-image-tiff
@@ -14,7 +14,7 @@ pkt_size=67604
width=200
height=112
pix_fmt=rgb24
-sample_aspect_ratio=N/A
+sample_aspect_ratio=1:1
pict_type=?
coded_picture_number=0
display_picture_number=0