Mercurial > hg > orthanc
diff OrthancServer/Internals/DicomFrameIndex.cpp @ 1950:533ff46e944b
return a single raw frame from DICOM videos
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 05 Apr 2016 11:07:02 +0200 |
parents | cda5b0ab4ce5 |
children | 01de36d949c3 |
line wrap: on
line diff
--- a/OrthancServer/Internals/DicomFrameIndex.cpp Tue Apr 05 10:30:17 2016 +0200 +++ b/OrthancServer/Internals/DicomFrameIndex.cpp Tue Apr 05 11:07:02 2016 +0200 @@ -37,6 +37,7 @@ #include "../../Core/DicomFormat/DicomImageInformation.h" #include "../FromDcmtkBridge.h" #include "../OrthancInitialization.h" +#include "../../Core/Endianness.h" #include "DicomImageDecoder.h" #include <boost/lexical_cast.hpp> @@ -45,16 +46,6 @@ #include <dcmtk/dcmdata/dcpxitem.h> #include <dcmtk/dcmdata/dcpixseq.h> -#if defined(_WIN32) // Windows machines are always little-endian -# define le32toh(x) x -#elif defined(__APPLE__) -# include <libkern/OSByteOrder.h> -# define le32toh(x) OSSwapLittleToHostInt32(x) -#else -# include <endian.h> -#endif - - namespace Orthanc { class DicomFrameIndex::FragmentIndex : public DicomFrameIndex::IIndex @@ -328,9 +319,38 @@ + bool DicomFrameIndex::IsVideo(const DcmDataset& dataset) + { + if (dataset.getOriginalXfer() == EXS_MPEG2MainProfileAtMainLevel || + dataset.getOriginalXfer() == EXS_MPEG2MainProfileAtHighLevel) + { + return true; + } + +#if DCMTK_VERSION_NUMBER > 360 + // New transfer syntaxes introduced in the DICOM standard after DCMTK 3.6.0 + if (dataset.getOriginalXfer() == EXS_MPEG4HighProfileLevel4 || + dataset.getOriginalXfer() == EXS_MPEG4BDcompatibleHighProfileLevel4 || + dataset.getOriginalXfer() == EXS_MPEG4HighProfileLevel4_2_For2DVideo || + dataset.getOriginalXfer() == EXS_MPEG4HighProfileLevel4_2_For3DVideo || + dataset.getOriginalXfer() == EXS_MPEG4StereoHighProfileLevel4_2) + { + return true; + } +#endif + + return false; + } + unsigned int DicomFrameIndex::GetFramesCount(DcmDataset& dataset) { + // Assume 1 frame for video transfer syntaxes + if (IsVideo(dataset)) + { + return 1; + } + const char* tmp = NULL; if (!dataset.findAndGetString(DCM_NumberOfFrames, tmp).good() || tmp == NULL)