diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2019-08-29 02:17:05 +0300 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2019-08-29 02:26:12 +0300 |
commit | 37a03fc77223a6d60554876fae4596734bbea79b (patch) | |
tree | dbc9b8928d2b2cdd1fb0e65f8e7c0096b0021ca6 | |
parent | 2c1467b4d22259192dfaa55484689e321919518a (diff) |
Check absolute tile positions in sb-to-tile_idx table generation
Otherwise the table can get out of sync when the frame size and tile
count stays the same, but the tile coordinates change. Fixes #266.
-rw-r--r-- | src/decode.c | 12 | ||||
-rw-r--r-- | src/internal.h | 3 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/decode.c b/src/decode.c index 24f1af6..200d42d 100644 --- a/src/decode.c +++ b/src/decode.c @@ -2595,8 +2595,10 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) { f->tile_thread.titsati_sz = titsati_sz; } if (f->tile_thread.titsati_init[0] != f->frame_hdr->tiling.cols || - f->tile_thread.titsati_init[1] != f->sbh || - f->tile_thread.titsati_init[2] != f->frame_hdr->tiling.rows) + f->tile_thread.titsati_init[1] != f->frame_hdr->tiling.rows || + memcmp(f->frame_hdr->tiling.row_start_sb, f->tile_thread.titsati_index_rows, + sizeof(*f->tile_thread.titsati_index_rows) * + (f->frame_hdr->tiling.rows + 1))) { for (int tile_row = 0, tile_idx = 0; tile_row < f->frame_hdr->tiling.rows; tile_row++) @@ -2614,8 +2616,10 @@ int dav1d_decode_frame(Dav1dFrameContext *const f) { } } f->tile_thread.titsati_init[0] = f->frame_hdr->tiling.cols; - f->tile_thread.titsati_init[1] = f->sbh; - f->tile_thread.titsati_init[2] = f->frame_hdr->tiling.rows; + f->tile_thread.titsati_init[1] = f->frame_hdr->tiling.rows; + memcpy(f->tile_thread.titsati_index_rows, f->frame_hdr->tiling.row_start_sb, + sizeof(*f->tile_thread.titsati_index_rows) * + (f->frame_hdr->tiling.rows + 1)); } } diff --git a/src/internal.h b/src/internal.h index ae56504..8ce5b16 100644 --- a/src/internal.h +++ b/src/internal.h @@ -235,7 +235,8 @@ struct Dav1dFrameContext { pthread_cond_t cond, icond; int tasks_left, num_tasks; int (*task_idx_to_sby_and_tile_idx)[2]; - int titsati_sz, titsati_init[3]; + int titsati_sz, titsati_init[2]; + uint16_t titsati_index_rows[1 + DAV1D_MAX_TILE_ROWS]; int inited; } tile_thread; }; |