jpt.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
  3. * Copyright (c) 2002-2007, Professor Benoit Macq
  4. * Copyright (c) 2002-2003, Yannick Verschueren
  5. * Copyright (c) 2005, Herve Drolon, FreeImage Team
  6. * All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  18. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  21. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27. * POSSIBILITY OF SUCH DAMAGE.
  28. */
  29. #include "opj_includes.h"
  30. /*
  31. * Read the information contains in VBAS [JPP/JPT stream message header]
  32. * Store information (7 bits) in value
  33. *
  34. */
  35. unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
  36. unsigned char elmt;
  37. elmt = cio_read(cio, 1);
  38. while ((elmt >> 7) == 1) {
  39. value = (value << 7);
  40. value |= (elmt & 0x7f);
  41. elmt = cio_read(cio, 1);
  42. }
  43. value = (value << 7);
  44. value |= (elmt & 0x7f);
  45. return value;
  46. }
  47. /*
  48. * Initialize the value of the message header structure
  49. *
  50. */
  51. void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
  52. header->Id = 0; /* In-class Identifier */
  53. header->last_byte = 0; /* Last byte information */
  54. header->Class_Id = 0; /* Class Identifier */
  55. header->CSn_Id = 0; /* CSn : index identifier */
  56. header->Msg_offset = 0; /* Message offset */
  57. header->Msg_length = 0; /* Message length */
  58. header->Layer_nb = 0; /* Auxiliary for JPP case */
  59. }
  60. /*
  61. * Re-initialize the value of the message header structure
  62. *
  63. * Only parameters always present in message header
  64. *
  65. */
  66. void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
  67. header->Id = 0; /* In-class Identifier */
  68. header->last_byte = 0; /* Last byte information */
  69. header->Msg_offset = 0; /* Message offset */
  70. header->Msg_length = 0; /* Message length */
  71. }
  72. /*
  73. * Read the message header for a JPP/JPT - stream
  74. *
  75. */
  76. void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
  77. unsigned char elmt, Class = 0, CSn = 0;
  78. jpt_reinit_msg_header(header);
  79. /* ------------- */
  80. /* VBAS : Bin-ID */
  81. /* ------------- */
  82. elmt = cio_read(cio, 1);
  83. /* See for Class and CSn */
  84. switch ((elmt >> 5) & 0x03) {
  85. case 0:
  86. opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");
  87. break;
  88. case 1:
  89. Class = 0;
  90. CSn = 0;
  91. break;
  92. case 2:
  93. Class = 1;
  94. CSn = 0;
  95. break;
  96. case 3:
  97. Class = 1;
  98. CSn = 1;
  99. break;
  100. default:
  101. break;
  102. }
  103. /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
  104. if (((elmt >> 4) & 0x01) == 1)
  105. header->last_byte = 1;
  106. /* In-class identifier */
  107. header->Id |= (elmt & 0x0f);
  108. if ((elmt >> 7) == 1)
  109. header->Id = jpt_read_VBAS_info(cio, header->Id);
  110. /* ------------ */
  111. /* VBAS : Class */
  112. /* ------------ */
  113. if (Class == 1) {
  114. header->Class_Id = 0;
  115. header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
  116. }
  117. /* ---------- */
  118. /* VBAS : CSn */
  119. /* ---------- */
  120. if (CSn == 1) {
  121. header->CSn_Id = 0;
  122. header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
  123. }
  124. /* ----------------- */
  125. /* VBAS : Msg_offset */
  126. /* ----------------- */
  127. header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
  128. /* ----------------- */
  129. /* VBAS : Msg_length */
  130. /* ----------------- */
  131. header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
  132. /* ---------- */
  133. /* VBAS : Aux */
  134. /* ---------- */
  135. if ((header->Class_Id & 0x01) == 1) {
  136. header->Layer_nb = 0;
  137. header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
  138. }
  139. }