From 5875a6b44618fb7dfd5cd6d742533eaee2014060 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 3 Oct 2019 11:04:30 +0200 Subject: [PATCH] opj_tcd_mct_decode()/opj_mct_decode()/opj_mct_encode_real()/opj_mct_decode_real(): proper deal with a number of samples larger than 4 billion (refs #1151) --- src/lib/openjp2/mct.c | 6 +++--- src/lib/openjp2/tcd.c | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/lib/openjp2/mct.c b/src/lib/openjp2/mct.c index b79d4b87..08bc8115 100644 --- a/src/lib/openjp2/mct.c +++ b/src/lib/openjp2/mct.c @@ -183,7 +183,7 @@ void opj_mct_decode( OPJ_INT32* OPJ_RESTRICT c2, OPJ_SIZE_T n) { - OPJ_UINT32 i; + OPJ_SIZE_T i; for (i = 0; i < n; ++i) { OPJ_INT32 y = c0[i]; OPJ_INT32 u = c1[i]; @@ -361,7 +361,7 @@ void opj_mct_encode_real( OPJ_INT32* OPJ_RESTRICT c2, OPJ_SIZE_T n) { - OPJ_UINT32 i; + OPJ_SIZE_T i; for (i = 0; i < n; ++i) { OPJ_INT32 r = c0[i]; OPJ_INT32 g = c1[i]; @@ -388,7 +388,7 @@ void opj_mct_decode_real( OPJ_FLOAT32* OPJ_RESTRICT c2, OPJ_SIZE_T n) { - OPJ_UINT32 i; + OPJ_SIZE_T i; #ifdef __SSE__ __m128 vrv, vgu, vgv, vbu; vrv = _mm_set1_ps(1.402f); diff --git a/src/lib/openjp2/tcd.c b/src/lib/openjp2/tcd.c index be3b8436..deecc4df 100644 --- a/src/lib/openjp2/tcd.c +++ b/src/lib/openjp2/tcd.c @@ -2017,7 +2017,8 @@ static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; opj_tcp_t * l_tcp = p_tcd->tcp; opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps; - OPJ_UINT32 l_samples, i; + OPJ_SIZE_T l_samples; + OPJ_UINT32 i; if (l_tcp->mct == 0 || p_tcd->used_component != NULL) { return OPJ_TRUE; @@ -2030,8 +2031,8 @@ static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) /* A bit inefficient: we process more data than needed if */ /* resno_decoded < l_tile_comp->minimum_num_resolutions-1, */ /* but we would need to take into account a stride then */ - l_samples = (OPJ_UINT32)((res_comp0->x1 - res_comp0->x0) * - (res_comp0->y1 - res_comp0->y0)); + l_samples = (OPJ_SIZE_T)(res_comp0->x1 - res_comp0->x0) * + (OPJ_SIZE_T)(res_comp0->y1 - res_comp0->y0); if (l_tile->numcomps >= 3) { if (l_tile_comp->minimum_num_resolutions != l_tile->comps[1].minimum_num_resolutions || @@ -2065,8 +2066,8 @@ static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) opj_tcd_resolution_t* res_comp0 = l_tile->comps[0].resolutions + p_tcd->image->comps[0].resno_decoded; - l_samples = (res_comp0->win_x1 - res_comp0->win_x0) * - (res_comp0->win_y1 - res_comp0->win_y0); + l_samples = (OPJ_SIZE_T)(res_comp0->win_x1 - res_comp0->win_x0) * + (OPJ_SIZE_T)(res_comp0->win_y1 - res_comp0->win_y0); if (l_tile->numcomps >= 3) { opj_tcd_resolution_t* res_comp1 = l_tile->comps[1].resolutions + p_tcd->image->comps[1].resno_decoded; -- 2.30.2