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