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/t1.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/t1.c')
| -rw-r--r-- | src/lib/openjp2/t1.c | 52 |
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; } |
