/*
-Copyright (c) 2005-2010, John Hurst
+Copyright (c) 2005-2014, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
{
fprintf(stream, "\n\
%s (asdcplib %s)\n\n\
-Copyright (c) 2005-2010 John Hurst\n\n\
+Copyright (c) 2005-2018 John Hurst\n\n\
%s is part of asdcplib.\n\
asdcplib may be copied only under the terms of the license found at\n\
the top of every file in the asdcplib distribution kit.\n\n\
}
ASDCP::JP2K::FrameBuffer FB;
- Marker MyMarker;
+ Marker current_marker;
CodestreamParser Parser;
std::list<std::string>::iterator i;
+ bool has_soc = false;
+ bool has_tlm = false;
+ int marker_count = 0;
Result_t result = FB.Capacity(1024*1024*4);
const byte_t* p = FB.RoData();
const byte_t* end_p = p + FB.Size();
- while ( p < end_p && ASDCP_SUCCESS(GetNextMarker(&p, MyMarker)) )
+ while ( p < end_p && ASDCP_SUCCESS(GetNextMarker(&p, current_marker)) )
{
+ ++marker_count;
+
+ if ( current_marker.m_Type == MRK_SOC )
+ {
+ if ( has_soc )
+ {
+ fprintf(stderr, "Duplicate SOC detected.\n");
+ result = RESULT_FAIL;
+ break;
+ }
+ else
+ {
+ has_soc = true;
+ continue;
+ }
+ }
+
+ if ( ! has_soc )
+ {
+ fprintf(stderr, "Markers detected before SOC.\n");
+ result = RESULT_FAIL;
+ break;
+ }
+
if ( Options.verbose_flag )
{
- MyMarker.Dump(stdout);
+ current_marker.Dump(stdout);
if ( Options.detail_flag )
- hexdump(MyMarker.m_Data - 2, MyMarker.m_DataSize + 2, stdout);
+ {
+ hexdump(current_marker.m_Data - 2, current_marker.m_DataSize + 2, stdout);
+ }
}
- switch ( MyMarker.m_Type )
+ if ( current_marker.m_Type == MRK_SOD )
{
- case MRK_SOD:
p = end_p;
- break;
-
- case MRK_SIZ:
- {
- Accessor::SIZ SIZ_(MyMarker);
- SIZ_.Dump(stdout);
- }
- break;
+ }
+ else if ( current_marker.m_Type == MRK_SIZ )
+ {
+ Accessor::SIZ SIZ_(current_marker);
+ SIZ_.Dump(stdout);
+ }
+ else if ( current_marker.m_Type == MRK_COD )
+ {
+ Accessor::COD COD_(current_marker);
+ COD_.Dump(stdout);
+ }
+ else if ( current_marker.m_Type == MRK_COM )
+ {
+ Accessor::COM COM_(current_marker);
+ COM_.Dump(stdout);
+ }
+ else if ( current_marker.m_Type == MRK_QCD )
+ {
+ Accessor::QCD QCD_(current_marker);
+ QCD_.Dump(stdout);
+ }
+ else if ( current_marker.m_Type == MRK_TLM )
+ {
+ has_tlm = true;
+ }
+ else
+ {
+ fprintf(stderr, "Unprocessed marker - %s\n", GetMarkerString(current_marker.m_Type));
+ }
+ }
- case MRK_COM:
- {
- Accessor::COM COM_(MyMarker);
- COM_.Dump(stdout);
- }
- break;
+ /*
+ while ( p < end_p )
+ {
+ if ( *p == 0xff )
+ {
+ fprintf(stdout, "0x%02x 0x%02x 0x%02x\n", *(p+1), *(p+2), *(p+3));
+ p += 4;
+ }
+ else
+ {
+ ++p;
}
}
+ */
+ }
+ }
+
+ if ( marker_count == 0 )
+ {
+ fprintf(stderr, "No JPEG 2000 marker items found.\n");
+ result = RESULT_FAIL;
+ }
+ else
+ {
+ fprintf(stderr, "Processed %d JPEG 2000 marker item%s.\n", marker_count, (marker_count==1?"":"s"));
+
+ if ( ! has_tlm )
+ {
+ fprintf(stderr, "No TLM marker found.\n");
+ result = RESULT_FAIL;
}
}