1 /*
2 *
3 * Copyright (C) 1997-2018, OFFIS e.V.
4 * All rights reserved. See COPYRIGHT file for details.
5 *
6 * This software and supporting documentation were developed by
7 *
8 * OFFIS e.V.
9 * R&D Division Health
10 * Escherweg 2
11 * D-26121 Oldenburg, Germany
12 *
13 *
14 * Module: dcmjpeg
15 *
16 * Author: Marco Eichelberg
17 *
18 * Purpose: singleton class that registers decoders for all supported JPEG processes.
19 *
20 */
21
22 #include "dcmtk/config/osconfig.h"
23 #include "dcmtk/dcmjpeg/djdecode.h"
24
25 #include "dcmtk/dcmdata/dccodec.h" /* for DcmCodecStruct */
26 #include "dcmtk/dcmjpeg/djdecbas.h"
27 #include "dcmtk/dcmjpeg/djdecext.h"
28 #include "dcmtk/dcmjpeg/djdecsps.h"
29 #include "dcmtk/dcmjpeg/djdecpro.h"
30 #include "dcmtk/dcmjpeg/djdecsv1.h"
31 #include "dcmtk/dcmjpeg/djdeclol.h"
32 #include "dcmtk/dcmjpeg/djcparam.h"
33
34 // initialization of static members
35 OFBool DJDecoderRegistration::registered = OFFalse;
36 DJCodecParameter *DJDecoderRegistration::cp = NULL;
37 DJDecoderBaseline *DJDecoderRegistration::decbas = NULL;
38 DJDecoderExtended *DJDecoderRegistration::decext = NULL;
39 DJDecoderSpectralSelection *DJDecoderRegistration::decsps = NULL;
40 DJDecoderProgressive *DJDecoderRegistration::decpro = NULL;
41 DJDecoderP14SV1 *DJDecoderRegistration::decsv1 = NULL;
42 DJDecoderLossless *DJDecoderRegistration::declol = NULL;
43
registerCodecs(E_DecompressionColorSpaceConversion pDecompressionCSConversion,E_UIDCreation pCreateSOPInstanceUID,E_PlanarConfiguration pPlanarConfiguration,OFBool predictor6WorkaroundEnable,OFBool cornellWorkaroundEnable,OFBool pForceSingleFragmentPerFrame)44 void DJDecoderRegistration::registerCodecs(
45 E_DecompressionColorSpaceConversion pDecompressionCSConversion,
46 E_UIDCreation pCreateSOPInstanceUID,
47 E_PlanarConfiguration pPlanarConfiguration,
48 OFBool predictor6WorkaroundEnable,
49 OFBool cornellWorkaroundEnable,
50 OFBool pForceSingleFragmentPerFrame)
51 {
52 if (! registered)
53 {
54 cp = new DJCodecParameter(
55 ECC_lossyYCbCr, // ignored, compression only
56 pDecompressionCSConversion,
57 pCreateSOPInstanceUID,
58 pPlanarConfiguration,
59 predictor6WorkaroundEnable,
60 cornellWorkaroundEnable,
61 pForceSingleFragmentPerFrame);
62
63 if (cp)
64 {
65 // baseline JPEG
66 decbas = new DJDecoderBaseline();
67 if (decbas) DcmCodecList::registerCodec(decbas, NULL, cp);
68
69 // extended JPEG
70 decext = new DJDecoderExtended();
71 if (decext) DcmCodecList::registerCodec(decext, NULL, cp);
72
73 // spectral selection JPEG
74 decsps = new DJDecoderSpectralSelection();
75 if (decsps) DcmCodecList::registerCodec(decsps, NULL, cp);
76
77 // progressive JPEG
78 decpro = new DJDecoderProgressive();
79 if (decpro) DcmCodecList::registerCodec(decpro, NULL, cp);
80
81 // lossless SV1 JPEG
82 decsv1 = new DJDecoderP14SV1();
83 if (decsv1) DcmCodecList::registerCodec(decsv1, NULL, cp);
84
85 // lossless JPEG
86 declol = new DJDecoderLossless();
87 if (declol) DcmCodecList::registerCodec(declol, NULL, cp);
88
89 registered = OFTrue;
90 }
91 }
92 }
93
cleanup()94 void DJDecoderRegistration::cleanup()
95 {
96 if (registered)
97 {
98 DcmCodecList::deregisterCodec(decbas);
99 delete decbas;
100 DcmCodecList::deregisterCodec(decext);
101 delete decext;
102 DcmCodecList::deregisterCodec(decsps);
103 delete decsps;
104 DcmCodecList::deregisterCodec(decpro);
105 delete decpro;
106 DcmCodecList::deregisterCodec(decsv1);
107 delete decsv1;
108 DcmCodecList::deregisterCodec(declol);
109 delete declol;
110 delete cp;
111 registered = OFFalse;
112 #ifdef DEBUG
113 // not needed but useful for debugging purposes
114 decbas = NULL;
115 decext = NULL;
116 decsps = NULL;
117 decpro = NULL;
118 decsv1 = NULL;
119 declol = NULL;
120 cp = NULL;
121 #endif
122
123 }
124 }
125