diff options
| author | Antonin Descampe <antonin@descampe.net> | 2017-09-26 18:30:20 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-09-26 18:30:20 -0300 |
| commit | d45ccb048bb2166c5d975f4e1b8acaf8ba3d198d (patch) | |
| tree | bbf4b49da38487923abc0cbf6565cf6504921e36 /src/bin | |
| parent | 3f0de88c7bf4e56826987aa7d3edb5acdd4399f2 (diff) | |
| parent | e17bbde9066600528ab523adee69d9c9c33ba157 (diff) | |
Merge pull request #1022 from rouault/partial_component_decoding
Add capability to decode only a subset of all components of an image.
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/jp2/opj_decompress.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/src/bin/jp2/opj_decompress.c b/src/bin/jp2/opj_decompress.c index 1473319c..8c5a125d 100644 --- a/src/bin/jp2/opj_decompress.c +++ b/src/bin/jp2/opj_decompress.c @@ -152,6 +152,10 @@ typedef struct opj_decompress_params { int num_threads; /* Quiet */ int quiet; + /** number of components to decode */ + OPJ_UINT32 numcomps; + /** indices of components to decode */ + OPJ_UINT32* comps_indices; } opj_decompress_parameters; /* -------------------------------------------------------------------------- */ @@ -227,6 +231,10 @@ static void decode_help_display(void) " If 'C' is specified (default), values are clipped.\n" " If 'S' is specified, values are scaled.\n" " A 0 value can be specified (meaning original bit depth).\n"); + fprintf(stdout, " -c first_comp_index[,second_comp_index][,...]\n" + " OPTIONAL\n" + " To limit the number of components to decoded.\n" + " Component indices are numbered starting at 0.\n"); fprintf(stdout, " -force-rgb\n" " Force output image colorspace to RGB\n" " -upsample\n" @@ -560,7 +568,7 @@ int parse_cmdline_decoder(int argc, char **argv, {"quiet", NO_ARG, NULL, 1}, }; - const char optlist[] = "i:o:r:l:x:d:t:p:" + const char optlist[] = "i:o:r:l:x:d:t:p:c:" /* UniPG>> */ #ifdef USE_JPWL @@ -771,6 +779,25 @@ int parse_cmdline_decoder(int argc, char **argv, } } break; + + /* ----------------------------------------------------- */ + case 'c': { /* Componenets */ + const char* iter = opj_optarg; + while (1) { + parameters->numcomps ++; + parameters->comps_indices = (OPJ_UINT32*) realloc( + parameters->comps_indices, + parameters->numcomps * sizeof(OPJ_UINT32)); + parameters->comps_indices[parameters->numcomps - 1] = + (OPJ_UINT32) atoi(iter); + iter = strchr(iter, ','); + if (iter == NULL) { + break; + } + iter ++; + } + } + break; /* ----------------------------------------------------- */ /* UniPG>> */ @@ -1015,6 +1042,9 @@ static void destroy_parameters(opj_decompress_parameters* parameters) free(parameters->precision); parameters->precision = NULL; } + + free(parameters->comps_indices); + parameters->comps_indices = NULL; } } @@ -1455,6 +1485,21 @@ int main(int argc, char **argv) goto fin; } + if (parameters.numcomps) { + if (! opj_set_decoded_components(l_codec, + parameters.numcomps, + parameters.comps_indices, + OPJ_FALSE)) { + fprintf(stderr, + "ERROR -> opj_decompress: failed to set the component indices!\n"); + opj_destroy_codec(l_codec); + opj_stream_destroy(l_stream); + opj_image_destroy(image); + failed = 1; + goto fin; + } + } + if (getenv("USE_OPJ_SET_DECODED_RESOLUTION_FACTOR") != NULL) { /* For debugging/testing purposes, and also an illustration on how to */ /* use the alternative API opj_set_decoded_resolution_factor() instead */ |
