diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2022-01-23 17:53:55 +0100 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2022-01-23 17:54:44 +0100 |
| commit | 1de5fc6c51617f49515ef80708dd074432a27a6a (patch) | |
| tree | 218a72739c1fdb4708ebf581a90ea4492c23cae5 /src/lib | |
| parent | 241e9e8efeb6750ef4202a61b3a436628e4f6d23 (diff) | |
opj_encoder_set_extra_options(): add a GUARD_BITS=value option
and add a -GuardBits option to opj_compress.
The recently-released SMPTE DCP Bv2.1 Application Profile (link below)
says that the number of guard bits in the QCD marker shall be 1 for 2K
content and 2 for 4K content. This change allows the number of guard bits
to be configured, so that users of openjpeg have the control they need to meet the specification.
https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9161348
This is an alternative implementation of https://github.com/uclouvain/openjpeg/pull/1388
that keeps ABI unchanged.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/openjp2/j2k.c | 21 | ||||
| -rw-r--r-- | src/lib/openjp2/j2k.h | 3 | ||||
| -rw-r--r-- | src/lib/openjp2/openjpeg.h | 9 |
3 files changed, 30 insertions, 3 deletions
diff --git a/src/lib/openjp2/j2k.c b/src/lib/openjp2/j2k.c index 220f4b1e..6cb6b8ca 100644 --- a/src/lib/openjp2/j2k.c +++ b/src/lib/openjp2/j2k.c @@ -7654,6 +7654,8 @@ OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k, return OPJ_FALSE; } + p_j2k->m_specific_param.m_encoder.m_nb_comps = image->numcomps; + /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ cp = &(p_j2k->m_cp); @@ -12180,6 +12182,25 @@ OPJ_BOOL opj_j2k_encoder_set_extra_options( "Invalid value for option: %s.\n", *p_option_iter); return OPJ_FALSE; } + } else if (strncmp(*p_option_iter, "GUARD_BITS=", strlen("GUARD_BITS=")) == 0) { + OPJ_UINT32 tileno; + opj_cp_t *cp = cp = &(p_j2k->m_cp); + + int numgbits = atoi(*p_option_iter + strlen("GUARD_BITS=")); + if (numgbits < 0 || numgbits > 7) { + opj_event_msg(p_manager, EVT_ERROR, + "Invalid value for option: %s. Should be in [0,7]\n", *p_option_iter); + return OPJ_FALSE; + } + + for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { + OPJ_UINT32 i; + opj_tcp_t *tcp = &cp->tcps[tileno]; + for (i = 0; i < p_j2k->m_specific_param.m_encoder.m_nb_comps; i++) { + opj_tccp_t *tccp = &tcp->tccps[i]; + tccp->numgbits = (OPJ_UINT32)numgbits; + } + } } else { opj_event_msg(p_manager, EVT_ERROR, "Invalid option: %s.\n", *p_option_iter); diff --git a/src/lib/openjp2/j2k.h b/src/lib/openjp2/j2k.h index 2b08e840..fc17166e 100644 --- a/src/lib/openjp2/j2k.h +++ b/src/lib/openjp2/j2k.h @@ -550,6 +550,9 @@ typedef struct opj_j2k_enc { /* reserved bytes in m_encoded_tile_size for PLT markers */ OPJ_UINT32 m_reserved_bytes_for_PLT; + /** Number of components */ + OPJ_UINT32 m_nb_comps; + } opj_j2k_enc_t; diff --git a/src/lib/openjp2/openjpeg.h b/src/lib/openjp2/openjpeg.h index b200a6ac..c0d6dbcb 100644 --- a/src/lib/openjp2/openjpeg.h +++ b/src/lib/openjp2/openjpeg.h @@ -1599,9 +1599,12 @@ OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, * <li>PLT=YES/NO. Defaults to NO. If set to YES, PLT marker segments, * indicating the length of each packet in the tile-part header, will be * written. Since 2.4.0</li> - * <li>TLM=YES/NO. Defaults to NO (except for Cinema and IMF profiles). - * If set to YES, TLM marker segments, indicating the length of each - * tile-part part will be written. Since 2.4.0</li> + * <li>TLM=YES/NO. Defaults to NO (except for Cinema and IMF profiles). + * If set to YES, TLM marker segments, indicating the length of each + * tile-part part will be written. Since 2.4.0</li> + * <li>GUARD_BITS=value. Number of guard bits in [0,7] range. Default value is 2. + * 1 may be used sometimes (like in SMPTE DCP Bv2.1 Application Profile for 2K images). + * Since 2.5.0</li> * </ul> * * @param p_codec Compressor handle |
