comparison OrthancFramework/Sources/DicomFormat/DicomStreamReader.cpp @ 5324:e95caa87fed8

only store PixelDataVR metadata if needed
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 25 Jun 2023 15:19:25 +0200
parents 03501a258d9e
children 48b8dae6dc77
comparison
equal deleted inserted replaced
5323:138e9d0c08c1 5324:e95caa87fed8
580 { 580 {
581 private: 581 private:
582 bool hasPixelData_; 582 bool hasPixelData_;
583 uint64_t pixelDataOffset_; 583 uint64_t pixelDataOffset_;
584 ValueRepresentation pixelDataVR_; 584 ValueRepresentation pixelDataVR_;
585 DicomTransferSyntax transferSyntax_;
585 586
586 public: 587 public:
587 PixelDataVisitor() : 588 PixelDataVisitor() :
588 hasPixelData_(false), 589 hasPixelData_(false),
589 pixelDataOffset_(0), 590 pixelDataOffset_(0),
590 pixelDataVR_(ValueRepresentation_Unknown) 591 pixelDataVR_(ValueRepresentation_Unknown),
592 transferSyntax_(DicomTransferSyntax_LittleEndianImplicit) // Default DICOM transfer syntax
591 { 593 {
592 } 594 }
593 595
594 virtual void VisitMetaHeaderTag(const DicomTag& tag, 596 virtual void VisitMetaHeaderTag(const DicomTag& tag,
595 const ValueRepresentation& vr, 597 const ValueRepresentation& vr,
597 { 599 {
598 } 600 }
599 601
600 virtual void VisitTransferSyntax(DicomTransferSyntax transferSyntax) ORTHANC_OVERRIDE 602 virtual void VisitTransferSyntax(DicomTransferSyntax transferSyntax) ORTHANC_OVERRIDE
601 { 603 {
604 transferSyntax_ = transferSyntax;
602 } 605 }
603 606
604 virtual bool VisitDatasetTag(const DicomTag& tag, 607 virtual bool VisitDatasetTag(const DicomTag& tag,
605 const ValueRepresentation& vr, 608 const ValueRepresentation& vr,
606 const std::string& value, 609 const std::string& value,
609 { 612 {
610 if (tag == DICOM_TAG_PIXEL_DATA) 613 if (tag == DICOM_TAG_PIXEL_DATA)
611 { 614 {
612 hasPixelData_ = true; 615 hasPixelData_ = true;
613 pixelDataOffset_ = fileOffset; 616 pixelDataOffset_ = fileOffset;
614 pixelDataVR_ = vr; 617
618 if (transferSyntax_ == DicomTransferSyntax_LittleEndianImplicit)
619 {
620 // Implicit Little Endian has always "OW" VR for pixel data
621 // https://dicom.nema.org/medical/dicom/current/output/chtml/part05/chapter_A.html
622 pixelDataVR_ = ValueRepresentation_OtherWord;
623 }
624 else if (transferSyntax_ == DicomTransferSyntax_LittleEndianExplicit ||
625 transferSyntax_ == DicomTransferSyntax_BigEndianExplicit)
626 {
627 pixelDataVR_ = vr;
628 }
629 else
630 {
631 // Compressed transfer syntaxes must always be OB
632 pixelDataVR_ = ValueRepresentation_OtherByte;
633 }
615 } 634 }
616 635
617 // Stop processing once pixel data has been passed 636 // Stop processing once pixel data has been passed
618 return (tag < DICOM_TAG_PIXEL_DATA); 637 return (tag < DICOM_TAG_PIXEL_DATA);
619 } 638 }