diff 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
line wrap: on
line diff
--- a/UnitTestsSources/FromDcmtkTests.cpp	Thu Mar 12 17:58:34 2020 +0100
+++ b/UnitTestsSources/FromDcmtkTests.cpp	Thu Mar 12 21:48:35 2020 +0100
@@ -1917,7 +1917,7 @@
 
 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
 
-#include "../Core/DicomFormat/DicomImageInformation.h"
+#include "../Core/DicomParsing/Internals/DicomFrameIndex.h"
 
 #include <dcmtk/dcmdata/dcostrmb.h>
 #include <dcmtk/dcmdata/dcpixel.h>
@@ -1954,12 +1954,11 @@
   class DcmtkTranscoder : public IDicomTranscoder
   {
   private:
-    std::unique_ptr<DcmFileFormat>          dicom_;
-    DicomTransferSyntax                     transferSyntax_;
-    std::string                             sopClassUid_;
-    std::string                             sopInstanceUid_;
-    DicomMap                                tags_;
-    std::unique_ptr<DicomImageInformation>  info_;
+    std::unique_ptr<DcmFileFormat>    dicom_;
+    std::unique_ptr<DicomFrameIndex>  index_;
+    DicomTransferSyntax               transferSyntax_;
+    std::string                       sopClassUid_;
+    std::string                       sopInstanceUid_;
 
     void Setup(DcmFileFormat* dicom)
     {
@@ -1972,12 +1971,8 @@
       }
 
       DcmDataset& dataset = *dicom_->getDataset();
+      index_.reset(new DicomFrameIndex(dataset));
 
-      tags_.Clear();
-      FromDcmtkBridge::ExtractDicomSummary(tags_, dataset);
-
-      info_.reset(new DicomImageInformation(tags_));
-      
       E_TransferSyntax xfer = dataset.getOriginalXfer();
       if (xfer == EXS_Unknown)
       {
@@ -1997,12 +1992,20 @@
           "Unsupported transfer syntax: " + boost::lexical_cast<std::string>(xfer));
       }
 
-      if (!tags_.LookupStringValue(sopClassUid_, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) ||
-          !tags_.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false))
+      const char* a = NULL;
+      const char* b = NULL;
+
+      if (!dataset.findAndGetString(DCM_SOPClassUID, a).good() ||
+          !dataset.findAndGetString(DCM_SOPInstanceUID, b).good() ||
+          a == NULL ||
+          b == NULL)
       {
         throw OrthancException(ErrorCode_BadFileFormat,
                                "Missing SOP class/instance UID in DICOM instance");
       }
+
+      sopClassUid_.assign(a);
+      sopInstanceUid_.assign(b);
     }
     
   public:
@@ -2034,7 +2037,7 @@
 
     virtual unsigned int GetFramesCount() ORTHANC_OVERRIDE
     {
-      return info_->GetNumberOfFrames();
+      return index_->GetFramesCount();
     }
 
     virtual ImageAccessor* DecodeFrame(unsigned int frame) ORTHANC_OVERRIDE
@@ -2046,55 +2049,27 @@
     virtual void GetCompressedFrame(std::string& target,
                                     unsigned int frame) ORTHANC_OVERRIDE
     {
+#if 1
+      index_->GetRawFrame(target, frame);
+      printf("%d: %d\n", frame, target.size());
+#endif
+
+#if 1
       assert(dicom_->getDataset() != NULL);
       DcmDataset& dataset = *dicom_->getDataset();
       
       DcmPixelSequence* pixelSequence = FromDcmtkBridge::GetPixelSequence(dataset);
 
-      if (pixelSequence == NULL)
-      {
-        // This is an uncompressed frame
-
-        DcmElement* element = NULL;
-        if (dataset.findAndGetElement(DCM_PixelData, element).good() &&
-            element != NULL)
-        {
-          Uint8* pixelData = NULL;
-        
-          if (element->getUint8Array(pixelData).good() &&
-              pixelData != NULL)
-          {    
-            // TODO => use "pixelData"
-            printf("RAW %d\n", element->getLength());
-          }
-          else
-          {
-            throw OrthancException(ErrorCode_BadFileFormat,
-                                   "Cannot access uncompressed pixel data");
-          }
-        }
-        else
-        {
-          std::string decoded;
-          if (DicomImageDecoder::DecodePsmctRle1(decoded, dataset))
-          {
-            // TODO => use "decoded"
-          }
-          else
-          {
-            throw OrthancException(ErrorCode_BadFileFormat,
-                                   "Cannot access uncompressed pixel data");
-          }
-        }
-      }
-      else
+      if (pixelSequence != NULL &&
+          frame == 0 &&
+          pixelSequence->card() != GetFramesCount() + 1)
       {
         printf("COMPRESSED\n");
-
+        
         // Check out "djcodecd.cc"
-
+        
         printf("%d fragments\n", pixelSequence->card());
-
+        
         // Skip the first fragment, that is the offset table
         for (unsigned long i = 1; ;i++)
         {
@@ -2109,6 +2084,7 @@
           }
         }
       }
+#endif
     }
 
     virtual IDicomTranscoder* Transcode(std::set<DicomTransferSyntax> syntaxes,
@@ -2210,8 +2186,20 @@
          transcoder.GetSopClassUid().c_str(), transcoder.GetSopInstanceUid().c_str(),
          transcoder.GetFramesCount());
 
-  std::string f;
-  transcoder.GetCompressedFrame(f, 0);
+  for (size_t i = 0; i < transcoder.GetFramesCount(); i++)
+  {
+    std::string f;
+    transcoder.GetCompressedFrame(f, i);
+
+    if (i == 0)
+    {
+      static unsigned int i = 0;
+      char buf[1024];
+      sprintf(buf, "/tmp/frame-%06d.dcm", i++);
+      printf(">> %s\n", buf);
+      Orthanc::SystemToolbox::WriteFile(f, buf);
+    }
+  }
 
   printf("\n");
 }
@@ -2271,6 +2259,7 @@
     }
 
     TestFile("/home/jodogne/Subversion/orthanc-tests/Database/Multiframe.dcm");
+    TestFile("/home/jodogne/Subversion/orthanc-tests/Database/Issue44/Monochrome1-Jpeg.dcm");
   }
 }