| Index: core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
|
| diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
|
| index 3f71035eb32d3d5b50d532fae5708245e0ba5b25..cf017ca17afbf06d07634617bc98badcced46ec3 100644
|
| --- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
|
| +++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
|
| @@ -165,22 +165,26 @@ static void sycc_to_rgb(int offset,
|
| *out_b = b;
|
| }
|
| static void sycc444_to_rgb(opj_image_t* img) {
|
| + int prec = img->comps[0].prec;
|
| + int offset = 1 << (prec - 1);
|
| + int upb = (1 << prec) - 1;
|
| + OPJ_UINT32 maxw =
|
| + std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w);
|
| + OPJ_UINT32 maxh =
|
| + std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h);
|
| + FX_SAFE_SIZE_T max_size = maxw;
|
| + max_size *= maxh;
|
| + if (!max_size.IsValid())
|
| + return;
|
| +
|
| + const int* y = img->comps[0].data;
|
| + const int* cb = img->comps[1].data;
|
| + const int* cr = img->comps[2].data;
|
| int *d0, *d1, *d2, *r, *g, *b;
|
| - const int *y, *cb, *cr;
|
| - int maxw, maxh, max, i, offset, upb;
|
| - i = (int)img->comps[0].prec;
|
| - offset = 1 << (i - 1);
|
| - upb = (1 << i) - 1;
|
| - maxw = (int)img->comps[0].w;
|
| - maxh = (int)img->comps[0].h;
|
| - max = maxw * maxh;
|
| - y = img->comps[0].data;
|
| - cb = img->comps[1].data;
|
| - cr = img->comps[2].data;
|
| - d0 = r = FX_Alloc(int, (size_t)max);
|
| - d1 = g = FX_Alloc(int, (size_t)max);
|
| - d2 = b = FX_Alloc(int, (size_t)max);
|
| - for (i = 0; i < max; ++i) {
|
| + d0 = r = FX_Alloc(int, max_size.ValueOrDie());
|
| + d1 = g = FX_Alloc(int, max_size.ValueOrDie());
|
| + d2 = b = FX_Alloc(int, max_size.ValueOrDie());
|
| + for (size_t i = 0; i < max_size.ValueOrDie(); ++i) {
|
| sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
|
| ++y;
|
| ++cb;
|
| @@ -197,24 +201,28 @@ static void sycc444_to_rgb(opj_image_t* img) {
|
| img->comps[2].data = d2;
|
| }
|
| static void sycc422_to_rgb(opj_image_t* img) {
|
| + int prec = img->comps[0].prec;
|
| + int offset = 1 << (prec - 1);
|
| + int upb = (1 << prec) - 1;
|
| + OPJ_UINT32 maxw =
|
| + std::min(std::min(img->comps[0].w, img->comps[1].w), img->comps[2].w);
|
| + OPJ_UINT32 maxh =
|
| + std::min(std::min(img->comps[0].h, img->comps[1].h), img->comps[2].h);
|
| + FX_SAFE_SIZE_T max_size = maxw;
|
| + max_size *= maxh;
|
| + if (!max_size.IsValid())
|
| + return;
|
| +
|
| + const int* y = img->comps[0].data;
|
| + const int* cb = img->comps[1].data;
|
| + const int* cr = img->comps[2].data;
|
| int *d0, *d1, *d2, *r, *g, *b;
|
| - const int *y, *cb, *cr;
|
| - int maxw, maxh, max, offset, upb;
|
| - int i, j;
|
| - i = (int)img->comps[0].prec;
|
| - offset = 1 << (i - 1);
|
| - upb = (1 << i) - 1;
|
| - maxw = (int)img->comps[0].w;
|
| - maxh = (int)img->comps[0].h;
|
| - max = maxw * maxh;
|
| - y = img->comps[0].data;
|
| - cb = img->comps[1].data;
|
| - cr = img->comps[2].data;
|
| - d0 = r = FX_Alloc(int, (size_t)max);
|
| - d1 = g = FX_Alloc(int, (size_t)max);
|
| - d2 = b = FX_Alloc(int, (size_t)max);
|
| - for (i = 0; i < maxh; ++i) {
|
| - for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2) {
|
| + d0 = r = FX_Alloc(int, max_size.ValueOrDie());
|
| + d1 = g = FX_Alloc(int, max_size.ValueOrDie());
|
| + d2 = b = FX_Alloc(int, max_size.ValueOrDie());
|
| + for (uint32_t i = 0; i < maxh; ++i) {
|
| + OPJ_UINT32 j;
|
| + for (j = 0; j < (maxw & ~static_cast<OPJ_UINT32>(1)); j += 2) {
|
| sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
|
| ++y;
|
| ++r;
|
| @@ -248,10 +256,6 @@ static void sycc422_to_rgb(opj_image_t* img) {
|
| img->comps[1].h = maxh;
|
| img->comps[2].w = maxw;
|
| img->comps[2].h = maxh;
|
| - img->comps[1].w = (OPJ_UINT32)maxw;
|
| - img->comps[1].h = (OPJ_UINT32)maxh;
|
| - img->comps[2].w = (OPJ_UINT32)maxw;
|
| - img->comps[2].h = (OPJ_UINT32)maxh;
|
| img->comps[1].dx = img->comps[0].dx;
|
| img->comps[2].dx = img->comps[0].dx;
|
| img->comps[1].dy = img->comps[0].dy;
|
|
|