summaryrefslogtreecommitdiff
path: root/openjpeg/src/bin/mj2
diff options
context:
space:
mode:
Diffstat (limited to 'openjpeg/src/bin/mj2')
-rw-r--r--openjpeg/src/bin/mj2/CMakeLists.txt47
-rw-r--r--openjpeg/src/bin/mj2/meta_out.c2858
-rw-r--r--openjpeg/src/bin/mj2/meta_out.h14
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata.c349
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata.dtd425
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata.h9
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata.sln29
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata.vcproj349
-rw-r--r--openjpeg/src/bin/mj2/mj2_to_metadata_Notes.docbin35328 -> 0 bytes
-rw-r--r--openjpeg/src/bin/mj2/opj_mj2_compress.c852
-rw-r--r--openjpeg/src/bin/mj2/opj_mj2_decompress.c258
-rw-r--r--openjpeg/src/bin/mj2/opj_mj2_extract.c162
-rw-r--r--openjpeg/src/bin/mj2/opj_mj2_wrap.c537
-rw-r--r--openjpeg/src/bin/mj2/readme.txt3
14 files changed, 0 insertions, 5892 deletions
diff --git a/openjpeg/src/bin/mj2/CMakeLists.txt b/openjpeg/src/bin/mj2/CMakeLists.txt
deleted file mode 100644
index 5d3e288b6..000000000
--- a/openjpeg/src/bin/mj2/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-# Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2
-
-set(common_SRCS ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c)
-
-if(WIN32)
- if(BUILD_SHARED_LIBS)
- add_definitions(-DOPJ_EXPORTS)
- else()
- add_definitions(-DOPJ_STATIC)
- endif()
-endif()
-
-# Headers file are located here:
-include_directories(
- ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
- ${OPENJPEG_BINARY_DIR}/src/bin/common # opj_apps_config.h
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
- ${OPENJPEG_SOURCE_DIR}/src/bin/common
- ${LCMS_INCLUDE_DIRNAME}
- )
-
-foreach(exe
- opj_mj2_wrap
- opj_mj2_extract
- opj_mj2_decompress
- opj_mj2_compress
-)
- add_definitions(-DOPJ_USE_LEGACY)
- add_executable(${exe}
- ${exe}.c
- ${common_SRCS}
- ${MJ2_SRCS}
- ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c
- )
- set_property(
- TARGET ${exe}
- APPEND PROPERTY COMPILE_DEFINITIONS USE_MJ2
- )
- target_link_libraries(${exe} ${LCMS_LIBNAME} openmj2)
-
- if(UNIX)
- target_link_libraries(${exe} m)
- endif()
-
- install(TARGETS ${exe}
- DESTINATION ${OPENJPEG_INSTALL_BIN_DIR})
-endforeach()
diff --git a/openjpeg/src/bin/mj2/meta_out.c b/openjpeg/src/bin/mj2/meta_out.c
deleted file mode 100644
index 2c0e27377..000000000
--- a/openjpeg/src/bin/mj2/meta_out.c
+++ /dev/null
@@ -1,2858 +0,0 @@
-/* meta_out.c */
-/* Dump MJ2, JP2 metadata (partial so far) to xml file */
-/* Callable from mj2_to_metadata */
-/* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine.
-
-The base code in this file was developed by the author as part of a video archiving
-project for the U.S. National Library of Medicine, Bethesda, MD.
-It is the policy of NLM (and U.S. government) to not assert copyright.
-
-A non-exclusive copy of this code has been contributed to the Open JPEG project.
-Except for copyright, inclusion of the code within Open JPEG for distribution and use
-can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere.
-*/
-
-#include <windows.h> /* for time functions */
-
-#include "opj_includes.h"
-#include "mj2.h"
-
-#include <time.h>
-#include "meta_out.h"
-
-static BOOL notes = TRUE;
-static BOOL sampletables = FALSE;
-static BOOL raw = TRUE;
-static BOOL derived = TRUE;
-
-opj_tcp_t *j2k_default_tcp;
-
-/* Forwards */
-int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, opj_event_mgr_t *event_mgr);
-int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, opj_event_mgr_t *event_mgr);
-
-void uint_to_chars(unsigned int value, char* buf);
-
-void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr);
-void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum);
-void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum);
-void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum);
-void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum);
-
-void UnixTimeToFileTime(time_t t, LPFILETIME pft);
-void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst);
-void xml_time_out(FILE* xmlout, time_t t);
-
-void int16_to_3packedchars(short int value, char* buf);
-
-void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie);
-void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie);
-void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie);
-
-int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample,
- unsigned int snum, opj_event_mgr_t *event_mgr);
-
-void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp);
-void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp);
-void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp,
- int numcomps); /* opj_image_t *img); */
-BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2);
-void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp);
-void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp,
- int numcomps); /* opj_image_t *img); */
-BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2);
-void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp,
- int numcomps);/* opj_image_t *img);*/
-void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp);
-void xml_out_frame_ppm(FILE* xmlout, opj_cp_t *cp);
-void xml_out_frame_ppt(FILE* xmlout, opj_tcp_t *tcp);
-void xml_out_frame_tlm(FILE*
- xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */
-void xml_out_frame_plm(FILE*
- xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */
-void xml_out_frame_plt(FILE* xmlout,
- opj_tcp_t *tcp); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */
-void xml_out_frame_crg(FILE*
- xmlout); /* j2k_default_tcp is passed globally */ /* opt in main; */
-void xml_out_frame_com(FILE* xmlout,
- opj_tcp_t *tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */
-void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s);
-void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len,
- char* s);
-void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct);
-#ifdef NOTYET
-/* Shown with cp, extended, as data structure... but it could be a new different one */
-void xml_out_frame_jp2i(FILE* xmlout,
- opj_cp_t *cp);/* IntellectualProperty 'jp2i' (no restrictions on location) */
-void xml_out_frame_xml(FILE* xmlout,
- opj_cp_t *cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */
-void xml_out_frame_uuid(FILE* xmlout,
- opj_cp_t *cp); /* UUID 'uuid' (top level only) */
-void xml_out_frame_uinf(FILE* xmlout,
- opj_cp_t *cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */
-void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp);
-#endif
-
-
-void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d)
-{
- /* Init file globals */
- notes = n;
- sampletables = t;
- raw = r;
- derived = d;
-}
-
-int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr)
-{
-
- if (stringDTD != NULL) {
- fprintf(xmlout, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
- /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */
- /* typical: SYSTEM mj2_to_metadata.dtd */
- stringDTD[6] =
- '\0'; /* Break into two strings at space, so quotes can be inserted. */
- fprintf(xmlout, "<!DOCTYPE MJ2_File %s \"%s\">\n", stringDTD, stringDTD + 7);
- stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */
- } else {
- fprintf(xmlout, "<?xml version=\"1.0\" standalone=\"yes\"?>\n");
- }
-
- fprintf(xmlout, "<MJ2_File>\n");
- xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr);
- fprintf(xmlout, "</MJ2_File>");
- return 0;
-}
-
-/* ------------- */
-
-int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, opj_event_mgr_t *event_mgr)
-{
- int i;
- char buf[5];
- buf[4] = '\0';
-
- fprintf(xmlout,
- " <JP2 BoxType=\"jP[space][space]\" Signature=\"0x0d0a870a\" />\n");
- // Called after structure initialized by mj2_read_ftyp
- fprintf(xmlout, " <FileType BoxType=\"ftyp\">\n");
- uint_to_chars(movie->brand, buf);
- fprintf(xmlout, " <Brand>%s</Brand>\n",
- buf); /* 4 character; BR */
- fprintf(xmlout, " <MinorVersion>%u</MinorVersion>\n",
- movie->minversion); /* 4 char; MinV */
- fprintf(xmlout, " <CompatibilityList Count=\"%d\">\n", movie->num_cl);
- for (i = movie->num_cl - 1; i > -1;
- i--) { /* read routine stored in reverse order, so let's undo damage */
- uint_to_chars(movie->cl[i], buf);
- fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n",
- buf); /*4 characters, each CLi */
- }
- fprintf(xmlout, " </CompatibilityList>\n");
- fprintf(xmlout, " </FileType>\n");
- xml_write_moov(file, xmlout, movie, sampleframe, event_mgr);
- // To come? <mdat> // This is the container for media data that can also be accessed through track structures,
- // so is redundant, and simply not of interest as metadata
- // <moof> // Allows incremental build up of movie. Probably not in Simple Profile
- xml_write_free_and_skip(xmlout,
- movie); /* NO OP so far */ /* May be a place where user squirrels metadata */
- xml_write_uuid(xmlout,
- movie); /* NO OP so far */ /* May be a place where user squirrels metadata */
- return 0;
-}
-
-/* ------------- */
-
-int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, opj_event_mgr_t *event_mgr)
-{
- unsigned int tnum;
- mj2_tk_t *track;
-
- fprintf(xmlout, " <MovieBox BoxType=\"moov\">\n");
- fprintf(xmlout, " <MovieHeader BoxType=\"mvhd\">\n");
- fprintf(xmlout, " <CreationTime>\n");
- if (raw) {
- fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->creation_time);
- }
- if (notes) {
- fprintf(xmlout,
- " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n");
- }
- /* 2082844800 = seconds between 1/1/04 and 1/1/70 */
- /* There's still a time zone offset problem not solved... but spec is ambiguous as to whether stored time
- should be local or UTC */
- if (derived) {
- fprintf(xmlout, " <AsLocalTime>");
- xml_time_out(xmlout, movie->creation_time - 2082844800);
- fprintf(xmlout, "</AsLocalTime>\n");
- }
- fprintf(xmlout, " </CreationTime>\n");
- fprintf(xmlout, " <ModificationTime>\n");
- if (raw) {
- fprintf(xmlout, " <InSeconds>%u</InSeconds>\n",
- movie->modification_time);
- }
- if (derived) {
- fprintf(xmlout, " <AsLocalTime>");
- xml_time_out(xmlout, movie->modification_time - 2082844800);
- fprintf(xmlout, "</AsLocalTime>\n");
- }
- fprintf(xmlout, " </ModificationTime>\n");
- fprintf(xmlout, " <Timescale>%d</Timescale>\n", movie->timescale);
- if (notes) {
- fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n");
- }
- fprintf(xmlout,
- " <Rate>\n"); /* Rate to play presentation (default = 0x00010000) */
- if (notes) {
- fprintf(xmlout,
- " <!-- Rate to play presentation is stored as fixed-point binary 16.16 value. Decimal value is approximation. -->\n");
- fprintf(xmlout,
- " <!-- Rate is expressed relative to normal (default) value of 0x00010000 (1.0) -->\n");
- }
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", movie->rate);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n",
- (double)movie->rate / (double)0x00010000);
- }
- fprintf(xmlout, " </Rate>\n");
- fprintf(xmlout, " <Duration>\n");
- if (raw) {
- fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", movie->duration);
- }
- if (derived) {
- fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n",
- (double)movie->duration / (double)
- movie->timescale); // Make this double later to get fractional seconds
- }
- fprintf(xmlout, " </Duration>\n");
-#ifdef CURRENTSTRUCT
- movie->volume = movie->volume << 8;
-#endif
- fprintf(xmlout, " <Volume>\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n");
- fprintf(xmlout,
- " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n");
- }
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", movie->volume);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n",
- (double)movie->volume / (double)0x0100);
- }
- fprintf(xmlout, " </Volume>\n");
-#ifdef CURRENTSTRUCT
- if (notes) {
- fprintf(xmlout,
- " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n");
- }
- movie->volume = movie->volume >> 8;
-#endif
- /* Transformation matrix for video */
- fprintf(xmlout, " <TransformationMatrix>\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 -->\n");
- fprintf(xmlout,
- " <!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) -->\n");
- fprintf(xmlout,
- " <!-- Stored as Fixed Point Hex: all are binary 16.16, except u,v,w are 2.30 -->\n");
- fprintf(xmlout,
- " <!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 -->\n");
- }
- fprintf(xmlout, " <TMa>0x%08x</TMa>\n", movie->trans_matrix[0]);
- fprintf(xmlout, " <TMb>0x%08x</TMb>\n", movie->trans_matrix[1]);
- fprintf(xmlout, " <TMu>0x%08x</TMu>\n", movie->trans_matrix[2]);
- fprintf(xmlout, " <TMc>0x%08x</TMc>\n", movie->trans_matrix[3]);
- fprintf(xmlout, " <TMd>0x%08x</TMd>\n", movie->trans_matrix[4]);
- fprintf(xmlout, " <TMv>0x%08x</TMv>\n", movie->trans_matrix[5]);
- fprintf(xmlout, " <TMx>0x%08x</TMx>\n", movie->trans_matrix[6]);
- fprintf(xmlout, " <TMy>0x%08x</TMy>\n", movie->trans_matrix[7]);
- fprintf(xmlout, " <TMw>0x%08x</TMw>\n", movie->trans_matrix[8]);
- fprintf(xmlout, " </TransformationMatrix>\n");
- fprintf(xmlout, " </MovieHeader>\n");
-
- fprintf(xmlout, " <Statistics>\n");
- fprintf(xmlout, " <TracksFound>\n");
- fprintf(xmlout, " <Video>%d</Video>\n", movie->num_vtk);
- fprintf(xmlout, " <Audio>%d</Audio>\n", movie->num_stk);
- fprintf(xmlout, " <Hint>%d</Hint>\n", movie->num_htk);
- if (notes) {
- fprintf(xmlout,
- " <!-- Hint tracks for streaming video are not part of MJ2, but are a defined extension. -->\n");
- }
- /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */
- fprintf(xmlout, " </TracksFound>\n");
- fprintf(xmlout, " </Statistics>\n");
- /* Idea for the future: It would be possible to add code to verify that the file values:
- 1) are legal and self-consistent
- 2) comply with particular JP2 and/or MJ2 profiles.
- This could be reported here as additional XML elements */
-
- // Find first video track
- tnum = 0;
- while (movie->tk[tnum].track_type != 0) {
- tnum ++;
- }
-
- track = &(movie->tk[tnum]);
- // For now, output info on first video track
- xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr);
-
- // to come: <MovieExtends mvek> // possibly not in Simple Profile
- xml_write_moov_udta(xmlout,
- movie); /* NO OP so far */ /* <UserDataBox udta> contains <CopyrightBox cprt> */
- fprintf(xmlout, " </MovieBox>\n");
- return 0;
-}
-
-/* --------------- */
-
-void uint_to_chars(unsigned int value, char* buf)
-{
- /* buf is at least char[5] */
- int i;
- for (i = 3; i >= 0; i--) {
- buf[i] = (value & 0x000000ff);
- value = (value >> 8);
- }
- buf[4] = '\0'; /* Precautionary */
-}
-
-/* ------------- */
-
-/* WINDOWS SPECIFIC */
-
-void UnixTimeToFileTime(time_t t, LPFILETIME pft)
-{
- /* Windows specific. From MS Q167296 */
- /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */
- /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */
- LONGLONG ll; /* LONGLONG is a 64-bit value. */
- ll = Int32x32To64(t, 10000000) + 116444736000000000;
- pft->dwLowDateTime = (DWORD)ll;
- /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */
- pft->dwHighDateTime = (DWORD)(ll >> 32);
-}
-// Once the UNIX time is converted to a FILETIME structure,
-// other Win32 time formats can be easily obtained by using Win32 functions such
-// as FileTimeToSystemTime() and FileTimeToDosDateTime().
-
-/* ------------- */
-
-void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst)
-{
- /* Windows specific */
- FILETIME ft;
- UnixTimeToFileTime(t, &ft);
- FileTimeToLocalFileTime(&ft, &ft); /* Adjust from UTC to local time zone */
- FileTimeToSystemTime(&ft, pst);
-}
-
-/* ------------- */
-
-void xml_time_out(FILE* xmlout, time_t t)
-{
- /* Windows specific */
- SYSTEMTIME st;
- char szLocalDate[255], szLocalTime[255];
- UnixTimeToSystemTime(t, &st);
- GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255);
- GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255);
- fprintf(xmlout, "%s %s", szLocalDate, szLocalTime);
-}
-
-/* END WINDOWS SPECIFIC */
-
-/* ------------- */
-
-void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie)
-{
- /* Compare with xml_write_udta */
-#ifdef NOTYET
- /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak)
- can contain multiple Copyright 'cprt' with different language codes */
- /* There may be nested non-standard boxes within udta */
- IMAGINE movie->udta, movie->copyright_count,
- movie->copyright_language[i](array of 16bit ints),
- movie->copyright_notice[i](array of buffers)
- PROBABLY ALSO NEED movie->udta_len or special handler for non - standard boxes
- char buf[5];
- int i;
-
- if (movie->udta != 1) {
- return; /* Not present */
- }
-
- fprintf(xmlout, " <UserData BoxType=\"udta\">\n");
- for (i = 0; i < movie->copyright_count; i++) {
- fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n",
- i + 1);
- int16_to_3packedchars((short int)movie->copyright_languages[i], buf);
- fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */
- fprintf(xmlout, " <Notice>%s</Notice>\n", movie->copyright_notices[i]);
- fprintf(xmlout, " </Copyright>\n", i + 1);
- }
- /* TO DO: Non-standard boxes */
- fprintf(xmlout, " </UserData>\n");
-#endif
-}
-
-void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie)
-{
-#ifdef NOTYET
- /* NO-OP so far. There can be zero or more instances of free and/or skip
- at the top level of the file. This may be a place where the user squirrel's metadata.
- Let's assume unstructured, and do a dump */
- IMAGINE movie->free_and_skip, movie->free_and_skip_count,
- movie->free_and_skip_content[i](array of buffers),
- movie->free_and_skip_len[i](array of ints), movie->is_skip[i](array of BOOL)
- int i;
-
- if (movie->free_and_skip != 1) {
- return; /* Not present */
- }
-
- for (i = 0; i < movie->free_and_skip_count; i++) {
- if (movie->is_skip[i]) {
- fprintf(xmlout, " <Skip BoxType=\"skip\">\n");
- } else {
- fprintf(xmlout, " <Free BoxType=\"free\">\n");
- }
-
- xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i],
- movie->free_and_skip_len[i]);
-
- if (movie->is_skip[i]) {
- fprintf(xmlout, " </Skip>\n");
- } else {
- fprintf(xmlout, " </Free>\n");
- }
- }
-#endif
-}
-
-void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie)
-{
- /* Universal Unique IDs of 16 bytes. */
-#ifdef NOTYET
- /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file.
- This function supports the top level of the file, but uuid may be elsewhere [not yet supported].
- This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */
- IMAGINE movie->uuid, movie->uuid_count,
- movie->uuid_content[i](array of buffers),
- movie->uuid_len[i](array of ints),
- movie->uuid_type[i](array of 17 - byte(16 + null termination) buffers)
- int i;
-
- if (movie->uuid != 1) {
- return; /* Not present */
- }
-
- for (i = 0; i < movie->uuid_count; i++) {
- fprintf(xmlout, " <PrivateExtension BoxType=\"uuid\" UUID=\"%s\">\n",
- movie->uuid_type[i]);
- // See Part III section 5.2.1, 6.1, 6.2
- xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]);
- fprintf(xmlout, " </PrivateExtension>\n");
- }
-#endif
-}
-
-/* ------------- */
-
-void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr)
-{
- fprintf(xmlout, " <Track BoxType=\"trak\" Instance=\"%d\">\n", tnum);
- xml_write_tkhd(file, xmlout, track, tnum);
- // TO DO: TrackReferenceContainer 'tref' just used in hint track
- // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate
- xml_write_mdia(file, xmlout, track, tnum);
- xml_write_udta(file, xmlout, track,
- tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt'
-
- if (track->track_type == 0) { /* Only do for visual track */
- /* sampleframe is from user option -f. 1 = first frame */
- /* sampleframe of 0 is a user requests: no jp2 header */
- /* Treat out-of-bounds values in the same way */
- if (sampleframe > 0 && sampleframe <= track->num_samples) {
- mj2_sample_t *sample;
- unsigned int snum;
-
- snum = sampleframe - 1;
- // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){
- // fprintf(stdout,"Frame %d: ",snum+1);
- sample = &track->sample[snum];
- if (xml_out_frame(file, xmlout, sample, snum, event_mgr)) {
- return; /* Not great error handling here */
- }
- }
- }
- fprintf(xmlout, " </Track>\n");
-}
-
-/* ------------- */
-
-void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum)
-{
- fprintf(xmlout, " <TrackHeader BoxType=\"tkhd\">\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Not shown here: CreationTime, ModificationTime, Duration. -->\n");
- fprintf(xmlout,
- " <!-- These 3 fields are reported under MediaHeader below. When reading these 3, -->\n");
- fprintf(xmlout,
- " <!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. -->\n");
- fprintf(xmlout,
- " <!-- If both found, value read from MediaHeader is used. -->\n");
- }
- fprintf(xmlout, " <TrackID>%u</TrackID>\n", track->track_ID);
- if (track->track_type == 0) { /* For visual track */
- fprintf(xmlout, " <TrackLayer>%d</TrackLayer>\n", track->layer);
- if (notes) {
- fprintf(xmlout,
- " <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. -->\n");
- }
- }
- if (track->track_type != 0) { /* volume irrelevant for visual track */
-#ifdef CURRENTSTRUCT
- track->volume = track->volume << 8;
-#endif
- fprintf(xmlout, " <Volume>\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Track audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n");
- fprintf(xmlout,
- " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n");
- }
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", track->volume);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n",
- (double)track->volume / (double)0x0100);
- }
- fprintf(xmlout, " </Volume>\n");
-#ifdef CURRENTSTRUCT
- if (notes) {
- fprintf(xmlout,
- " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n");
- }
- track->volume = track->volume >> 8;
-#endif
- }
- if (track->track_type == 0) {
- /* Transformation matrix for video */
- fprintf(xmlout, " <TransformationMatrix>\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Comments about matrix in MovieHeader apply here as well. -->\n");
- fprintf(xmlout,
- " <!-- This matrix is applied before MovieHeader one. -->\n");
- }
- fprintf(xmlout, " <TMa>0x%08x</TMa>\n", track->trans_matrix[0]);
- fprintf(xmlout, " <TMb>0x%08x</TMb>\n", track->trans_matrix[1]);
- fprintf(xmlout, " <TMu>0x%08x</TMu>\n", track->trans_matrix[2]);
- fprintf(xmlout, " <TMc>0x%08x</TMc>\n", track->trans_matrix[3]);
- fprintf(xmlout, " <TMd>0x%08x</TMd>\n", track->trans_matrix[4]);
- fprintf(xmlout, " <TMv>0x%08x</TMv>\n", track->trans_matrix[5]);
- fprintf(xmlout, " <TMx>0x%08x</TMx>\n", track->trans_matrix[6]);
- fprintf(xmlout, " <TMy>0x%08x</TMy>\n", track->trans_matrix[7]);
- fprintf(xmlout, " <TMw>0x%08x</TMw>\n", track->trans_matrix[8]);
- fprintf(xmlout, " </TransformationMatrix>\n");
- }
-#ifdef CURRENTSTRUCT
- track->w = track->w << 16;
- track->h = track->h << 16;
-#endif
- if (notes) {
- fprintf(xmlout,
- " <!-- Width and Height in pixels are for the presentation; frames will be scaled to this. -->\n");
- fprintf(xmlout,
- " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n");
- }
- fprintf(xmlout, " <Width>\n");
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->w);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n",
- (double)track->w / (double)
- 0x00010000); /* Rate to play presentation (default = 0x00010000) */
- }
- fprintf(xmlout, " </Width>\n");
- fprintf(xmlout, " <Height>\n");
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->h);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n",
- (double)track->h / (double)
- 0x00010000); /* Rate to play presentation (default = 0x00010000) */
- }
- fprintf(xmlout, " </Height>\n");
-#ifdef CURRENTSTRUCT
- if (notes) {
- fprintf(xmlout,
- " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n");
- fprintf(xmlout,
- " <!-- Also, width and height values shown here will actually be those read from track's <VisualSampleEntry> if given. -->\n");
- }
- track->w = track->w >> 16;
- track->h = track->h >> 16;
-#endif
- fprintf(xmlout, " </TrackHeader>\n");
-}
-
-/* ------------- */
-
-void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum)
-{
- /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak)
- can contain multiple Copyright 'cprt' with different language codes */
- /* There may be nested non-standard boxes within udta */
-#ifdef NOTYET
- IMAGINE track->udta, track->copyright_count,
- track->copyright_language[i](array of 16bit ints),
- track->copyright_notice[i](array of buffers)
- PROBABLY ALSO NEED track->udta_len or special handler for non - standard boxes
- char buf[5];
- int i;
-
- if (track->udta != 1) {
- return; /* Not present */
- }
-
- fprintf(xmlout, " <UserData BoxType=\"udta\">\n");
- for (i = 0; i < track->copyright_count; i++) {
- fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n",
- i + 1);
- int16_to_3packedchars((short int)track->copyright_languages[i], buf);
- fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */
- fprintf(xmlout, " <Notice>%s</Notice>\n",
- track->copyright_notices[i]);
- fprintf(xmlout, " </Copyright>\n", i + 1);
- }
- /* TO DO: Non-standard boxes */
- fprintf(xmlout, " </UserData>\n");
-#endif
-}
-
-/* ------------- */
-
-void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum)
-{
- char buf[5];
- int i, k;
- buf[4] = '\0';
-
- fprintf(xmlout, " <Media BoxType=\"mdia\">\n");
- fprintf(xmlout, " <MediaHeader BoxType=\"mdhd\">\n");
- fprintf(xmlout, " <CreationTime>\n");
- if (raw) {
- fprintf(xmlout, " <InSeconds>%u</InSeconds>\n",
- track->creation_time);
- }
- if (notes) {
- fprintf(xmlout,
- " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n");
- }
- /* 2082844800 = seconds between 1/1/04 and 1/1/70 */
- /* There's still a time zone offset problem not solved... but spec is ambiguous as to whether stored time
- should be local or UTC */
- if (derived) {
- fprintf(xmlout, " <AsLocalTime>");
- xml_time_out(xmlout, track->creation_time - 2082844800);
- fprintf(xmlout, "</AsLocalTime>\n");
- }
- fprintf(xmlout, " </CreationTime>\n");
- fprintf(xmlout, " <ModificationTime>\n");
- if (raw) {
- fprintf(xmlout, " <InSeconds>%u</InSeconds>\n",
- track->modification_time);
- }
- if (derived) {
- fprintf(xmlout, " <AsLocalTime>");
- xml_time_out(xmlout, track->modification_time - 2082844800);
- fprintf(xmlout, "</AsLocalTime>\n");
- }
- fprintf(xmlout, " </ModificationTime>\n");
- fprintf(xmlout, " <Timescale>%d</Timescale>\n", track->timescale);
- if (notes) {
- fprintf(xmlout,
- " <!-- Timescale defines time units in one second -->\n");
- }
- fprintf(xmlout, " <Duration>\n");
- if (raw) {
- fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n",
- track->duration);
- }
- if (derived) {
- fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n",
- (double)track->duration / (double)
- track->timescale); // Make this double later to get fractional seconds
- }
- fprintf(xmlout, " </Duration>\n");
- int16_to_3packedchars((short int)track->language, buf);
- fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */
- fprintf(xmlout, " </MediaHeader>\n");
- fprintf(xmlout, " <HandlerReference BoxType=\"hdlr\">\n");
- switch (track->track_type) {
- case 0:
- fprintf(xmlout,
- " <HandlerType Code=\"vide\">video media track</HandlerType>\n");
- break;
- case 1:
- fprintf(xmlout, " <HandlerType Code=\"soun\">Sound</HandlerType>\n");
- break;
- case 2:
- fprintf(xmlout, " <HandlerType Code=\"hint\">Hint</HandlerType>\n");
- break;
- }
- if (notes) {
- fprintf(xmlout,
- " <!-- String value shown is not actually read from file. -->\n");
- fprintf(xmlout,
- " <!-- Shown value is one used for our encode. -->\n");
- }
- fprintf(xmlout, " </HandlerReference>\n");
- fprintf(xmlout, " <MediaInfoContainer BoxType=\"minf\">\n");
- switch (track->track_type) {
- case 0:
- fprintf(xmlout, " <VideoMediaHeader BoxType=\"vmhd\">\n");
- fprintf(xmlout, " <GraphicsMode>0x%02x</GraphicsMode>\n",
- track->graphicsmode);
- if (notes) {
- fprintf(xmlout, " <!-- Enumerated values of graphics mode: -->\n");
- fprintf(xmlout, " <!-- 0x00 = copy (over existing image); -->\n");
- fprintf(xmlout,
- " <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; -->\n");
- fprintf(xmlout,
- " <!-- 0x100 = alpha; alpha-blend this image -->\n");
- /* fprintf(xmlout," <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; -->\n"); This was evidently dropped upon amendment */
- fprintf(xmlout,
- " <!-- 0x102 = pre-multiplied black alpha; image has been already been alpha-blended with black. -->\n");
- fprintf(xmlout,
- " <!-- 0x110 = component alpha; blend alpha channel(s) and color channels individually. -->\n");
- }
- fprintf(xmlout, " <Opcolor>\n");
- fprintf(xmlout, " <Red>0x%02x</Red>\n", track->opcolor[0]);
- fprintf(xmlout, " <Green>0x%02x</Green>\n", track->opcolor[1]);
- fprintf(xmlout, " <Blue>0x%02x</Blue>\n", track->opcolor[2]);
- fprintf(xmlout, " </Opcolor>\n");
- fprintf(xmlout, " </VideoMediaHeader>\n");
- break;
- case 1:
- fprintf(xmlout, " <SoundMediaHeader BoxType=\"smhd\">\n");
-#ifdef CURRENTSTRUCT
- track->balance = track->balance << 8;
-#endif
- fprintf(xmlout, " <Balance>\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Track audio balance fixes mono track in stereo space. -->\n");
- fprintf(xmlout,
- " <!-- Stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n");
- fprintf(xmlout,
- " <!-- 0.0 = center, -1.0 = full left, 1.0 = full right -->\n");
- }
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", track->balance);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n",
- (double)track->balance / (double)0x0100);
- }
- fprintf(xmlout, " </Balance>\n");
-#ifdef CURRENTSTRUCT
- if (notes) {
- fprintf(xmlout,
- " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n");
- }
- track->balance = track->balance >> 8;
-#endif
- fprintf(xmlout, " </SoundMediaHeader>\n");
- break;
- case 2:
- fprintf(xmlout, " <HintMediaHeader BoxType=\"hmhd\">\n");
- fprintf(xmlout, " <MaxPDU_Size>%d</MaxPDU_Size>\n",
- track->maxPDUsize);
- if (notes) {
- fprintf(xmlout,
- " <!-- Size in bytes of largest PDU in this hint stream. -->\n");
- }
- fprintf(xmlout, " <AvgPDU_Size>%d</AvgPDU_Size>\n",
- track->avgPDUsize);
- if (notes) {
- fprintf(xmlout,
- " <!-- Average size in bytes of a PDU over the entire presentation. -->\n");
- }
- fprintf(xmlout, " <MaxBitRate>%d</MaxBitRate>\n",
- track->maxbitrate);
- if (notes) {
- fprintf(xmlout,
- " <!-- Maximum rate in bits per second over any window of 1 second. -->\n");
- }
- fprintf(xmlout, " <AvgBitRate>%d</AvgBitRate>\n",
- track->avgbitrate);
- if (notes) {
- fprintf(xmlout,
- " <!-- Averate rate in bits per second over the entire presentation. -->\n");
- }
- fprintf(xmlout, " <SlidingAvgBit>%d</SlidingAvgBitRate>\n",
- track->slidingavgbitrate);
- if (notes) {
- fprintf(xmlout,
- " <!-- Maximum rate in bits per second over any window of one minute. -->\n");
- }
- fprintf(xmlout, " </HintMediaHeader>\n");
- break;
- }
- fprintf(xmlout, " <DataInfo BoxType=\"dinf\">\n");
- fprintf(xmlout,
- " <DataReference BoxType=\"dref\" URL_Count=\"%d\" URN_Count=\"%d\">\n",
- track->num_url, track->num_urn); // table w. flags, URLs, URNs
- // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs.
- // We could infer those, but for now just present everything as a DREF table.
- if (notes) {
- fprintf(xmlout,
- " <!-- No entries here mean that file is self-contained, as required by Simple Profile. -->\n");
- }
- for (k = 0; k < track->num_url; k++) {
- fprintf(xmlout,
- " <DataEntryUrlBox BoxType=\"url[space]\">\n"); // table w. flags, URLs, URNs
- if (notes) {
- fprintf(xmlout,
- " <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. -->\n");
- }
- for (i = 0; i < 4; i++) {
- uint_to_chars(track->url[track->num_url].location[i], buf);
- fprintf(xmlout, " <Location>%s</Location>\n");
- }
- fprintf(xmlout,
- " </DataEntryUrlBox>\n"); // table w. flags, URLs, URNs
- }
- for (k = 0; k < track->num_urn; k++) {
- fprintf(xmlout,
- " <DataEntryUrnBox BoxType=\"urn[space]\">\n"); // table w. flags, URLs, URNs
- // Only the first 16 bytes are recorded in the data structure currently.
- if (notes) {
- fprintf(xmlout,
- " <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. -->\n");
- }
- fprintf(xmlout, " <Name>");
- for (i = 0; i < 4; i++) {
- uint_to_chars(track->urn[track->num_urn].name[i], buf);
- fprintf(xmlout, "%s", buf);
- }
- fprintf(xmlout, "</Name>\n");
- fprintf(xmlout, " <Location>");
- for (i = 0; i < 4; i++) {
- uint_to_chars(track->urn[track->num_urn].location[i], buf);
- fprintf(xmlout, "%s");
- }
- fprintf(xmlout, "</Location>\n");
- fprintf(xmlout, " </DataEntryUrnBox>\n");
- }
- fprintf(xmlout, " </DataReference>\n");
- fprintf(xmlout, " </DataInfo>\n");
-
- xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */
-
- fprintf(xmlout, " </MediaInfoContainer>\n");
- fprintf(xmlout, " </Media>\n");
-}
-
-/* ------------- */
-
-void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track,
- unsigned int tnum)
-{
- char buf[5], buf33[33];
- int i, len;
- buf[4] = '\0';
-
- fprintf(xmlout, " <SampleTable BoxType=\"stbl\">\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- What follows are specific instances of generic SampleDescription BoxType=\"stsd\" -->\n");
- }
- switch (track->track_type) {
- case 0:
- // There could be multiple instances of this, but "entry_count" is just a local at read-time.
- // And it's used wrong, too, as count of just visual type, when it's really all 3 types.
- // This is referred to as "smj2" within mj2.c
- fprintf(xmlout, " <VisualSampleEntry BoxType=\"mjp2\">\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- If multiple instances of this box, only first is shown here. -->\n");
- fprintf(xmlout,
- " <!-- Width and Height are in pixels. Unlike the Track Header, there is no fractional part. -->\n");
- fprintf(xmlout,
- " <!-- In mj2_to_metadata implementation, the values are not represented separately from Track Header's values. -->\n");
- }
- /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */
- fprintf(xmlout, " <WidthAsInteger>%d</WidthAsInteger>\n",
- track->w);
- fprintf(xmlout, " <HeightAsInteger>%d</HeightAsInteger>\n",
- track->h);
-// Horizresolution and vertresolution don't require shifting, already stored right in CURRENTSTRUCT
- if (notes) {
- fprintf(xmlout,
- " <!-- Resolutions are in pixels per inch, for the highest-resolution component (typically luminance). -->\n");
- fprintf(xmlout,
- " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n");
- fprintf(xmlout,
- " <!-- Typical value for both resolutions is 0x00480000 (72.0) -->\n");
- }
- fprintf(xmlout, " <HorizontalRes>\n");
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n",
- track->horizresolution);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n",
- (double)track->horizresolution / (double)
- 0x00010000); /* Rate to play presentation (default = 0x00010000) */
- }
- fprintf(xmlout, " </HorizontalRes>\n");
- fprintf(xmlout, " <VerticalRes>\n");
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n",
- track->vertresolution);
- }
- if (derived) {
- fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n",
- (double)track->vertresolution / (double)
- 0x00010000); /* Rate to play presentation (default = 0x00010000) */
- }
- fprintf(xmlout, " </VerticalRes>\n");
-
- buf33[0] = '\0';
- for (i = 0; i < 8; i++) {
- uint_to_chars((unsigned int)track->compressorname[i], buf);
- strcat(buf33,
- buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */
- }
- len = (int)
- buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */
- buf33[len + 1] = '\0'; /* Suppress it */
- fprintf(xmlout, " <CompressorName>%s</CompressorName>\n",
- buf33 + 1); /* Start beyond first byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. -->\n");
- fprintf(xmlout,
- " <!-- Usually blank or \"Motion JPEG2000\" -->\n");
- }
- fprintf(xmlout, " <Depth>0x%02x</Depth>\n", track->depth);
- if (notes) {
- fprintf(xmlout, " <!-- Depth is: -->\n");
- fprintf(xmlout,
- " <!-- 0x20: alpha channels present (color or grayscale) -->\n");
- fprintf(xmlout, " <!-- 0x28: grayscale without alpha -->\n");
- fprintf(xmlout, " <!-- 0x18: color without alpha -->\n");
- }
-
- xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */
-
- /* Following subboxes are optional */
- fprintf(xmlout, " <FieldCoding BoxType=\"fiel\">\n");
- fprintf(xmlout, " <FieldCount>%d</FieldCount>\n",
- (unsigned int)track->fieldcount); /* uchar as 1 byte uint */
- if (notes) {
- fprintf(xmlout, " <!-- Must be either 1 or 2 -->\n");
- }
- fprintf(xmlout, " <FieldOrder>%d</FieldOrder>\n",
- (unsigned int)track->fieldorder); /* uchar as 1 byte uint */
- if (notes) {
- fprintf(xmlout,
- " <!-- When FieldCount=2, FieldOrder means: -->\n");
- fprintf(xmlout, " <!-- 0: Field coding unknown -->\n");
- fprintf(xmlout,
- " <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order -->\n");
- fprintf(xmlout,
- " <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order -->\n");
- fprintf(xmlout,
- " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n");
- fprintf(xmlout,
- " <!-- Current implementation doesn't retain whether box was actually present. -->\n");
- }
- fprintf(xmlout, " </FieldCoding>\n");
-
- fprintf(xmlout,
- " <MJP2_Profile BoxType=\"jp2p\" Count=\"%d\">\n", track->num_br);
- for (i = 0; i < track->num_br;
- i++) { /* read routine stored in reverse order, so let's undo damage */
- uint_to_chars(track->br[i], buf);
- fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n",
- buf); /*4 characters, each CLi */
- }
- fprintf(xmlout, " </MJP2_Profile>\n");
-
- fprintf(xmlout,
- " <MJP2_Prefix BoxType=\"jp2x\" Count=\"%d\">\n", track->num_jp2x);
- for (i = 0; i < track->num_jp2x; i++) {
- // We'll probably need better formatting than this
- fprintf(xmlout, " <Data>0x%02x</Data>\n",
- track->jp2xdata[i]); /* Each entry is single byte */
- }
- fprintf(xmlout, " </MJP2_Prefix>\n");
-
- fprintf(xmlout,
- " <MJP2_SubSampling BoxType=\"jsub\">\n"); /* These values are all 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- Typical subsample value is 2 for 4:2:0 -->\n");
- }
- fprintf(xmlout, " <HorizontalSub>%d</HorizontalSub>\n",
- track->hsub);
- fprintf(xmlout, " <VerticalSub>%d</VerticalSub>\n",
- track->vsub);
- fprintf(xmlout, " <HorizontalOffset>%d</HorizontalOffset>\n",
- track->hoff);
- fprintf(xmlout, " <VerticalOffset>%d</VerticalOffset>\n",
- track->voff);
- if (notes) {
- fprintf(xmlout,
- " <!-- Typical {horizontal, vertical} chroma offset values: -->\n");
- fprintf(xmlout,
- " <!-- 4:2:2 format (CCIR601, H.262, MPEG2, MPEG4, recom. Exif): {0, 0} -->\n");
- fprintf(xmlout,
- " <!-- 4:2:2 format (JFIF): {1, 0} -->\n");
- fprintf(xmlout,
- " <!-- 4:2:0 format (H.262, MPEG2, MPEG4): {0, 1} -->\n");
- fprintf(xmlout,
- " <!-- 4:2:0 format (MPEG1, H.261, JFIF, recom. Exif): {1, 1} -->\n");
- }
- fprintf(xmlout,
- " </MJP2_SubSampling>\n"); /* These values are all 1 byte */
-
- fprintf(xmlout,
- " <MJP2_OriginalFormat BoxType=\"orfo\">\n"); /* Part III Appx. 2 */
- fprintf(xmlout,
- " <OriginalFieldCount>%u</OriginalFieldCount>\n",
- (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */
- if (notes) {
- fprintf(xmlout,
- " <!-- In original material before encoding. Must be either 1 or 2 -->\n");
- }
- fprintf(xmlout,
- " <OriginalFieldOrder>%u</OriginalFieldOrder>\n",
- (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */
- if (notes) {
- fprintf(xmlout,
- " <!-- When FieldCount=2, FieldOrder means: -->\n");
- fprintf(xmlout, " <!-- 0: Field coding unknown -->\n");
- fprintf(xmlout,
- " <!-- 11: Topmost line came from the earlier field; -->\n");
- fprintf(xmlout,
- " <!-- 16: Topmost line came form the later field. -->\n");
- fprintf(xmlout,
- " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n");
- fprintf(xmlout,
- " <!-- Current implementation doesn't retain whether box was actually present. -->\n");
- }
- fprintf(xmlout, " </MJP2_OriginalFormat>\n");
- fprintf(xmlout, " </VisualSampleEntry>\n");
- break;
- case 1:
- case 2:
- if (notes) {
- fprintf(xmlout,
- " <!-- mj2_to_metadata's data structure doesn't record this currently. -->\n");
- }
- break;
- }
- fprintf(xmlout, " <TimeToSample BoxType=\"stts\">\n");
- fprintf(xmlout, " <SampleStatistics>\n");
- fprintf(xmlout, " <TotalSamples>%d</TotalSamples>\n",
- track->num_samples);
- if (notes) {
- fprintf(xmlout,
- " <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table -->\n");
- }
- fprintf(xmlout, " </SampleStatistics>\n");
- fprintf(xmlout, " <SampleEntries EntryCount=\"%d\">\n",
- track->num_tts);
- for (i = 0; i < track->num_tts; i++) {
- fprintf(xmlout,
- " <Table Entry=\"%u\" SampleCount=\"%d\" SampleDelta=\"%u\" />\n",
- i + 1, track->tts[i].sample_count, track->tts[i].sample_delta);
- }
- fprintf(xmlout, " </SampleEntries>\n");
- fprintf(xmlout, " </TimeToSample>\n");
-
- fprintf(xmlout,
- " <SampleToChunk BoxType=\"stsc\" Count=\"%d\">\n",
- track->num_samplestochunk);
- for (i = 0; i < track->num_samplestochunk; i++) {
- fprintf(xmlout, " <FirstChunk>%u</FirstChunk>\n",
- track->sampletochunk[i].first_chunk); /* 4 bytes */
- fprintf(xmlout, " <SamplesPerChunk>%u</SamplesPerChunk>\n",
- track->sampletochunk[i].samples_per_chunk); /* 4 bytes */
- fprintf(xmlout, " <SampleDescrIndex>%u</SampleDescrIndex>\n",
- track->sampletochunk[i].sample_descr_idx); /* 4 bytes */
- }
- fprintf(xmlout, " </SampleToChunk>\n");
- // After reading this info in, track->num_chunks is calculated and a decompressed table established internally.
-
- fprintf(xmlout, " <SampleSize BoxType=\"stsz\">\n");
- if (track->same_sample_size) {
- // all values in track->sample[i].sample_size are equal. Grab the first one.
- fprintf(xmlout, " <Sample_Size>%u</Sample_Size>\n",
- track->sample[0].sample_size);
- if (notes) {
- fprintf(xmlout,
- " <!-- Non-zero value means all samples have that size. -->\n");
- fprintf(xmlout,
- " <!-- So <Sample_Count> (aka Entry_Count in std.) has no meaning, is suppressed from this output, and no table follows. -->\n");
- }
- } else {
- fprintf(xmlout, " <Sample_Size>0</Sample_Size>\n");
- if (notes)
- if (sampletables) {
- fprintf(xmlout,
- " <!-- Zero value means samples have different sizes, given in table next of length Sample_Count (aka Entry_Count in std). -->\n");
- } else {
- fprintf(xmlout,
- " <!-- Zero value means samples have different sizes, given in table (not shown) of length Sample_Count (aka Entry_Count in std). -->\n");
- }
- fprintf(xmlout, " <Sample_Count>%u</Sample_Count>\n",
- track->num_samples);
- if (sampletables)
- for (i = 0; i < (int)track->num_samples; i++) {
- fprintf(xmlout, " <EntrySize Num=\"%u\">%u</EntrySize>\n", i + 1,
- track->sample[i].sample_size);
- }
- }
- fprintf(xmlout, " </SampleSize>\n");
-
- fprintf(xmlout, " <ChunkOffset BoxType=\"stco\">\n");
- // Structure not yet - Variant ChunkLargeOffset 'co64'
- fprintf(xmlout, " <EntryCount>%u</EntryCount>\n",
- track->num_chunks);
- if (notes) {
- fprintf(xmlout,
- " <!-- For this implementation, EntryCount shown is one calculated during file read of <SampleToChunk> data. -->\n");
- fprintf(xmlout,
- " <!-- Implementation will report failure during file read of <ChunkOffset> data if read entry-count disagrees. -->\n");
- }
- if (sampletables)
- for (i = 0; i < (int)track->num_chunks; i++) {
- fprintf(xmlout, " <Chunk_Offset Num=\"%d\">%u</Chunk_Offset>\n",
- i + 1, track->chunk[i].offset);
- }
- fprintf(xmlout, " </ChunkOffset>\n");
-
- fprintf(xmlout, " </SampleTable>\n");
-}
-
-/* ------------- */
-
-int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample,
- unsigned int snum, opj_event_mgr_t *event_mgr)
-{
- opj_dparameters_t parameters; /* decompression parameters */
- opj_image_t *img;
- opj_cp_t *cp;
- int i;
- int numcomps;
- unsigned char* frame_codestream;
- opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
- opj_cio_t *cio = NULL;
- opj_j2k_t *j2k;
-
- /* JPEG 2000 compressed image data */
-
- /* get a decoder handle */
- dinfo = opj_create_decompress(CODEC_J2K);
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr);
-
- /* setup the decoder decoding parameters using the current image and user parameters */
- parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS;
- opj_setup_decoder(dinfo, &parameters);
-
- frame_codestream = (unsigned char*) malloc(sample->sample_size -
- 8); /* Skipping JP2C marker */
- if (frame_codestream == NULL) {
- return 1;
- }
-
- fseek(file, sample->offset + 8, SEEK_SET);
- fread(frame_codestream, sample->sample_size - 8, 1,
- file); /* Assuming that jp and ftyp markers size do */
-
- /* open a byte stream */
- cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream,
- sample->sample_size - 8);
-
- /* Decode J2K to image: */
- img = opj_decode(dinfo, cio);
- if (!img) {
- fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
- opj_destroy_decompress(dinfo);
- opj_cio_close(cio);
- return 1;
- }
-
- j2k = (opj_j2k_t*)dinfo->j2k_handle;
- j2k_default_tcp = j2k->default_tcp;
- cp = j2k->cp;
-
- numcomps = img->numcomps;
- /* Alignments: " < To help maintain xml pretty-printing */
- fprintf(xmlout, " <JP2_Frame Num=\"%d\">\n", snum + 1);
- fprintf(xmlout, " <MainHeader>\n");
- /* There can be multiple codestreams; a particular image is entirely within a single codestream */
- /* TO DO: A frame can be represented by two I-guess-contiguous codestreams if its interleaved. */
- fprintf(xmlout, " <StartOfCodestream Marker=\"SOC\" />\n");
- /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */
- xml_out_frame_siz(xmlout, img, cp); /* reqd in main */
- xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */
- xml_out_frame_coc(xmlout, j2k_default_tcp,
- numcomps); /* opt in main, at most 1 per component */
- xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */
- xml_out_frame_qcc(xmlout, j2k_default_tcp,
- numcomps); /* opt in main, at most 1 per component */
- xml_out_frame_rgn(xmlout, j2k_default_tcp,
- numcomps); /* opt, at most 1 per component */
- xml_out_frame_poc(xmlout,
- j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */
- /* Next four get j2k_default_tcp passed globally: */
-#ifdef SUPPRESS_FOR_NOW
- xml_out_frame_ppm(xmlout,
- cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */
-#endif
- xml_out_frame_tlm(
- xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */
- xml_out_frame_plm(
- xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */
- xml_out_frame_crg(
- xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */
- xml_out_frame_com(xmlout,
- j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */
-
- fprintf(xmlout, " </MainHeader>\n");
-
- /* TO DO: all the tile headers (sigh) */
- fprintf(xmlout, " <TilePartHeaders Count=\"%d\">\n",
- cp->tileno_size); /* size of the vector tileno */
- for (i = 0; i < cp->tileno_size;
- i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */
- // Standard seems to use zero-based # for tile-part.
- fprintf(xmlout, " <TilePartHeader Num=\"%d\" ID=\"%d\">\n", i,
- cp->tileno[i]); /* ID number of the tiles present in the codestream */
- fprintf(xmlout, " <StartOfTilePart Marker=\"SOT\" />\n");
- /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */
- if (i == 0) {
- xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */
- xml_out_frame_coc(xmlout, &(cp->tcps[i]),
- numcomps); /* No more than 1 per component */
- xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */
- xml_out_frame_qcc(xmlout, &(cp->tcps[i]),
- numcomps); /* No more than 1 per component */
- xml_out_frame_rgn(xmlout, &(cp->tcps[i]),
- numcomps); /* No more than 1 per component */
- }
- xml_out_frame_poc(xmlout,
- &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */
-#ifdef SUPPRESS_FOR_NOW
- xml_out_frame_ppt(xmlout,
- &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */
-#endif
- xml_out_frame_plt(xmlout,
- &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */
- xml_out_frame_com(xmlout,
- &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */
- /* opj_tcp_t * cp->tcps; "tile coding parameters" */
- /* Maybe not: fprintf(xmlout, " <>%d</>, cp->matrice[i]; */ /* Fixed layer */
- fprintf(xmlout, " <StartOfData Marker=\"SOD\" />\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. -->\n");
- }
- fprintf(xmlout, " </TilePartHeader>\n");
- }
- fprintf(xmlout,
- " </TilePartHeaders>\n"); /* size of the vector tileno */
-
-#ifdef NOTYET
- IMAGINE the cp object has data to support the following... but we could use an
- new different data structure instead
- /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */
- /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */
- xml_out_frame_jp2i(xmlout,
- &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */
- xml_out_frame_xml(xmlout,
- &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */
- xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */
- xml_out_frame_uinf(xmlout,
- &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */
-#endif
-
- fprintf(xmlout, " </JP2_Frame>\n");
-
- /* Extra commentary: */
- if (notes) {
- fprintf(xmlout,
- " <!-- Given the number and size of components, mj2_to_frame would try to convert this -->\n");
- if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2)
- && (img->comps[0].dx == img->comps[2].dx / 2) && (img->comps[0].dx == 1))
- || (img->numcomps == 1)) {
- fprintf(xmlout, " <!-- file to a YUV movie in the normal manner. -->\n");
- } else if ((img->numcomps == 3) &&
- (img->comps[0].dx == 1) && (img->comps[1].dx == 1) &&
- (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp
- fprintf(xmlout, " <!-- YUV 4:4:4 file to a series of .bmp files. -->\n");
- } else {
- fprintf(xmlout,
- " <!-- file whose image component dimension are unknown, to a series of .j2k files. -->\n");
- }
- }
-
- opj_destroy_decompress(dinfo);
- opj_cio_close(cio);
- free(frame_codestream);
-
- return 0;
-}
-
-/* ------------- */
-
-void int16_to_3packedchars(short int value, char* buf)
-{
- /* This is to retrieve the 3-letter ASCII language code */
- /* Each char is packed into 5 bits, as difference from 0x60 */
- int i;
- for (i = 2; i >= 0; i--) {
- buf[i] = (value & 0x001f) + 0x60;
- value = (value >> 5);
- }
- buf[3] = '\0';
-}
-
-/* ------------- */
-
-void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp)
-{
- opj_image_comp_t *comp;
- int i;
-
- fprintf(xmlout, " <ImageAndFileSize Marker=\"SIZ\">\n");
- // This is similar to j2k.c's j2k_dump_image.
- // Not of interest: Lsiz, Rsiz
- fprintf(xmlout, " <Xsiz>%d</Xsiz>\n", img->x1);
- fprintf(xmlout, " <Ysiz>%d</Ysiz>\n", img->y1);
- if (notes) {
- fprintf(xmlout,
- " <!-- Xsiz, Ysiz is the size of the reference grid. -->\n");
- }
- fprintf(xmlout, " <XOsiz>%d</XOsiz>\n", img->x0);
- fprintf(xmlout, " <YOsiz>%d</YOsiz>\n", img->y0);
- if (notes) {
- fprintf(xmlout,
- " <!-- XOsiz, YOsiz are offsets from grid origin to image origin. -->\n");
- }
- fprintf(xmlout, " <XTsiz>%d</XTsiz>\n", cp->tdx);
- fprintf(xmlout, " <YTsiz>%d</YTsiz>\n", cp->tdy);
- if (notes) {
- fprintf(xmlout,
- " <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. -->\n");
- }
- fprintf(xmlout, " <XTOsiz>%d</XTOsiz>\n", cp->tx0);
- fprintf(xmlout, " <YTOsiz>%d</YTOsiz>\n", cp->ty0);
- if (notes) {
- fprintf(xmlout,
- " <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. -->\n");
- }
- fprintf(xmlout, " <Csiz>%d</Csiz>\n", img->numcomps);
- if (notes) {
- fprintf(xmlout,
- " <!-- Csiz is the number of components in the image. -->\n");
- fprintf(xmlout, " <!-- For image components next: -->\n");
- fprintf(xmlout,
- " <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. -->\n");
- //fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n");
- fprintf(xmlout,
- " <!-- Bits per pixel (bpp) is the pixel depth. -->\n");
- fprintf(xmlout,
- " <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) -->\n");
- }
-
- for (i = 0; i < img->numcomps; i++) {/* image-components */
- comp = &(img->comps[i]);
- fprintf(xmlout, " <Component Num=\"%d\">\n", i + 1);
- fprintf(xmlout, " <Ssiz>\n");
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n",
- (comp->sgnd << 7) & (comp->prec - 1));
- }
- if (derived) {
- fprintf(xmlout, " <Signed>%d</Signed>\n", comp->sgnd);
- fprintf(xmlout, " <PrecisionInBits>%d</PrecisionInBits>\n",
- comp->prec);
- }
- fprintf(xmlout, " </Ssiz>\n");
- fprintf(xmlout, " <XRsiz>%d</XRsiz>\n", comp->dx);
- fprintf(xmlout, " <YRsiz>%d</YRsiz>\n", comp->dy);
- fprintf(xmlout, " <WidthOfData>%d</WidthOfData>\n", comp->w);
- fprintf(xmlout, " <HeightOfData>%d</HeightOfData>\n", comp->h);
- /* Rest of these aren't calculated when SIZ is read:
- fprintf(xmlout, " <XO>%d</XO>\n", comp->x0);
- fprintf(xmlout, " <YO>%d</YO>\n", comp->y0);
- if(notes)
- fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n");
- fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", comp->bpp);
- fprintf(xmlout, " <NumberOfDecodedResolution>%d</NumberOfDecodedResolution>\n", comp->resno_decoded); */
- // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," <Factor>%d</Factor\n", comp->factor);
- /* factor = number of division by 2 of the out image compare to the original size of image */
- // TO DO comp->data: int *data; /* image-component data */
-
- fprintf(xmlout, " </Component>\n");
- }
- fprintf(xmlout, " </ImageAndFileSize>\n");
-}
-
-/* ------------- */
-
-void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp)
-{
- /* Could be called with tcp = &j2k_default_tcp;
- /* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno]
- /* Alignment for main:" < < < < To help maintain xml pretty-printing */
- /* Alignment for tile:" < < < To help maintain xml pretty-printing */
- opj_tccp_t *tccp;
- int i;
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
- tccp = &(tcp->tccps[0]);
-
- fprintf(xmlout, "%s<CodingStyleDefault Marker=\"COD\">\n",
- s); /* Required in main header */
- /* Not retained or of interest: Lcod */
- fprintf(xmlout, "%s <Scod>0x%02x</Scod>\n", s, tcp->csty); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 0: Defines entropy coder precincts -->\n", s);
- fprintf(xmlout,
- "%s <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. -->\n", s);
- fprintf(xmlout, "%s <!-- bit 1: 1 = SOP marker may be used; 0 = not. -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 2: 1 = EPH marker may be used; 0 = not. -->\n",
- s);
- }
- fprintf(xmlout, "%s <SGcod>\n", s);
- fprintf(xmlout, "%s <ProgressionOrder>%d</ProgressionOrder>\n", s,
- tcp->prg); /* 1 byte, SGcod (A) */
- if (notes) {
- fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n", s);
- fprintf(xmlout,
- "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s);
- fprintf(xmlout,
- "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n",
- s);
- }
- fprintf(xmlout, "%s <NumberOfLayers>%d</NumberOfLayers>\n", s,
- tcp->numlayers); /* 2 bytes, SGcod (B) */
- fprintf(xmlout,
- "%s <MultipleComponentTransformation>%d</MultipleComponentTransformation>\n",
- s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G -->\n",
- s);
- }
- fprintf(xmlout, "%s </SGcod>\n", s);
- /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */
- fprintf(xmlout, "%s <SPcod>\n", s);
- /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */
- /* So we only have to report the first component's values here. */
- /* Compare j2k_read_cox(...) */
- fprintf(xmlout,
- "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s,
- tccp->numresolutions - 1); /* 1 byte, SPcox (D) */
- fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s,
- tccp->cblkw - 2); /* 1 byte, SPcox (E) */
- fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s,
- tccp->cblkh - 2); /* 1 byte, SPcox (F) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s);
- fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s);
- }
- fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s,
- tccp->cblksty); /* 1 byte, SPcox (G) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s);
- fprintf(xmlout,
- "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s);
- fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s);
- fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s);
- }
- fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s,
- tccp->qmfbid); /* 1 byte, SPcox (H) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n",
- s);
- }
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n",
- s);
- }
- for (i = 0; i < tccp->numresolutions; i++) {
- fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n",
- s, i);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */
- }
- if (derived) {
- fprintf(xmlout, "%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s,
- tccp->prcw[i]);
- fprintf(xmlout, "%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s,
- tccp->prch[i]);
- }
- fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i);
- }
- fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */
- }
- fprintf(xmlout, "%s </SPcod>\n", s);
- fprintf(xmlout, "%s</CodingStyleDefault>\n", s);
-}
-
-/* ------------- */
-
-void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp,
- int numcomps) /* Optional in main & tile-part headers */
-{
- /* Uses global j2k_default_tcp */
- opj_tccp_t *tccp, *firstcomp_tccp;
- int i, compno;
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-
- firstcomp_tccp = &(tcp->tccps[0]);
- /* Internal data structure tccp defines separate defaults for each component, set from main */
- /* default, then selectively overwritten. */
- /* Compare j2k_read_cox(...) */
- /* We don't really know which was the default, and which were not */
- /* Let's pretend that [0] is the default and all others are not */
- if (notes) {
- fprintf(xmlout,
- "%s<!-- mj2_to_metadata implementation always reports component[0] as using default COD, -->\n",
- s);
- if (tcp == j2k_default_tcp) {
- fprintf(xmlout,
- "%s<!-- and any other component, with main-header style values different from [0], as COC. -->\n",
- s);
- } else {
- fprintf(xmlout,
- "%s<!-- and any other component, with tile-part-header style values different from [0], as COC. -->\n",
- s);
- }
- }
- for (compno = 1; compno < numcomps;
- compno++) { /* spec says components are zero-based */
- tccp = &tcp->tccps[compno];
- if (same_component_style(firstcomp_tccp, tccp)) {
- continue;
- }
-
- /* Alignments: " < < < < < To help maintain xml pretty-printing */
- fprintf(xmlout, "%s<CodingStyleComponent Marker=\"COC\">\n",
- s); /* Optional in main header, at most 1 per component */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- See Ccoc below for zero-based component number. -->\n", s);
- }
- /* Overrides the main COD for the specific component */
- /* Not retained or of interest: Lcod */
- fprintf(xmlout, "%s <Scoc>0x%02x</Scoc>\n", s, tccp->csty); /* 1 byte */
- if (notes) {
- fprintf(xmlout, "%s <!-- Scoc defines entropy coder precincts: -->\n", s);
- fprintf(xmlout,
- "%s <!-- 0 = maximum, namely (PPx=15, PPy=15); 1 = precincts defined below. -->\n",
- s);
- }
- fprintf(xmlout, "%s <Ccoc>%d</Ccoc>\n", s, compno); /* 1 or 2 bytes */
- /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */
- /*if(j2k_img_numcomps <=256)
- component is 1 byte
- else
- compno is 2 byte */
-
- /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */
- fprintf(xmlout, "%s <SPcoc>\n", s);
- fprintf(xmlout,
- "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s,
- tccp->numresolutions - 1); /* 1 byte, SPcox (D) */
- fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s,
- tccp->cblkw - 2); /* 1 byte, SPcox (E) */
- fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s,
- tccp->cblkh - 2); /* 1 byte, SPcox (F) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s);
- fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s);
- }
- fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s,
- tccp->cblksty); /* 1 byte, SPcox (G) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s);
- fprintf(xmlout,
- "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n",
- s);
- fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s);
- fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s);
- fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s);
- }
- fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s,
- tccp->qmfbid); /* 1 byte, SPcox (H) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n",
- s);
- }
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n",
- s);
- }
- for (i = 0; i < tccp->numresolutions - 1;
- i++) { /* subtract 1 to get # of decomposition levels */
- fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n",
- s, i);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */
- }
- if (derived) {
- fprintf(xmlout, "%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s,
- tccp->prcw[i]);
- fprintf(xmlout, "%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s,
- tccp->prch[i]);
- }
- fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i);
- }
- fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */
- }
- fprintf(xmlout, "%s </SPcoc>\n", s);
- fprintf(xmlout, "%s</CodingStyleComponent>\n", s);
- }
-}
-
-/* ------------- */
-
-BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2)
-{
- int i;
-
- if (tccp1->numresolutions != tccp2->numresolutions) {
- return FALSE;
- }
- if (tccp1->cblkw != tccp2->cblkw) {
- return FALSE;
- }
- if (tccp1->cblkh != tccp2->cblkh) {
- return FALSE;
- }
- if (tccp1->cblksty != tccp2->cblksty) {
- return FALSE;
- }
- if (tccp1->csty != tccp2->csty) {
- return FALSE;
- }
-
- if (tccp1->csty & J2K_CP_CSTY_PRT) {
- for (i = 0; i < tccp1->numresolutions; i++) {
- if (tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) {
- return FALSE;
- }
- }
- }
- return TRUE;
-}
-
-/* ------------- */
-
-void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp)
-{
- /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */
- opj_tccp_t *tccp;
- int bandno, numbands;
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-
- /* Compare j2k_read_qcx */
- fprintf(xmlout, "%s<QuantizationDefault Marker=\"QCD\">\n",
- s); /* Required in main header, single occurrence */
- tccp = &(tcp->tccps[0]);
- /* Not retained or of interest: Lqcd */
- fprintf(xmlout, "%s <Sqcd>\n", s); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Default quantization style for all components. -->\n", s);
- }
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->numgbits) << 5 | tccp->qntsty);
- }
- if (derived) {
- fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s,
- tccp->qntsty);
- }
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Quantization style (in Sqcd's low 5 bits) may be: -->\n", s);
- fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcd size = 8 bits-->\n",
- s);
- fprintf(xmlout,
- "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. -->\n",
- s);
- }
- if (derived) {
- fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s,
- tccp->numgbits);
- }
- if (notes) {
- fprintf(xmlout,
- "%s <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) -->\n", s);
- }
- fprintf(xmlout, "%s </Sqcd>\n", s);
-
- /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */
- /* So we'll just dump all internal values */
- /* We could calculate it, but I'm having trouble believing the length equations in the standard */
-
- fprintf(xmlout, "%s <SPqcd>\n", s);
- switch (tccp->qntsty) {
- case J2K_CCP_QNTSTY_NOQNT: /* no quantization */
- /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */
- numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */
- /* Better: IMAGINE numbands = tccp->stepsize_numbands; */
- /* Instead look for first zero exponent, quit there. Adequate? */
- fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until an exponent with zero value is reached. -->\n", s);
- fprintf(xmlout,
- "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s);
- fprintf(xmlout,
- "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s);
- }
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0) {
- break; /* Remove when we have real numbands */
- }
- fprintf(xmlout, "%s <DynamicRangeExponent Subband=\"%d\">\n", s, bandno);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- tccp->stepsizes[bandno].expn << 3);
- }
- if (derived) {
- fprintf(xmlout, "%s <AsDecimal>%d</AsDecimal>\n", s,
- tccp->stepsizes[bandno].expn);
- }
- fprintf(xmlout, "%s </DynamicRangeExponent>\n", s);
- }
- fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s);
- break;
- case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */
- /* This is what standard says. Should I believe it:: len = 5;
- /* numbands = 1; */
- fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n",
- s);
- }
- fprintf(xmlout, "%s <QuantizationValues Subband=\"0\">\n", s);
- if (notes) {
- fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s);
- }
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant);
- }
- if (derived) {
- fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s,
- tccp->stepsizes[0].expn);
- fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s,
- tccp->stepsizes[0].mant);
- }
- fprintf(xmlout, "%s </QuantizationValues>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until a subband with exponent of zero value is reached. -->\n",
- s);
- }
-
- for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0) {
- break;
- }
-
- fprintf(xmlout,
- "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s,
- bandno, tccp->stepsizes[bandno].expn);
- }
-
- fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s);
- break;
-
- default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */
- /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */
- numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/
- /* Better: IMAGINE numbands = tccp->stepsize_numbands; */
- fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n",
- s);
- }
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) {
- break; /* Remove when we have real numbands */
- }
-
- fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant);
- }
- if (derived) {
- fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s,
- tccp->stepsizes[bandno].expn);
- fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s,
- tccp->stepsizes[bandno].mant);
- }
- fprintf(xmlout, "%s </QuantizationValues>\n", s);
- }
- fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s);
- break;
- } /* switch */
- fprintf(xmlout, "%s </SPqcd>\n", s);
- fprintf(xmlout, "%s</QuantizationDefault>\n", s);
-
- /* Alignments: " < < < < < To help maintain xml pretty-printing */
-}
-
-/* ------------- */
-
-void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps)
-{
- /* Uses global j2k_default_tcp */
- /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */
- opj_tccp_t *tccp, *firstcomp_tccp;
- int bandno, numbands;
- int compno;
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-
- firstcomp_tccp = &(tcp->tccps[0]);
- /* Internal data structure tccp defines separate defaults for each component, set from main */
- /* default, then selectively overwritten. */
- /* Compare j2k_read_qcx(...) */
- /* We don't really know which was the default, and which were not */
- /* Let's pretend that [0] is the default and all others are not */
- if (notes) {
- fprintf(xmlout,
- "%s<!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->\n",
- s);
- if (tcp == j2k_default_tcp) {
- fprintf(xmlout,
- "%s<!-- and any other component, with main-header quantization values different from [0], as QCC. -->\n",
- s);
- } else {
- fprintf(xmlout,
- "%s<!-- and any other component, with tile-part-header quantization values different from [0], as QCC. -->\n",
- s);
- }
- }
- for (compno = 1; compno < numcomps;
- compno++) { /* spec says components are zero-based */
- tccp = &(tcp->tccps[compno]);
- if (same_component_quantization(firstcomp_tccp, tccp)) {
- continue;
- }
-
- /* Compare j2k_read_qcx */
- fprintf(xmlout,
- "%s<QuantizationComponent Marker=\"QCC\" Component=\"%d\">\n", s,
- compno); /* Required in main header, single occurrence */
- tccp = &j2k_default_tcp->tccps[0];
- /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */
- fprintf(xmlout, "%s <Sqcc>\n", s); /* 1 byte */
- if (notes) {
- fprintf(xmlout, "%s <!-- Quantization style for this component. -->\n", s);
- }
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->numgbits) << 5 | tccp->qntsty);
- }
- if (derived) {
- fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s,
- tccp->qntsty);
- }
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Quantization style (in Sqcc's low 5 bits) may be: -->\n", s);
- fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcc size = 8 bits-->\n",
- s);
- fprintf(xmlout,
- "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcc size = 16. -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcc size = 16. -->\n",
- s);
- }
- if (derived) {
- fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s,
- tccp->numgbits);
- }
- if (notes) {
- fprintf(xmlout,
- "%s <!-- 0-7 guard bits allowed (stored in Sqcc's high 3 bits) -->\n", s);
- }
- fprintf(xmlout, "%s </Sqcc>\n", s);
-
- /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */
- /* So we'll just dump all internal values */
- fprintf(xmlout, "%s <SPqcc>\n", s);
- switch (tccp->qntsty) {
- case J2K_CCP_QNTSTY_NOQNT:
- numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */
- /* Better: IMAGINE numbands = tccp->stepsize_numbands; */
-
- /* Instead look for first zero exponent, quit there. Adequate? */
- fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until an exponent with zero value is reached. -->\n", s);
- fprintf(xmlout,
- "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s);
- fprintf(xmlout,
- "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s);
- }
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0) {
- break; /* Remove this once we have real numbands */
- }
- fprintf(xmlout, "%s <Exponent Subband=\"%d\">\n", s, bandno);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- tccp->stepsizes[bandno].expn << 3);
- }
- if (derived) {
- fprintf(xmlout, "%s <AsDecimal>%d</AsDecimal>\n", s,
- tccp->stepsizes[bandno].expn);
- }
- fprintf(xmlout, "%s </Exponent>\n", s);
- }
- fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s);
- break;
- case J2K_CCP_QNTSTY_SIQNT:
- /* numbands = 1; */
- fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n",
- s);
- }
- fprintf(xmlout, "%s <QuantizationValuesForSubband0>\n", s);
- if (notes) {
- fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s);
- }
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant);
- }
- if (derived) {
- fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s,
- tccp->stepsizes[0].expn);
- fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s,
- tccp->stepsizes[0].mant);
- }
- fprintf(xmlout, "%s </QuantizationValuesForSubband0>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until a subband with exponent of zero value is reached. -->\n",
- s);
- }
-
- for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0) {
- break;
- }
-
- fprintf(xmlout,
- "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s,
- bandno, tccp->stepsizes[bandno].expn);
- }
- fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s);
- break;
-
- default: /* J2K_CCP_QNTSTY_SEQNT */
- numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/
- /* Better: IMAGINE numbands = tccp->stepsize_numbands; */
- fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s);
- if (notes) {
- fprintf(xmlout,
- "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n",
- s);
- fprintf(xmlout,
- "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n",
- s);
- }
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) {
- break; /* Remove this once we have real numbands count */
- }
- fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno);
- if (raw) {
- fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s,
- (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant);
- }
- if (derived) {
- fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s,
- tccp->stepsizes[bandno].expn);
- fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s,
- tccp->stepsizes[bandno].mant);
- }
- fprintf(xmlout, "%s </QuantizationValues>\n", s);
- }
- fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s);
- break;
- } /* switch */
- fprintf(xmlout, "%s </SPqcc>\n", s);
- fprintf(xmlout, "%s</QuantizationComponent>\n", s);
- }
- /* Alignments: " < < < < < To help maintain xml pretty-printing */
-}
-
-/* ------------- */
-
-BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2)
-{
- int bandno, numbands;
-
- if (tccp1->qntsty != tccp2->qntsty) {
- return FALSE;
- }
- if (tccp1->numgbits != tccp2->numgbits) {
- return FALSE;
- }
-
- switch (tccp1->qntsty) {
- case J2K_CCP_QNTSTY_NOQNT:
- numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */
- /* Instead look for first zero exponent, quit there. Adequate? */
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp1->stepsizes[bandno].expn == 0) {
- break;
- }
- if (tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) {
- return FALSE;
- }
- }
- break;
- case J2K_CCP_QNTSTY_SIQNT:
- /* numbands = 1; */
- if (tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn ||
- tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) {
- return FALSE;
- }
- /* Don't need to check remainder, since they are calculated from [0] */
- break;
-
- default: /* J2K_CCP_QNTSTY_SEQNT */
- numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/
- /* This comparison may cause us problems with trailing junk values. */
- for (bandno = 0; bandno < numbands; bandno++) {
- if (tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn ||
- tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant);
- return FALSE;
- }
- break;
- } /* switch */
- return TRUE;
-}
-
-/* ------------- */
-
-void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps)
-{
- int compno, SPrgn;
- /* MJ2 files can have regions of interest if hybridized with JPX Part II */
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-
- for (compno = 0; compno < numcomps; compno++) {
- SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */
- if (SPrgn == 0) {
- continue; /* Yet another kludge */
- }
-
- fprintf(xmlout, "%s<RegionOfInterest Marker=\"RGN\">\n",
- s); /* Optional in main header, at most 1 per component */
- if (notes) {
- fprintf(xmlout, "%s<!-- See Crgn below for zero-based component number. -->\n",
- s);
- }
- /* Not retained or of interest: Lrgd */
- fprintf(xmlout, "%s <Srgn>0</Srgn>\n", s); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Srgn is ROI style. Only style=0 defined: Implicit ROI (max. shift) -->\n",
- s);
- }
- fprintf(xmlout, "%s <Crgn>%d</Crgn>\n", s, compno); /* 1 or 2 bytes */
- fprintf(xmlout, "%s <SPrgn>%d</SPrgn>\n", s, SPrgn); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- SPrgn is implicit ROI shift, i.e., binary shifting of ROI coefficients above background. -->\n",
- s);
- }
- fprintf(xmlout, "</RegionOfInterest\n",
- s); /* Optional in main header, at most 1 per component */
- }
-}
-
-/* ------------- */
-
-void xml_out_frame_poc(FILE* xmlout,
- opj_tcp_t *tcp) /* Progression Order Change */
-{
- /* Compare j2k_read_poc() */
- int i;
- opj_poc_t *poc;
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-
- if (tcp->POC != 1) {
- return; /* Not present */
- }
-
- fprintf(xmlout, "%s<ProgressionOrderChange Marker=\"POC\">\n",
- s); /* Optional in main header, at most 1 per component */
- /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does
- the spec really allow that? */
- /* 2 bytes, not retained; Lpoc */
- /* I probably didn't get this dump precisely right. */
- for (i = 0; i < tcp->numpocs; i++) {
- poc = &tcp->pocs[i];
- fprintf(xmlout, "%s <Progression Num=\"%d\">\n", s, i + 1);
- fprintf(xmlout, "%S <RSpoc>%d</RSpoc>\n", s,
- poc->resno0); /* 1 byte, RSpoc_i */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 -->\n",
- s);
- }
- fprintf(xmlout, "%s <CSpoc>%d</CSpoc>\n", s,
- poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Component index (inclusive) for progression start. -->\n", s);
- }
- fprintf(xmlout, "%s <LYEpoc>%d</LYEpoc>\n", s,
- poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */
- if (notes) {
- fprintf(xmlout, "%s <!-- Layer index (exclusive) for progression end. -->\n",
- s);
- }
- fprintf(xmlout, "%s <REpoc>%d</REpoc>\n", s,
- poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 -->\n",
- s);
- }
- fprintf(xmlout, "%s <CEpoc>%d</CEpoc>\n", s,
- poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */
- if (notes) {
- fprintf(xmlout,
- "%s <!-- Component index (exclusive) for progression end. Minimum: CSpoc -->\n",
- s);
- }
- fprintf(xmlout, "%s <Ppoc>%d</Ppoc>\n", s, poc->prg); /* 1 byte Ppoc_i */
- if (notes) {
- fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n", s);
- fprintf(xmlout,
- "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s);
- fprintf(xmlout,
- "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n",
- s);
- }
- fprintf(xmlout, "%s </Progression>\n", s);
- }
- fprintf(xmlout, "%s</ProgressionOrderChange\n", s);
-}
-
-/* ------------- */
-
-#ifdef SUPPRESS_FOR_NOW
-/* Suppress PPM and PPT since we're not showing data from the third option, namely within the codestream, and
-that's evidently what frames_to_mj2 uses. And a hex dump isn't so useful anyway */
-
-void xml_out_frame_ppm(FILE *xmlout,
- opj_cp_t *cp) /* For main header, not tile-part (which uses PPT instead). */
-{
- /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */
- /* Use of PPM and PPT are mutually exclusive. */
- /* Compare j2k_read_ppm() */
- int j;
-
- if (cp->ppm != 1) {
- return; /* Not present */
- }
- /* Main header uses indent of 10 spaces */
- fprintf(xmlout,
- " <PackedPacketHeadersMainHeader Marker=\"PPM\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */
- /* 2 bytes Lppm not saved */
- if (notes) {
- fprintf(xmlout,
- " <!-- If there are multiple PPM marker segments in the main header, -->\n");
- fprintf(xmlout,
- " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPM header. -->\n");
- fprintf(xmlout,
- " <!-- The implementation can't currently segregate by tile-part. -->\n");
- fprintf(xmlout,
- " <!-- TO DO? further map the packet headers to xml. -->\n");
- }
-
- /* 1 byte, not retained ; Zppm is sequence # of this PPM header */
- /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */
- /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */
- /* Not real clear whether to use ppm->store or ppm_len as upper bound */
- fprintf(xmlout, " <PackedData>\n");
- xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len);
- /* Dump packet headers 1 byte at a time: lppm[i][j] */
- fprintf(xmlout, " </PackedData>\n");
- fprintf(xmlout,
- " </PackedPacketHeadersMainHeader>\n"); /* Optional in main header, but if not, must be in PPT or codestream */
-}
-
-/* ------------- */
-
-void xml_out_frame_ppt(FILE *xmlout,
- opj_tcp_t *tcp) /* For tile-part header, not main (which uses PPM instead). */
-{
- /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */
- /* Use of PPM and PPT are mutually exclusive. */
- /* Compare j2k_read_ppt() */
- int j;
-
- if (tcp->ppt != 1) {
- return; /* Not present */
- }
-
- /* Tile-part indents are 12 spaces */
- fprintf(xmlout,
- " <PackedPacketHeadersTilePartHeader Marker=\"PPT\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */
- /* 2 bytes Lppm not saved */
- if (notes) {
- fprintf(xmlout,
- " <!-- If there are multiple PPT marker segments in the tile-part header, -->\n");
- fprintf(xmlout,
- " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPT header. -->\n");
- fprintf(xmlout,
- " <!-- The implementation can't currently segregate by tile-part. -->\n");
- fprintf(xmlout,
- " <!-- TO DO? further map the packet headers to xml. -->\n");
- }
-
- /* 1 byte, not retained ; Zppt is sequence # of this PPT header */
- /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */
- /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */
- /* Not real clear whether to use ppt->store or ppt_len as upper bound */
- fprintf(xmlout, " <PackedData>\n");
- xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len);
- /* Dump packet headers 1 byte at a time: lppt[i][j] */
- fprintf(xmlout, " </PackedData>\n");
- fprintf(xmlout,
- " </PackedPacketHeadersTileHeader>\n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */
-}
-#endif SUPPRESS_FOR_NOW
-
-/* ------------- */
-
-void xml_out_frame_tlm(FILE*
- xmlout) /* opt, main header only. May be multiple. */
-{
- /* Compare j2k_read_tlm()... which doesn't retain anything! */
- /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */
- /* Main header indents are 10 spaces */
-}
-
-/* ------------- */
-
-void xml_out_frame_plm(FILE*
- xmlout) /* opt, main header only; can be used in conjunction with tile-part's PLT */
-{
- /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */
- /* Compare j2k_read_plm()... which doesn't retain anything! */
- /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */
- /* Main header indents are 10 spaces */
-}
-
-/* ------------- */
-
-void xml_out_frame_plt(FILE* xmlout,
- opj_tcp_t *tcp) /* opt, tile-part headers only; can be used in conjunction with main header's PLM */
-{
- /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */
- /* Compare j2k_read_plt()... which doesn't retain anything! */
- /* Tile-part header indents are 12 spaces */
-}
-
-/* ------------- */
-
-void xml_out_frame_crg(FILE* xmlout)
-{
- /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */
- /* Compare j2k_read_crg()... which doesn't retain anything! */
- /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */
-#ifdef NOTYET
-THIS PSEUDOCODE IMAGINES THESE EXIST:
- j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*,
- j2k_default_tcp->crg_ycrg*
- (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE)
- if (j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0)
- return; /* Not present */
-
- /* Main header indents are 10 spaces */
- fprintf(xmlout,
- " <ComponentRegistration Marker=\"RG\" Count=\"%d\">\n",
- j2k_default_tcp->crg_i);
- if (notes) {
- fprintf(xmlout,
- " <!-- Fine tuning of registration of components with respect to each other, -->\n");
- fprintf(xmlout,
- " <!-- not required but potentially helpful for decoder. -->\n");
- fprintf(xmlout,
- " <!-- These supplementary fractional offsets are in units of 1/65536 of the horizontal -->\n");
- fprintf(xmlout,
- " <!-- or vertical separation (e.g., XRsiz[i] or YRsiz[i] for component i). -->\n");
- }
- /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */
- for (i = 0; i < j2k_default_tcp->crg_i; i++) {
- fprintf(xmlout, " <Component Num=\"%d\">\n", i + 1);
- fprintf(xmlout, " <Xcrg>\n");
- if (raw) {
- fprintf(xmlout, " <AsNumerator>%d</AsNumerator>\n",
- j2k_default_tcp->crg_xcrg[i]);
- }
- if (derived) {
- /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */
- fprintf(xmlout, " <AsPercentage>%.4f</AsPercentage>\n",
- ((double)j2k_default_tcp->crg_xcrg[i]) / 655.36);
- /* We could do another calculation that include XRsiz[i]; maybe later. */
- }
- fprintf(xmlout, " </Xcrg>\n");
- fprintf(xmlout, " <Ycrg>\n");
- if (raw) {
- fprintf(xmlout, " <AsNumerator>%d</AsNumerator>\n",
- j2k_default_tcp->crg_ycrg[i]);
- }
- if (derived) {
- fprintf(xmlout, " <AsPercentage>%f</AsPercentage>\n",
- ((double)j2k_default_tcp->crg_ycrg[i]) / 655.36);
- }
- fprintf(xmlout, " </Ycrg>\n");
- fprintf(xmlout, " </Component>\n");
- }
-
- fprintf(xmlout, " </ComponentRegistration>\n");
-
-#endif
-}
-
-/* ------------- */
-
-/* Regrettably from a metadata point of view, j2k_read_com() skips over any comments in main header or tile-part-header */
-void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp)
-{
- /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */
- /* Compare j2k_read_com()... which doesn't retain anything! */
-#ifdef NOTYET
- char spaces[13] = " "; /* 12 spaces if tilepart*/
- char* s = spaces;
- if (tcp == &j2k_default_tcp) {
- s++;
- s++; /* shorten s to 10 spaces if main */
- }
-THIS PSEUDOCODE IMAGINES THESE EXIST:
- tcp->com, tcp->com_len, tcp->com_data array
- if (tcp->com != 1) {
- return; /* Not present */
- }
-
- fprintf(xmlout, "%s<Comment Marker=\"COM\">\n",
- s); /* Optional in main or tile-part header */
- xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s);
- fprintf(xmlout, "%s</Comment>\n", s);
-#endif
-}
-
-void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s)
-{
- /* s is a string of spaces for indent */
- int i;
-
- /* This is called when raw is true, or there is no appropriate derived form */
- fprintf(xmlout, "%s<AsHex>\n", s);
- fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */
- for (i = 0; i < data_len; i++) { /* Dump packet headers */
- fprintf(xmlout, "%02x", data[i]);
- }
- fprintf(xmlout, "%s</AsHex>\n", s);
-}
-
-/* Define this as an even number: */
-#define BYTES_PER_DUMP_LINE 40
-/* Current total width for Hex and ASCII is : 11 spaces lead + (3 * BPDL) + 2 spaces + BPDL */
-void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len,
- char* s)
-{
- /* s is a string of spaces for indent */
- int i, j;
-
- if (raw) {
- xml_out_dump_hex(xmlout, data, data_len, s);
- }
-
- if (derived) {
- fprintf(xmlout, "%s<AsHexAndASCII>\n", s);
- for (i = 0; i < data_len;) {
- fprintf(xmlout, "%s ", s); /* Additional leading space added in loop */
- /* First column: hex */
- for (j = 0; j < BYTES_PER_DUMP_LINE; j++) { /* Dump bytes */
- fprintf(xmlout, " %02x", data[i + j]);
- }
- /* Space between columns... */ fprintf(xmlout, " ");
- /* Second column: ASCII */
- for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) {
- if (isprint((int)data[i]) && i < data_len) {
- fprintf(xmlout, "%c", data[i]);
- } else {
- fprintf(xmlout, " ");
- }
- }
- /* If we also wanted to output UCS-2 Unicode as a third column, then entire document
- must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still
- the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If
- data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII
- in column 2. */
- }
- fprintf(xmlout, "%s</AsHexAndASCII>\n", s);
- }
-}
-
-
-/* ------------- */
-
-void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) /* JP2 Header */
-{
- /* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */
- int i;
-
- fprintf(xmlout, " <JP2Header BoxType=\"jp2h\">\n");
-
- /* Compare jp2_read_ihdr(jp2_struct)) */
- fprintf(xmlout, " <ImageHeader BoxType=\"ihdr\">\n");
- fprintf(xmlout, " <HEIGHT>%d</HEIGHT>\n",
- jp2_struct->h); /* 4 bytes */
- fprintf(xmlout, " <WIDTH>%d</WIDTH>\n",
- jp2_struct->w); /* 4 bytes */
- if (notes) {
- fprintf(xmlout,
- " <!-- HEIGHT here, if 2 fields per image, is of total deinterlaced height. -->\n");
- }
- fprintf(xmlout, " <NC>%d</NC>\n",
- jp2_struct->numcomps); /* 2 bytes */
- if (notes) {
- fprintf(xmlout,
- " <!-- NC is number of components -->\n"); /* 2 bytes */
- }
- fprintf(xmlout, " <BPC>\n"); /* 1 byte */
- if (jp2_struct->bpc == 255) {
- fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n",
- jp2_struct->bpc); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n");
- }
- } else { /* Not 0xff */
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n",
- jp2_struct->bpc); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n");
- }
- }
- if (derived) {
- fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n",
- jp2_struct->bpc & 0x7f);
- fprintf(xmlout, " <Signed>%d</Signed>\n",
- jp2_struct->bpc >> 7);
- }
- }
- fprintf(xmlout, " </BPC>\n");
- fprintf(xmlout, " <C>%d</C>\n",
- jp2_struct->C); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- C is compression type. Only \"7\" is allowed to date. -->\n"); /* 2 bytes */
- }
- fprintf(xmlout, " <UnkC>%d</UnkC>\n",
- jp2_struct->UnkC); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- Colourspace Unknown. 1 = unknown, 0 = known (e.g., colourspace spec is accurate) -->\n"); /* 1 byte */
- }
- fprintf(xmlout, " <IPR>%d</IPR>\n",
- jp2_struct->IPR); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- IPR is 1 if frame contains an Intellectual Property box; 0 otherwise. -->\n"); /* 2 bytes */
- }
- fprintf(xmlout, " </ImageHeader>\n");
-
- if (jp2_struct->bpc == 255) {
- fprintf(xmlout, " <BitsPerComponent BoxType=\"bpcc\">\n");
- if (notes) {
- fprintf(xmlout,
- " <!-- Pixel depth (range 1 to 38) is low 7 bits of hex value + 1 -->\n");
- }
- /* Bits per pixel varies with components */
- /* Compare jp2_read_bpcc(jp2_struct) */
- for (i = 0; i < (int)jp2_struct->numcomps; i++) {
- if (raw) {
- fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n",
- jp2_struct->comps[i].bpcc); /* 1 byte */
- }
- if (derived) {
- fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n",
- (jp2_struct->comps[i].bpcc & 0x7f) + 1);
- fprintf(xmlout, " <Signed>%d</Signed>\n",
- jp2_struct->comps[i].bpcc >> 7);
- }
- }
- fprintf(xmlout, " </BitsPerComponent>\n");
- }
-
- /* Compare jp2_read_colr(jp2_struct) */
- fprintf(xmlout,
- " <ColourSpecification BoxType=\"colr\">\n");
- fprintf(xmlout, " <METH>%d</METH>\n",
- jp2_struct->meth); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- Valid values of specification method so far: -->\n");
- fprintf(xmlout,
- " <!-- 1 = Enumerated colourspace, in EnumCS field -->\n");
- fprintf(xmlout,
- " <!-- 2 = Restricted ICC Profile, in PROFILE field -->\n");
- }
- fprintf(xmlout, " <PREC>%d</PREC>\n",
- jp2_struct->precedence); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- 0 is only valid value of precedence so far. -->\n");
- }
- fprintf(xmlout, " <APPROX>%d</APPROX>\n",
- jp2_struct->approx); /* 1 byte */
- if (notes) {
- fprintf(xmlout,
- " <!-- 0 is only valid value of colourspace approximation so far. -->\n");
- }
-
- if (jp2_struct->meth == 1) {
- fprintf(xmlout, " <EnumCS>%d</EnumCS>\n",
- jp2_struct->enumcs); /* 4 bytes */
- if (notes) {
- fprintf(xmlout,
- " <!-- Valid values of enumerated MJ2 colourspace so far: -->\n");
- fprintf(xmlout,
- " <!-- 16: sRGB as defined by IEC 61966-2-1. -->\n");
- fprintf(xmlout,
- " <!-- 17: greyscale (related to sRGB). -->\n");
- fprintf(xmlout,
- " <!-- 18: sRGB YCC (from JPEG 2000 Part II). -->\n");
- fprintf(xmlout,
- " <!-- (Additional JPX values are defined in Part II). -->\n");
- }
- } else if (notes) {
- fprintf(xmlout,
- " <!-- PROFILE is not handled by current OpenJPEG implementation. -->\n");
- }
- /* only 1 byte is read and nothing stored */
- fprintf(xmlout, " </ColourSpecification>\n");
-
- /* TO DO? No OpenJPEG support.
- Palette 'pclr'
- ComponentMapping 'cmap'
- ChannelDefinition 'cdef'
- Resolution 'res'
- */
- fprintf(xmlout, " </JP2Header>\n");
-}
-/* ------------- */
-
-#ifdef NOTYET
-IMAGE these use cp structure,
- extended... but we could use a new data structure instead
- void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp)
-{
- /* IntellectualProperty 'jp2i' (no restrictions on location) */
- int i;
- IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data(array of chars),
- cp->cp2i_len(array of ints)
- if (cp->jp2i != 1) {
- return; /* Not present */
- }
-
- for (i = 0; i < cp->jp2i_count; i++) {
- fprintf(xmlout, " <IntellectualProperty BoxType=\"jp2i\">\n");
- /* I think this can be anything, including binary, so do a dump */
- /* Is it better to indent or not indent this content? Indent is better for reading, but
- worse for cut/paste. */
- xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]);
- fprintf(xmlout, " </IntellectualProperty>\n");
- }
-}
-
-void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp)
-{
- /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */
- IMAGE cp->xml, cp->xml_count, cp->xml_data(array of chars)
- MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED.
- ASSUME ASSUME EACH LINE IS ENDED BY \n.
- int i;
- if (cp->xml != 1) {
- return; /* Not present */
- }
-
- for (i = 0; i < cp->xml_count; i++) {
- fprintf(xmlout, " <TextFormXML BoxType=\"xml[space]" Instance =
- \"%d\">\n", i + 1);
- /* Is it better to indent or not indent this content? Indent is better for reading, but
- worse for cut/paste. Being lazy, didn't indent here. */
- fprintf(xmlout,
- cp->xml_data[i]); /* May be multiple lines */ /* Could check if this is well-formed */
- fprintf(xmlout, " </TextFormXML>\n");
- }
-}
-
-void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp)
-{
- /* UUID 'uuid' (top level only) */
- /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */
- /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */
- /* A UUID is a 16-byte value. There is a conventional string representation for it:
- "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */
-
- /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given
- as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However,
- such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of
- the same type, or not." Here, we choose not to. */
- int i;
- IMAGE cp->uuid, cp->uuid_count,
- cp->uuid_value(array of uuids...
- let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints)
- if (cp->juuid != 1)
- return; /* Not present */
-
- for (i = 0; i < cp->uuid_count; i++) {
- fprintf(xmlout, " <UniversalUniqueID BoxType=\"uuid\">
- fprintf(xmlout, " <UUID>%s</UUDI>\n", cp->uuid_value[i]);
- fprintf(xmlout, " <Data>\n");
- /* I think this can be anything, including binary, so do a dump */
- /* Is it better to indent or not indent this content? Indent is better for reading, but
- worse for cut/paste. */
- xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]);
- fprintf(xmlout, " </Data>\n");
- fprintf(xmlout, " </UniversalUniqueID>\n");
- }
-}
-
-void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp)
-{
- /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */
- /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */
- /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */
- /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */
- /* Assume UUIDs stored in canonical string format */
- int i, j;
- IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu(array of ints)
- cp->uinf_uuid(2 dimensional array of uuids... let's say fixed-length strings),
- cp->uinf_url(array of char buffers)
-
- if (cp->uinf != 1)
- return; /* Not present */
-
- for (i = 0; i < cp->uuid_count; i++) {
- fprintf(xmlout, " <UUIDInfo BoxType=\"uinf\">\n");
- fprintf(xmlout, " <UUIDList BoxType=\"ulst\" Count=\"%d\">\n",
- cp->cp->uinf_ulst_nu[i]);
- for (j = 0; j < cp->uinf_ulst_nu[i]; j++) {
- fprintf(xmlout, " <ID Instance=\"%s\">%s</ID>\n",
- cp->uuif_uuid[i][j], j + 1);
- }
- fprintf(xmlout, " </UUIDList>\n");
- fprintf(xmlout, " <DataEntryURL>\n");
- /* Could add VERS and FLAG here */
- fprintf(xmlout, " <LOC>\n");
- fprintf(xmlout, " %s",
- cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */
- fprintf(xmlout, " </LOC>\n");
- fprintf(xmlout, " </DataEntryURL>\n");
- fprintf(xmlout, " </UUIDInfo>\n");
- }
-}
-
-IMAGE these use cp structure,
-extended... but we could use a new data structure instead
-void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp)
-{
- /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions
- shall be acieved through the 'uuid' type." [This implies an unknown
- type would be an error, but then...] "Boxes not explicitly defined in this standard,
- or otherwise unrecognized by a reader, may be ignored."
- Also, it says "the following types are not and will not be used, or used only in
- their existing sense, in future versions of this specification, to avoid conflict
- with existing content using earlier pre-standard versions of this format:
- clip, crgn, matt, kmat, pnot, ctab, load, imap;
- track reference types tmcd, chap, sync,scpt, ssrc"
- [But good luck figuring out the mapping.]
- Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g.,
- JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including
- MJ2] require that readers ignore objects that are unrecognizable to them".
- */
- int i;
- IMAGE cp->unknown_type, cp->unknown_type_count,
- cp->unknown_type_boxtype(array of buf[5]s),
- cp->unknown_type_data(array of chars), cp->unknown_type_len(array of ints)
- if (cp->unknown_type != 1) {
- return; /* Not present */
- }
-
- for (i = 0; i < cp->unknown_type_count; i++) {
- fprintf(xmlout, " <UnknownType BoxType=\"%s\">\n",
- cp->unknown_type_boxtype[i]);
- /* Can be anything, including binary, so do a dump */
- /* Is it better to indent or not indent this content? Indent is better for reading, but
- worse for cut/paste. */
- xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i],
- cp->unknown_type_len[i]);
- fprintf(xmlout, " </UnknownType>\n");
- }
-}
-
-#endif
diff --git a/openjpeg/src/bin/mj2/meta_out.h b/openjpeg/src/bin/mj2/meta_out.h
deleted file mode 100644
index 769ff3917..000000000
--- a/openjpeg/src/bin/mj2/meta_out.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* meta_out.h */
-/* Dump MJ2, JP2 metadata (partial so far) to xml file */
-/* Callable from mj2_to_metadata */
-/* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */
-
-#define BOOL int
-#define FALSE 0
-#define TRUE 1
-
-void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d);
-
-int xml_write_struct(FILE *file, FILE *xmlout, opj_mj2_t * movie,
- unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr);
-
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata.c b/openjpeg/src/bin/mj2/mj2_to_metadata.c
deleted file mode 100644
index 44858c86a..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/* mj2_to_metadata.c */
-/* Dump MJ2, JP2 metadata (partial so far) to xml file */
-/* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine.
-
-The base code in this file was developed by the author as part of a video archiving
-project for the U.S. National Library of Medicine, Bethesda, MD.
-It is the policy of NLM (and U.S. government) to not assert copyright.
-
-A non-exclusive copy of this code has been contributed to the Open JPEG project.
-Except for copyright, inclusion of the code within Open JPEG for distribution and use
-can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere.
-*/
-
-#include "opj_includes.h"
-#include "mj2.h"
-
-#include "mj2_to_metadata.h"
-#include <string.h>
-#include "opj_getopt.h"
-
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-/**
-sample debug callback expecting a FILE* client object
-*/
-void info_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[INFO] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-
-
-/* ------------- */
-
-void help_display()
-{
- /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */
- fprintf(stdout, " Help for the 'mj2_to_metadata' Program\n");
- fprintf(stdout, " ======================================\n");
- fprintf(stdout, "The -h option displays this information on screen.\n\n");
-
- fprintf(stdout,
- "mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n");
- fprintf(stdout,
- "The generated XML shows the structural, but not (yet) curatorial,\n");
- fprintf(stdout,
- "metadata from the movie header and from the JPEG 2000 image and tile\n");
- fprintf(stdout,
- "headers of a sample frame. Excluded: low-level packed-bits image data.\n\n");
-
- fprintf(stdout, "By Default\n");
- fprintf(stdout, "----------\n");
- fprintf(stdout,
- "The metadata includes the jp2 image and tile headers of the first frame.\n");
- fprintf(stdout, "\n");
- fprintf(stdout,
- "Metadata values are shown in 'raw' form (e.g., hexadecimal) as stored in the\n");
- fprintf(stdout,
- "file, and, if apt, in a 'derived' form that is more quickly grasped.\n");
- fprintf(stdout, "\n");
- fprintf(stdout,
- "Notes explaining the XML are embedded as terse comments. These include\n");
- fprintf(stdout, " meaning of non-obvious tag abbreviations;\n");
- fprintf(stdout, " range and precision of valid values;\n");
- fprintf(stdout, " interpretations of values, such as enumerations; and\n");
- fprintf(stdout, " current implementation limitations.\n");
- fprintf(stdout, "\n");
- fprintf(stdout,
- "The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n");
- fprintf(stdout, "\n");
- fprintf(stdout,
- "The file is self-contained and no verification (e.g., against a DTD) is requested.\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "Required Parameters (except with -h)\n");
- fprintf(stdout, "------------------------------------\n");
- fprintf(stdout,
- "[Caution: file strings that contain spaces should be wrapped with quotes.]\n");
- fprintf(stdout,
- "-i input.mj2 : where 'input' is any source file name or path.\n");
- fprintf(stdout,
- " MJ2 files created with 'frames_to_mj2' are supported so far.\n");
- fprintf(stdout,
- " These are silent, single-track, 'MJ2 Simple Profile' videos.\n");
- fprintf(stdout,
- "-o output.xml : where 'output' is any destination file name or path.\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "Optional Parameters\n");
- fprintf(stdout, "-------------------\n");
- fprintf(stdout, "-h : Display this help information.\n");
- fprintf(stdout, "-n : Suppress all mj2_to_metadata notes.\n");
- fprintf(stdout,
- "-t : Include sample-size and chunk-offset tables.\n");
- fprintf(stdout,
- "-f n : where n > 0. Include jp2 header info for frame n [default=1].\n");
- fprintf(stdout, "-f 0 : No jp2 header info.\n");
- fprintf(stdout,
- "-r : Suppress all 'raw' data for which a 'derived' form exists.\n");
- fprintf(stdout, "-d : Suppress all 'derived' data.\n");
- fprintf(stdout,
- " (If both -r and -d given, -r will be ignored.)\n");
- fprintf(stdout,
- "-v string : Verify against the DTD file located by the string.\n");
- fprintf(stdout,
- " Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n");
- fprintf(stdout,
- " Thus, for the distributed DTD placed in the same directory as\n");
- fprintf(stdout,
- " the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n");
- fprintf(stdout,
- " \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n");
- /* More to come */
- fprintf(stdout, "\n");
- /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */
-}
-
-/* ------------- */
-
-int main(int argc, char *argv[])
-{
-
- opj_dinfo_t* dinfo;
- opj_event_mgr_t event_mgr; /* event manager */
-
- FILE *file, *xmlout;
- /* char xmloutname[50]; */
- opj_mj2_t *movie;
-
- char* infile = 0;
- char* outfile = 0;
- char* s, S1, S2, S3;
- int len;
- unsigned int sampleframe = 1; /* First frame */
- char* stringDTD = NULL;
- BOOL notes = TRUE;
- BOOL sampletables = FALSE;
- BOOL raw = TRUE;
- BOOL derived = TRUE;
- mj2_dparameters_t parameters;
-
- while (TRUE) {
- /* ':' after letter means it takes an argument */
- int c = getopt(argc, argv, "i:o:f:v:hntrd");
- /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */
- if (c == -1) {
- break;
- }
- switch (c) {
- case 'i': /* IN file */
- infile = optarg;
- s = optarg;
- while (*s) {
- s++; /* Run to filename end */
- }
- s--;
- S3 = *s;
- s--;
- S2 = *s;
- s--;
- S1 = *s;
-
- if ((S1 == 'm' && S2 == 'j' && S3 == '2')
- || (S1 == 'M' && S2 == 'J' && S3 == '2')) {
- break;
- }
- fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1,
- S2, S3);
- return 1;
-
- /* ----------------------------------------------------- */
- case 'o': /* OUT file */
- outfile = optarg;
- while (*outfile) {
- outfile++; /* Run to filename end */
- }
- outfile--;
- S3 = *outfile;
- outfile--;
- S2 = *outfile;
- outfile--;
- S1 = *outfile;
-
- outfile = optarg;
-
- if ((S1 == 'x' && S2 == 'm' && S3 == 'l')
- || (S1 == 'X' && S2 == 'M' && S3 == 'L')) {
- break;
- }
-
- fprintf(stderr,
- "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3);
- return 1;
-
- /* ----------------------------------------------------- */
- case 'f': /* Choose sample frame. 0 = none */
- sscanf(optarg, "%u", &sampleframe);
- break;
-
- /* ----------------------------------------------------- */
- case 'v': /* Verification by DTD. */
- stringDTD = optarg;
- /* We will not insist upon last 3 chars being "dtd", since non-file
- access protocol may be used. */
- if (strchr(stringDTD, '"') != NULL) {
- fprintf(stderr,
- "-D's string must not contain any embedded double-quote characters.\n");
- return 1;
- }
-
- if (strncmp(stringDTD, "PUBLIC ", 7) == 0 ||
- strncmp(stringDTD, "SYSTEM ", 7) == 0) {
- break;
- }
-
- fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n");
- return 1;
-
- /* ----------------------------------------------------- */
- case 'n': /* Suppress comments */
- notes = FALSE;
- break;
-
- /* ----------------------------------------------------- */
- case 't': /* Show sample size and chunk offset tables */
- sampletables = TRUE;
- break;
-
- /* ----------------------------------------------------- */
- case 'h': /* Display an help description */
- help_display();
- return 0;
-
- /* ----------------------------------------------------- */
- case 'r': /* Suppress raw data */
- raw = FALSE;
- break;
-
- /* ----------------------------------------------------- */
- case 'd': /* Suppress derived data */
- derived = FALSE;
- break;
-
- /* ----------------------------------------------------- */
- default:
- return 1;
- } /* switch */
- } /* while */
-
- if (!raw && !derived) {
- raw = TRUE; /* At least one of 'raw' and 'derived' must be true */
- }
-
- /* Error messages */
- /* -------------- */
- if (!infile || !outfile) {
- fprintf(stderr,
- "Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n");
- return 1;
- }
-
- /* was:
- if (argc != 3) {
- printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n");
- printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n");
- return 1;
- }
- */
- len = strlen(infile);
- if (infile[0] == ' ') {
- infile++; /* There may be a leading blank if user put space after -i */
- }
-
- file = fopen(infile, "rb"); /* was: argv[1] */
-
- if (!file) {
- fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */
- return 1;
- }
-
- len = strlen(outfile);
- if (outfile[0] == ' ') {
- outfile++; /* There may be a leading blank if user put space after -o */
- }
-
- // Checking output file
- xmlout = fopen(outfile, "w"); /* was: argv[2] */
- if (!xmlout) {
- fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */
- return 1;
- }
- // Leave it open
-
- /*
- configure the event callbacks (not required)
- setting of each callback is optional
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* get a MJ2 decompressor handle */
- dinfo = mj2_create_decompress();
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
-
- /* setup the decoder decoding parameters using user parameters */
- movie = (opj_mj2_t*) dinfo->mj2_handle;
- mj2_setup_decoder(dinfo->mj2_handle, &parameters);
-
- if (mj2_read_struct(file, movie)) { // Creating the movie structure
- fclose(xmlout);
- return 1;
- }
-
- xml_write_init(notes, sampletables, raw, derived);
- xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr);
- fclose(xmlout);
-
- fprintf(stderr, "Metadata correctly extracted to XML file \n");;
-
- /* free remaining structures */
- if (dinfo) {
- mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle);
- }
-
- return 0;
-}
-
-
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata.dtd b/openjpeg/src/bin/mj2/mj2_to_metadata.dtd
deleted file mode 100644
index 249de1a07..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata.dtd
+++ /dev/null
@@ -1,425 +0,0 @@
-<!--
-Preliminary DTD for Open JPEG "mj2_to_metadata" function.
-Last revised: April 20, 2005
-Author: Glenn Pearson, at U.S. National Library of Medicine.
-See mj2_to_metadata.c regarding copyright, license, disclaimer status.
-
-While the vocabulary of this DTD is based on the relevant portions of the
-ISO/IEC JPEG 200 standard, the detailed representation is the author's own.
-It is neither an ISO/IEC nor NLM official or consensus representation.
-Furthermore, it deviates from a pure representation of the ISO/IEC standard
-in these aspects:
-
- - it is incomplete in a number of ways (which to some extent may be
- addressed over time);
- - it has extensions for "derived" data and "statistics";
- - it is more flexible. That is, some elements are marked as optional
- not because they are optional in an MJ2 file, but because reporting
- of them is optional based on current or projected mj2_to_metadata
- command-line flags.
--->
-<!ELEMENT MJ2_File (JP2?, FileType?, MovieBox?)>
-<!ELEMENT JP2 EMPTY>
-<!ATTLIST JP2 BoxType CDATA #FIXED "jP[space][space]">
-<!ATTLIST JP2 Signature CDATA #FIXED "0x0d0a870a">
-<!ELEMENT FileType (Brand, MinorVersion, CompatibilityList)>
-<!ATTLIST FileType BoxType CDATA #FIXED "ftyp">
-<!ELEMENT Brand (#PCDATA)> <!-- 4 characters max -->
-<!ELEMENT MinorVersion (#PCDATA)> <!-- 4 chararcters max -->
-<!ELEMENT CompatibilityList (CompatibleBrand)*>
-<!ATTLIST CompatibilityList Count CDATA #REQUIRED> <!-- Count >= 0 -->
-<!ELEMENT CompatibleBrand (#PCDATA)> <!-- 4 characters max -->
-<!ELEMENT MovieBox (MovieHeader, Statistics?, Track*)>
-<!ATTLIST MovieBox BoxType CDATA #FIXED "moov">
-<!ELEMENT MovieHeader (CreationTime, ModificationTime, Timescale, Rate, Duration, Volume, TransformationMatrix)>
-<!ATTLIST MovieHeader BoxType CDATA #FIXED "mvhd">
-<!ELEMENT CreationTime (InSeconds?,AsLocalTime?)>
-<!ELEMENT InSeconds (#PCDATA)>
-<!ELEMENT AsLocalTime (#PCDATA)>
-<!ELEMENT ModificationTime (InSeconds?,AsLocalTime?)>
-<!ELEMENT Timescale (#PCDATA)> <!-- Timescale defines time units in one second -->
-<!ELEMENT Rate (AsHex | (AsHex, AsDecimal) | AsDecimal)> <!-- Decimal is Approximation; Optional on input. -->
-<!ELEMENT AsHex (#PCDATA)>
-<!ELEMENT AsDecimal (#PCDATA)>
-<!ELEMENT Duration (InTimeUnits | (InTimeUnits, InSeconds) | InSeconds)> <!-- InSeconds Optional on input. -->
-<!ELEMENT InTimeUnits (#PCDATA)>
-<!ELEMENT Volume (AsHex | (AsHex, AsDecimal) | AsDecimal)> <!-- hex default = 0x0100 -->
-<!-- Fixed 8.8 value of audio volume. Full, normal value is 1.0 (0x0100) -->
-<!ELEMENT TransformationMatrix (TMa,TMb,TMu,TMc,TMd,TMv,TMx,TMy,TMw)> <!-- for video -->
-<!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 -->
-<!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) -->
-<!-- Stored as Fixed Point Hex: all are 16.16, except u,v,w are 2.30 -->
-<!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 -->
-<!ELEMENT TMa (#PCDATA)>
-<!ELEMENT TMb (#PCDATA)>
-<!ELEMENT TMu (#PCDATA)> <!--Always "0x00000000" -->
-<!ELEMENT TMc (#PCDATA)>
-<!ELEMENT TMd (#PCDATA)>
-<!ELEMENT TMv (#PCDATA)> <!--Always "0x00000000" -->
-<!ELEMENT TMx (#PCDATA)>
-<!ELEMENT TMy (#PCDATA)>
-<!ELEMENT TMw (#PCDATA)> <!--Always "0x40000000" -->
-
-<!ELEMENT Statistics (TracksFound)>
-<!ELEMENT TracksFound (Video,Audio,Hint)>
-<!ELEMENT Video (#PCDATA)>
-<!ELEMENT Audio (#PCDATA)>
-<!ELEMENT Hint (#PCDATA)>
-
-
-<!-- For now, output info on at most one video track -->
-
-
-<!ELEMENT Track (TrackHeader, TrackReferenceContainer?, EditListContainer?, Media, JP2_Frame?)> <!-- JP2_Frame is mj2_to_metadata extension -->
-<!ATTLIST Track BoxType CDATA #FIXED "trak">
-<!ATTLIST Track Instance CDATA #REQUIRED>
-<!ELEMENT TrackHeader (TrackID, TrackLayer?, Volume?, TransformationMatrix?, Width?, Height?)>
-<!ATTLIST TrackHeader BoxType CDATA #FIXED "tkhd">
-<!-- Not shown here: CreationTime, ModificationTime, Duration. -->
-<!-- These 3 fields are reported under MediaHeader below. When reading these 3, -->
-<!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. -->
-<!-- If both found, value read from MediaHeader is used. -->
-<!ELEMENT TrackID (#PCDATA)>
-<!ELEMENT TrackLayer (#PCDATA)> <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. -->
-<!-- "Volume" element described above; here it is for particular audio track. Full, normal (default = 0x0100) -->
-<!-- "TransformationMatrix" element described above; matrix here is applied before MovieHeader one. -->
-<!ELEMENT Width (AsHex | (AsHex, AsDecimal) | AsDecimal)>
-<!ELEMENT Height (AsHex | (AsHex, AsDecimal) | AsDecimal)>
-<!-- AsHex, AsDecimal already defined above -->
- <!-- Width and Height are for the presentation; frames will be scaled to this -->
-<!-- /TrackHeader -->
-<!ELEMENT TrackReferenceContainer ANY> <!-- TO DO: TrackReferenceContainer 'tref' just used in hint track -->
-<!ELEMENT EditListContainer ANY> <!-- TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate -->
-<!ELEMENT Media (MediaHeader, HandlerReference,MediaInfoContainer)>
-<!ATTLIST Media BoxType CDATA #FIXED "mdia">
-<!ELEMENT MediaHeader (CreationTime,ModificationTime,Timescale,Duration,Language)>
-<!ATTLIST MediaHeader BoxType CDATA #FIXED "mdhd">
-<!-- Elements already defined above: CreationTime, ModificationTime, Timescale, Duration -->
-<!ELEMENT Language (#PCDATA)> <!-- 3 chars max. There's an enumeration available -->
-<!ELEMENT HandlerReference (HandlerType)>
-<!ATTLIST HandlerReference BoxType CDATA #FIXED "hdlr">
-<!ELEMENT HandlerType (#PCDATA)>
-<!ATTLIST HandlerType Code ( vide | soun | hint ) "vide">
-
-<!-- make the media headers multiple? -->
-<!ELEMENT MediaInfoContainer ((VideoMediaHeader | SoundMediaHeader | HintMediaHeader), DataInfo, SampleTable)>
-<!ATTLIST MediaInfoContainer BoxType CDATA #FIXED "minf">
-<!ELEMENT VideoMediaHeader (GraphicsMode, Opcolor)>
-<!ATTLIST VideoMediaHeader BoxType CDATA #FIXED "vmhd">
-<!ELEMENT GraphicsMode (#PCDATA)>
- <!-- Enumerated values of graphics mode: -->
- <!-- 0x00 = copy (over existing image); -->
- <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; -->
- <!-- 0x100 = alpha; alpha-blend this image -->
- <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; -->
- <!-- 0x102 = blackalpha; alpha-blend this image, which has been blended with black. -->
-<!ELEMENT Opcolor (Red,Green,Blue)>
-<!ELEMENT Red (#PCDATA)>
-<!ELEMENT Green (#PCDATA)>
-<!ELEMENT Blue (#PCDATA)>
-<!ELEMENT SoundMediaHeader (Balance)>
-<!ATTLIST SoundMediaHeader BoxType CDATA #FIXED "smhd">
-<!ELEMENT Balance (#PCDATA)>
- <!-- Fixed Point 8.8, fixes mono track in stereo space. -->
- <!-- 0.0 = center, -1.0 = full left, 1.0 = full right -->
-<!ELEMENT HintMediaHeader (MaxPDU_Size, AvgPDU_Size, MaxBitRate, AvgBitRate, SlidingAvgBitRate)>
-<!ATTLIST HintMediaHeader BoxType CDATA #FIXED "hmhd">
-<!ELEMENT MaxPDU_Size (#PCDATA)>
- <!-- Size in bytes of largest PDU in this hint stream. -->
-<!ELEMENT AvgPDU_Size (#PCDATA)>
- <!-- Average size in bytes of a PDU over the entire presentation. -->
-<!ELEMENT MaxBitRate (#PCDATA)>
- <!-- Maximum rate in bits per second over any window of 1 second. -->
-<!ELEMENT AvgBitRate (#PCDATA)>
- <!-- Averate rate in bits per second over the entire presentation. -->
-<!ELEMENT SlidingAvgBit (#PCDATA)>
- <!-- Maximum rate in bits per second over any window of one minute. -->
-
-<!ELEMENT DataInfo (DataReference)>
-<!ATTLIST DataInfo BoxType CDATA #FIXED "dinf">
-<!ELEMENT DataReference (DataEntryUrlBox | DataEntryUrnBox )*>
-<!ATTLIST DataReference BoxType CDATA #FIXED "dref">
-<!ATTLIST DataReference URL_Count CDATA #REQUIRED>
-<!ATTLIST DataReference URN_Count CDATA #REQUIRED> <!-- table w. flags, URLs, URNs -->
-<!-- // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs.
- // We could infer those, but for now just present everything as a DREF table.
--->
- <!-- No entries here mean that file is self-contained, as required by Simple Profile. -->
-
-<!ELEMENT DataEntryUrlBox (Location)>
-<!ATTLIST DataEntryUrlBox BoxType CDATA #FIXED "url[space]"> <!-- table w. flags, URLs, URNs -->
- <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. -->
-<!ELEMENT DataEntryUrnBox (Name, Location?)>
-<!ATTLIST DataEntryUrnBox BoxType CDATA #FIXED "urn[space]\">
- <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. -->
-
-<!ELEMENT SampleTable (VisualSampleEntry,TimeToSample,SampleToChunk,SampleSize,ChunkOffset)> <!-- structure doesn't do non-visual sample entry yet -->
-<!ATTLIST SampleTable BoxType CDATA #FIXED "stbl"> <!-- to add: entry count -->
- <!-- Next are instances of generic SampleDescription BoxType=\"stsd\" -->
-
- <!-- There could be multiple instances of this, but "entry_count" is just a local at read-time.
- And it's used wrong, too, as count of just visual type, when it's really all 3 types.
- This is referred to as "smj2" within mj2.c -->
-<!ELEMENT VisualSampleEntry (WidthAsInteger, HeightAsInteger, HorizontalRes, VerticalRes, CompressorName, Depth, JP2Header?, FieldCoding?, MJP2_Profile?, MJP2_Prefix?, MJP2_SubSampling?, MJP2_OriginalFormat?)>
-<!ATTLIST VisualSampleEntry BoxType CDATA #FIXED "mjp2">
- <!-- If multiple instances of this, only first is shown here. -->
-<!ELEMENT WidthAsInteger (#PCDATA)>
-<!ELEMENT HeightAsInteger (#PCDATA)>
-<!ELEMENT HorizontalRes (AsHex | (AsHex, AsDecimal) | AsDecimal)>
-<!ELEMENT VerticalRes (AsHex | (AsHex, AsDecimal) | AsDecimal)>
-<!-- Typical value for both resolution is 72 (0x00480000) -->
-<!ELEMENT CompressorName (#PCDATA)>
- <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. -->
- <!-- Usually blank or \"Motion JPEG2000\" -->
-<!ELEMENT Depth (#PCDATA)>
- <!-- Depth is: -->
- <!-- 0x20: alpha channels present (color or grayscale) -->
- <!-- 0x28: grayscale without alpha -->
- <!-- 0x18: color without alpha -->
-
-<!-- TODO somewhere: tk->jp2_struct.numcomps -->
-<!ELEMENT JP2Header (ImageHeader, ColourSpecification)>
-<!ATTLIST JP2Header BoxType CDATA #FIXED "jp2h">
-<!ELEMENT ImageHeader (HEIGHT, WIDTH, NC, BPC, C, UnkC, IPR)>
-<!ATTLIST ImageHeader BoxType CDATA #FIXED "ihdr">
-<!ELEMENT HEIGHT (#PCDATA)> <!-- If 2 fields/frame, total deinterlaced height -->
-<!ELEMENT WIDTH (#PCDATA)>
-<!ELEMENT NC (#PCDATA)> <!-- number of components -->
-<!ELEMENT BPC (AsHex | (AsHex,BitsPerPixel,Signed) | (BitsPerPixel,Signed))>
-<!ELEMENT BitsPerPixel (#PCDATA)>
-<!ELEMENT Signed (#PCDATA)>
-<!ELEMENT C (#PCDATA)> <!-- Compression type. Only "7" defined -->
-<!ELEMENT UnkC (#PCDATA)> <!-- Colourspace Unknown. 1 = unknown, 0 = known -->
-<!ELEMENT IPR (#PCDATA)> <!-- 1 = frame has Intellectual Prop. box; otherwise 0 -->
-<!ELEMENT ColourSpecification (METH, PREC, APPROX, EnumCS)>
-<!ATTLIST ColourSpecification BoxType CDATA #FIXED "colr">
-<!ELEMENT METH (#PCDATA)> <!-- 1 = EnumCS field; 2 = PROFILE field (not yet generated) -->
-<!ELEMENT PREC (#PCDATA)> <!-- precedence must be 0 so far -->
-<!ELEMENT APPROX (#PCDATA)> <!-- colourspace approximation must be 0 so far -->
-<!ELEMENT EnumCS (#PCDATA)> <!-- Valid enumerated MJ2 colourspaces: 16 (sRGB), 17 (grey sRGB), 18 (YCC) -->
-
-<!-- Following subboxes are optional -->
-<!ELEMENT FieldCoding (FieldCount, FieldOrder)>
-<!ATTLIST FieldCoding BoxType CDATA #FIXED "fiel">
-<!ELEMENT FieldCount (#PCDATA)>
- <!-- Must be either 1 or 2 -->
-<!ELEMENT FieldOrder (#PCDATA)>
- <!-- When FieldCount=2, FieldOrder means: -->
- <!-- 0: Field coding unknown -->
- <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order -->
- <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order -->
- <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->
- <!-- Current implementation doesn't retain whether box was actually present. -->
-
-<!ELEMENT MJP2_Profile (CompatibleBrand*)>
-<!ATTLIST MJP2_Profile BoxType CDATA #FIXED "jp2p">
-<!ATTLIST MJP2_Profile Count CDATA #REQUIRED>
-
-<!ELEMENT MJP2_Prefix (Data*)>
-<!ATTLIST MJP2_Prefix BoxType CDATA #FIXED "jp2x">
-<!ATTLIST MJP2_Prefix Count CDATA #REQUIRED>
-<!-- We'll probably need better formatting than this -->
-<!ELEMENT Data (#PCDATA)> <!-- Multiple. Each entry is single byte -->
-
-<!ELEMENT MJP2_SubSampling (HorizontalSub, VerticalSub, HorizontalOffset, VerticalOffset)>
-<!ATTLIST MJP2_SubSampling BoxType CDATA #FIXED "jsub">
-<!-- These values are all 1 byte -->
- <!-- Typical subsample value is 2 for 4:2:0 -->
-<!ELEMENT HorizontalSub (#PCDATA)>
-<!ELEMENT VerticalSub (#PCDATA)>
-<!ELEMENT HorizontalOffset (#PCDATA)>
-<!ELEMENT VerticalOffset (#PCDATA)>
-
-<!ELEMENT MJP2_OriginalFormat (OriginalFieldCount, OriginalFieldOrder)>
-<!ATTLIST MJP2_OriginalFormat BoxType CDATA #FIXED "orfo"> <!-- Part III Appx. 2 -->
-<!ELEMENT OriginalFieldCount (#PCDATA)>
- <!-- In original material before encoding. Must be either 1 or 2 -->
-<!ELEMENT OriginalFieldOrder (#PCDATA)>
- <!-- When FieldCount=2, FieldOrder means: -->
- <!-- 0: Field coding unknown -->
- <!-- 11: Topmost line came from the earlier field; -->
- <!-- 16: Topmost line came form the later field. -->
- <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->
- <!-- Current implementation doesn't retain whether box was actually present. -->
-
-
- <!-- mj2_to_metadata's data structure doesn't record Audio and Hint sample data currently. -->
-
-<!-- Within SampleTable: -->
-<!ELEMENT TimeToSample (SampleStatistics, SampleEntries)>
-<!ATTLIST TimeToSample BoxType CDATA #FIXED "stts">
-<!ELEMENT SampleStatistics (TotalSamples)> <!-- Not part of standard -->
-<!ELEMENT TotalSamples (#PCDATA)>
- <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table -->
-
-<!ELEMENT SampleEntries (Table*)>
-<!ATTLIST SampleEntries EntryCount CDATA #REQUIRED>
-<!ELEMENT Table EMPTY> <!-- Multiple. Attributes have values -->
-<!ATTLIST Table Entry CDATA #REQUIRED>
-<!ATTLIST Table SampleCount CDATA #REQUIRED>
-<!ATTLIST Table SampleDelta CDATA #REQUIRED>
-
-<!-- Within SampleTable: -->
-<!ELEMENT SampleToChunk (FirstChunk,SamplesPerChunk,SampleDescrIndex)>
-<!ATTLIST SampleToChunk BoxType CDATA #FIXED "stsc">
-<!ATTLIST SampleToChunk Count CDATA #REQUIRED>
-<!ELEMENT FirstChunk (#PCDATA)>
-<!ELEMENT SamplesPerChunk (#PCDATA)>
-<!ELEMENT SampleDescrIndex (#PCDATA)>
-<!ELEMENT SampleSize (Sample_Size,Sample_Count,EntrySize*)>
-<!ATTLIST SampleSize BoxType CDATA #FIXED "stsz">
-<!ELEMENT Sample_Size (#PCDATA)>
-<!ELEMENT Sample_Count (#PCDATA)>
-<!ELEMENT EntrySize (#PCDATA)> <!-- appears multiply, but only with mj2_to_metadata option -t -->
-<!ATTLIST EntrySize Num CDATA #REQUIRED>
-<!ELEMENT ChunkOffset (EntryCount, Chunk_Offset*)>
-<!ATTLIST ChunkOffset BoxType CDATA #FIXED "stco">
-<!ELEMENT EntryCount (#PCDATA)>
-<!ELEMENT Chunk_Offset (#PCDATA)> <!-- appears multiply, but only with mj2_to_metadata option -t -->
-<!ATTLIST Chunk_Offset Num CDATA #REQUIRED>
-<!-- </SampleTable> </MediaInfoContainer> </Media> -->
-
-<!-- TO DO: optional UserData 'udat', can contain multiple Copyright 'cprt' -->
-
-
-<!-- Optional, and only for Visual Track: given individual frame -->
-<!ELEMENT JP2_Frame (MainHeader, TilePartHeaders)>
-<!ATTLIST JP2_Frame Num CDATA #REQUIRED>
-<!ELEMENT MainHeader (StartOfCodestream,ImageAndFileSize,CodingStyleDefault,QuantizationDefault,QuantizationComponent*,RegionOfInterest?,ProgressionOrderChange*)>
-<!ELEMENT StartOfCodestream EMPTY>
-<!ATTLIST StartOfCodestream Marker CDATA #FIXED "SOC">
-<!ELEMENT ImageAndFileSize (Xsiz,Ysiz,XOsiz,YOsiz,XTsiz,YTsiz,XTOsiz,YTOsiz,Csiz,Component+)>
-<!ATTLIST ImageAndFileSize Marker CDATA #FIXED "SIZ">
-<!ELEMENT Xsiz (#PCDATA)>
-<!ELEMENT Ysiz (#PCDATA)> <!-- Xsiz, Ysiz is the size of the reference grid. -->
-<!ELEMENT XOsiz (#PCDATA)>
-<!ELEMENT YOsiz (#PCDATA)> <!-- XOsiz, YOsiz are offsets from grid origin to image origin. -->
-<!ELEMENT XTsiz (#PCDATA)>
-<!ELEMENT YTsiz (#PCDATA)> <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. -->
-<!ELEMENT XTOsiz (#PCDATA)>
-<!ELEMENT YTOsiz (#PCDATA)> <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. -->
-<!ELEMENT Csiz (#PCDATA)> <!-- Csiz is the number of components in the image. -->
-<!-- For image components next -->
-<!ELEMENT Component (Ssiz,XRsiz,YRsiz,WidthOfData,HeightOfData)>
-<!ATTLIST Component Num CDATA #REQUIRED>
-<!ELEMENT Ssiz (AsHex | (AsHex,Signed,PrecisionInBits) | (Signed,PrecisionInBits))>
-<!-- Signed already defined -->
-<!ELEMENT PrecisionInBits (#PCDATA)> <!-- Bits per pixel (bpp) or pixel depth. -->
-<!ELEMENT XRsiz (#PCDATA)>
-<!ELEMENT YRsiz (#PCDATA)> <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. -->
-<!ELEMENT WidthOfData (#PCDATA)>
-<!ELEMENT HeightOfData (#PCDATA)> <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) -->
-<!-- -->
-<!ELEMENT CodingStyleDefault (Scod,SGcod,SPcod)>
-<!ATTLIST CodingStyleDefault Marker CDATA #FIXED "COD">
-<!ELEMENT Scod (#PCDATA)>
- <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): -->
- <!-- bit 0: Defines entropy coder precincts -->
- <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. -->
- <!-- bit 1: 1 = SOP marker may be used; 0 = not. -->
- <!-- bit 2: 1 = EPH marker may be used; 0 = not. -->
-<!ELEMENT SGcod (ProgressionOrder,NumberOfLayers,MultipleComponentTransformation)>
-<!ELEMENT ProgressionOrder (#PCDATA)>
- <!-- Defined Progression Order Values are: -->
- <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->
- <!-- where L = "layer", R = "resolution level", C = "component", P = "position". -->
-<!ELEMENT NumberOfLayers (#PCDATA)>
-<!ELEMENT MultipleComponentTransformation (#PCDATA)>
- <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G -->
-<!ELEMENT SPcod (NumberOfDecompositionLevels,CodeblockWidth,CodeblockHeight,CodeblockStyle,Transformation)>
-<!ELEMENT NumberOfDecompositionLevels (#PCDATA)>
-<!ELEMENT CodeblockWidth (#PCDATA)> <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->
-<!ELEMENT CodeblockHeight (#PCDATA)> <!-- Codeblock dimension is 2^(value + 2) -->
-<!ELEMENT CodeblockStyle (#PCDATA)>
- <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->
- <!-- bit 0: Selective arithmetic coding bypass. -->
- <!-- bit 1: Reset context probabilities on coding pass boundaries. -->
- <!-- bit 2: Termination on each coding pass. -->
- <!-- bit 3: Vertically causal context. -->
- <!-- bit 4: Predictable termination. -->
- <!-- bit 5: Segmentation symbols are used. -->
-<!ELEMENT Transformation (#PCDATA)> <!-- For Transformation, 0="9-7 irreversible filter", 1="5-3 reversible filter" -->
- <!-- mj2_to_metadata implementation always reports component[0] as using default COD, -->
- <!-- and any other component, with main-header style values different from [0], as COC. -->
-<!ELEMENT QuantizationDefault (Sqcd,SPqcd)>
-<!ATTLIST QuantizationDefault Marker CDATA #FIXED "QCD">
-<!ELEMENT Sqcd (AsHex | (AsHex,QuantizationStyle,NumberOfGuardBits) | (QuantizationStyle,NumberOfGuardBits))>
-<!ELEMENT QuantizationStyle (#PCDATA)> <!-- Default quantization style for all components. -->
- <!-- Quantization style (in Sqcd's low 5 bits) may be: -->
- <!-- 0 = No quantization. SPqcd size = 8 bits-->
- <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. -->
- <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. -->
-<!ELEMENT NumberOfGuardBits (#PCDATA)> <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) -->
-<!ELEMENT SPqcd (ReversibleStepSizeValue | QuantizationStepSizeValues )> <!-- TO DO: Irreversible choices -->
-<!ELEMENT ReversibleStepSizeValue (DynamicRangeExponent+)>
- <!-- Current mj2_to_metadata implementation dumps entire internal table, -->
- <!-- until an exponent with zero value is reached. -->
- <!-- Exponent epsilon(b) of reversible dynamic range. -->
- <!-- Hex value is as stored, in high-order 5 bits. -->
-<!ELEMENT DynamicRangeExponent (AsHex | (AsHex, AsDecimal) | AsDecimal)>
-<!ATTLIST DynamicRangeExponent Subband CDATA #REQUIRED>
-<!ELEMENT QuantizationStepSizeValues (QuantizationValues+, CalculatedExponent*)> <!-- Calculated exponents iff only subband 0 reported -->
-<!ELEMENT QuantizationValues (AsHex | (AsHex,Exponent,Mantissa) | (Exponent,Mantissa))>
-<!ATTLIST QuantizationValues Subband CDATA #REQUIRED>
-<!ELEMENT Exponent (#PCDATA)>
-<!ELEMENT Mantissa (#PCDATA)>
-<!ELEMENT CalculatedExponent (#PCDATA)>
-<!ATTLIST CalculatedExponent Subband CDATA #REQUIRED>
-<!-- /QuantizationDefault -->
- <!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->
- <!-- and any other component, with main-header quantization values different from [0], as QCC. -->
-<!ELEMENT QuantizationComponent (Sqcc,SPqcc)>
-<!ATTLIST QuantizationComponent Marker CDATA #FIXED "QCC">
-<!ATTLIST QuantizationComponent Component CDATA #REQUIRED>
-<!ELEMENT Sqcc (AsHex | (AsHex,QuantizationStyle,NumberOfGuardBits) | (QuantizationStyle,NumberOfGuardBits))>
-<!ELEMENT SPqcc (ReversibleStepSizeValue | QuantizationStepSizeValues )> <!-- TO DO: Irreversible choices -->
-<!-- /QuantizationComponent -->
-<!-- Don't know if MJ2 files can have regions of interest. Assume yes -->
-<!ELEMENT RegionOfInterest (Srgn,Crgn,Sprgn)> <!-- Optional in main header, at most 1 per component -->
-<!ATTLIST RegionOfInterest Marker CDATA #FIXED "RGN">
-<!ELEMENT Srgn (#PCDATA)> <!-- ROI style. Only style=0 defined: Implicit ROI (max. shift) -->
-<!ELEMENT Crgn (#PCDATA)> <!-- Zero-based component number. -->
-<!ELEMENT SPrgn (#PCDATA)> <!-- Implicit ROI shift, i.e., binary shifting of ROI coefficients above background. -->
-<!-- </RegionOfInterest> -->
-<!ELEMENT ProgressionOrderChange (Progression+)> <!-- Optional in main header, at most 1 per component (but impl allows more?) -->
-<!ATTLIST ProgressionOrderChange Marker CDATA #REQUIRED>
-<!ELEMENT Progression (RSpoc,CSpoc,LYEpoc,REpoc,CEpoc,Ppoc)>
-<!ATTLIST Progression Num CDATA #REQUIRED>
-<!ELEMENT RSpoc (#PCDATA)> <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 -->
-<!ELEMENT CSpoc (#PCDATA)> <!-- Component index (inclusive) for progression start. -->
-<!ELEMENT LYEpoc (#PCDATA)> <!-- Layer index (exclusive) for progression end. -->
-<!ELEMENT REpoc (#PCDATA)> <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 -->
-<!ELEMENT CEpoc (#PCDATA)> <!-- Component index (exclusive) for progression end. Minimum: CSpoc -->
-<!ELEMENT Ppoc (#PCDATA)> <!-- Defined Progression Order Values are: -->
- <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->
- <!-- where L = "layer", R = "resolution level", C = "component", P = "position". -->
-<!-- </Progression>, </ProgressionOrderChange -->
-<!-- /MainHeader -->
-<!ELEMENT TilePartHeaders (TilePartHeader+)>
-<!ATTLIST TilePartHeaders Count CDATA #REQUIRED>
-<!ELEMENT TilePartHeader (StartOfTilePart,CodingStyleDefault,QuantizationDefault,QuantizationComponent*,RegionOfInterest?,ProgressionOrderChange*,StartOfData)>
-<!ATTLIST TilePartHeader Num CDATA #REQUIRED>
-<!ATTLIST TilePartHeader ID CDATA #REQUIRED>
-<!ELEMENT StartOfTilePart EMPTY>
-<!ATTLIST StartOfTilePart Marker CDATA #FIXED "SOT">
-<!-- CodingStyleDefault, QuantizationDefault, QuantizationComponent already defined -->
- <!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->
- <!-- and any other component, with tile-part-header quantization values different from [0], as QCC. -->
-<!ELEMENT StartOfData EMPTY> <!-- always empty for now -->
-<!ATTLIST StartOfData Marker CDATA #FIXED "SOD">
- <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. -->
-<!-- /TilePartHeader, /TilePartHeaders, /JP2_Frame -->
-<!-- </Track> -->
-
-<!-- to come:
- <MovieExtends mvek> // possibly not in Simple Profile
- <UserDataBox udat> contains <CopyrightBox cprt>
- -->
-<!-- /MovieBox -->
-<!-- To come:
- <mdat>
- <moof> // probably not in Simple Profile
- <free>
- <skip>
- -->
-<!-- </MJ2_File> --> \ No newline at end of file
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata.h b/openjpeg/src/bin/mj2/mj2_to_metadata.h
deleted file mode 100644
index f4c349191..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* mj2_to_metadata.h */
-/* Dump MJ2, JP2 metadata (partial so far) to xml file */
-/* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */
-
-#define BOOL int
-#define FALSE 0
-#define TRUE 1
-
-#include "meta_out.h"
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata.sln b/openjpeg/src/bin/mj2/mj2_to_metadata.sln
deleted file mode 100644
index f579c536a..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata.sln
+++ /dev/null
@@ -1,29 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mj2_to_metadata", "mj2_to_metadata.vcproj", "{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"
- ProjectSection(ProjectDependencies) = postProject
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} = {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibOpenJPEG", "..\LibOpenJPEG.vcproj", "{0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.ActiveCfg = Debug|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.Build.0 = Debug|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.ActiveCfg = Release|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.Build.0 = Release|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.ActiveCfg = Debug|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.Build.0 = Debug|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.ActiveCfg = Release|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata.vcproj b/openjpeg/src/bin/mj2/mj2_to_metadata.vcproj
deleted file mode 100644
index a8000f306..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="mj2_to_metadata"
- ProjectGUID="{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\mj2_to_metadata___Win32_Debug0"
- IntermediateDirectory=".\mj2_to_metadata___Win32_Debug0"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../libopenjpeg"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pch"
- AssemblerListingLocation=".\mj2_to_metadata___Win32_Debug0/"
- ObjectFile=".\mj2_to_metadata___Win32_Debug0/"
- ProgramDataBaseFileName=".\mj2_to_metadata___Win32_Debug0/"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="2057"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.exe"
- LinkIncremental="2"
- SuppressStartupBanner="true"
- IgnoreDefaultLibraryNames="LIBCMT"
- GenerateDebugInformation="true"
- ProgramDatabaseFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release"
- IntermediateDirectory=".\Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\Release/mj2_to_metadata.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="../libopenjpeg"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\Release/mj2_to_metadata.pch"
- AssemblerListingLocation=".\Release/"
- ObjectFile=".\Release/"
- ProgramDataBaseFileName=".\Release/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="2057"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\Release/mj2_to_metadata.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- IgnoreDefaultLibraryNames="libcmtd"
- ProgramDatabaseFile=".\Release/mj2_to_metadata.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Release/mj2_to_metadata.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="MJ2"
- >
- <Filter
- Name="MJ2 Header Files"
- >
- <File
- RelativePath="compat\opj_getopt.h"
- >
- </File>
- <File
- RelativePath="meta_out.h"
- >
- </File>
- <File
- RelativePath="mj2.h"
- >
- </File>
- <File
- RelativePath="mj2_convert.h"
- >
- </File>
- <File
- RelativePath="mj2_to_metadata.h"
- >
- </File>
- </Filter>
- <Filter
- Name="MJ2 Source Files"
- >
- <File
- RelativePath="compat\opj_getopt.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="meta_out.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2_convert.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2_to_metadata.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/openjpeg/src/bin/mj2/mj2_to_metadata_Notes.doc b/openjpeg/src/bin/mj2/mj2_to_metadata_Notes.doc
deleted file mode 100644
index 05ccec206..000000000
--- a/openjpeg/src/bin/mj2/mj2_to_metadata_Notes.doc
+++ /dev/null
Binary files differ
diff --git a/openjpeg/src/bin/mj2/opj_mj2_compress.c b/openjpeg/src/bin/mj2/opj_mj2_compress.c
deleted file mode 100644
index 4baefe670..000000000
--- a/openjpeg/src/bin/mj2/opj_mj2_compress.c
+++ /dev/null
@@ -1,852 +0,0 @@
-/*
-* Copyright (c) 2003-2004, Francois-Olivier Devaux
-* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-* 1. Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-* 2. Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in the
-* documentation and/or other materials provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "opj_apps_config.h"
-#include "openjpeg.h"
-#include "j2k_lib.h"
-#include "cio.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "mj2.h"
-#include "mj2_convert.h"
-#include "opj_getopt.h"
-
-/**
-Size of memory first allocated for MOOV box
-*/
-#define TEMP_BUF 10000
-
-
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-static void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-static void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-
-static void help_display()
-{
- fprintf(stdout, "HELP for frames_to_mj2\n----\n\n");
- fprintf(stdout, "- the -h option displays this help information on screen\n\n");
-
-
- fprintf(stdout, "List of parameters for the MJ2 encoder:\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "REMARKS:\n");
- fprintf(stdout, "---------\n");
- fprintf(stdout, "\n");
- fprintf
- (stdout, "The markers written to the main_header are : SOC SIZ COD QCD COM.\n");
- fprintf
- (stdout, "COD and QCD never appear in the tile_header.\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "By default:\n");
- fprintf(stdout, "------------\n");
- fprintf(stdout, "\n");
- fprintf(stdout, " * Lossless\n");
- fprintf(stdout, " * 1 tile\n");
- fprintf(stdout, " * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n");
- fprintf(stdout, " * Size of code-block : 64 x 64\n");
- fprintf(stdout, " * Number of resolutions: 6\n");
- fprintf(stdout, " * No SOP marker in the codestream\n");
- fprintf(stdout, " * No EPH marker in the codestream\n");
- fprintf(stdout, " * No sub-sampling in x or y direction\n");
- fprintf(stdout, " * No mode switch activated\n");
- fprintf(stdout, " * Progression order: LRCP\n");
- fprintf(stdout, " * No index file\n");
- fprintf(stdout, " * No ROI upshifted\n");
- fprintf(stdout, " * No offset of the origin of the image\n");
- fprintf(stdout, " * No offset of the origin of the tiles\n");
- fprintf(stdout, " * Reversible DWT 5-3\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "Parameters:\n");
- fprintf(stdout, "------------\n");
- fprintf(stdout, "\n");
- fprintf
- (stdout, "Required Parameters (except with -h):\n");
- fprintf
- (stdout, "-i : source file (-i source.yuv) \n");
- fprintf
- (stdout, "-o : destination file (-o dest.mj2) \n");
- fprintf
- (stdout, "Optional Parameters:\n");
- fprintf(stdout, "-h : display the help information \n");
- fprintf(stdout,
- "-r : different compression ratios for successive layers (-r 20,10,5)\n");
- fprintf(stdout,
- " - The rate specified for each quality level is the desired \n");
- fprintf(stdout, " compression factor.\n");
- fprintf(stdout, " Example: -r 20,10,1 means quality 1: compress 20x, \n");
- fprintf(stdout,
- " quality 2: compress 10x and quality 3: compress lossless\n");
- fprintf(stdout, " (options -r and -q cannot be used together)\n");
-
- fprintf(stdout, "-q : different psnr for successive layers (-q 30,40,50) \n");
- fprintf(stdout, " (options -r and -q cannot be used together)\n");
-
- fprintf(stdout, "-n : number of resolutions (-n 3) \n");
- fprintf(stdout, "-b : size of code block (-b 32,32) \n");
- fprintf(stdout, "-c : size of precinct (-c 128,128) \n");
- fprintf(stdout, "-t : size of tile (-t 512,512) \n");
- fprintf
- (stdout, "-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n");
- fprintf
- (stdout, "-s : subsampling factor (-s 2,2) [-s X,Y] \n");
- fprintf(stdout, " Remark: subsampling bigger than 2 can produce error\n");
- fprintf
- (stdout, "-S : write SOP marker before each packet \n");
- fprintf
- (stdout, "-E : write EPH marker after each header packet \n");
- fprintf
- (stdout, "-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n");
- fprintf
- (stdout, " 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n");
- fprintf
- (stdout, " Indicate multiple modes by adding their values. \n");
- fprintf
- (stdout, " Example: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
- fprintf
- (stdout, "-R : c=%%d,U=%%d : quantization indices upshifted \n");
- fprintf
- (stdout, " for component c=%%d [%%d = 0,1,2]\n");
- fprintf
- (stdout, " with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n");
- fprintf
- (stdout, "-d : offset of the origin of the image (-d 150,300) \n");
- fprintf
- (stdout, "-T : offset of the origin of the tiles (-T 100,75) \n");
- fprintf(stdout, "-I : use the irreversible DWT 9-7 (-I) \n");
- fprintf(stdout, "-W : image width, height and the dx and dy subsampling \n");
- fprintf(stdout, " of the Cb and Cr components for YUV files \n");
- fprintf(stdout,
- " (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n");
- fprintf(stdout, "-F : video frame rate (set to 25 by default)\n");
- fprintf(stdout, "-D : depth, precision in bits [8 .. 16]; default:8\n");
- fprintf(stdout, "-C : comment\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "IMPORTANT:\n");
- fprintf(stdout, "-----------\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "The index file has the structure below:\n");
- fprintf(stdout, "---------------------------------------\n");
- fprintf(stdout, "\n");
- fprintf(stdout, "Image_height Image_width\n");
- fprintf(stdout, "progression order\n");
- fprintf(stdout, "Tiles_size_X Tiles_size_Y\n");
- fprintf(stdout, "Components_nb\n");
- fprintf(stdout, "Layers_nb\n");
- fprintf(stdout, "decomposition_levels\n");
- fprintf(stdout, "[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n");
- fprintf(stdout, " [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n");
- fprintf(stdout, "Main_header_end_position\n");
- fprintf(stdout, "Codestream_size\n");
- fprintf(stdout,
- "Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n");
- fprintf(stdout,
- "Tile_1 '' '' '' '' '' ''\n");
- fprintf(stdout, "...\n");
- fprintf(stdout,
- "Tile_Nt '' '' '' '' '' ''\n");
- fprintf(stdout,
- "Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n");
- fprintf(stdout, "...\n");
- fprintf(stdout,
- "Tpacket_Np '' '' '' '' '' '' '' ''\n");
-
- fprintf(stdout, "MaxDisto\n");
-
- fprintf(stdout, "TotalDisto\n\n");
-}
-
-static OPJ_PROG_ORDER give_progression(const char progression[5])
-{
- if (progression[0] == 'L' && progression[1] == 'R'
- && progression[2] == 'C' && progression[3] == 'P') {
- return LRCP;
- } else {
- if (progression[0] == 'R' && progression[1] == 'L'
- && progression[2] == 'C' && progression[3] == 'P') {
- return RLCP;
- } else {
- if (progression[0] == 'R' && progression[1] == 'P'
- && progression[2] == 'C' && progression[3] == 'L') {
- return RPCL;
- } else {
- if (progression[0] == 'P' && progression[1] == 'C'
- && progression[2] == 'R' && progression[3] == 'L') {
- return PCRL;
- } else {
- if (progression[0] == 'C' && progression[1] == 'P'
- && progression[2] == 'R' && progression[3] == 'L') {
- return CPRL;
- } else {
- return PROG_UNKNOWN;
- }
- }
- }
- }
- }
-}
-
-
-
-
-int main(int argc, char **argv)
-{
- mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */
- opj_cparameters_t *j2k_parameters; /* J2K compression parameters */
- opj_event_mgr_t event_mgr; /* event manager */
- opj_cio_t *cio;
- int value;
- opj_mj2_t *movie;
- opj_image_t *img;
- int i, j;
- char *s, S1, S2, S3;
- unsigned char *buf;
- int x1, y1, len;
- long mdat_initpos, offset;
- FILE *mj2file;
- int sampleno;
- opj_cinfo_t* cinfo;
- opj_bool bSuccess;
- int numframes;
- int prec = 8;/* DEFAULT */
- double total_time = 0;
-
- memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t));
- /* default value */
- /* ------------- */
- mj2_parameters.w = 352; /* CIF default value*/
- mj2_parameters.h = 288; /* CIF default value*/
- mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value*/
- mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value*/
- mj2_parameters.frame_rate = 25;
- mj2_parameters.prec = 8; /* DEFAULT */
- mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */
- mj2_parameters.meth = 1; /* enumerated color space */
-
- /*
- configure the event callbacks (not required)
- setting of each callback is optionnal
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = NULL;
-
- /* set J2K encoding parameters to default values */
- opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters);
- j2k_parameters = &mj2_parameters.j2k_parameters;
-
- /* Create comment for codestream */
- if (j2k_parameters->cp_comment == NULL) {
- const char comment[] = "Created by OpenJPEG version ";
- const size_t clen = strlen(comment);
- const char *version = opj_version();
- j2k_parameters->cp_comment = (char*)malloc(clen + strlen(version) + 1);
- sprintf(j2k_parameters->cp_comment, "%s%s", comment, version);
- }
-
- while (1) {
- int c = opj_getopt(argc, argv,
- "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h");
- if (c == -1) {
- break;
- }
- switch (c) {
- case 'i': { /* IN fill */
- char *infile = opj_optarg;
- s = opj_optarg;
- while (*s) {
- s++;
- }
- s--;
- S3 = *s;
- s--;
- S2 = *s;
- s--;
- S1 = *s;
-
- if ((S1 == 'y' && S2 == 'u' && S3 == 'v')
- || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) {
- mj2_parameters.decod_format = YUV_DFMT;
- } else {
- fprintf(stderr,
- "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n",
- S1, S2, S3);
- return 1;
- }
- strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile) - 1);
- }
- break;
- /* ----------------------------------------------------- */
- case 'o': { /* OUT fill */
- char *outfile = opj_optarg;
- while (*outfile) {
- outfile++;
- }
- outfile--;
- S3 = *outfile;
- outfile--;
- S2 = *outfile;
- outfile--;
- S1 = *outfile;
-
- outfile = opj_optarg;
-
- if ((S1 == 'm' && S2 == 'j' && S3 == '2')
- || (S1 == 'M' && S2 == 'J' && S3 == '2')) {
- mj2_parameters.cod_format = MJ2_CFMT;
- } else {
- fprintf(stderr,
- "Unknown output format image *.%c%c%c [only *.mj2]!! \n",
- S1, S2, S3);
- return 1;
- }
- strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile) - 1);
- }
- break;
- /* ----------------------------------------------------- */
- case 'r': { /* rates rates/distorsion */
- float rate;
- s = opj_optarg;
- while (sscanf(s, "%f", &rate) == 1) {
- j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2;
- j2k_parameters->tcp_numlayers++;
- while (*s && *s != ',') {
- s++;
- }
- if (!*s) {
- break;
- }
- s++;
- }
- j2k_parameters->cp_disto_alloc = 1;
- }
- break;
- /* ----------------------------------------------------- */
- case 'q': /* add fixed_quality */
- s = opj_optarg;
- while (sscanf(s, "%f",
- &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) {
- j2k_parameters->tcp_numlayers++;
- while (*s && *s != ',') {
- s++;
- }
- if (!*s) {
- break;
- }
- s++;
- }
- j2k_parameters->cp_fixed_quality = 1;
- break;
- /* dda */
- /* ----------------------------------------------------- */
- case 'f': { /* mod fixed_quality (before : -q) */
- int *row = NULL, *col = NULL;
- int numlayers = 0, numresolution = 0, matrix_width = 0;
-
- s = opj_optarg;
- sscanf(s, "%d", &numlayers);
- s++;
- if (numlayers > 9) {
- s++;
- }
-
- j2k_parameters->tcp_numlayers = numlayers;
- numresolution = j2k_parameters->numresolution;
- matrix_width = numresolution * 3;
- j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(
- int));
- s = s + 2;
-
- for (i = 0; i < numlayers; i++) {
- row = &j2k_parameters->cp_matrice[i * matrix_width];
- col = row;
- j2k_parameters->tcp_rates[i] = 1;
- sscanf(s, "%d,", &col[0]);
- s += 2;
- if (col[0] > 9) {
- s++;
- }
- col[1] = 0;
- col[2] = 0;
- for (j = 1; j < numresolution; j++) {
- col += 3;
- sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]);
- s += 6;
- if (col[0] > 9) {
- s++;
- }
- if (col[1] > 9) {
- s++;
- }
- if (col[2] > 9) {
- s++;
- }
- }
- if (i < numlayers - 1) {
- s++;
- }
- }
- j2k_parameters->cp_fixed_alloc = 1;
- }
- break;
- /* ----------------------------------------------------- */
- case 't': /* tiles */
- sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy);
- j2k_parameters->tile_size_on = OPJ_TRUE;
- break;
- /* ----------------------------------------------------- */
- case 'n': /* resolution */
- sscanf(opj_optarg, "%d", &j2k_parameters->numresolution);
- break;
- /* ----------------------------------------------------- */
- case 'c': { /* precinct dimension */
- char sep;
- int res_spec = 0;
-
- char *s = opj_optarg;
- do {
- sep = 0;
- sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec],
- &j2k_parameters->prch_init[res_spec], &sep);
- j2k_parameters->csty |= 0x01;
- res_spec++;
- s = strpbrk(s, "]") + 2;
- } while (sep == ',');
- j2k_parameters->res_spec = res_spec;
- }
- break;
-
- /* ----------------------------------------------------- */
- case 'b': { /* code-block dimension */
- int cblockw_init = 0, cblockh_init = 0;
- sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init);
- if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024
- || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {
- fprintf(stderr,
- "!! Size of code_block error (option -b) !!\n\nRestriction :\n"
- " * width*height<=4096\n * 4<=width,height<= 1024\n\n");
- return 1;
- }
- j2k_parameters->cblockw_init = cblockw_init;
- j2k_parameters->cblockh_init = cblockh_init;
- }
- break;
- /* ----------------------------------------------------- */
- case 'p': { /* progression order */
- char progression[5];
-
- strncpy(progression, opj_optarg, 5);
- j2k_parameters->prog_order = give_progression(progression);
- if (j2k_parameters->prog_order == -1) {
- fprintf(stderr, "Unrecognized progression order "
- "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");
- return 1;
- }
- }
- break;
- /* ----------------------------------------------------- */
- case 's': { /* subsampling factor */
- if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->subsampling_dx,
- &j2k_parameters->subsampling_dy) != 2) {
- fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n");
- return 1;
- }
- }
- break;
- /* ----------------------------------------------------- */
- case 'd': { /* coordonnate of the reference grid */
- if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->image_offset_x0,
- &j2k_parameters->image_offset_y0) != 2) {
- fprintf(stderr, "-d 'coordonnate of the reference grid' argument "
- "error !! [-d x0,y0]\n");
- return 1;
- }
- }
- break;
- /* ----------------------------------------------------- */
- case 'h': /* Display an help description */
- help_display();
- return 0;
- break;
- /* ----------------------------------------------------- */
- case 'P': { /* POC */
- int numpocs = 0; /* number of progression order change (POC) default 0 */
- opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */
-
- char *s = opj_optarg;
- POC = j2k_parameters->POC;
-
- while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile,
- &POC[numpocs].resno0, &POC[numpocs].compno0,
- &POC[numpocs].layno1, &POC[numpocs].resno1,
- &POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
- POC[numpocs].prg1 = give_progression(POC[numpocs].progorder);
- numpocs++;
- while (*s && *s != '/') {
- s++;
- }
- if (!*s) {
- break;
- }
- s++;
- }
- j2k_parameters->numpocs = numpocs;
- }
- break;
- /* ------------------------------------------------------ */
- case 'S': /* SOP marker */
- j2k_parameters->csty |= 0x02;
- break;
- /* ------------------------------------------------------ */
- case 'E': /* EPH marker */
- j2k_parameters->csty |= 0x04;
- break;
- /* ------------------------------------------------------ */
- case 'M': /* Mode switch pas tous au point !! */
- if (sscanf(opj_optarg, "%d", &value) == 1) {
- for (i = 0; i <= 5; i++) {
- int cache = value & (1 << i);
- if (cache) {
- j2k_parameters->mode |= (1 << i);
- }
- }
- }
- break;
- /* ------------------------------------------------------ */
- case 'R': { /* ROI */
- if (sscanf(opj_optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno,
- &j2k_parameters->roi_shift) != 2) {
- fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n");
- return 1;
- }
- }
- break;
- /* ------------------------------------------------------ */
- case 'T': { /* Tile offset */
- if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tx0,
- &j2k_parameters->cp_ty0) != 2) {
- fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");
- return 1;
- }
- }
- break;
- /* ------------------------------------------------------ */
- case 'C': { /* Add a comment */
- j2k_parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);
- if (j2k_parameters->cp_comment) {
- strcpy(j2k_parameters->cp_comment, opj_optarg);
- }
- }
- break;
- /* ------------------------------------------------------ */
- case 'I': { /* reversible or not */
- j2k_parameters->irreversible = 1;
- }
- break;
- /* ------------------------------------------------------ */
- case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */
- if (sscanf
- (opj_optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h,
- &mj2_parameters.CbCr_subsampling_dx,
- &mj2_parameters.CbCr_subsampling_dy) != 4) {
- fprintf(stderr, "-W argument error");
- return 1;
- }
- break;
- /* ------------------------------------------------------ */
- case 'F': /* Video frame rate */
- if (sscanf(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) {
- fprintf(stderr, "-F argument error");
- return 1;
- }
- break;
- /* ------------------------------------------------------ */
- case 'D': /* Depth: the precision */
- if (sscanf(opj_optarg, "%d", &prec) != 1) {
- prec = 0;
- }
- break;
-
- default:
- return 1;
- }
- }
-
- /* Error messages */
- /* -------------- */
- if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) {
- fprintf(stderr,
- "Usage: %s -i yuv-file -o mj2-file (+ options)\n", argv[0]);
- return 1;
- }
- if (prec < 1 || prec > 16) {
- fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n", prec);
- return 1;
- }
- if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc ||
- j2k_parameters->cp_fixed_quality)
- && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^
- j2k_parameters->cp_fixed_quality))) {
- fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n");
- return 1;
- } /* mod fixed_quality */
-
- /* if no rate entered, lossless by default */
- if (j2k_parameters->tcp_numlayers == 0) {
- j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */
- j2k_parameters->tcp_numlayers++;
- j2k_parameters->cp_disto_alloc = 1;
- }
-
- if ((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) ||
- (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) {
- fprintf(stderr,
- "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
- j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0,
- j2k_parameters->image_offset_y0);
- return 1;
- }
-
- for (i = 0; i < j2k_parameters->numpocs; i++) {
- if (j2k_parameters->POC[i].prg == -1) {
- fprintf(stderr,
- "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",
- i + 1);
- }
- }
-
- if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] ||
- j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) {
- fprintf(stderr,
- "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
- j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy,
- mj2_parameters.Dim[1]);
- return 1;
- }
-
- /* to respect profile - 0 */
- /* ---------------------- */
-
- x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) *
- j2k_parameters->subsampling_dx
- + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) *
- j2k_parameters->subsampling_dx + 1;
- y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) *
- j2k_parameters->subsampling_dy
- + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) *
- j2k_parameters->subsampling_dy + 1;
- mj2_parameters.numcomps = 3; /* YUV files only have 3 components */
-
- mj2_parameters.prec = prec;
-
- j2k_parameters->tcp_mct = 0;
-
- mj2file = fopen(mj2_parameters.outfile, "wb");
-
- if (!mj2file) {
- fprintf(stderr, "failed to open %s for writing\n", argv[2]);
- return 1;
- }
-
- /* get a MJ2 decompressor handle */
- cinfo = mj2_create_compress();
- movie = (opj_mj2_t*)cinfo->mj2_handle;
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
-
- /* setup encoder parameters */
- mj2_setup_encoder(movie, &mj2_parameters);
-
- movie->tk[0].num_samples =
- yuv_num_frames(&movie->tk[0], mj2_parameters.infile);
-
- if (movie->tk[0].num_samples == 0) {
- return 1;
- }
-
- /* One sample per chunk*/
- movie->tk[0].chunk = (mj2_chunk_t*)
- malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t));
- movie->tk[0].sample = (mj2_sample_t*)
- malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t));
-
- if (mj2_init_stdmovie(movie)) {
- fprintf(stderr, "Error with movie initialization");
- return 1;
- }
-
- /* Writing JP, FTYP and MDAT boxes */
- /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/
- buf = (unsigned char*)
- malloc(300 * sizeof(unsigned char));
-
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300);
-
- mj2_write_jp(cio);
- mj2_write_ftyp(movie, cio);
-
- mdat_initpos = cio_tell(cio);
- cio_skip(cio, 4);
-
- cio_write(cio, MJ2_MDAT, 4);
-
- fwrite(buf, cio_tell(cio), 1, mj2file);
-
- offset = cio_tell(cio);
- opj_cio_close(cio);
- free(buf);
-
- for (i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) {
- if (movie->tk[i].track_type != 0) {
- fprintf(stderr, "Unable to write sound or hint tracks\n");
- } else {
- mj2_tk_t *tk;
- int buflen = 0;
-
- tk = &movie->tk[i];
- tk->num_chunks = tk->num_samples;
- numframes = tk->num_samples;
- tk->depth = prec;
-
- fprintf(stderr, "Video Track number %d\n", i);
-
- img = mj2_image_create(tk, j2k_parameters);
-
- buflen = 2 * (tk->w * tk->h * 8);
- buf = (unsigned char *) malloc(buflen * sizeof(unsigned char));
-
- for (sampleno = 0; sampleno < numframes; sampleno++) {
- double init_time = opj_clock();
- double elapsed_time;
-
- if (yuvtoimage(tk, img, sampleno, j2k_parameters,
- mj2_parameters.infile)) {
- fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno);
- return 1;
- }
-
- /* setup the encoder parameters using the current image and user parameters */
- opj_setup_encoder(cinfo, j2k_parameters, img);
-
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen);
-
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP2C, 4); /* JP2C*/
-
- /* encode the image */
- bSuccess = opj_encode(cinfo, cio, img, NULL);
-
- if (!bSuccess) {
- opj_cio_close(cio);
- fprintf(stderr, "failed to encode image\n");
- return 1;
- }
-
- len = cio_tell(cio) - 8;
- cio_seek(cio, 0);
- cio_write(cio, len + 8, 4);
- opj_cio_close(cio);
-
- tk->sample[sampleno].sample_size = len + 8;
- tk->sample[sampleno].offset = offset;
- tk->chunk[sampleno].offset = offset; /* There is one sample per chunk */
- fwrite(buf, 1, len + 8, mj2file);
- offset += len + 8;
-
- elapsed_time = opj_clock() - init_time;
- fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n",
- sampleno + 1, numframes, elapsed_time * 1000);
- total_time += elapsed_time;
- } /* for(sampleno */
-
- free(buf);
- opj_image_destroy(img);
- }
- }/* for(i */
-
- fseek(mj2file, mdat_initpos, SEEK_SET);
-
- buf = (unsigned char*) malloc(4 * sizeof(unsigned char));
-
- /* Init a cio to write box length variable in a little endian way */
- cio = opj_cio_open(NULL, buf, 4);
- cio_write(cio, offset - mdat_initpos, 4);
- fwrite(buf, 4, 1, mj2file);
- fseek(mj2file, 0, SEEK_END);
- free(buf);
-
- /* Writing MOOV box */
- buf = (unsigned char*)
- malloc((TEMP_BUF + numframes * 20) * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF + numframes * 20));
- mj2_write_moov(movie, cio);
- fwrite(buf, cio_tell(cio), 1, mj2file);
- free(buf);
-
- fprintf(stdout, "Total encoding time: %.2f s for %d frames (%.1f fps)\n",
- total_time, numframes, (float)numframes / total_time);
-
- /* Ending program */
-
- fclose(mj2file);
- /* free remaining compression structures */
- mj2_destroy_compress(movie);
- free(cinfo);
-
- if (j2k_parameters->cp_comment) {
- free(j2k_parameters->cp_comment);
- }
- if (j2k_parameters->cp_matrice) {
- free(j2k_parameters->cp_matrice);
- }
- opj_cio_close(cio);
-
- return 0;
-}
diff --git a/openjpeg/src/bin/mj2/opj_mj2_decompress.c b/openjpeg/src/bin/mj2/opj_mj2_decompress.c
deleted file mode 100644
index 6b26d5636..000000000
--- a/openjpeg/src/bin/mj2/opj_mj2_decompress.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
-* Copyright (c) 2003-2004, Francois-Olivier Devaux
-* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
-* All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-* 1. Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-* 2. Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in the
-* documentation and/or other materials provided with the distribution.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "opj_apps_config.h"
-#include "openjpeg.h"
-#include "j2k_lib.h"
-#include "cio.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "mj2.h"
-#include "mj2_convert.h"
-
-#ifdef OPJ_HAVE_LIBLCMS2
-#include <lcms2.h>
-#endif
-#ifdef OPJ_HAVE_LIBLCMS1
-#include <lcms.h>
-#endif
-#include "color.h"
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-static void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-static void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-
-int main(int argc, char *argv[])
-{
- mj2_dparameters_t mj2_parameters; /* decompression parameters */
- opj_dinfo_t* dinfo;
- opj_event_mgr_t event_mgr; /* event manager */
- opj_cio_t *cio = NULL;
- unsigned int tnum, snum;
- opj_mj2_t *movie;
- mj2_tk_t *track;
- mj2_sample_t *sample;
- unsigned char* frame_codestream;
- FILE *file, *outfile;
- char outfilename[50];
- opj_image_t *img = NULL;
- unsigned int max_codstrm_size = 0;
- double total_time = 0;
- unsigned int numframes = 0;
-
- if (argc != 3) {
- printf("Usage: %s inputfile.mj2 outputfile.yuv\n", argv[0]);
- return 1;
- }
-
- file = fopen(argv[1], "rb");
-
- if (!file) {
- fprintf(stderr, "failed to open %s for reading\n", argv[1]);
- return 1;
- }
-
- /* Checking output file */
- outfile = fopen(argv[2], "w");
- if (!file) {
- fprintf(stderr, "failed to open %s for writing\n", argv[2]);
- return 1;
- }
- fclose(outfile);
-
- /*
- configure the event callbacks (not required)
- setting of each callback is optional
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = NULL;
-
- /* get a MJ2 decompressor handle */
- dinfo = mj2_create_decompress();
- movie = (opj_mj2_t*)dinfo->mj2_handle;
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
-
- memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t));
- /* set J2K decoding parameters to default values */
- opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters);
-
- /* setup the decoder decoding parameters using user parameters */
- mj2_setup_decoder(movie, &mj2_parameters);
-
- if (mj2_read_struct(file, movie)) { /* Creating the movie structure */
- return 1;
- }
-
- /* Decode first video track */
- for (tnum = 0;
- tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk);
- tnum++) {
- if (movie->tk[tnum].track_type == 0) {
- break;
- }
- }
-
- if (movie->tk[tnum].track_type != 0) {
- printf("Error. Movie does not contain any video track\n");
- return 1;
- }
-
- track = &movie->tk[tnum];
-
- /* Output info on first video tracl */
- fprintf(stdout,
- "The first video track contains %d frames.\nWidth: %d, Height: %d \n\n",
- track->num_samples, track->w, track->h);
-
- max_codstrm_size = track->sample[0].sample_size - 8;
- frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(
- unsigned char));
-
- numframes = track->num_samples;
-
- for (snum = 0; snum < numframes; snum++) {
- double init_time = opj_clock();
- double elapsed_time;
-
- sample = &track->sample[snum];
- if (sample->sample_size - 8 > max_codstrm_size) {
- max_codstrm_size = sample->sample_size - 8;
- if ((frame_codestream = (unsigned char*)
- realloc(frame_codestream, max_codstrm_size)) == NULL) {
- printf("Error reallocation memory\n");
- return 1;
- };
- }
- fseek(file, sample->offset + 8, SEEK_SET);
- fread(frame_codestream, sample->sample_size - 8, 1,
- file); /* Assuming that jp and ftyp markers size do */
-
- /* open a byte stream */
- cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream,
- sample->sample_size - 8);
-
- img = opj_decode(dinfo, cio); /* Decode J2K to image */
-
-#ifdef WANT_SYCC_TO_RGB
- if (img->color_space == CLRSPC_SYCC) {
- color_sycc_to_rgb(img);
- }
-#endif
-
- if (img->icc_profile_buf) {
-#if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2)
- color_apply_icc_profile(img);
-#endif
-
- free(img->icc_profile_buf);
- img->icc_profile_buf = NULL;
- img->icc_profile_len = 0;
- }
-
- if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2)
- && (img->comps[0].dx == img->comps[2].dx / 2) && (img->comps[0].dx == 1))
- || (img->numcomps == 1)) {
-
- if (!imagetoyuv(img, argv[2])) { /* Convert image to YUV */
- return 1;
- }
- } else if ((img->numcomps == 3) &&
- (img->comps[0].dx == 1) && (img->comps[1].dx == 1) &&
- (img->comps[2].dx == 1)) { /* If YUV 4:4:4 input --> to bmp */
- fprintf(stdout,
- "The frames will be output in a bmp format (output_1.bmp, ...)\n");
- sprintf(outfilename, "output_%d.bmp", snum);
- if (imagetobmp(img, outfilename)) { /* Convert image to BMP */
- return 1;
- }
-
- } else {
- fprintf(stdout,
- "Image component dimensions are unknown. Unable to output image\n");
- fprintf(stdout,
- "The frames will be output in a j2k file (output_1.j2k, ...)\n");
-
- sprintf(outfilename, "output_%d.j2k", snum);
- outfile = fopen(outfilename, "wb");
- if (!outfile) {
- fprintf(stderr, "failed to open %s for writing\n", outfilename);
- return 1;
- }
- fwrite(frame_codestream, sample->sample_size - 8, 1, outfile);
- fclose(outfile);
- }
- /* close the byte stream */
- opj_cio_close(cio);
- /* free image data structure */
- opj_image_destroy(img);
- elapsed_time = opj_clock() - init_time;
- fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1,
- numframes, elapsed_time * 1000);
- total_time += elapsed_time;
-
- }
-
- free(frame_codestream);
- fclose(file);
-
- /* free remaining structures */
- if (dinfo) {
- mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle);
- }
- free(dinfo);
-
- fprintf(stdout, "%d frame(s) correctly decompressed\n", snum);
- fprintf(stdout, "Total decoding time: %.2f seconds (%.1f fps)\n", total_time,
- (float)numframes / total_time);
-
- return 0;
-}
diff --git a/openjpeg/src/bin/mj2/opj_mj2_extract.c b/openjpeg/src/bin/mj2/opj_mj2_extract.c
deleted file mode 100644
index a062e17d8..000000000
--- a/openjpeg/src/bin/mj2/opj_mj2_extract.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * The copyright in this software is being made available under the 2-clauses
- * BSD License, included below. This software may be subject to other third
- * party and contributor rights, including patent rights, and no such rights
- * are granted under this license.
- *
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2014, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "openjpeg.h"
-#include "cio.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "mj2.h"
-
-/* -------------------------------------------------------------------------- */
-
-/**
-sample error callback expecting a FILE* client object
-*/
-void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-/**
-sample debug callback expecting a FILE* client object
-*/
-void info_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[INFO] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-
-int main(int argc, char *argv[])
-{
- opj_dinfo_t* dinfo;
- opj_event_mgr_t event_mgr; /* event manager */
- int tnum;
- unsigned int snum;
- opj_mj2_t *movie;
- mj2_tk_t *track;
- mj2_sample_t *sample;
- unsigned char* frame_codestream;
- FILE *file, *outfile;
- char outfilename[50];
- mj2_dparameters_t parameters;
-
- if (argc != 3) {
- printf("Usage: %s mj2filename output_location\n", argv[0]);
- printf("Example: %s foreman.mj2 output/foreman\n", argv[0]);
- return 1;
- }
-
- file = fopen(argv[1], "rb");
-
- if (!file) {
- fprintf(stderr, "failed to open %s for reading\n", argv[1]);
- return 1;
- }
-
- /*
- configure the event callbacks (not required)
- setting of each callback is optional
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* get a MJ2 decompressor handle */
- dinfo = mj2_create_decompress();
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
-
- /* setup the decoder decoding parameters using user parameters */
- memset(&parameters, 0, sizeof(mj2_dparameters_t));
- movie = (opj_mj2_t*) dinfo->mj2_handle;
- mj2_setup_decoder(movie, &parameters);
-
- if (mj2_read_struct(file, movie)) { /* Creating the movie structure*/
- return 1;
- }
-
- /* Decode first video track */
- tnum = 0;
- while (movie->tk[tnum].track_type != 0) {
- tnum ++;
- }
-
- track = &movie->tk[tnum];
-
- fprintf(stdout, "Extracting %d frames from file...\n", track->num_samples);
-
- for (snum = 0; snum < track->num_samples; snum++) {
- sample = &track->sample[snum];
- frame_codestream = (unsigned char*) malloc(sample->sample_size -
- 8); /* Skipping JP2C marker*/
- fseek(file, sample->offset + 8, SEEK_SET);
- fread(frame_codestream, sample->sample_size - 8, 1,
- file); /* Assuming that jp and ftyp markers size do*/
-
- sprintf(outfilename, "%s_%05d.j2k", argv[2], snum);
- outfile = fopen(outfilename, "wb");
- if (!outfile) {
- fprintf(stderr, "failed to open %s for writing\n", outfilename);
- return 1;
- }
- fwrite(frame_codestream, sample->sample_size - 8, 1, outfile);
- fclose(outfile);
- free(frame_codestream);
- }
- fclose(file);
- fprintf(stdout, "%d frames correctly extracted\n", snum);
-
- /* free remaining structures */
- if (dinfo) {
- mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle);
- }
-
- return 0;
-}
diff --git a/openjpeg/src/bin/mj2/opj_mj2_wrap.c b/openjpeg/src/bin/mj2/opj_mj2_wrap.c
deleted file mode 100644
index 84a066e21..000000000
--- a/openjpeg/src/bin/mj2/opj_mj2_wrap.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * The copyright in this software is being made available under the 2-clauses
- * BSD License, included below. This software may be subject to other third
- * party and contributor rights, including patent rights, and no such rights
- * are granted under this license.
- *
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2014, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "openjpeg.h"
-#include "cio.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "mj2.h"
-
-static int int_ceildiv(int a, int b)
-{
- return (a + b - 1) / b;
-}
-
-/**
-Size of memory first allocated for MOOV box
-*/
-#define TEMP_BUF 10000
-
-#define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51"
-
-/* -------------------------------------------------------------------------- */
-
-static int test_image(const char *fname, mj2_cparameters_t *cp)
-{
- FILE *reader;
- opj_image_t *image;
- unsigned char *src;
- opj_dinfo_t *dinfo;
- opj_cio_t *cio;
- opj_dparameters_t dparameters;
- int success;
- long src_len;
-
- success = 0;
-
- if ((reader = fopen(fname, "rb")) == NULL) {
- return success;
- }
-
- fseek(reader, 0, SEEK_END);
- src_len = ftell(reader);
- fseek(reader, 0, SEEK_SET);
- src = (unsigned char*) malloc(src_len);
- fread(src, 1, src_len, reader);
- fclose(reader);
-
- if (memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) {
- free(src);
- return success;
- }
- memset(&dparameters, 0, sizeof(opj_dparameters_t));
-
- opj_set_default_decoder_parameters(&dparameters);
-
- dinfo = opj_create_decompress(CODEC_J2K);
-
- opj_setup_decoder(dinfo, &dparameters);
-
- cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len);
-
- image = opj_decode(dinfo, cio);
-
- free(src);
- cio->buffer = NULL;
- opj_cio_close(cio);
-
- if (image == NULL) {
- goto fin;
- }
-
- cp->numcomps = image->numcomps;
- cp->w = image->comps[0].w;
- cp->h = image->comps[0].h;
- cp->prec = image->comps[0].prec;
-
- if (image->numcomps > 2) {
- if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 2)
- && (image->comps[2].dx == 2)
- && (image->comps[0].dy == 1)
- && (image->comps[1].dy == 2)
- && (image->comps[2].dy == 2)) { /* horizontal and vertical*/
- /* Y420*/
- cp->enumcs = ENUMCS_SYCC;
- cp->CbCr_subsampling_dx = 2;
- cp->CbCr_subsampling_dy = 2;
- } else if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 2)
- && (image->comps[2].dx == 2)
- && (image->comps[0].dy == 1)
- && (image->comps[1].dy == 1)
- && (image->comps[2].dy == 1)) { /* horizontal only*/
- /* Y422*/
- cp->enumcs = ENUMCS_SYCC;
- cp->CbCr_subsampling_dx = 2;
- cp->CbCr_subsampling_dy = 1;
- } else if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 1)
- && (image->comps[2].dx == 1)
- && (image->comps[0].dy == 1)
- && (image->comps[1].dy == 1)
- && (image->comps[2].dy == 1)) {
- /* Y444 or RGB */
-
- if (image->color_space == CLRSPC_SRGB) {
- cp->enumcs = ENUMCS_SRGB;
-
- /* cp->CbCr_subsampling_dx = 0; */
- /* cp->CbCr_subsampling_dy = 0; */
- } else {
- cp->enumcs = ENUMCS_SYCC;
-
- cp->CbCr_subsampling_dx = 1;
- cp->CbCr_subsampling_dy = 1;
- }
- } else {
- goto fin;
- }
- } else {
- cp->enumcs = ENUMCS_GRAY;
- /* cp->CbCr_subsampling_dx = 0; */
- /* cp->CbCr_subsampling_dy = 0; */
- }
- if (image->icc_profile_buf) {
- cp->meth = 2;
- free(image->icc_profile_buf);
- image->icc_profile_buf = NULL;
- } else {
- cp->meth = 1;
- }
-
- success = 1;
-fin:
- if (dinfo) {
- opj_destroy_decompress(dinfo);
- }
-
- if (image) {
- opj_image_destroy(image);
- }
-
- return success;
-}
-
-/**
-sample error callback expecting a FILE* client object
-*/
-static void error_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[ERROR] %s", msg);
-}
-/**
-sample warning callback expecting a FILE* client object
-*/
-static void warning_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[WARNING] %s", msg);
-}
-/**
-sample debug callback expecting a FILE* client object
-*/
-static void info_callback(const char *msg, void *client_data)
-{
- FILE *stream = (FILE*)client_data;
- fprintf(stream, "[INFO] %s", msg);
-}
-
-/* -------------------------------------------------------------------------- */
-
-
-
-static void read_siz_marker(FILE *file, opj_image_t *image)
-{
- int len, i;
- char buf, buf2[2];
- unsigned char *siz_buffer;
- opj_cio_t *cio;
-
- fseek(file, 0, SEEK_SET);
- do {
- fread(&buf, 1, 1, file);
- if (buf == (char)0xff) {
- fread(&buf, 1, 1, file);
- }
- } while (!(buf == (char)0x51));
-
- fread(buf2, 2, 1, file); /* Lsiz */
- len = ((buf2[0]) << 8) + buf2[1];
-
- siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char));
- fread(siz_buffer, len, 1, file);
- cio = opj_cio_open(NULL, siz_buffer, len);
-
- cio_read(cio, 2); /* Rsiz (capabilities) */
- image->x1 = cio_read(cio, 4); /* Xsiz */
- image->y1 = cio_read(cio, 4); /* Ysiz */
- image->x0 = cio_read(cio, 4); /* X0siz */
- image->y0 = cio_read(cio, 4); /* Y0siz */
- cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */
-
- image->numcomps = cio_read(cio, 2); /* Csiz */
- image->comps =
- (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t));
-
- for (i = 0; i < image->numcomps; i++) {
- int tmp;
- tmp = cio_read(cio, 1); /* Ssiz_i */
- image->comps[i].prec = (tmp & 0x7f) + 1;
- image->comps[i].sgnd = tmp >> 7;
- image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */
- image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */
- image->comps[i].resno_decoded = 0; /* number of resolution decoded */
- image->comps[i].factor = 0; /* reducing factor by component */
- }
- fseek(file, 0, SEEK_SET);
- opj_cio_close(cio);
- free(siz_buffer);
-}
-
-static void setparams(opj_mj2_t *movie, opj_image_t *image)
-{
- int i, depth_0, depth, sign;
-
- movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx);
- movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy);
- mj2_init_stdmovie(movie);
-
- movie->tk[0].depth = image->comps[0].prec;
-
- if (image->numcomps == 3) {
- if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 1)
- && (image->comps[2].dx == 1)) {
- movie->tk[0].CbCr_subsampling_dx = 1;
- } else if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 2)
- && (image->comps[2].dx == 2)) {
- movie->tk[0].CbCr_subsampling_dx = 2;
- } else {
- fprintf(stderr, "Image component sizes are incoherent\n");
- }
-
- if ((image->comps[0].dy == 1)
- && (image->comps[1].dy == 1)
- && (image->comps[2].dy == 1)) {
- movie->tk[0].CbCr_subsampling_dy = 1;
- } else if ((image->comps[0].dy == 1)
- && (image->comps[1].dy == 2)
- && (image->comps[2].dy == 2)) {
- movie->tk[0].CbCr_subsampling_dy = 2;
- } else {
- fprintf(stderr, "Image component sizes are incoherent\n");
- }
- }
-
- movie->tk[0].sample_rate = 25;
-
- movie->tk[0].jp2_struct.numcomps = image->numcomps; /* NC */
-
- /* Init Standard jp2 structure */
-
- movie->tk[0].jp2_struct.comps =
- (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(
- opj_jp2_comps_t));
- movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/
- movie->tk[0].jp2_struct.approx = 0; /* APPROX*/
- movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */
- movie->tk[0].jp2_struct.minversion = 0; /* MinV */
- movie->tk[0].jp2_struct.numcl = 1;
- movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(
- movie->tk[0].jp2_struct.numcl * sizeof(int));
- movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */
- movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/
- movie->tk[0].jp2_struct.UnkC =
- 0; /* UnkC, colorspace specified in colr box*/
- movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/
- movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0,
- image->comps[0].dx);
- movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0,
- image->comps[0].dy);
-
- depth_0 = image->comps[0].prec - 1;
- sign = image->comps[0].sgnd;
- movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7);
-
- for (i = 1; i < image->numcomps; i++) {
- depth = image->comps[i].prec - 1;
- sign = image->comps[i].sgnd;
- if (depth_0 != depth) {
- movie->tk[0].jp2_struct.bpc = 255;
- }
- }
-
- for (i = 0; i < image->numcomps; i++)
- movie->tk[0].jp2_struct.comps[i].bpcc =
- image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
-
- if ((image->numcomps == 1 || image->numcomps == 3)
- && (movie->tk[0].jp2_struct.bpc != 255)) {
- movie->tk[0].jp2_struct.meth = 1;
- } else {
- movie->tk[0].jp2_struct.meth = 2;
- }
-
- if (image->numcomps == 1) {
- movie->tk[0].jp2_struct.enumcs = 17; /* Grayscale */
- }
-
- else if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 1)
- && (image->comps[2].dx == 1)
- && (image->comps[0].dy == 1)
- && (image->comps[1].dy == 1)
- && (image->comps[2].dy == 1)) {
- movie->tk[0].jp2_struct.enumcs = 16; /* RGB */
- }
-
- else if ((image->comps[0].dx == 1)
- && (image->comps[1].dx == 2)
- && (image->comps[2].dx == 2)
- && (image->comps[0].dy == 1)
- && (image->comps[1].dy == 2)
- && (image->comps[2].dy == 2)) {
- movie->tk[0].jp2_struct.enumcs = 18; /* YUV */
- }
-
- else {
- movie->tk[0].jp2_struct.enumcs = 0; /* Unknown profile */
- }
-}
-
-int main(int argc, char *argv[])
-{
- opj_cinfo_t* cinfo;
- opj_event_mgr_t event_mgr; /* event manager */
- unsigned int snum;
- opj_mj2_t *movie;
- mj2_sample_t *sample;
- unsigned char* frame_codestream;
- FILE *mj2file, *j2kfile;
- char *j2kfilename;
- unsigned char *buf;
- int offset, mdat_initpos;
- opj_image_t img;
- opj_cio_t *cio;
- mj2_cparameters_t parameters;
-
- if (argc != 3) {
- printf("Usage: %s source_location mj2_filename\n", argv[0]);
- printf("Example: %s input/input output.mj2\n", argv[0]);
- return 1;
- }
-
- mj2file = fopen(argv[2], "wb");
-
- if (!mj2file) {
- fprintf(stderr, "failed to open %s for writing\n", argv[2]);
- return 1;
- }
- memset(&img, 0, sizeof(opj_image_t));
- /*
- configure the event callbacks (not required)
- setting of each callback is optional
- */
- memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
- event_mgr.error_handler = error_callback;
- event_mgr.warning_handler = warning_callback;
- event_mgr.info_handler = info_callback;
-
- /* get a MJ2 decompressor handle */
- cinfo = mj2_create_compress();
-
- /* catch events using our callbacks and give a local context */
- opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
-
- /* setup the decoder encoding parameters using user parameters */
- memset(&parameters, 0, sizeof(mj2_cparameters_t));
- movie = (opj_mj2_t*) cinfo->mj2_handle;
-
- j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */
- sprintf(j2kfilename, "%s_00001.j2k", argv[1]);
-
- if (test_image(j2kfilename, &parameters) == 0) {
- goto fin;
- }
-
- parameters.frame_rate = 25; /* DEFAULT */
-
- mj2_setup_encoder(movie, &parameters);
-
-
- /* Writing JP, FTYP and MDAT boxes
- Assuming that the JP and FTYP boxes won't be longer than 300 bytes */
-
- buf = (unsigned char*) malloc(300 * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, 300);
- mj2_write_jp(cio);
- mj2_write_ftyp(movie, cio);
- mdat_initpos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MDAT, 4);
- fwrite(buf, cio_tell(cio), 1, mj2file);
- free(buf);
-
- /* Insert each j2k codestream in a JP2C box */
- snum = 0;
- offset = 0;
- while (1) {
- mj2_sample_t * new_sample;
- mj2_chunk_t * new_chunk;
- sample = &movie->tk[0].sample[snum];
- sprintf(j2kfilename, "%s_%05d.j2k", argv[1], snum);
- j2kfile = fopen(j2kfilename, "rb");
- if (!j2kfile) {
- if (snum == 0) { /* Could not open a single codestream */
- fprintf(stderr, "failed to open %s for reading\n", j2kfilename);
- return 1;
- } else { /* Tried to open a inexistent codestream */
- fprintf(stdout, "%d frames are being added to the MJ2 file\n", snum);
- break;
- }
- }
-
- /* Calculating offset for samples and chunks */
- offset += cio_tell(cio);
- sample->offset = offset;
- movie->tk[0].chunk[snum].offset =
- offset; /* There will be one sample per chunk */
-
- /* Calculating sample size */
- fseek(j2kfile, 0, SEEK_END);
- sample->sample_size = ftell(j2kfile) +
- 8; /* Sample size is codestream + JP2C box header */
- fseek(j2kfile, 0, SEEK_SET);
-
- /* Reading siz marker of j2k image for the first codestream */
- if (snum == 0) {
- read_siz_marker(j2kfile, &img);
- }
-
- /* Writing JP2C box header */
- frame_codestream = (unsigned char*) malloc(sample->sample_size + 8);
- cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size);
- cio_write(cio, sample->sample_size, 4); /* Sample size */
- cio_write(cio, JP2_JP2C, 4); /* JP2C */
-
- /* Writing codestream from J2K file to MJ2 file */
- fread(frame_codestream + 8, sample->sample_size - 8, 1, j2kfile);
- fwrite(frame_codestream, sample->sample_size, 1, mj2file);
- cio_skip(cio, sample->sample_size - 8);
-
- /* Ending loop */
- fclose(j2kfile);
- snum++;
- new_sample = (mj2_sample_t*)
- realloc(movie->tk[0].sample, (snum + 1) * sizeof(mj2_sample_t));
- new_chunk = (mj2_chunk_t*)
- realloc(movie->tk[0].chunk, (snum + 1) * sizeof(mj2_chunk_t));
- if (new_sample && new_chunk) {
- movie->tk[0].sample = new_sample;
- movie->tk[0].chunk = new_chunk;
- } else {
- fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename);
- return 1;
- }
- free(frame_codestream);
- }
-
- /* Writing the MDAT box length in header */
- offset += cio_tell(cio);
- buf = (unsigned char*) malloc(4 * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, 4);
- cio_write(cio, offset - mdat_initpos, 4);
- fseek(mj2file, (long)mdat_initpos, SEEK_SET);
- fwrite(buf, 4, 1, mj2file);
- fseek(mj2file, 0, SEEK_END);
- free(buf);
-
- /* Setting movie parameters */
- movie->tk[0].num_samples = snum;
- movie->tk[0].num_chunks = snum;
- setparams(movie, &img);
-
- /* Writing MOOV box */
- buf = (unsigned char*) malloc((TEMP_BUF + snum * 20) * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF + snum * 20));
- mj2_write_moov(movie, cio);
- fwrite(buf, cio_tell(cio), 1, mj2file);
-
- /* Ending program */
- free(img.comps);
- opj_cio_close(cio);
-
-fin:
- fclose(mj2file);
- mj2_destroy_compress(movie);
- free(j2kfilename);
-
- return 0;
-}
diff --git a/openjpeg/src/bin/mj2/readme.txt b/openjpeg/src/bin/mj2/readme.txt
deleted file mode 100644
index 9419d2a2d..000000000
--- a/openjpeg/src/bin/mj2/readme.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Attention : the motion jpeg 2000 files currently only work with OpenJPEG v0.97 that you can find here :
-
-http://www.openjpeg.org/openjpeg_v097.tar.gz \ No newline at end of file