diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2017-07-26 21:39:50 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2017-07-26 21:43:32 +0200 |
| commit | 94c4b7300cc515330bf798bb45eb0d68e2c84aa0 (patch) | |
| tree | 4059448090f1fa81c48d21c7addd5abaab721ea3 /src/lib/openjp2/tcd.c | |
| parent | 5e795d90a1e47616e0c7a2e39381c13ccf7fd6dd (diff) | |
T1 decoder: check code stream errors when predictable termination is enabled and emit a warning when errors are found
Diffstat (limited to 'src/lib/openjp2/tcd.c')
| -rw-r--r-- | src/lib/openjp2/tcd.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/lib/openjp2/tcd.c b/src/lib/openjp2/tcd.c index 3a38ef42..7ae0fa37 100644 --- a/src/lib/openjp2/tcd.c +++ b/src/lib/openjp2/tcd.c @@ -157,7 +157,8 @@ static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd, opj_codestream_index_t *p_cstr_index, opj_event_mgr_t *p_manager); -static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd); +static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, + opj_event_mgr_t *p_manager); static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd); @@ -1421,8 +1422,7 @@ OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *p_tcd, /*------------------TIER1-----------------*/ /* FIXME _ProfStart(PGROUP_T1); */ - if - (! opj_tcd_t1_decode(p_tcd)) { + if (! opj_tcd_t1_decode(p_tcd, p_manager)) { return OPJ_FALSE; } /* FIXME _ProfStop(PGROUP_T1); */ @@ -1681,16 +1681,27 @@ static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd, return OPJ_TRUE; } -static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd) +static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager) { OPJ_UINT32 compno; opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles; opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps; opj_tccp_t * l_tccp = p_tcd->tcp->tccps; volatile OPJ_BOOL ret = OPJ_TRUE; + OPJ_BOOL check_pterm = OPJ_FALSE; + opj_mutex_t* p_manager_mutex = NULL; + + p_manager_mutex = opj_mutex_create(); + + /* Only enable PTERM check if we decode all layers */ + if (p_tcd->tcp->num_layers_to_decode == p_tcd->tcp->numlayers && + (l_tccp->cblksty & J2K_CCP_CBLKSTY_PTERM) != 0) { + check_pterm = OPJ_TRUE; + } for (compno = 0; compno < l_tile->numcomps; ++compno) { - opj_t1_decode_cblks(p_tcd->thread_pool, &ret, l_tile_comp, l_tccp); + opj_t1_decode_cblks(p_tcd->thread_pool, &ret, l_tile_comp, l_tccp, + p_manager, p_manager_mutex, check_pterm); if (!ret) { break; } @@ -1699,7 +1710,9 @@ static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd) } opj_thread_pool_wait_completion(p_tcd->thread_pool, 0); - + if (p_manager_mutex) { + opj_mutex_destroy(p_manager_mutex); + } return ret; } |
