#include "gdcmTransferSyntax.h"
#include "gdcmTrace.h"
#include <cassert>
#include <cstring>
#include <string>
#include <iostream>
namespace gdcm
{
static const char *TSStrings[] = {
"1.2.840.10008.1.2",
"1.2.840.113619.5.2",
"1.2.840.10008.1.2.1",
"1.2.840.10008.1.2.1.99",
"1.2.840.10008.1.2.2",
"1.2.840.10008.1.2.4.50",
"1.2.840.10008.1.2.4.51",
"1.2.840.10008.1.2.4.52",
"1.2.840.10008.1.2.4.53",
"1.2.840.10008.1.2.4.55",
"1.2.840.10008.1.2.4.57",
"1.2.840.10008.1.2.4.70",
"1.2.840.10008.1.2.4.80",
"1.2.840.10008.1.2.4.81",
"1.2.840.10008.1.2.4.90",
"1.2.840.10008.1.2.4.91",
"1.2.840.10008.1.2.4.92",
"1.2.840.10008.1.2.4.93",
"1.2.840.10008.1.2.5",
"1.2.840.10008.1.2.4.100",
"ImplicitVRBigEndianACRNEMA",
"1.2.840.10008.1.20",
"1.3.46.670589.33.1.4.1",
"1.2.840.10008.1.2.4.94",
"1.2.840.10008.1.2.4.101",
"1.2.840.10008.1.2.4.102",
"1.2.840.10008.1.2.4.103",
"1.2.840.10008.1.2.4.201",
"1.2.840.10008.1.2.4.202",
"1.2.840.10008.1.2.4.203",
"1.2.840.10008.1.2.8.1",
"Unknown Transfer Syntax", nullptr };
TransferSyntax::TSType TransferSyntax::GetTSType(const char *cstr)
{
std::string str = cstr;
std::string::size_type notspace = str.find_last_not_of(' ') + 1;
if( notspace != str.size() )
{
gdcmDebugMacro( "BUGGY HEADER: TS contains " <<
str.size()-notspace << " whitespace character(s)" );
str.erase(notspace);
}
int i = 0;
while(TSStrings[i] != nullptr)
{
if( str == TSStrings[i] )
return (TSType)i;
++i;
}
return TS_END;
}
const char* TransferSyntax::GetTSString(TSType ts)
{
gdcm_assert( ts <= TS_END );
return TSStrings[(int)ts];
}
bool TransferSyntax::IsImplicit(TSType ts) const
{
gdcm_assert( ts != TS_END );
return ts == ImplicitVRLittleEndian
|| ts == ImplicitVRBigEndianACRNEMA
|| ts == ImplicitVRBigEndianPrivateGE
#ifdef GDCM_SUPPORT_BROKEN_IMPLEMENTATION
|| ts == WeirdPapryus
#endif
;
}
bool TransferSyntax::IsImplicit() const
{
if ( TSField == TS_END ) return false;
return TSField == ImplicitVRLittleEndian
|| TSField == ImplicitVRBigEndianACRNEMA
|| TSField == ImplicitVRBigEndianPrivateGE
#ifdef GDCM_SUPPORT_BROKEN_IMPLEMENTATION
|| TSField == WeirdPapryus
#endif
;
}
bool TransferSyntax::IsExplicit() const
{
if ( TSField == TS_END ) return false; return !IsImplicit();
}
bool TransferSyntax::IsLossy() const
{
if (
TSField == JPEGBaselineProcess1 ||
TSField == JPEGExtendedProcess2_4 ||
TSField == JPEGExtendedProcess3_5 ||
TSField == JPEGSpectralSelectionProcess6_8 ||
TSField == JPEGFullProgressionProcess10_12 ||
TSField == JPEGLSNearLossless ||
TSField == JPEG2000 ||
TSField == JPEG2000Part2 ||
TSField == JPIPReferenced ||
TSField == MPEG2MainProfile ||
TSField == MPEG2MainProfileHighLevel ||
TSField == MPEG4AVCH264HighProfileLevel4_1 ||
TSField == MPEG4AVCH264BDcompatibleHighProfileLevel4_1 ||
TSField == HTJ2K
)
{
return true;
}
return false;
}
bool TransferSyntax::CanStoreLossy() const
{
if (
TSField == JPEGLosslessProcess14 ||
TSField == JPEGLosslessProcess14_1 ||
TSField == JPEGLSLossless ||
TSField == JPEG2000Lossless ||
TSField == JPEG2000Part2Lossless ||
TSField == DeflatedImageFrameCompression ||
TSField == RLELossless
)
{
return false;
}
return true;
}
bool TransferSyntax::IsLossless() const
{
if (
TSField == JPEGBaselineProcess1 ||
TSField == JPEGExtendedProcess2_4 ||
TSField == JPEGExtendedProcess3_5 ||
TSField == JPEGSpectralSelectionProcess6_8 ||
TSField == JPEGFullProgressionProcess10_12 ||
TSField == MPEG2MainProfile ||
TSField == MPEG2MainProfileHighLevel ||
TSField == MPEG4AVCH264HighProfileLevel4_1 ||
TSField == MPEG4AVCH264BDcompatibleHighProfileLevel4_1 ||
TSField == HTJ2K
)
{
return false;
}
return true;
}
bool TransferSyntax::IsExplicit(TSType ts) const
{
gdcm_assert( ts != TS_END );
return !IsImplicit(ts);
}
TransferSyntax::NegociatedType TransferSyntax::GetNegociatedType() const
{
if( TSField == TS_END )
{
return TransferSyntax::Unknown;
}
else if( IsImplicit(TSField) )
{
return TransferSyntax::Implicit;
}
return TransferSyntax::Explicit;
}
bool TransferSyntax::IsLittleEndian(TSType ts) const
{
gdcm_assert( ts != TS_END );
return !IsBigEndian(ts);
}
bool TransferSyntax::IsBigEndian(TSType ts) const
{
gdcm_assert( ts != TS_END );
return ts == ExplicitVRBigEndian
|| ts == ImplicitVRBigEndianACRNEMA;
}
SwapCode TransferSyntax::GetSwapCode() const
{
gdcm_assert( TSField != TS_END );
if( IsBigEndian( TSField ) )
{
return SwapCode::BigEndian;
}
gdcm_assert( IsLittleEndian( TSField ) );
return SwapCode::LittleEndian;
}
bool TransferSyntax::IsEncoded() const
{
return TSField == DeflatedExplicitVRLittleEndian;
}
bool TransferSyntax::IsEncapsulated() const
{
bool ret = false;
switch( TSField )
{
case JPEGBaselineProcess1:
case JPEGExtendedProcess2_4:
case JPEGExtendedProcess3_5:
case JPEGSpectralSelectionProcess6_8:
case JPEGFullProgressionProcess10_12:
case JPEGLosslessProcess14:
case JPEGLosslessProcess14_1:
case JPEGLSLossless:
case JPEGLSNearLossless:
case JPEG2000Lossless:
case JPEG2000:
case JPEG2000Part2Lossless:
case JPEG2000Part2:
case JPIPReferenced:
case RLELossless:
case MPEG2MainProfile:
case MPEG2MainProfileHighLevel:
case MPEG4AVCH264HighProfileLevel4_1:
case MPEG4AVCH264BDcompatibleHighProfileLevel4_1:
case HTJ2KLossless:
case HTJ2KRPCLLossless:
case HTJ2K:
case DeflatedImageFrameCompression:
ret = true;
break;
default:
;
}
return ret;
}
}