[FFmpeg-devel,v10,06/13] lavc/tiff: Fix edge case with full-length/width tiles

Submitted by velocityra@gmail.com on Aug. 7, 2019, 3:27 p.m.

Details

Message ID 20190807152723.18892-6-velocityra@gmail.com
State New
Headers show

Commit Message

velocityra@gmail.com Aug. 7, 2019, 3:27 p.m.
From: Nick Renieris <velocityra@gmail.com>

In an image [1], the height was equal to the tile length (full-height
tile) and after `height % tile_length` was applied to them with the
current code, it resulted in the operating tile_length to be 0.  This
commit makes this leftover logic only applies if it's necessary.

Signed-off-by: Nick Renieris <velocityra@gmail.com>
---
 libavcodec/tiff.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index b6f626daca..f577639dfa 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -884,10 +884,14 @@  static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame)
     int tile_byte_count_offset, tile_byte_count;
     int tile_count_x, tile_count_y;
     int tile_width, tile_length;
+    int has_width_leftover, has_height_leftover;
     int tile_x = 0, tile_y = 0;
     int pos_x = 0, pos_y = 0;
     int ret;
 
+    has_width_leftover = (s->width % s->tile_width != 0);
+    has_height_leftover = (s->height % s->tile_length != 0);
+
     /* Calculate tile counts (round up) */
     tile_count_x = (s->width + s->tile_width - 1) / s->tile_width;
     tile_count_y = (s->height + s->tile_length - 1) / s->tile_length;
@@ -897,12 +901,12 @@  static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame)
         tile_x = tile_idx % tile_count_x;
         tile_y = tile_idx / tile_count_x;
 
-        if (tile_x == tile_count_x - 1) // If on the right edge
+        if (has_width_leftover && tile_x == tile_count_x - 1) // If on the right-most tile
             tile_width = s->width % s->tile_width;
         else
             tile_width = s->tile_width;
 
-        if (tile_y == tile_count_y - 1) // If on the bottom edge
+        if (has_height_leftover && tile_y == tile_count_y - 1) // If on the bottom-most tile
             tile_length = s->height % s->tile_length;
         else
             tile_length = s->tile_length;