Mercurial > hg > orthanc
comparison UnitTestsSources/FromDcmtkTests.cpp @ 3745:113a7b994a12
extracting the raw frame in the transcoder
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 12 Mar 2020 21:48:35 +0100 |
parents | accf1b60b108 |
children | ca36e3f1112c c6658187e4b1 |
comparison
equal
deleted
inserted
replaced
3744:accf1b60b108 | 3745:113a7b994a12 |
---|---|
1915 | 1915 |
1916 | 1916 |
1917 | 1917 |
1918 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 | 1918 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 |
1919 | 1919 |
1920 #include "../Core/DicomFormat/DicomImageInformation.h" | 1920 #include "../Core/DicomParsing/Internals/DicomFrameIndex.h" |
1921 | 1921 |
1922 #include <dcmtk/dcmdata/dcostrmb.h> | 1922 #include <dcmtk/dcmdata/dcostrmb.h> |
1923 #include <dcmtk/dcmdata/dcpixel.h> | 1923 #include <dcmtk/dcmdata/dcpixel.h> |
1924 #include <dcmtk/dcmdata/dcpxitem.h> | 1924 #include <dcmtk/dcmdata/dcpxitem.h> |
1925 | 1925 |
1952 | 1952 |
1953 | 1953 |
1954 class DcmtkTranscoder : public IDicomTranscoder | 1954 class DcmtkTranscoder : public IDicomTranscoder |
1955 { | 1955 { |
1956 private: | 1956 private: |
1957 std::unique_ptr<DcmFileFormat> dicom_; | 1957 std::unique_ptr<DcmFileFormat> dicom_; |
1958 DicomTransferSyntax transferSyntax_; | 1958 std::unique_ptr<DicomFrameIndex> index_; |
1959 std::string sopClassUid_; | 1959 DicomTransferSyntax transferSyntax_; |
1960 std::string sopInstanceUid_; | 1960 std::string sopClassUid_; |
1961 DicomMap tags_; | 1961 std::string sopInstanceUid_; |
1962 std::unique_ptr<DicomImageInformation> info_; | |
1963 | 1962 |
1964 void Setup(DcmFileFormat* dicom) | 1963 void Setup(DcmFileFormat* dicom) |
1965 { | 1964 { |
1966 dicom_.reset(dicom); | 1965 dicom_.reset(dicom); |
1967 | 1966 |
1970 { | 1969 { |
1971 throw OrthancException(ErrorCode_NullPointer); | 1970 throw OrthancException(ErrorCode_NullPointer); |
1972 } | 1971 } |
1973 | 1972 |
1974 DcmDataset& dataset = *dicom_->getDataset(); | 1973 DcmDataset& dataset = *dicom_->getDataset(); |
1975 | 1974 index_.reset(new DicomFrameIndex(dataset)); |
1976 tags_.Clear(); | 1975 |
1977 FromDcmtkBridge::ExtractDicomSummary(tags_, dataset); | |
1978 | |
1979 info_.reset(new DicomImageInformation(tags_)); | |
1980 | |
1981 E_TransferSyntax xfer = dataset.getOriginalXfer(); | 1976 E_TransferSyntax xfer = dataset.getOriginalXfer(); |
1982 if (xfer == EXS_Unknown) | 1977 if (xfer == EXS_Unknown) |
1983 { | 1978 { |
1984 dataset.updateOriginalXfer(); | 1979 dataset.updateOriginalXfer(); |
1985 xfer = dataset.getOriginalXfer(); | 1980 xfer = dataset.getOriginalXfer(); |
1995 throw OrthancException( | 1990 throw OrthancException( |
1996 ErrorCode_BadFileFormat, | 1991 ErrorCode_BadFileFormat, |
1997 "Unsupported transfer syntax: " + boost::lexical_cast<std::string>(xfer)); | 1992 "Unsupported transfer syntax: " + boost::lexical_cast<std::string>(xfer)); |
1998 } | 1993 } |
1999 | 1994 |
2000 if (!tags_.LookupStringValue(sopClassUid_, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) || | 1995 const char* a = NULL; |
2001 !tags_.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) | 1996 const char* b = NULL; |
1997 | |
1998 if (!dataset.findAndGetString(DCM_SOPClassUID, a).good() || | |
1999 !dataset.findAndGetString(DCM_SOPInstanceUID, b).good() || | |
2000 a == NULL || | |
2001 b == NULL) | |
2002 { | 2002 { |
2003 throw OrthancException(ErrorCode_BadFileFormat, | 2003 throw OrthancException(ErrorCode_BadFileFormat, |
2004 "Missing SOP class/instance UID in DICOM instance"); | 2004 "Missing SOP class/instance UID in DICOM instance"); |
2005 } | 2005 } |
2006 | |
2007 sopClassUid_.assign(a); | |
2008 sopInstanceUid_.assign(b); | |
2006 } | 2009 } |
2007 | 2010 |
2008 public: | 2011 public: |
2009 DcmtkTranscoder(DcmFileFormat* dicom) // Takes ownership | 2012 DcmtkTranscoder(DcmFileFormat* dicom) // Takes ownership |
2010 { | 2013 { |
2032 return sopInstanceUid_; | 2035 return sopInstanceUid_; |
2033 } | 2036 } |
2034 | 2037 |
2035 virtual unsigned int GetFramesCount() ORTHANC_OVERRIDE | 2038 virtual unsigned int GetFramesCount() ORTHANC_OVERRIDE |
2036 { | 2039 { |
2037 return info_->GetNumberOfFrames(); | 2040 return index_->GetFramesCount(); |
2038 } | 2041 } |
2039 | 2042 |
2040 virtual ImageAccessor* DecodeFrame(unsigned int frame) ORTHANC_OVERRIDE | 2043 virtual ImageAccessor* DecodeFrame(unsigned int frame) ORTHANC_OVERRIDE |
2041 { | 2044 { |
2042 assert(dicom_->getDataset() != NULL); | 2045 assert(dicom_->getDataset() != NULL); |
2044 } | 2047 } |
2045 | 2048 |
2046 virtual void GetCompressedFrame(std::string& target, | 2049 virtual void GetCompressedFrame(std::string& target, |
2047 unsigned int frame) ORTHANC_OVERRIDE | 2050 unsigned int frame) ORTHANC_OVERRIDE |
2048 { | 2051 { |
2052 #if 1 | |
2053 index_->GetRawFrame(target, frame); | |
2054 printf("%d: %d\n", frame, target.size()); | |
2055 #endif | |
2056 | |
2057 #if 1 | |
2049 assert(dicom_->getDataset() != NULL); | 2058 assert(dicom_->getDataset() != NULL); |
2050 DcmDataset& dataset = *dicom_->getDataset(); | 2059 DcmDataset& dataset = *dicom_->getDataset(); |
2051 | 2060 |
2052 DcmPixelSequence* pixelSequence = FromDcmtkBridge::GetPixelSequence(dataset); | 2061 DcmPixelSequence* pixelSequence = FromDcmtkBridge::GetPixelSequence(dataset); |
2053 | 2062 |
2054 if (pixelSequence == NULL) | 2063 if (pixelSequence != NULL && |
2055 { | 2064 frame == 0 && |
2056 // This is an uncompressed frame | 2065 pixelSequence->card() != GetFramesCount() + 1) |
2057 | |
2058 DcmElement* element = NULL; | |
2059 if (dataset.findAndGetElement(DCM_PixelData, element).good() && | |
2060 element != NULL) | |
2061 { | |
2062 Uint8* pixelData = NULL; | |
2063 | |
2064 if (element->getUint8Array(pixelData).good() && | |
2065 pixelData != NULL) | |
2066 { | |
2067 // TODO => use "pixelData" | |
2068 printf("RAW %d\n", element->getLength()); | |
2069 } | |
2070 else | |
2071 { | |
2072 throw OrthancException(ErrorCode_BadFileFormat, | |
2073 "Cannot access uncompressed pixel data"); | |
2074 } | |
2075 } | |
2076 else | |
2077 { | |
2078 std::string decoded; | |
2079 if (DicomImageDecoder::DecodePsmctRle1(decoded, dataset)) | |
2080 { | |
2081 // TODO => use "decoded" | |
2082 } | |
2083 else | |
2084 { | |
2085 throw OrthancException(ErrorCode_BadFileFormat, | |
2086 "Cannot access uncompressed pixel data"); | |
2087 } | |
2088 } | |
2089 } | |
2090 else | |
2091 { | 2066 { |
2092 printf("COMPRESSED\n"); | 2067 printf("COMPRESSED\n"); |
2093 | 2068 |
2094 // Check out "djcodecd.cc" | 2069 // Check out "djcodecd.cc" |
2095 | 2070 |
2096 printf("%d fragments\n", pixelSequence->card()); | 2071 printf("%d fragments\n", pixelSequence->card()); |
2097 | 2072 |
2098 // Skip the first fragment, that is the offset table | 2073 // Skip the first fragment, that is the offset table |
2099 for (unsigned long i = 1; ;i++) | 2074 for (unsigned long i = 1; ;i++) |
2100 { | 2075 { |
2101 DcmPixelItem *fragment = NULL; | 2076 DcmPixelItem *fragment = NULL; |
2102 if (pixelSequence->getItem(fragment, i).good()) | 2077 if (pixelSequence->getItem(fragment, i).good()) |
2107 { | 2082 { |
2108 break; | 2083 break; |
2109 } | 2084 } |
2110 } | 2085 } |
2111 } | 2086 } |
2087 #endif | |
2112 } | 2088 } |
2113 | 2089 |
2114 virtual IDicomTranscoder* Transcode(std::set<DicomTransferSyntax> syntaxes, | 2090 virtual IDicomTranscoder* Transcode(std::set<DicomTransferSyntax> syntaxes, |
2115 bool allowNewSopInstanceUid) ORTHANC_OVERRIDE | 2091 bool allowNewSopInstanceUid) ORTHANC_OVERRIDE |
2116 { | 2092 { |
2208 | 2184 |
2209 printf("[%s] [%s] [%s] %d\n", GetTransferSyntaxUid(transcoder.GetTransferSyntax()), | 2185 printf("[%s] [%s] [%s] %d\n", GetTransferSyntaxUid(transcoder.GetTransferSyntax()), |
2210 transcoder.GetSopClassUid().c_str(), transcoder.GetSopInstanceUid().c_str(), | 2186 transcoder.GetSopClassUid().c_str(), transcoder.GetSopInstanceUid().c_str(), |
2211 transcoder.GetFramesCount()); | 2187 transcoder.GetFramesCount()); |
2212 | 2188 |
2213 std::string f; | 2189 for (size_t i = 0; i < transcoder.GetFramesCount(); i++) |
2214 transcoder.GetCompressedFrame(f, 0); | 2190 { |
2191 std::string f; | |
2192 transcoder.GetCompressedFrame(f, i); | |
2193 | |
2194 if (i == 0) | |
2195 { | |
2196 static unsigned int i = 0; | |
2197 char buf[1024]; | |
2198 sprintf(buf, "/tmp/frame-%06d.dcm", i++); | |
2199 printf(">> %s\n", buf); | |
2200 Orthanc::SystemToolbox::WriteFile(f, buf); | |
2201 } | |
2202 } | |
2215 | 2203 |
2216 printf("\n"); | 2204 printf("\n"); |
2217 } | 2205 } |
2218 | 2206 |
2219 TEST(Toto, Transcode) | 2207 TEST(Toto, Transcode) |
2269 TestFile(it->path().string()); | 2257 TestFile(it->path().string()); |
2270 } | 2258 } |
2271 } | 2259 } |
2272 | 2260 |
2273 TestFile("/home/jodogne/Subversion/orthanc-tests/Database/Multiframe.dcm"); | 2261 TestFile("/home/jodogne/Subversion/orthanc-tests/Database/Multiframe.dcm"); |
2262 TestFile("/home/jodogne/Subversion/orthanc-tests/Database/Issue44/Monochrome1-Jpeg.dcm"); | |
2274 } | 2263 } |
2275 } | 2264 } |
2276 | 2265 |
2277 #endif | 2266 #endif |