mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 06:08:21 +01:00
Add an internal WebPValidatePicture.
Change-Id: Ia01bd3975f7bd0d47eb0a1764807baed16f0d268
This commit is contained in:
parent
6c43219a5f
commit
30453ea4e6
@ -496,7 +496,7 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
|
|||||||
use_iterative_conversion = 0;
|
use_iterative_conversion = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WebPPictureAllocYUVA(picture, width, height)) {
|
if (!WebPPictureAllocYUVA(picture)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (has_alpha) {
|
if (has_alpha) {
|
||||||
@ -677,7 +677,7 @@ int WebPPictureYUVAToARGB(WebPPicture* picture) {
|
|||||||
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||||
}
|
}
|
||||||
// Allocate a new argb buffer (discarding the previous one).
|
// Allocate a new argb buffer (discarding the previous one).
|
||||||
if (!WebPPictureAllocARGB(picture, picture->width, picture->height)) return 0;
|
if (!WebPPictureAllocARGB(picture)) return 0;
|
||||||
picture->use_argb = 1;
|
picture->use_argb = 1;
|
||||||
|
|
||||||
// Convert
|
// Convert
|
||||||
|
@ -45,6 +45,22 @@ int WebPPictureInitInternal(WebPPicture* picture, int version) {
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
int WebPValidatePicture(const WebPPicture* const picture) {
|
||||||
|
if (picture == NULL) return 0;
|
||||||
|
if (picture->width <= 0 || picture->height <= 0) {
|
||||||
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
|
}
|
||||||
|
if (picture->width <= 0 || picture->width / 4 > INT_MAX / 4 ||
|
||||||
|
picture->height <= 0 || picture->height / 4 > INT_MAX / 4) {
|
||||||
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
|
}
|
||||||
|
if (picture->colorspace != WEBP_YUV420 &&
|
||||||
|
picture->colorspace != WEBP_YUV420A) {
|
||||||
|
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void WebPPictureResetBufferARGB(WebPPicture* const picture) {
|
static void WebPPictureResetBufferARGB(WebPPicture* const picture) {
|
||||||
picture->memory_argb_ = NULL;
|
picture->memory_argb_ = NULL;
|
||||||
picture->argb = NULL;
|
picture->argb = NULL;
|
||||||
@ -63,18 +79,17 @@ void WebPPictureResetBuffers(WebPPicture* const picture) {
|
|||||||
WebPPictureResetBufferYUVA(picture);
|
WebPPictureResetBufferYUVA(picture);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height) {
|
int WebPPictureAllocARGB(WebPPicture* const picture) {
|
||||||
void* memory;
|
void* memory;
|
||||||
|
const int width = picture->width;
|
||||||
|
const int height = picture->height;
|
||||||
const uint64_t argb_size = (uint64_t)width * height;
|
const uint64_t argb_size = (uint64_t)width * height;
|
||||||
|
|
||||||
assert(picture != NULL);
|
if (!WebPValidatePicture(picture)) return 0;
|
||||||
|
|
||||||
WebPSafeFree(picture->memory_argb_);
|
WebPSafeFree(picture->memory_argb_);
|
||||||
WebPPictureResetBufferARGB(picture);
|
WebPPictureResetBufferARGB(picture);
|
||||||
|
|
||||||
if (width <= 0 || height <= 0) {
|
|
||||||
return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
|
|
||||||
}
|
|
||||||
// allocate a new buffer.
|
// allocate a new buffer.
|
||||||
memory = WebPSafeMalloc(argb_size + WEBP_ALIGN_CST, sizeof(*picture->argb));
|
memory = WebPSafeMalloc(argb_size + WEBP_ALIGN_CST, sizeof(*picture->argb));
|
||||||
if (memory == NULL) {
|
if (memory == NULL) {
|
||||||
@ -86,10 +101,10 @@ int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
|
int WebPPictureAllocYUVA(WebPPicture* const picture) {
|
||||||
const WebPEncCSP uv_csp =
|
|
||||||
(WebPEncCSP)((int)picture->colorspace & WEBP_CSP_UV_MASK);
|
|
||||||
const int has_alpha = (int)picture->colorspace & WEBP_CSP_ALPHA_BIT;
|
const int has_alpha = (int)picture->colorspace & WEBP_CSP_ALPHA_BIT;
|
||||||
|
const int width = picture->width;
|
||||||
|
const int height = picture->height;
|
||||||
const int y_stride = width;
|
const int y_stride = width;
|
||||||
const int uv_width = (int)(((int64_t)width + 1) >> 1);
|
const int uv_width = (int)(((int64_t)width + 1) >> 1);
|
||||||
const int uv_height = (int)(((int64_t)height + 1) >> 1);
|
const int uv_height = (int)(((int64_t)height + 1) >> 1);
|
||||||
@ -98,15 +113,11 @@ int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
|
|||||||
uint64_t y_size, uv_size, a_size, total_size;
|
uint64_t y_size, uv_size, a_size, total_size;
|
||||||
uint8_t* mem;
|
uint8_t* mem;
|
||||||
|
|
||||||
assert(picture != NULL);
|
if (!WebPValidatePicture(picture)) return 0;
|
||||||
|
|
||||||
WebPSafeFree(picture->memory_);
|
WebPSafeFree(picture->memory_);
|
||||||
WebPPictureResetBufferYUVA(picture);
|
WebPPictureResetBufferYUVA(picture);
|
||||||
|
|
||||||
if (uv_csp != WEBP_YUV420) {
|
|
||||||
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
// alpha
|
// alpha
|
||||||
a_width = has_alpha ? width : 0;
|
a_width = has_alpha ? width : 0;
|
||||||
a_stride = a_width;
|
a_stride = a_width;
|
||||||
@ -152,15 +163,12 @@ int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
|
|||||||
|
|
||||||
int WebPPictureAlloc(WebPPicture* picture) {
|
int WebPPictureAlloc(WebPPicture* picture) {
|
||||||
if (picture != NULL) {
|
if (picture != NULL) {
|
||||||
const int width = picture->width;
|
|
||||||
const int height = picture->height;
|
|
||||||
|
|
||||||
WebPPictureFree(picture); // erase previous buffer
|
WebPPictureFree(picture); // erase previous buffer
|
||||||
|
|
||||||
if (!picture->use_argb) {
|
if (!picture->use_argb) {
|
||||||
return WebPPictureAllocYUVA(picture, width, height);
|
return WebPPictureAllocYUVA(picture);
|
||||||
} else {
|
} else {
|
||||||
return WebPPictureAllocARGB(picture, width, height);
|
return WebPPictureAllocARGB(picture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -491,19 +491,24 @@ int VP8FilterStrengthFromDelta(int sharpness, int delta);
|
|||||||
|
|
||||||
// misc utils for picture_*.c:
|
// misc utils for picture_*.c:
|
||||||
|
|
||||||
|
// Returns true if 'picture' is non-NULL and dimensions/colorspace are within
|
||||||
|
// their valid ranges. If returning false, the 'error_code' in 'picture' is
|
||||||
|
// updated.
|
||||||
|
int WebPValidatePicture(const WebPPicture* picture);
|
||||||
|
|
||||||
// Remove reference to the ARGB/YUVA buffer (doesn't free anything).
|
// Remove reference to the ARGB/YUVA buffer (doesn't free anything).
|
||||||
void WebPPictureResetBuffers(WebPPicture* const picture);
|
void WebPPictureResetBuffers(WebPPicture* const picture);
|
||||||
|
|
||||||
// Allocates ARGB buffer of given dimension (previous one is always free'd).
|
// Allocates ARGB buffer according to set width/height (previous one is
|
||||||
// Preserves the YUV(A) buffer. Returns false in case of error (invalid param,
|
// always free'd). Preserves the YUV(A) buffer. Returns false in case of error
|
||||||
// out-of-memory).
|
// (invalid param, out-of-memory).
|
||||||
int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height);
|
int WebPPictureAllocARGB(WebPPicture* const picture);
|
||||||
|
|
||||||
// Allocates YUVA buffer of given dimension (previous one is always free'd).
|
// Allocates YUVA buffer according to set width/height (previous one is always
|
||||||
// Uses picture->csp to determine whether an alpha buffer is needed.
|
// free'd). Uses picture->csp to determine whether an alpha buffer is needed.
|
||||||
// Preserves the ARGB buffer.
|
// Preserves the ARGB buffer.
|
||||||
// Returns false in case of error (invalid param, out-of-memory).
|
// Returns false in case of error (invalid param, out-of-memory).
|
||||||
int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
|
int WebPPictureAllocYUVA(WebPPicture* const picture);
|
||||||
|
|
||||||
// Replace samples that are fully transparent by 'color' to help compressibility
|
// Replace samples that are fully transparent by 'color' to help compressibility
|
||||||
// (no guarantee, though). Assumes pic->use_argb is true.
|
// (no guarantee, though). Assumes pic->use_argb is true.
|
||||||
|
@ -336,9 +336,7 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
|
|||||||
if (!WebPValidateConfig(config)) {
|
if (!WebPValidateConfig(config)) {
|
||||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
|
||||||
}
|
}
|
||||||
if (pic->width <= 0 || pic->height <= 0) {
|
if (!WebPValidatePicture(pic)) return 0;
|
||||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
|
|
||||||
}
|
|
||||||
if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) {
|
if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) {
|
||||||
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
|
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user