00001
00002
00003
00004 #ifndef CHARLS_STREAMS
00005 #define CHARLS_STREAMS
00006
00007 #include "dcmtk/ofstd/ofvector.h"
00008 #include "dcmtk/ofstd/ofbmanip.h"
00009 #include "util.h"
00010
00011
00012
00013
00014
00015
00016
00017 class JpegSegment;
00018
00019 enum JPEGLS_ColorXForm
00020 {
00021
00022 COLORXFORM_NONE = 0,
00023
00024
00025 COLORXFORM_HP1,
00026 COLORXFORM_HP2,
00027 COLORXFORM_HP3,
00028
00029
00030 COLORXFORM_RGB_AS_YUV_LOSSY,
00031 COLORXFORM_MATRIX
00032 };
00033
00034
00035
00036
00037 class JLSOutputStream
00038 {
00039 friend class JpegMarkerSegment;
00040 friend class JpegImageDataSegment;
00041
00042 public:
00043 JLSOutputStream();
00044 virtual ~JLSOutputStream();
00045
00046 void Init(Size size, LONG bitsPerSample, LONG ccomp);
00047 void AddScan(const void* compareData, const JlsParameters* pparams);
00048 void AddLSE(const JlsCustomParameters* pcustom);
00049 void AddColorTransform(int i);
00050 size_t GetBytesWritten()
00051 { return _cbyteOffset; }
00052
00053 size_t GetLength()
00054 { return _cbyteLength - _cbyteOffset; }
00055
00056 size_t Write(BYTE* pdata, size_t cbyteLength);
00057
00058 void EnableCompare(bool bCompare)
00059 { _bCompare = bCompare; }
00060 private:
00061 BYTE* GetPos() const
00062 { return _pdata + _cbyteOffset; }
00063
00064 void WriteByte(BYTE val)
00065 {
00066 ASSERT(!_bCompare || _pdata[_cbyteOffset] == val);
00067
00068 _pdata[_cbyteOffset++] = val;
00069 }
00070
00071 void WriteBytes(const OFVector<BYTE>& rgbyte)
00072 {
00073 for (size_t i = 0; i < rgbyte.size(); ++i)
00074 {
00075 WriteByte(rgbyte[i]);
00076 }
00077 }
00078
00079 void WriteWord(USHORT val)
00080 {
00081 WriteByte(BYTE(val / 0x100));
00082 WriteByte(BYTE(val % 0x100));
00083 }
00084
00085
00086 void Seek(size_t byteCount)
00087 { _cbyteOffset += byteCount; }
00088
00089 bool _bCompare;
00090
00091 private:
00092 BYTE* _pdata;
00093 size_t _cbyteOffset;
00094 size_t _cbyteLength;
00095 LONG _icompLast;
00096 OFVector<JpegSegment*> _segments;
00097 };
00098
00099
00100
00101 struct Presets : public JlsCustomParameters
00102 {
00103 public:
00104 Presets()
00105 {
00106 MAXVAL = 0;
00107 T1 = 0;
00108 T2 = 0;
00109 T3 = 0;
00110 RESET = 0;
00111 }
00112 };
00113
00114
00115
00116
00117
00118 class JLSInputStream
00119 {
00120 public:
00121 JLSInputStream(const BYTE* pdata, LONG cbyteLength);
00122
00123 size_t GetBytesRead()
00124 { return _cbyteOffset; }
00125
00126 const JlsParameters& GetMetadata() const
00127 { return _info; }
00128
00129 const JlsCustomParameters& GetCustomPreset() const
00130 { return _info.custom; }
00131
00132 void Read(void* pvoid, LONG cbyteAvailable);
00133 void ReadHeader();
00134
00135 void EnableCompare(bool bCompare)
00136 { _bCompare = bCompare; }
00137
00138 void SetInfo(JlsParameters* info) { _info = *info; }
00139
00140 void SetRect(JlsRect rect) { _rect = rect; }
00141
00142 private:
00143 void ReadPixels(void* pvoid, LONG cbyteAvailable);
00144 void ReadScan(void*);
00145 void ReadStartOfScan();
00146 void ReadPresetParameters();
00147 void ReadComment();
00148 void ReadStartOfFrame();
00149 BYTE ReadByte();
00150 int ReadWord();
00151 void ReadNBytes(OFVector<char>& dst, int byteCount);
00152
00153
00154 void ReadJfif();
00155
00156 void ReadColorSpace();
00157 void ReadColorXForm();
00158
00159 private:
00160 const BYTE* _pdata;
00161 size_t _cbyteOffset;
00162 size_t _cbyteLength;
00163 bool _bCompare;
00164 JlsParameters _info;
00165 JlsRect _rect;
00166 };
00167
00168
00169
00170
00171 #endif