internal static void Decode(
            DicomPixelData oldPixelData,
            DicomPixelData newPixelData,
            DicomJpegLsParams parameters)
        {
            for (var frame = 0; frame < oldPixelData.NumberOfFrames; frame++)
            {
                var jpegData = oldPixelData.GetFrame(frame);

                var frameSize = newPixelData.UncompressedFrameSize;
                if ((frameSize & 1) == 1)
                {
                    ++frameSize;
                }
                var frameData = new byte[frameSize];

                string errorMessage;
                var    err = JpegLs.Decode(frameData, jpegData.Data, null, out errorMessage);
                if (err != ApiResult.OK)
                {
                    throw new InvalidOperationException(GetErrorMessage(err, errorMessage));
                }

                newPixelData.AddFrame(new MemoryByteBuffer(frameData));
            }
        }
        internal static void Encode(
            DicomPixelData oldPixelData,
            DicomPixelData newPixelData,
            DicomJpegLsParams parameters)
        {
            if (oldPixelData.PhotometricInterpretation == PhotometricInterpretation.YbrFull422 ||
                oldPixelData.PhotometricInterpretation == PhotometricInterpretation.YbrPartial422 ||
                oldPixelData.PhotometricInterpretation == PhotometricInterpretation.YbrPartial420)
            {
                throw new InvalidOperationException(
                          "Photometric Interpretation '{oldPixelData.PhotometricInterpretation}' not supported by JPEG-LS encoder");
            }

            var jparameters = new JlsParameters
            {
                width          = oldPixelData.Width,
                height         = oldPixelData.Height,
                bitsPerSample  = oldPixelData.BitsStored,
                stride         = oldPixelData.BytesAllocated * oldPixelData.Width * oldPixelData.SamplesPerPixel,
                components     = oldPixelData.SamplesPerPixel,
                interleaveMode = oldPixelData.SamplesPerPixel == 1
                    ? InterleaveMode.None
                    : oldPixelData.PlanarConfiguration == PlanarConfiguration.Interleaved
                        ? InterleaveMode.Sample
                        : InterleaveMode.Line,
                colorTransformation = ColorTransformation.None
            };

            for (var frame = 0; frame < oldPixelData.NumberOfFrames; frame++)
            {
                var frameData = oldPixelData.GetFrame(frame);

                // assume compressed frame will be smaller than original
                var jpegData = new byte[frameData.Size];

                ulong  jpegDataSize;
                string errorMessage;
                var    err = JpegLs.Encode(jpegData, frameData.Data, jparameters, out jpegDataSize, out errorMessage);
                if (err != ApiResult.OK)
                {
                    throw new InvalidOperationException(GetErrorMessage(err, errorMessage));
                }

                Array.Resize(ref jpegData, (int)jpegDataSize + ((jpegDataSize & 1) == 1 ? 1 : 0));

                newPixelData.AddFrame(new MemoryByteBuffer(jpegData));
            }
        }
        /// <summary>
        /// The JPEG-LS decoding function
        /// </summary>
        /// <param name="oldPixelData">The old pixel data</param>
        /// <param name="newPixelData">The new pixel data</param>
        /// <param name="parameters">The compression parameters</param>
        public override void Decode(DicomPixelData oldPixelData, DicomPixelData newPixelData,
                                    DicomCodecParams parameters)
        {
            for (var frame = 0; frame < oldPixelData.NumberOfFrames; frame++)
            {
                var jpegLsData = oldPixelData.GetFrame(frame);

                var message      = String.Empty;
                var jpegLsParams = new JlsParameters();
                var frameData    = new byte[newPixelData.UncompressedFrameSize];

                var err = JpegLs.Decode(frameData, jpegLsData.Data, jpegLsParams, out message);

                var buffer = frameData.Length >= 1 * 1024 * 1024 || oldPixelData.NumberOfFrames > 1
                    ? (IByteBuffer) new TempFileBuffer(frameData)
                    : new MemoryByteBuffer(frameData);
                newPixelData.AddFrame(EvenLengthBuffer.Create(buffer));
            }
        }