annotate OrthancFramework/Sources/DicomParsing/MemoryBufferTranscoder.cpp @ 4596:2b64cc3cea99

added OrthancPluginContentType_DicomUntilPixelData
author Alain Mazy <am@osimis.io>
date Wed, 17 Mar 2021 15:31:26 +0100
parents a3c6678aa7b1
children 7053502fbf97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
4437
d9473bd5ed43 upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4304
diff changeset
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
8 * modify it under the terms of the GNU Lesser General Public License
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
9 * as published by the Free Software Foundation, either version 3 of
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
10 * the License, or (at your option) any later version.
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 *
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
15 * Lesser General Public License for more details.
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 *
4119
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
18 * License along with this program. If not, see
bf7b9edf6b81 re-licensing the OrthancFramework to LGPL, in order to license Stone of Orthanc under LGPL
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4044
diff changeset
19 * <http://www.gnu.org/licenses/>.
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 **/
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 #include "../PrecompiledHeaders.h"
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "MemoryBufferTranscoder.h"
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
4304
50b0c69b653a continued abi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4273
diff changeset
26 #include "../Logging.h"
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 #include "../OrthancException.h"
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #include "FromDcmtkBridge.h"
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
3929
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
30 #if !defined(NDEBUG) // For debugging
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
31 # include "ParsedDicomFile.h"
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
32 #endif
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
33
4304
50b0c69b653a continued abi
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4273
diff changeset
34
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 namespace Orthanc
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 {
3929
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
37 static void CheckTargetSyntax(const std::string& transcoded,
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
38 const std::set<DicomTransferSyntax>& allowedSyntaxes)
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
39 {
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
40 #if !defined(NDEBUG)
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
41 // Debug mode
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
42 ParsedDicomFile parsed(transcoded);
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
43
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
44 DicomTransferSyntax a, b;
4507
b4c58795f3a8 widening the use of DicomTransferSyntax enum
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 4437
diff changeset
45 if (!const_cast<const ParsedDicomFile&>(parsed).LookupTransferSyntax(b) ||
3929
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
46 !FromDcmtkBridge::LookupOrthancTransferSyntax(a, parsed.GetDcmtkObject()) ||
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
47 a != b ||
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
48 allowedSyntaxes.find(a) == allowedSyntaxes.end())
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
49 {
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
50 throw OrthancException(
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
51 ErrorCode_Plugin,
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
52 "DEBUG - The transcoding plugin has not written to one of the allowed transfer syntaxes");
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
53 }
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
54 #endif
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
55 }
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
56
7dc5e7e0045d simplifying MemoryBufferTranscoder::Transcode() interface
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3910
diff changeset
57
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
58 bool MemoryBufferTranscoder::Transcode(DicomImage& target,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
59 DicomImage& source,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
60 const std::set<DicomTransferSyntax>& allowedSyntaxes,
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
61 bool allowNewSopInstanceUid)
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
62 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
63 target.Clear();
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
64
3946
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
65 #if !defined(NDEBUG)
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
66 // Don't run this code in release mode, as it implies parsing the DICOM file
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
67 DicomTransferSyntax sourceSyntax;
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
68 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed()))
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
69 {
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
70 LOG(ERROR) << "Unsupport transfer syntax for transcoding";
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
71 return false;
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
72 }
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
73
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
74 const std::string sourceSopInstanceUid = GetSopInstanceUid(source.GetParsed());
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
75 #endif
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
76
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
77 std::string buffer;
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3946
diff changeset
78 if (TranscodeBuffer(buffer, source.GetBufferData(), source.GetBufferSize(),
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3946
diff changeset
79 allowedSyntaxes, allowNewSopInstanceUid))
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
80 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
81 CheckTargetSyntax(buffer, allowedSyntaxes); // For debug only
3946
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
82
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
83 target.AcquireBuffer(buffer);
3946
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
84
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
85 #if !defined(NDEBUG)
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
86 // Only run the sanity check in debug mode
3951
5fe8c6d3212e removed useless information "hasSopInstanceUidChanged"
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3946
diff changeset
87 CheckTranscoding(target, sourceSyntax, sourceSopInstanceUid,
3946
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
88 allowedSyntaxes, allowNewSopInstanceUid);
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
89 #endif
1f33ed7f82e6 automatic test of transcoding
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3945
diff changeset
90
3944
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
91 return true;
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
92 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
93 else
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
94 {
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
95 return false;
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
96 }
aae045f802f4 preparing simplified interface for IDicomTranscoder
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 3930
diff changeset
97 }
3893
7a5fa8f307e9 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 }