From 3fa595a571c6a12ded7683f155c79c156fce43b4 Mon Sep 17 00:00:00 2001 From: Urvang Joshi Date: Tue, 11 Jun 2013 16:00:58 -0700 Subject: [PATCH] Support decoding upto given row in DECODE_DATA_FUNC This is in preparation for supporting Intertwined decoding of RGB and alpha. Change-Id: Ie1905d1212f4a00718a64dca020be3f4b1b870ec --- src/dec/vp8l.c | 33 ++++++++++++++++++++------------- src/dec/vp8li.h | 3 +++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/dec/vp8l.c b/src/dec/vp8l.c index 1f618e82..cefcf29a 100644 --- a/src/dec/vp8l.c +++ b/src/dec/vp8l.c @@ -685,22 +685,26 @@ static void ProcessRows(VP8LDecoder* const dec, int row) { #define DECODE_DATA_FUNC(FUNC_NAME, TYPE, STORE_PIXEL) \ static int FUNC_NAME(VP8LDecoder* const dec, TYPE* const data, int width, \ - int height, ProcessRowsFunc process_func) { \ + int height, int last_row, \ + ProcessRowsFunc process_func) { \ int ok = 1; \ - int col = 0, row = 0; \ + int row = dec->last_pixel_ / width; \ + int col = dec->last_pixel_ % width; \ VP8LBitReader* const br = &dec->br_; \ VP8LMetadata* const hdr = &dec->hdr_; \ - HTreeGroup* htree_group = hdr->htree_groups_; \ - TYPE* src = data; \ - TYPE* last_cached = data; \ - TYPE* const src_end = data + width * height; \ + HTreeGroup* htree_group = GetHtreeGroupForPos(hdr, col, row); \ + TYPE* src = data + dec->last_pixel_; \ + TYPE* last_cached = src; \ + TYPE* const src_end = data + width * height; /* End of data */ \ + TYPE* const src_last = data + width * last_row; /* Last pixel to decode */ \ const int len_code_limit = NUM_LITERAL_CODES + NUM_LENGTH_CODES; \ const int color_cache_limit = len_code_limit + hdr->color_cache_size_; \ VP8LColorCache* const color_cache = \ (hdr->color_cache_size_ > 0) ? &hdr->color_cache_ : NULL; \ const int mask = hdr->huffman_mask_; \ assert(htree_group != NULL); \ - while (!br->eos_ && src < src_end) { \ + assert(src_last <= src_end); \ + while (!br->eos_ && src < src_last) { \ int code; \ /* Only update when changing tile. Note we could use this test: */ \ /* if "((((prev_col ^ col) | prev_row ^ row)) > mask)" -> tile changed */ \ @@ -788,8 +792,9 @@ End: \ ok = 0; \ dec->status_ = \ (!br->eos_) ? VP8_STATUS_BITSTREAM_ERROR : VP8_STATUS_SUSPENDED; \ - } else if (src == src_end) { \ - dec->state_ = READ_DATA; \ + } else { \ + dec->last_pixel_ = src - data; \ + if (src == src_end) dec->state_ = READ_DATA; \ } \ return ok; \ } @@ -1030,7 +1035,8 @@ static int DecodeImageStream(int xsize, int ysize, } // Use the Huffman trees to decode the LZ77 encoded data. - ok = DecodeImageData(dec, data, transform_xsize, transform_ysize, NULL); + ok = DecodeImageData(dec, data, transform_xsize, transform_ysize, + transform_ysize, NULL); ok = ok && !br->error_; End: @@ -1052,6 +1058,7 @@ static int DecodeImageStream(int xsize, int ysize, assert(data == NULL); assert(is_level0); } + dec->last_pixel_ = 0; // Reset for future DECODE_DATA_FUNC() calls. if (!is_level0) ClearMetadata(hdr); // Clean up temporary data behind. } return ok; @@ -1157,9 +1164,9 @@ int VP8LDecodeAlphaImageStream(int width, int height, const uint8_t* const data, dec->action_ = READ_DATA; ok = (bytes_per_pixel == sizeof(uint8_t)) ? DecodeAlphaData(dec, (uint8_t*)dec->pixels_, dec->width_, dec->height_, - ExtractPalettedAlphaRows) : + dec->height_, ExtractPalettedAlphaRows) : DecodeImageData(dec, dec->pixels_, dec->width_, dec->height_, - ExtractAlphaRows); + dec->height_, ExtractAlphaRows); Err: VP8LDelete(dec); @@ -1226,7 +1233,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) { // Decode. dec->action_ = READ_DATA; if (!DecodeImageData(dec, dec->pixels_, dec->width_, dec->height_, - ProcessRows)) { + dec->height_, ProcessRows)) { goto Err; } diff --git a/src/dec/vp8li.h b/src/dec/vp8li.h index 543a7675..30c8184a 100644 --- a/src/dec/vp8li.h +++ b/src/dec/vp8li.h @@ -74,6 +74,9 @@ typedef struct { int width_; int height_; int last_row_; // last input row decoded so far. + int last_pixel_; // last pixel decoded so far. However, it may + // not be transformed, scaled and + // color-converted yet. int last_out_row_; // last row output so far. VP8LMetadata hdr_;