mirror of
https://github.com/webmproject/libwebp.git
synced 2025-04-19 23:36:45 +02:00
factor out buffer alloc in AllocateARGBBuffers()
+ small opportunistic fixes: * allow NULL decoded_data to be passed to DecodeStream and clarity (with assert()) when to do so * AllocateAndInitRescaler() was already setting error status, as it should. No need to do it at caller's site Change-Id: I30867e596564a7f459a0d1ddbf6f5d312414b7fd
This commit is contained in:
parent
a107dfa806
commit
140b89a323
@ -892,17 +892,46 @@ static int DecodeImageStream(int xsize, int ysize,
|
|||||||
dec->status_ = VP8_STATUS_SUSPENDED;
|
dec->status_ = VP8_STATUS_SUSPENDED;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (decoded_data != NULL) {
|
||||||
*decoded_data = data;
|
*decoded_data = data;
|
||||||
|
} else {
|
||||||
|
// We allocate image data in this function only for transforms. At level 0
|
||||||
|
// (that is: not the transforms), we shouldn't have allocated anything.
|
||||||
|
assert(data == NULL);
|
||||||
|
assert(is_level0);
|
||||||
|
}
|
||||||
if (!is_level0) ClearMetadata(hdr); // Clean up temporary data behind.
|
if (!is_level0) ClearMetadata(hdr); // Clean up temporary data behind.
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Allocate dec->argb_ and dec->argb_cache_ using dec->width_ and dec->height_
|
||||||
|
|
||||||
|
static int AllocateARGBBuffers(VP8LDecoder* const dec, int final_width) {
|
||||||
|
const int num_pixels = dec->width_ * dec->height_;
|
||||||
|
// Scratch buffer corresponding to top-prediction row for transforming the
|
||||||
|
// first row in the row-blocks.
|
||||||
|
const int cache_top_pixels = final_width;
|
||||||
|
// Scratch buffer for temporary BGRA storage.
|
||||||
|
const int cache_pixels = final_width * NUM_ARGB_CACHE_ROWS;
|
||||||
|
const int total_num_pixels = num_pixels + cache_top_pixels + cache_pixels;
|
||||||
|
|
||||||
|
assert(dec->width_ <= final_width);
|
||||||
|
dec->argb_ = (uint32_t*)malloc(total_num_pixels * sizeof(*dec->argb_));
|
||||||
|
if (dec->argb_ == NULL) {
|
||||||
|
dec->argb_cache_ = NULL;
|
||||||
|
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
dec->argb_cache_ = dec->argb_ + num_pixels + cache_top_pixels;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) {
|
int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) {
|
||||||
int width, height;
|
int width, height;
|
||||||
uint32_t* decoded_data = NULL;
|
|
||||||
|
|
||||||
if (dec == NULL) return 0;
|
if (dec == NULL) return 0;
|
||||||
if (io == NULL) {
|
if (io == NULL) {
|
||||||
@ -922,10 +951,7 @@ int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) {
|
|||||||
io->height = height;
|
io->height = height;
|
||||||
|
|
||||||
dec->action_ = READ_HDR;
|
dec->action_ = READ_HDR;
|
||||||
if (!DecodeImageStream(width, height, 1, dec, &decoded_data)) {
|
if (!DecodeImageStream(width, height, 1, dec, NULL)) goto Error;
|
||||||
free(decoded_data);
|
|
||||||
goto Error;
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
Error:
|
Error:
|
||||||
@ -958,27 +984,9 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
|
|||||||
goto Err;
|
goto Err;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (!AllocateARGBBuffers(dec, io->width)) goto Err;
|
||||||
const int num_pixels = dec->width_ * dec->height_;
|
|
||||||
// Scratch buffer corresponding to top-prediction row for transforming the
|
|
||||||
// first row in the row-blocks.
|
|
||||||
const int cache_top_pixels = io->width;
|
|
||||||
// Scratch buffer for temporary BGRA storage.
|
|
||||||
const int cache_pixels = io->width * NUM_ARGB_CACHE_ROWS;
|
|
||||||
const int total_num_pixels =
|
|
||||||
num_pixels + cache_top_pixels + cache_pixels;
|
|
||||||
dec->argb_ = (uint32_t*)malloc(total_num_pixels * sizeof(*dec->argb_));
|
|
||||||
if (dec->argb_ == NULL) {
|
|
||||||
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
|
|
||||||
goto Err;
|
|
||||||
}
|
|
||||||
dec->argb_cache_ = dec->argb_ + num_pixels + cache_top_pixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (io->use_scaling && !AllocateAndInitRescaler(dec, io)) {
|
if (io->use_scaling && !AllocateAndInitRescaler(dec, io)) goto Err;
|
||||||
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
|
|
||||||
goto Err;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode.
|
// Decode.
|
||||||
dec->action_ = READ_DATA;
|
dec->action_ = READ_DATA;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user