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