diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-01-14 17:39:32 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-01-20 11:20:25 +0000 |
| commit | 3f630fb8334238ab8a58fbe1a0f513ae2c00de80 (patch) | |
| tree | 4b773b91029d6374bfd4f2194053d3e249d597cd /asdcplib/src/JP2K.cpp | |
| parent | 49cafda01b3e07c47e3b20dd5ee91e1426446aea (diff) | |
Simplify time representation; better in-tree DCP subtitle parser.
Diffstat (limited to 'asdcplib/src/JP2K.cpp')
| -rwxr-xr-x | asdcplib/src/JP2K.cpp | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/asdcplib/src/JP2K.cpp b/asdcplib/src/JP2K.cpp new file mode 100755 index 0000000..4cc0e50 --- /dev/null +++ b/asdcplib/src/JP2K.cpp @@ -0,0 +1,224 @@ +/* +Copyright (c) 2005-2009, John Hurst +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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ +/*! \file JP2K.cpp + \version $Id: JP2K.cpp,v 1.8 2010/06/17 03:33:17 jhurst Exp $ + \brief JPEG 2000 parser implementation + + This is not a complete implementation of all things JP2K. There is just enough here to + support parsing picture metadata from a codestream header. +*/ + +#include <JP2K.h> +#include <KM_log.h> +using Kumu::DefaultLogSink; + + +// when indexed with the second byte of a marker code, this table will procuce one of +// two values: +// 0 - the marker is a standalone marker +// 1 - the marker designates a marker segment +// +const byte_t MarkerSegmentMap[] = + { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 + /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 + /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 + /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 + /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 + /* 5 */ 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, // 5 + /* 6 */ 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 + /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 + /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 + /* 9 */ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 + /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // a + /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // b + /* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // c + /* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // d + /* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // e + /* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // f + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + }; + + +// +ASDCP::Result_t +ASDCP::JP2K::GetNextMarker(const byte_t** buf, JP2K::Marker& Marker) +{ + assert((buf != 0) && (*buf != 0 )); + + if ( **buf != 0xff ) + return ASDCP::RESULT_FAIL; + + Marker.m_IsSegment = (MarkerSegmentMap[*(++(*buf))] == 1); + Marker.m_Type = (Marker_t)(0xff00 | *(*buf)++); + + if ( Marker.m_IsSegment ) + { + Marker.m_DataSize = *(*buf)++ << 8; + Marker.m_DataSize |= *(*buf)++; + Marker.m_DataSize -= 2; + Marker.m_Data = *buf; + *buf += Marker.m_DataSize; + } + + + if ( Marker.m_DataSize != 0 && Marker.m_DataSize < 3 ) + { + DefaultLogSink().Error("Illegal data size: %u\n", Marker.m_DataSize); + return ASDCP::RESULT_FAIL; + } + + return ASDCP::RESULT_OK; +} + + +//------------------------------------------------------------------------------------------------------- +// + +// +void +ASDCP::JP2K::Accessor::SIZ::ReadComponent(ui32_t index, ASDCP::JP2K::ImageComponent_t& IC) +{ + assert ( index < Csize() ); + const byte_t* p = m_MarkerData + 36 + (index * 3); + IC.Ssize = *p++; + IC.XRsize = *p++; + IC.YRsize = *p; +} + +// +void +ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream) +{ + if ( stream == 0 ) + stream = stderr; + + fprintf(stream, "SIZ: \n"); + fprintf(stream, " Rsize: %hu\n", Rsize()); + fprintf(stream, " Xsize: %u\n", Xsize()); + fprintf(stream, " Ysize: %u\n", Ysize()); + fprintf(stream, " XOsize: %u\n", XOsize()); + fprintf(stream, " YOsize: %u\n", YOsize()); + fprintf(stream, " XTsize: %u\n", XTsize()); + fprintf(stream, " YTsize: %u\n", YTsize()); + fprintf(stream, "XTOsize: %u\n", XTOsize()); + fprintf(stream, "YTOsize: %u\n", YTOsize()); + fprintf(stream, " Csize: %u\n", Csize()); + + if ( Csize() > 0 ) + { + fprintf(stream, "Components\n"); + + for ( ui32_t i = 0; i < Csize(); i++ ) + { + ImageComponent_t TmpComp; + ReadComponent(i, TmpComp); + fprintf(stream, "%u: ", i); + fprintf(stream, "%u, %u, %u\n", TmpComp.Ssize, TmpComp.XRsize, TmpComp.YRsize); + } + } +} + +// +void +ASDCP::JP2K::Accessor::COM::Dump(FILE* stream) +{ + if ( stream == 0 ) + stream = stderr; + + if ( IsText() ) + { + char* t_str = (char*)malloc(CommentSize() + 1); + assert( t_str != 0 ); + ui32_t cs = CommentSize(); + memcpy(t_str, CommentData(), cs); + t_str[cs] = 0; + fprintf(stream, "COM:%s\n", t_str); + } + else + { + fprintf(stream, "COM:\n"); + Kumu::hexdump(CommentData(), CommentSize(), stream); + } +} + + +//------------------------------------------------------------------------------------------------------- +// + + +// +void +ASDCP::JP2K::Marker::Dump(FILE* stream) const +{ + if ( stream == 0 ) + stream = stderr; + + fprintf(stream, "Marker%s 0x%04x: %s", (m_IsSegment ? " segment" : ""), m_Type, GetMarkerString(m_Type)); + + if ( m_IsSegment ) + fprintf(stream, ", 0x%0x bytes", m_DataSize); + + fputc('\n', stream); +} + +// +const char* +ASDCP::JP2K::GetMarkerString(Marker_t m) +{ + switch ( m ) + { + case MRK_NIL: return "NIL"; break; + case MRK_SOC: return "SOC: Start of codestream"; break; + case MRK_SOT: return "SOT: Start of tile-part"; break; + case MRK_SOD: return "SOD: Start of data"; break; + case MRK_EOC: return "EOC: End of codestream"; break; + case MRK_SIZ: return "SIZ: Image and tile size"; break; + case MRK_COD: return "COD: Coding style default"; break; + case MRK_COC: return "COC: Coding style component"; break; + case MRK_RGN: return "RGN: Region of interest"; break; + case MRK_QCD: return "QCD: Quantization default"; break; + case MRK_QCC: return "QCC: Quantization component"; break; + case MRK_POC: return "POC: Progression order change"; break; + case MRK_TLM: return "TLM: Tile-part lengths"; break; + case MRK_PLM: return "PLM: Packet length, main header"; break; + case MRK_PLT: return "PLT: Packet length, tile-part header"; break; + case MRK_PPM: return "PPM: Packed packet headers, main header"; break; + case MRK_PPT: return "PPT: Packed packet headers, tile-part header"; break; + case MRK_SOP: return "SOP: Start of packet"; break; + case MRK_EPH: return "EPH: End of packet header"; break; + case MRK_CRG: return "CRG: Component registration"; break; + case MRK_COM: return "COM: Comment"; break; + } + + return "Unknown marker code"; +} + +// +// end JP2K.cpp +// |
