summaryrefslogtreecommitdiff
path: root/src/lib/openjp2/tcd.c
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-07-26 21:39:50 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-07-26 21:43:32 +0200
commit94c4b7300cc515330bf798bb45eb0d68e2c84aa0 (patch)
tree4059448090f1fa81c48d21c7addd5abaab721ea3 /src/lib/openjp2/tcd.c
parent5e795d90a1e47616e0c7a2e39381c13ccf7fd6dd (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.c25
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;
}