summaryrefslogtreecommitdiff
path: root/src/lib/openjp2/t1.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/t1.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/t1.c')
-rw-r--r--src/lib/openjp2/t1.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/lib/openjp2/t1.c b/src/lib/openjp2/t1.c
index 637778b7..bd615d59 100644
--- a/src/lib/openjp2/t1.c
+++ b/src/lib/openjp2/t1.c
@@ -189,7 +189,10 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
opj_tcd_cblk_dec_t* cblk,
OPJ_UINT32 orient,
OPJ_UINT32 roishift,
- OPJ_UINT32 cblksty);
+ OPJ_UINT32 cblksty,
+ opj_event_mgr_t *p_manager,
+ opj_mutex_t* p_manager_mutex,
+ OPJ_BOOL check_pterm);
static OPJ_BOOL opj_t1_allocate_buffers(opj_t1_t *t1,
OPJ_UINT32 w,
@@ -1608,6 +1611,9 @@ typedef struct {
opj_tcd_tilecomp_t* tilec;
opj_tccp_t* tccp;
volatile OPJ_BOOL* pret;
+ opj_event_mgr_t *p_manager;
+ opj_mutex_t* p_manager_mutex;
+ OPJ_BOOL check_pterm;
} opj_t1_cblk_decode_processing_job_t;
static void opj_t1_destroy_wrapper(void* t1)
@@ -1654,7 +1660,10 @@ static void opj_t1_clbl_decode_processor(void* user_data, opj_tls_t* tls)
cblk,
band->bandno,
(OPJ_UINT32)tccp->roishift,
- tccp->cblksty)) {
+ tccp->cblksty,
+ job->p_manager,
+ job->p_manager_mutex,
+ job->check_pterm)) {
*(job->pret) = OPJ_FALSE;
opj_free(job);
return;
@@ -1730,7 +1739,10 @@ static void opj_t1_clbl_decode_processor(void* user_data, opj_tls_t* tls)
void opj_t1_decode_cblks(opj_thread_pool_t* tp,
volatile OPJ_BOOL* pret,
opj_tcd_tilecomp_t* tilec,
- opj_tccp_t* tccp
+ opj_tccp_t* tccp,
+ opj_event_mgr_t *p_manager,
+ opj_mutex_t* p_manager_mutex,
+ OPJ_BOOL check_pterm
)
{
OPJ_UINT32 resno, bandno, precno, cblkno;
@@ -1760,6 +1772,9 @@ void opj_t1_decode_cblks(opj_thread_pool_t* tp,
job->tilec = tilec;
job->tccp = tccp;
job->pret = pret;
+ job->p_manager_mutex = p_manager_mutex;
+ job->p_manager = p_manager;
+ job->check_pterm = check_pterm;
opj_thread_pool_submit_job(tp, opj_t1_clbl_decode_processor, job);
if (!(*pret)) {
return;
@@ -1777,7 +1792,10 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
opj_tcd_cblk_dec_t* cblk,
OPJ_UINT32 orient,
OPJ_UINT32 roishift,
- OPJ_UINT32 cblksty)
+ OPJ_UINT32 cblksty,
+ opj_event_mgr_t *p_manager,
+ opj_mutex_t* p_manager_mutex,
+ OPJ_BOOL check_pterm)
{
opj_mqc_t *mqc = &(t1->mqc); /* MQC component */
@@ -1858,6 +1876,32 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
opq_mqc_finish_dec(mqc);
}
+ if (check_pterm) {
+ if (mqc->bp + 2 < mqc->end) {
+ if (p_manager_mutex) {
+ opj_mutex_lock(p_manager_mutex);
+ }
+ opj_event_msg(p_manager, EVT_WARNING,
+ "PTERM check failure: %d remaining bytes in code block (%d used / %d)\n",
+ (int)(mqc->end - mqc->bp) - 2,
+ (int)(mqc->bp - mqc->start),
+ (int)(mqc->end - mqc->start));
+ if (p_manager_mutex) {
+ opj_mutex_unlock(p_manager_mutex);
+ }
+ } else if (mqc->end_of_byte_stream_counter > 2) {
+ if (p_manager_mutex) {
+ opj_mutex_lock(p_manager_mutex);
+ }
+ opj_event_msg(p_manager, EVT_WARNING,
+ "PTERM check failure: %d synthetized 0xFF markers read\n",
+ mqc->end_of_byte_stream_counter);
+ if (p_manager_mutex) {
+ opj_mutex_unlock(p_manager_mutex);
+ }
+ }
+ }
+
return OPJ_TRUE;
}