o Added preliminary support for timed-text wrapping for AS-02. This
[asdcplib.git] / src / JP2K.h
1 /*
2 Copyright (c) 2005-2009, John Hurst
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8 1. Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11    notice, this list of conditions and the following disclaimer in the
12    documentation and/or other materials provided with the distribution.
13 3. The name of the author may not be used to endorse or promote products
14    derived from this software without specific prior written permission.
15
16 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 /*! \file    JP2K.h
28     \version $Id$
29     \brief   JPEG 2000 constants and data structures
30
31     This is not a complete enumeration of all things JP2K.  There is just enough here to
32     support parsing picture metadata from a codestream header.
33 */
34
35 #ifndef _JP2K_H_
36 #define _JP2K_H_
37
38 // AS_DCP.h is included only for it's base type definitions.
39 #include <KM_platform.h>
40 #include <KM_util.h>
41 #include <AS_DCP.h>
42 #include <assert.h>
43
44 namespace ASDCP
45 {
46 namespace JP2K
47 {
48   const byte_t Magic[] = {0xff, 0x4f, 0xff};
49
50   enum Marker_t
51     {
52       MRK_NIL = 0,
53       MRK_SOC = 0xff4f, // Start of codestream
54       MRK_SOT = 0xff90, // Start of tile-part
55       MRK_SOD = 0xff93, // Start of data
56       MRK_EOC = 0xffd9, // End of codestream
57       MRK_SIZ = 0xff51, // Image and tile size
58       MRK_COD = 0xff52, // Coding style default
59       MRK_COC = 0xff53, // Coding style component
60       MRK_RGN = 0xff5e, // Region of interest
61       MRK_QCD = 0xff5c, // Quantization default
62       MRK_QCC = 0xff5d, // Quantization component
63       MRK_POC = 0xff5f, // Progression order change
64       MRK_TLM = 0xff55, // Tile-part lengths
65       MRK_PLM = 0xff57, // Packet length, main header
66       MRK_PLT = 0xff58, // Packet length, tile-part header
67       MRK_PPM = 0xff60, // Packed packet headers, main header
68       MRK_PPT = 0xff61, // Packed packet headers, tile-part header
69       MRK_SOP = 0xff91, // Start of packet
70       MRK_EPH = 0xff92, // End of packet header
71       MRK_CRG = 0xff63, // Component registration
72       MRK_COM = 0xff64, // Comment
73     };
74
75   const char* GetMarkerString(Marker_t m);
76
77   //
78   class Marker
79     {
80       KM_NO_COPY_CONSTRUCT(Marker);
81
82     public:
83       Marker_t m_Type;
84       bool     m_IsSegment;
85       ui32_t   m_DataSize;
86       const byte_t* m_Data;
87
88       Marker() : m_Type(MRK_NIL), m_IsSegment(false), m_DataSize(0), m_Data(0) {}
89       ~Marker() {}
90
91       void Dump(FILE* stream = 0) const;
92     };
93
94   //
95   ASDCP::Result_t GetNextMarker(const byte_t**, Marker&);
96
97   // accessor objects for marker segments
98   namespace Accessor
99     {
100       // image size
101       class SIZ
102         {
103           const byte_t* m_MarkerData;
104           KM_NO_COPY_CONSTRUCT(SIZ);
105           SIZ();
106
107         public:
108           SIZ(const Marker& M)
109             {
110               assert(M.m_Type == MRK_SIZ);
111               m_MarkerData = M.m_Data;
112             }
113
114           ~SIZ() {}
115
116           inline ui16_t Rsize()   { return KM_i16_BE(*(ui16_t*)m_MarkerData); }
117           inline ui32_t Xsize()   { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 2)); }
118           inline ui32_t Ysize()   { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 6)); }
119           inline ui32_t XOsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 10)); }
120           inline ui32_t YOsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 14)); }
121           inline ui32_t XTsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 18)); }
122           inline ui32_t YTsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 22)); }
123           inline ui32_t XTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 26)); }
124           inline ui32_t YTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 30)); }
125           inline ui16_t Csize()   { return KM_i16_BE(*(ui16_t*)(m_MarkerData + 34)); }
126           void ReadComponent(ui32_t index, ImageComponent_t& IC);
127           void Dump(FILE* stream = 0);
128         };
129
130       const int SGcodOFST = 1;
131       const int SPcodOFST = 5;
132
133       // coding style
134       class COD
135         {
136           const byte_t* m_MarkerData;
137
138           KM_NO_COPY_CONSTRUCT(COD);
139           COD();
140
141         public:
142           COD(const Marker& M)
143             {
144               assert(M.m_Type == MRK_COD);
145               m_MarkerData = M.m_Data;
146             }
147
148           ~COD() {}
149           
150           inline ui8_t  ProgOrder()        { return *(m_MarkerData + SGcodOFST ); }
151           inline ui16_t Layers()           { return KM_i16_BE(*(ui16_t*)(m_MarkerData + SGcodOFST + 1));}
152           inline ui8_t  DecompLevels()     { return *(m_MarkerData + SPcodOFST); }
153           inline ui8_t  CodeBlockWidth()   { return *(m_MarkerData + SPcodOFST + 1) + 2; }
154           inline ui8_t  CodeBlockHeight()  { return *(m_MarkerData + SPcodOFST + 2) + 2; }
155           inline ui8_t  CodeBlockStyle()   { return *(m_MarkerData + SPcodOFST + 3); }
156           inline ui8_t  Transformation()   { return *(m_MarkerData + SPcodOFST + 4); }
157
158           void Dump(FILE* stream = 0);
159         };
160
161       // a comment
162       class COM
163         {
164           bool          m_IsText;
165           const byte_t* m_MarkerData;
166           ui32_t        m_DataSize;
167
168           KM_NO_COPY_CONSTRUCT(COM);
169           COM();
170
171         public:
172           COM(const Marker& M)
173             {
174               assert(M.m_Type == MRK_COM);
175               m_IsText = M.m_Data[1] == 1;
176               m_MarkerData = M.m_Data + 2;
177               m_DataSize = M.m_DataSize - 2;
178             }
179
180           ~COM() {}
181           
182           inline bool IsText() { return m_IsText; }
183           inline const byte_t* CommentData() { return m_MarkerData; }
184           inline ui32_t CommentSize() { return m_DataSize; }
185           void Dump(FILE* stream = 0);
186         };
187     } // namespace Accessor
188 } // namespace JP2K
189 } // namespace ASDCP
190
191 #endif // _JP2K_H_
192
193 //
194 // end JP2K.h
195 //