DYT/Tool/3rdParty_x64/include/dcmtk/dcmjpls/djcodece.h
2024-11-22 23:19:31 +08:00

372 lines
15 KiB
C++

/*
*
* Copyright (C) 2007-2011, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmjpls
*
* Author: Martin Willkomm, Uli Schlachter
*
* Purpose: codec classes for JPEG-LS encoders.
*
*/
#ifndef DCMJPLS_DJCODEC_H
#define DCMJPLS_DJCODEC_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dccodec.h" /* for class DcmCodec */
#include "dcmtk/dcmdata/dcofsetl.h" /* for struct DcmOffsetList */
#include "dcmtk/ofstd/ofstring.h" /* for class OFString */
#include "dcmtk/dcmjpls/dldefine.h"
class DJLSRepresentationParameter;
class DJLSCodecParameter;
class DicomImage;
/** abstract codec class for JPEG-LS encoders.
* This abstract class contains most of the application logic
* needed for a dcmdata codec object that implements a JPEG-LS encoder
* This class only supports compression, it neither implements
* decoding nor transcoding.
*/
class DCMTK_DCMJPLS_EXPORT DJLSEncoderBase : public DcmCodec
{
public:
/// default constructor
DJLSEncoderBase();
/// destructor
virtual ~DJLSEncoderBase();
/** decompresses the given pixel sequence and
* stores the result in the given uncompressedPixelData element.
* @param fromRepParam current representation parameter of compressed data, may be NULL
* @param pixSeq compressed pixel sequence
* @param uncompressedPixelData uncompressed pixel data stored in this element
* @param cp codec parameters for this codec
* @param objStack stack pointing to the location of the pixel data
* element in the current dataset.
* @return EC_Normal if successful, an error code otherwise.
*/
virtual OFCondition decode(
const DcmRepresentationParameter * fromRepParam,
DcmPixelSequence * pixSeq,
DcmPolymorphOBOW& uncompressedPixelData,
const DcmCodecParameter * cp,
const DcmStack& objStack) const;
/** decompresses a single frame from the given pixel sequence and
* stores the result in the given buffer.
* @param fromParam representation parameter of current compressed
* representation, may be NULL.
* @param fromPixSeq compressed pixel sequence
* @param cp codec parameters for this codec
* @param dataset pointer to dataset in which pixel data element is contained
* @param frameNo number of frame, starting with 0 for the first frame
* @param startFragment index of the compressed fragment that contains
* all or the first part of the compressed bitstream for the given frameNo.
* Upon successful return this parameter is updated to contain the index
* of the first compressed fragment of the next frame.
* When unknown, zero should be passed. In this case the decompression
* algorithm will try to determine the index by itself, which will always
* work if frames are decompressed in increasing order from first to last,
* but may fail if frames are decompressed in random order, multiple fragments
* per frame and multiple frames are present in the dataset, and the offset
* table is empty.
* @param buffer pointer to buffer where frame is to be stored
* @param bufSize size of buffer in bytes
* @param decompressedColorModel upon successful return, the color model
* of the decompressed image (which may be different from the one used
* in the compressed images) is returned in this parameter.
* @return EC_Normal if successful, an error code otherwise.
*/
virtual OFCondition decodeFrame(
const DcmRepresentationParameter * fromParam,
DcmPixelSequence * fromPixSeq,
const DcmCodecParameter * cp,
DcmItem *dataset,
Uint32 frameNo,
Uint32& startFragment,
void *buffer,
Uint32 bufSize,
OFString& decompressedColorModel) const;
/** compresses the given uncompressed DICOM image and stores
* the result in the given pixSeq element.
* @param pixelData pointer to the uncompressed image data in OW format
* and local byte order
* @param length of the pixel data field in bytes
* @param toRepParam representation parameter describing the desired
* compressed representation (e.g. JPEG quality)
* @param pixSeq compressed pixel sequence (pointer to new DcmPixelSequence object
* allocated on heap) returned in this parameter upon success.
* @param cp codec parameters for this codec
* @param objStack stack pointing to the location of the pixel data
* element in the current dataset.
* @return EC_Normal if successful, an error code otherwise.
*/
virtual OFCondition encode(
const Uint16 * pixelData,
const Uint32 length,
const DcmRepresentationParameter * toRepParam,
DcmPixelSequence * & pixSeq,
const DcmCodecParameter *cp,
DcmStack & objStack) const;
/** transcodes (re-compresses) the given compressed DICOM image and stores
* the result in the given toPixSeq element.
* @param fromRepType current transfer syntax of the compressed image
* @param fromRepParam current representation parameter of compressed data, may be NULL
* @param fromPixSeq compressed pixel sequence
* @param toRepParam representation parameter describing the desired
* new compressed representation (e.g. JPEG quality)
* @param toPixSeq compressed pixel sequence (pointer to new DcmPixelSequence object
* allocated on heap) returned in this parameter upon success.
* @param cp codec parameters for this codec
* @param objStack stack pointing to the location of the pixel data
* element in the current dataset.
* @return EC_Normal if successful, an error code otherwise.
*/
virtual OFCondition encode(
const E_TransferSyntax fromRepType,
const DcmRepresentationParameter * fromRepParam,
DcmPixelSequence * fromPixSeq,
const DcmRepresentationParameter * toRepParam,
DcmPixelSequence * & toPixSeq,
const DcmCodecParameter * cp,
DcmStack & objStack) const;
/** checks if this codec is able to convert from the
* given current transfer syntax to the given new
* transfer syntax
* @param oldRepType current transfer syntax
* @param newRepType desired new transfer syntax
* @return true if transformation is supported by this codec, false otherwise.
*/
virtual OFBool canChangeCoding(
const E_TransferSyntax oldRepType,
const E_TransferSyntax newRepType) const;
/** determine color model of the decompressed image
* @param fromParam representation parameter of current compressed
* representation, may be NULL
* @param fromPixSeq compressed pixel sequence
* @param cp codec parameters for this codec
* @param dataset pointer to dataset in which pixel data element is contained
* @param dataset pointer to DICOM dataset in which this pixel data object
* is located. Used to access photometric interpretation.
* @param decompressedColorModel upon successful return, the color model
* of the decompressed image (which may be different from the one used
* in the compressed images) is returned in this parameter
* @return EC_Normal if successful, an error code otherwise
*/
virtual OFCondition determineDecompressedColorModel(
const DcmRepresentationParameter *fromParam,
DcmPixelSequence *fromPixSeq,
const DcmCodecParameter *cp,
DcmItem *dataset,
OFString &decompressedColorModel) const;
private:
/** returns the transfer syntax that this particular codec
* is able to encode
* @return supported transfer syntax
*/
virtual E_TransferSyntax supportedTransferSyntax() const = 0;
/** lossless encoder that compresses the complete pixel cell
* (very much like the RLE encoder in module dcmdata).
* @param pixelData pointer to the uncompressed image data in OW format
* and local byte order
* @param length of the pixel data field in bytes
* @param dataset pointer to dataset containing image pixel module
* @param djrp representation parameter
* @param pixSeq pixel sequence to write to
* @param djcp codec parameter
* @param compressionRatio compression ratio returned upon success
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition losslessRawEncode(
const Uint16 *pixelData,
const Uint32 length,
DcmItem *dataset,
const DJLSRepresentationParameter *djrp,
DcmPixelSequence * & pixSeq,
const DJLSCodecParameter *djcp,
double& compressionRatio) const;
/** lossless encoder that moves Overlays to (60xx,3000) and only
* compresses the stored bits of the pixel cell.
* @param pixelData pointer to the uncompressed image data in OW format
* and local byte order
* @param length of the pixel data field in bytes
* @param dataset pointer to dataset containing image pixel module
* @param djrp representation parameter
* @param pixSeq pixel sequence to write to
* @param djcp codec parameter
* @param compressionRatio compression ratio returned upon success
* @param nearLosslessDeviation maximum deviation for near-lossless encoding
* @return EC_Normal if successful, an error code otherwise.
*/
OFCondition losslessCookedEncode(
const Uint16 * pixelData,
const Uint32 length,
DcmItem *dataset,
const DJLSRepresentationParameter *djrp,
DcmPixelSequence * & pixSeq,
const DJLSCodecParameter *djcp,
double& compressionRatio,
Uint16 nearLosslessDeviation) const;
/** for all overlay groups create (60xx,3000) Overlay Data.
* @param dataset dataset to be modified
* @param image DicomImage object for this dataset
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition adjustOverlays(
DcmItem *dataset,
DicomImage& image) const;
/** create Lossy Image Compression and Lossy Image Compression Ratio.
* @param dataset dataset to be modified
* @param ratio image compression ratio > 1. This is the real effective ratio
* between compressed and uncompressed image,
* i. e. 30 means a 30:1 lossy compression.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition updateLossyCompressionRatio(
DcmItem *dataset,
double ratio) const;
/** create Derivation Description.
* @param dataset dataset to be modified
* @param djrp representation parameter passed to encode()
* @param ratio image compression ratio > 1. This is the real effective ratio
* between compressed and uncompressed image,
* i. e. 30 means a 30:1 lossy compression.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition updateDerivationDescription(
DcmItem *dataset,
const DJLSRepresentationParameter *djrp,
double ratio) const;
/** perform the lossless raw compression of a single frame
* @param framePointer pointer to start of frame
* @param bitsAllocated number of bits allocated per pixel
* @param columns frame width
* @param rows frame height
* @param samplesPerPixel image samples per pixel
* @param planarConfiguration image planar configuration
* @param photometricInterpretation photometric interpretation of the DICOM dataset
* @param pixelSequence object in which the compressed frame is stored
* @param offsetList list of frame offsets updated in this parameter
* @param compressedSize size of compressed frame returned in this parameter
* @param djcp parameters for the codec
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition compressRawFrame(
const Uint8 *framePointer,
Uint16 bitsAllocated,
Uint16 columns,
Uint16 rows,
Uint16 samplesPerPixel,
Uint16 planarConfiguration,
const OFString& photometricInterpretation,
DcmPixelSequence *pixelSequence,
DcmOffsetList &offsetList,
unsigned long &compressedSize,
const DJLSCodecParameter *djcp) const;
/** perform the lossless cooked compression of a single frame
* @param pixelSequence object in which the compressed frame is stored
* @param dimage DicomImage instance used to process frame
* @param photometricInterpretation photometric interpretation of the DICOM dataset
* @param offsetList list of frame offsets updated in this parameter
* @param compressedSize size of compressed frame returned in this parameter
* @param djcp parameters for the codec
* @param frame frame index
* @param nearLosslessDeviation maximum deviation for near-lossless encoding
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition compressCookedFrame(
DcmPixelSequence *pixelSequence,
DicomImage *dimage,
const OFString& photometricInterpretation,
DcmOffsetList &offsetList,
unsigned long &compressedSize,
const DJLSCodecParameter *djcp,
Uint32 frame,
Uint16 nearLosslessDeviation) const;
/** Convert an image from sample interleaved to uninterleaved.
* @param target A buffer where the converted image will be stored
* @param source The image buffer to be converted
* @param components Color components used in the image
* @param width The width of the image
* @param height The height of the image
* @param bitsAllocated The number of bits allocated in the image.
* @return EC_Normal if succesful, an error code otherwise
*/
OFCondition convertToUninterleaved(
Uint8 *target,
const Uint8 *source,
Uint16 components,
Uint32 width,
Uint32 height,
Uint16 bitsAllocated) const;
/** Convert an image from uninterleaved to sample interleaved.
* @param target A buffer where the converted image will be stored
* @param source The image buffer to be converted
* @param components Color components used in the image
* @param width The width of the image.
* @param height The height of the image.
* @param bitsAllocated The number of bits allocated in the image.
* @return EC_Normal if succesful, an error code otherwise
*/
OFCondition convertToSampleInterleaved(
Uint8 *target,
const Uint8 *source,
Uint16 components,
Uint32 width,
Uint32 height,
Uint16 bitsAllocated) const;
};
/** codec class for JPEG-LS lossless only TS encoding
*/
class DCMTK_DCMJPLS_EXPORT DJLSLosslessEncoder : public DJLSEncoderBase
{
/** returns the transfer syntax that this particular codec
* is able to encode
* @return supported transfer syntax
*/
virtual E_TransferSyntax supportedTransferSyntax() const;
};
/** codec class for JPEG-LS lossy and lossless TS encoding
*/
class DCMTK_DCMJPLS_EXPORT DJLSNearLosslessEncoder : public DJLSEncoderBase
{
/** returns the transfer syntax that this particular codec
* is able to encode
* @return supported transfer syntax
*/
virtual E_TransferSyntax supportedTransferSyntax() const;
};
#endif