/*****************************************************************************/
// Copyright 2006-2007 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE:  Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/

/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_lossless_jpeg.cpp#2 $ */ 
/* $DateTime: 2012/06/01 07:28:57 $ */
/* $Change: 832715 $ */
/* $Author: tknoll $ */
 
/*****************************************************************************/

// Lossless JPEG code adapted from:

/* Copyright (C) 1991, 1992, Thomas G. Lane.
 * Part of the Independent JPEG Group's software.
 * See the file Copyright for more details.
 *
 * Copyright (c) 1993 Brian C. Smith, The Regents of the University
 * of California
 * All rights reserved.
 * 
 * Copyright (c) 1994 Kongji Huang and Brian C. Smith.
 * Cornell University
 * All rights reserved.
 * 
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose, without fee, and without written agreement is
 * hereby granted, provided that the above copyright notice and the following
 * two paragraphs appear in all copies of this software.
 * 
 * IN NO EVENT SHALL CORNELL UNIVERSITY BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF CORNELL
 * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * CORNELL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND CORNELL UNIVERSITY HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 */
 
/*****************************************************************************/

#include "dng_lossless_jpeg.h"

#include "dng_assertions.h"
#include "dng_exceptions.h"
#include "dng_memory.h"
#include "dng_stream.h"
#include "dng_tag_codes.h"

/*****************************************************************************/

// This module contains routines that should be as fast as possible, even
// at the expense of slight code size increases.

#include "dng_fast_module.h"

/*****************************************************************************/

// The qSupportCanon_sRAW stuff not actually required for DNG support, but
// only included to allow this code to be used on Canon sRAW files.

#ifndef qSupportCanon_sRAW
#define qSupportCanon_sRAW 1
#endif

// The qSupportHasselblad_3FR stuff not actually required for DNG support, but
// only included to allow this code to be used on Hasselblad 3FR files.

#ifndef qSupportHasselblad_3FR
#define qSupportHasselblad_3FR 1
#endif

/*****************************************************************************/

/*
 * One of the following structures is created for each huffman coding
 * table.  We use the same structure for encoding and decoding, so there
 * may be some extra fields for encoding that aren't used in the decoding
 * and vice-versa.
 */
 
struct HuffmanTable
	{
	
    /*
     * These two fields directly represent the contents of a JPEG DHT
     * marker
     */
    uint8 bits[17];
    uint8 huffval[256];

    /*
     * The remaining fields are computed from the above to allow more
     * efficient coding and decoding.  These fields should be considered
     * private to the Huffman compression & decompression modules.
     */

    uint16 mincode[17];
    int32 maxcode[18];
    int16 valptr[17];
    int32 numbits[256];
    int32 value[256];
    
    uint16 ehufco[256];
    int8 ehufsi[256];
    
	};

/*****************************************************************************/

// Computes the derived fields in the Huffman table structure.
 
static void FixHuffTbl (HuffmanTable *htbl)
	{
	
	int32 l;
	int32 i;
	
	const uint32 bitMask [] =
		{
		0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff,
        0x0fffffff, 0x07ffffff, 0x03ffffff, 0x01ffffff,
        0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
        0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff,
        0x0000ffff, 0x00007fff, 0x00003fff, 0x00001fff,
        0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
        0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f,
        0x0000000f, 0x00000007, 0x00000003, 0x00000001
        };
        
    // Figure C.1: make table of Huffman code length for each symbol
    // Note that this is in code-length order.

	int8 huffsize [257];
	
    int32 p = 0;
    
	for (l = 1; l <= 16; l++)
    	{
    	
        for (i = 1; i <= (int32) htbl->bits [l]; i++)
            huffsize [p++] = (int8) l;

    	}
    	
    huffsize [p] = 0;
    
    int32 lastp = p;

	// Figure C.2: generate the codes themselves
	// Note that this is in code-length order.

	uint16 huffcode [257];
	
	uint16 code = 0;
    
    int32 si = huffsize [0];
    
    p = 0;
    
    while (huffsize [p])
    	{
    	
        while (((int32) huffsize [p]) == si) 
        	{
            huffcode [p++] = code;
            code++;
        	}
        	
        code <<= 1;
        
        si++;
        
    	}

    // Figure C.3: generate encoding tables
    // These are code and size indexed by symbol value
    // Set any codeless symbols to have code length 0; this allows
    // EmitBits to detect any attempt to emit such symbols.

    memset (htbl->ehufsi, 0, sizeof (htbl->ehufsi));

    for (p = 0; p < lastp; p++)
    	{
    	
        htbl->ehufco [htbl->huffval [p]] = huffcode [p];
        htbl->ehufsi [htbl->huffval [p]] = huffsize [p];
        
    	}
    
	// Figure F.15: generate decoding tables
 
	p = 0;
	
    for (l = 1; l <= 16; l++)
    	{
    	
        if (htbl->bits [l])
        	{
        	
            htbl->valptr  [l] = (int16) p;
            htbl->mincode [l] = huffcode [p];
            
            p += htbl->bits [l];
            
            htbl->maxcode [l] = huffcode [p - 1];
            
        	}
        	
        else 
        	{
            htbl->maxcode [l] = -1;
        	}

    	}

    // We put in this value to ensure HuffDecode terminates.

    htbl->maxcode[17] = 0xFFFFFL;

    // Build the numbits, value lookup tables.
    // These table allow us to gather 8 bits from the bits stream,
    // and immediately lookup the size and value of the huffman codes.
    // If size is zero, it means that more than 8 bits are in the huffman
    // code (this happens about 3-4% of the time).

    memset (htbl->numbits, 0, sizeof (htbl->numbits));
    
	for (p = 0; p < lastp; p++)
		{
		
        int32 size = huffsize [p];
        
        if (size <= 8)
        	{
        	
            int32 value = htbl->huffval [p];
            
            code = huffcode [p];
            
            int32 ll = code << (8  -size);
            
     		int32 ul = (size < 8 ? ll | bitMask [24 + size]
     						     : ll);
            if (ul >= static_cast<int32>(sizeof(htbl->numbits) / sizeof(htbl->numbits[0])) ||
                ul >= static_cast<int32>(sizeof(htbl->value) / sizeof(htbl->value[0])))
                {
                ThrowBadFormat ();
                }
	
            for (i = ll; i <= ul; i++)
            	{
                htbl->numbits [i] = size;
                htbl->value   [i] = value;
           		}
           		
			}

		}

	}

/*****************************************************************************/

/*
 * The following structure stores basic information about one component.
 */
 
struct JpegComponentInfo
	{
	
    /*
     * These values are fixed over the whole image.
     * They are read from the SOF marker.
     */
    int16 componentId;		/* identifier for this component (0..255) */
    int16 componentIndex;	/* its index in SOF or cPtr->compInfo[]   */

    /*
     * Downsampling is not normally used in lossless JPEG, although
     * it is permitted by the JPEG standard (DIS). We set all sampling 
     * factors to 1 in this program.
     */
    int16 hSampFactor;		/* horizontal sampling factor */
    int16 vSampFactor;		/* vertical sampling factor   */

    /*
     * Huffman table selector (0..3). The value may vary
     * between scans. It is read from the SOS marker.
     */
    int16 dcTblNo;

	};

/*
 * One of the following structures is used to pass around the
 * decompression information.
 */
 
struct DecompressInfo
	{
	
    /*
     * Image width, height, and image data precision (bits/sample)
     * These fields are set by ReadFileHeader or ReadScanHeader
     */ 
    int32 imageWidth;
    int32 imageHeight;
    int32 dataPrecision;

    /*
     * compInfo[i] describes component that appears i'th in SOF
     * numComponents is the # of color components in JPEG image.
     */
    JpegComponentInfo *compInfo;
    int16 numComponents;

    /*
     * *curCompInfo[i] describes component that appears i'th in SOS.
     * compsInScan is the # of color components in current scan.
     */
    JpegComponentInfo *curCompInfo[4];
    int16 compsInScan;

    /*
     * MCUmembership[i] indexes the i'th component of MCU into the
     * curCompInfo array.
     */
    int16 MCUmembership[10];

    /*
     * ptrs to Huffman coding tables, or NULL if not defined
     */
    HuffmanTable *dcHuffTblPtrs[4];

    /* 
     * prediction selection value (PSV) and point transform parameter (Pt)
     */
    int32 Ss;
    int32 Pt;

    /*
     * In lossless JPEG, restart interval shall be an integer
     * multiple of the number of MCU in a MCU row.
     */
    int32 restartInterval;/* MCUs per restart interval, 0 = no restart */
    int32 restartInRows; /*if > 0, MCU rows per restart interval; 0 = no restart*/

    /*
     * these fields are private data for the entropy decoder
     */
    int32 restartRowsToGo;	/* MCUs rows left in this restart interval */
    int16 nextRestartNum;	/* # of next RSTn marker (0..7) */
    
	};

/*****************************************************************************/

// An MCU (minimum coding unit) is an array of samples.

typedef uint16 ComponentType; 		// the type of image components

typedef ComponentType *MCU;  		// MCU - array of samples

/*****************************************************************************/

class dng_lossless_decoder
	{
	
	private:
	
		dng_stream *fStream;		// Input data.
		
		dng_spooler *fSpooler;		// Output data.
				
		bool fBug16;				// Decode data with the "16-bit" bug.

		dng_memory_data huffmanBuffer [4];
		
		dng_memory_data compInfoBuffer;
		
		DecompressInfo info;
		
		dng_memory_data mcuBuffer1;
		dng_memory_data mcuBuffer2;
		dng_memory_data mcuBuffer3;
		dng_memory_data mcuBuffer4;
	
		MCU *mcuROW1;
		MCU *mcuROW2;
		
		uint64 getBuffer;			// current bit-extraction buffer
		int32 bitsLeft;				// # of unused bits in it
				
		#if qSupportHasselblad_3FR
		bool fHasselblad3FR;
		#endif

	public:
	
		dng_lossless_decoder (dng_stream *stream,
						      dng_spooler *spooler,
						      bool bug16);
	
		void StartRead (uint32 &imageWidth,
						uint32 &imageHeight,
						uint32 &imageChannels);

		void FinishRead ();

	private:

		uint8 GetJpegChar ()
			{
			return fStream->Get_uint8 ();
			}
			
		void UnGetJpegChar ()
			{
			fStream->SetReadPosition (fStream->Position () - 1);
			}
			
		uint16 Get2bytes ();
	
		void SkipVariable ();

		void GetDht ();

		void GetDri ();

		void GetApp0 ();

		void GetSof (int32 code);

		void GetSos ();

		void GetSoi ();
		
		int32 NextMarker ();

		JpegMarker ProcessTables ();
		
		void ReadFileHeader ();

		int32 ReadScanHeader ();

		void DecoderStructInit ();

		void HuffDecoderInit ();

		void ProcessRestart ();

		int32 QuickPredict (int32 col,
						    int32 curComp,
						    MCU *curRowBuf,
						    MCU *prevRowBuf);

		void FillBitBuffer (int32 nbits);

		int32 show_bits8 ();

		void flush_bits (int32 nbits);

		int32 get_bits (int32 nbits);

		int32 get_bit ();

		int32 HuffDecode (HuffmanTable *htbl);

		void HuffExtend (int32 &x, int32 s);

		void PmPutRow (MCU *buf,
					   int32 numComp,
					   int32 numCol,
					   int32 row);

		void DecodeFirstRow (MCU *curRowBuf);

		void DecodeImage ();
		
		// Hidden copy constructor and assignment operator.
		
		dng_lossless_decoder (const dng_lossless_decoder &decoder);
		
		dng_lossless_decoder & operator= (const dng_lossless_decoder &decoder);
		
	};

/*****************************************************************************/

dng_lossless_decoder::dng_lossless_decoder (dng_stream *stream,
									        dng_spooler *spooler,
									        bool bug16)
									
	:	fStream  (stream )
	,	fSpooler (spooler)
	,	fBug16   (bug16  )
	
	,	compInfoBuffer ()
	,	info           ()
	,	mcuBuffer1     ()
	,	mcuBuffer2     ()
	,	mcuBuffer3     ()
	,	mcuBuffer4     ()
	,	mcuROW1		   (NULL)
	,	mcuROW2		   (NULL)
	,	getBuffer      (0)
	,	bitsLeft	   (0)
	
	#if qSupportHasselblad_3FR
	,	fHasselblad3FR (false)
	#endif
	
	{
	
	memset (&info, 0, sizeof (info));
	
	}

/*****************************************************************************/

uint16 dng_lossless_decoder::Get2bytes ()
	{
	
    uint16 a = GetJpegChar ();
    
    return (uint16) ((a << 8) + GetJpegChar ());
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * SkipVariable --
 *
 *	Skip over an unknown or uninteresting variable-length marker
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Bitstream is parsed over marker.
 *
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::SkipVariable ()
	{
	
    uint32 length = Get2bytes () - 2;
    
    fStream->Skip (length);

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetDht --
 *
 *	Process a DHT marker
 *
 * Results:
 *	None
 *
 * Side effects:
 *	A huffman table is read.
 *	Exits on error.
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::GetDht ()
	{
	
    int32 length = Get2bytes () - 2;
    
    while (length > 0)
    	{

		int32 index = GetJpegChar ();
	    
		if (index < 0 || index >= 4)
			{
		    ThrowBadFormat ();
			}

		HuffmanTable *&htblptr = info.dcHuffTblPtrs [index];

		if (htblptr == NULL)
			{
			
			huffmanBuffer [index] . Allocate (sizeof (HuffmanTable));
			
		    htblptr = (HuffmanTable *) huffmanBuffer [index] . Buffer ();
		    
			}

		htblptr->bits [0] = 0;
		
	    int32 count = 0;
	    
		for (int32 i = 1; i <= 16; i++)
			{
			
		    htblptr->bits [i] = GetJpegChar ();
		    
		    count += htblptr->bits [i];
		    
			}

		if (count > 256) 
			{
		    ThrowBadFormat ();
			}

		for (int32 j = 0; j < count; j++)
			{
			
		    htblptr->huffval [j] = GetJpegChar ();
		    
		    }

		length -= 1 + 16 + count;

	    }
	    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetDri --
 *
 *	Process a DRI marker
 *
 * Results:
 *	None
 *
 * Side effects:
 *	Exits on error.
 *	Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::GetDri ()
	{
	
    if (Get2bytes () != 4)
    	{
		ThrowBadFormat ();
		}
    
    info.restartInterval = Get2bytes ();

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetApp0 --
 *
 *	Process an APP0 marker.
 *
 * Results:
 *	None
 *
 * Side effects:
 *	Bitstream is parsed
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::GetApp0 ()
	{

	SkipVariable ();
	
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetSof --
 *
 *	Process a SOFn marker
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Bitstream is parsed
 *	Exits on error
 *	info structure is filled in
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::GetSof (int32 /*code*/)
	{
	
    int32 length = Get2bytes ();

    info.dataPrecision = GetJpegChar ();
    info.imageHeight   = Get2bytes   ();
    info.imageWidth    = Get2bytes   ();
    info.numComponents = GetJpegChar ();

    // We don't support files in which the image height is initially
    // specified as 0 and is later redefined by DNL.  As long as we
    // have to check that, might as well have a general sanity check.
     
    if ((info.imageHeight   <= 0) ||
		(info.imageWidth    <= 0) || 
		(info.numComponents <= 0))
		{
		ThrowBadFormat ();
    	}

	// Lossless JPEG specifies data precision to be from 2 to 16 bits/sample.

	const int32 MinPrecisionBits = 2;
	const int32 MaxPrecisionBits = 16;

    if ((info.dataPrecision < MinPrecisionBits) ||
        (info.dataPrecision > MaxPrecisionBits))
        {
		ThrowBadFormat ();
    	}
    	
    // Check length of tag.

    if (length != (info.numComponents * 3 + 8))
    	{
		ThrowBadFormat ();
    	}
    	
    // Allocate per component info.
    
    // We can cast info.numComponents to a uint32 because the check above
    // guarantees that it cannot be negative.
    compInfoBuffer.Allocate (static_cast<uint32> (info.numComponents),
                             sizeof (JpegComponentInfo));
    
    info.compInfo = (JpegComponentInfo *) compInfoBuffer.Buffer ();
    							 
    // Read in the per compent info.

    for (int32 ci = 0; ci < info.numComponents; ci++)
    	{
    	
   		JpegComponentInfo *compptr = &info.compInfo [ci];
   		
		compptr->componentIndex = (int16) ci;
		
		compptr->componentId = GetJpegChar ();
		
    	int32 c = GetJpegChar ();
    	
		compptr->hSampFactor = (int16) ((c >> 4) & 15);
		compptr->vSampFactor = (int16) ((c     ) & 15);
		
        (void) GetJpegChar ();   /* skip Tq */
        
    	}

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetSos --
 *
 *	Process a SOS marker
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Bitstream is parsed.
 *	Exits on error.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::GetSos ()
	{
	
    int32 length = Get2bytes ();

    // Get the number of image components.

    int32 n = GetJpegChar ();
    info.compsInScan = (int16) n;
    
    // Check length.
    
    length -= 3;

    if (length != (n * 2 + 3) || n < 1 || n > 4)
    	{
		ThrowBadFormat ();
		}
	
	// Find index and huffman table for each component.

    for (int32 i = 0; i < n; i++)
    	{
    	
 		int32 cc = GetJpegChar ();
		int32 c  = GetJpegChar ();
		
 		int32 ci;
 		
		for (ci = 0; ci < info.numComponents; ci++)
			{
			
		    if (cc == info.compInfo[ci].componentId)
		    	{
				break;
		    	}
		    	
		    }

		if (ci >= info.numComponents) 
			{
		    ThrowBadFormat ();
			}

    	JpegComponentInfo *compptr = &info.compInfo [ci];
    	
		info.curCompInfo [i] = compptr;
		
		compptr->dcTblNo = (int16) ((c >> 4) & 15);
		
	    }

    // Get the PSV, skip Se, and get the point transform parameter.

    info.Ss = GetJpegChar (); 
    
    (void) GetJpegChar ();
    
    info.Pt = GetJpegChar () & 0x0F;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GetSoi --
 *
 *	Process an SOI marker
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Bitstream is parsed.
 *	Exits on error.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::GetSoi ()
	{

    // Reset all parameters that are defined to be reset by SOI
     
    info.restartInterval = 0;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * NextMarker --
 *
 *      Find the next JPEG marker Note that the output might not
 *	be a valid marker code but it will never be 0 or FF
 *
 * Results:
 *	The marker found.
 *
 * Side effects:
 *	Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */

int32 dng_lossless_decoder::NextMarker ()
	{
	
    int32 c;

    do
    	{

		// skip any non-FF bytes
		
		do 
			{
	   		c = GetJpegChar ();
			}
		while (c != 0xFF);
		
		// skip any duplicate FFs, since extra FFs are legal
		
		do 
			{
			c = GetJpegChar();
			} 
		while (c == 0xFF);
		
		}
	while (c == 0);		// repeat if it was a stuffed FF/00

    return c;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * ProcessTables --
 *
 *	Scan and process JPEG markers that can appear in any order
 *	Return when an SOI, EOI, SOFn, or SOS is found
 *
 * Results:
 *	The marker found.
 *
 * Side effects:
 *	Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */

JpegMarker dng_lossless_decoder::ProcessTables ()
	{
	
    while (true)
    	{
    
		int32 c = NextMarker ();
	
		switch (c)
			{
			
			case M_SOF0:
			case M_SOF1:
			case M_SOF2:
			case M_SOF3:
			case M_SOF5:
			case M_SOF6:
			case M_SOF7:
			case M_JPG:
			case M_SOF9:
			case M_SOF10:
			case M_SOF11:
			case M_SOF13:
			case M_SOF14:
			case M_SOF15:
			case M_SOI:
			case M_EOI:
			case M_SOS:
			    return (JpegMarker) c;

			case M_DHT:
			    GetDht ();
			    break;

			case M_DQT:
			    break;

			case M_DRI:
			    GetDri ();
			    break;

			case M_APP0:
			    GetApp0 ();
			    break;

			case M_RST0:	// these are all parameterless
			case M_RST1:
			case M_RST2:
			case M_RST3:
			case M_RST4:
			case M_RST5:
			case M_RST6:
			case M_RST7:
			case M_TEM:
			    break;

			default:		// must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn
			    SkipVariable ();
			    break;
			    
			}
			
    	}

    	return M_ERROR;
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * ReadFileHeader --
 *
 *	Initialize and read the stream header (everything through
 *	the SOF marker).
 *
 * Results:
 *	None
 *
 * Side effects:
 *	Exit on error.
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::ReadFileHeader ()
	{
	
    // Demand an SOI marker at the start of the stream --- otherwise it's
    // probably not a JPEG stream at all.

    int32 c  = GetJpegChar ();
    int32 c2 = GetJpegChar ();
    
    if ((c != 0xFF) || (c2 != M_SOI)) 
    	{
		ThrowBadFormat ();
    	}
    	
    // OK, process SOI

    GetSoi ();

    // Process markers until SOF

    c = ProcessTables ();

    switch (c)
    	{
    	
		case M_SOF0:
		case M_SOF1:
		case M_SOF3:
			GetSof (c);
			break;

    	default:
			ThrowBadFormat ();
			break;
			
    	}

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * ReadScanHeader --
 *
 *	Read the start of a scan (everything through the SOS marker).
 *
 * Results:
 *	1 if find SOS, 0 if find EOI
 *
 * Side effects:
 *	Bitstream is parsed, may exit on errors.
 *
 *--------------------------------------------------------------
 */

int32 dng_lossless_decoder::ReadScanHeader ()
	{

    // Process markers until SOS or EOI

    int32 c = ProcessTables ();

    switch (c)
    	{
    	
		case M_SOS:
			GetSos ();
			return 1;

    	case M_EOI:
			return 0;

    	default:
			ThrowBadFormat ();
			break;
			
    	}
    	
    return 0;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * DecoderStructInit --
 *
 *	Initalize the rest of the fields in the decompression
 *	structure.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::DecoderStructInit ()
	{
	
	int32 ci;
	
	#if qSupportCanon_sRAW
	
	bool canon_sRAW = (info.numComponents == 3) &&
					  (info.compInfo [0].hSampFactor == 2) &&
					  (info.compInfo [1].hSampFactor == 1) &&
					  (info.compInfo [2].hSampFactor == 1) &&
					  (info.compInfo [0].vSampFactor == 1) &&
					  (info.compInfo [1].vSampFactor == 1) &&
					  (info.compInfo [2].vSampFactor == 1) &&
					  (info.dataPrecision == 15) &&
					  (info.Ss == 1) &&
					  ((info.imageWidth & 1) == 0);
					  
	bool canon_sRAW2 = (info.numComponents == 3) &&
					   (info.compInfo [0].hSampFactor == 2) &&
					   (info.compInfo [1].hSampFactor == 1) &&
					   (info.compInfo [2].hSampFactor == 1) &&
					   (info.compInfo [0].vSampFactor == 2) &&
					   (info.compInfo [1].vSampFactor == 1) &&
					   (info.compInfo [2].vSampFactor == 1) &&
					   (info.dataPrecision == 15) &&
					   (info.Ss == 1) &&
					   ((info.imageWidth  & 1) == 0) &&
					   ((info.imageHeight & 1) == 0);
					   
	if (!canon_sRAW && !canon_sRAW2)
	
	#endif
	
		{
	
		// Check sampling factor validity.

		for (ci = 0; ci < info.numComponents; ci++)
			{
			
			JpegComponentInfo *compPtr = &info.compInfo [ci];
			
			if (compPtr->hSampFactor != 1 ||
				compPtr->vSampFactor != 1) 
				{
				ThrowBadFormat ();
				}
		
			}
			
		}
	
    // Prepare array describing MCU composition.

	if (info.compsInScan < 0 || info.compsInScan > 4)
		{
    	ThrowBadFormat ();
		}

	for (ci = 0; ci < info.compsInScan; ci++)
		{
        info.MCUmembership [ci] = (int16) ci;
		}

	// Initialize mucROW1 and mcuROW2 which buffer two rows of
    // pixels for predictor calculation.
    
	// This multiplication cannot overflow because info.compsInScan is
	// guaranteed to be between 0 and 4 inclusive (see checks above).
	int32 mcuSize = info.compsInScan * (uint32) sizeof (ComponentType);
	
	mcuBuffer1.Allocate (info.imageWidth, sizeof (MCU));
	mcuBuffer2.Allocate (info.imageWidth, sizeof (MCU));
	
	mcuROW1 = (MCU *) mcuBuffer1.Buffer ();
	mcuROW2 = (MCU *) mcuBuffer2.Buffer ();
	
	mcuBuffer3.Allocate (info.imageWidth, mcuSize);
	mcuBuffer4.Allocate (info.imageWidth, mcuSize);
 	
 	mcuROW1 [0] = (ComponentType *) mcuBuffer3.Buffer ();
 	mcuROW2 [0] = (ComponentType *) mcuBuffer4.Buffer ();
 	
 	for (int32 j = 1; j < info.imageWidth; j++)
 		{
 		
 		mcuROW1 [j] = mcuROW1 [j - 1] + info.compsInScan;
 		mcuROW2 [j] = mcuROW2 [j - 1] + info.compsInScan;
 	
 		}
 	
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * HuffDecoderInit --
 *
 *	Initialize for a Huffman-compressed scan.
 *	This is invoked after reading the SOS marker.
 *
 * Results:
 *	None
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::HuffDecoderInit ()
	{
	
    // Initialize bit parser state
 
 	getBuffer = 0;
    bitsLeft  = 0;
    
    // Prepare Huffman tables.

    for (int16 ci = 0; ci < info.compsInScan; ci++)
    	{
    	
		JpegComponentInfo *compptr = info.curCompInfo [ci];
		
		// Make sure requested tables are present
		
		if (compptr->dcTblNo < 0 || compptr->dcTblNo > 3)
			{
			ThrowBadFormat ();
			}

		if (info.dcHuffTblPtrs [compptr->dcTblNo] == NULL) 
			{ 
	    	ThrowBadFormat ();
			}

		// Compute derived values for Huffman tables.
		// We may do this more than once for same table, but it's not a
		// big deal

		FixHuffTbl (info.dcHuffTblPtrs [compptr->dcTblNo]);

	    }

   	// Initialize restart stuff

	info.restartInRows   = info.restartInterval / info.imageWidth;
    info.restartRowsToGo = info.restartInRows;
    info.nextRestartNum  = 0;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * ProcessRestart --
 *
 *	Check for a restart marker & resynchronize decoder.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	BitStream is parsed, bit buffer is reset, etc.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_decoder::ProcessRestart ()
	{
	
	// Throw away and unused odd bits in the bit buffer.
	
	fStream->SetReadPosition (fStream->Position () - bitsLeft / 8);
	
	bitsLeft  = 0;
	getBuffer = 0;
	
   	// Scan for next JPEG marker

    int32 c;

    do
    	{
    	
		// skip any non-FF bytes
		
		do 
			{ 
	    	c = GetJpegChar ();
			}
		while (c != 0xFF);
		
		// skip any duplicate FFs
		
		do
			{
			c = GetJpegChar ();
			}
		while (c == 0xFF);
		
    	}
    while (c == 0);		// repeat if it was a stuffed FF/00
    
    // Verify correct restart code.

    if (c != (M_RST0 + info.nextRestartNum))
    	{
		ThrowBadFormat ();
    	}

    // Update restart state.

    info.restartRowsToGo = info.restartInRows;
    info.nextRestartNum  = (info.nextRestartNum + 1) & 7;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * QuickPredict --
 *
 *      Calculate the predictor for sample curRowBuf[col][curComp].
 *	It does not handle the special cases at image edges, such 
 *      as first row and first column of a scan. We put the special 
 *	case checkings outside so that the computations in main
 *	loop can be simpler. This has enhenced the performance
 *	significantly.
 *
 * Results:
 *      predictor is passed out.
 *
 * Side effects:
 *      None.
 *
 *--------------------------------------------------------------
 */
 
inline int32 dng_lossless_decoder::QuickPredict (int32 col,
						 				         int32 curComp,
						 				         MCU *curRowBuf,
						 				         MCU *prevRowBuf)
	{
	
    int32 diag  = prevRowBuf [col - 1] [curComp];
    int32 upper = prevRowBuf [col    ] [curComp];
    int32 left  = curRowBuf  [col - 1] [curComp];

    switch (info.Ss)
    	{
    	
		case 0:
			return 0;
			
		case 1:
			return left;

		case 2:
			return upper;

		case 3:
			return diag;

		case 4:
			return left + upper - diag;

		case 5:
			return left + ((upper - diag) >> 1);

		case 6:
       		return upper + ((left - diag) >> 1);

		case 7:
            return (left + upper) >> 1;

		default:
			{
			ThrowBadFormat ();
            return 0;
            }
              
     	}
     
	}
	
/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * FillBitBuffer --
 *
 *	Load up the bit buffer with at least nbits
 *	Process any stuffed bytes at this time.
 *
 * Results:
 *	None
 *
 * Side effects:
 *	The bitwise global variables are updated.
 *
 *--------------------------------------------------------------
 */

inline void dng_lossless_decoder::FillBitBuffer (int32 nbits)
	{
	
	const int32 kMinGetBits = sizeof (uint32) * 8 - 7;
	
	#if qSupportHasselblad_3FR
	
	if (fHasselblad3FR)
		{
		
		while (bitsLeft < kMinGetBits)
			{
			
			int32 c0 = GetJpegChar ();
			int32 c1 = GetJpegChar ();
			int32 c2 = GetJpegChar ();
			int32 c3 = GetJpegChar ();
			
			getBuffer = (getBuffer << 8) | c3;
			getBuffer = (getBuffer << 8) | c2;
			getBuffer = (getBuffer << 8) | c1;
			getBuffer = (getBuffer << 8) | c0;
			
			bitsLeft += 32;
			
			}
			
		return;
		
		}
	
	#endif
	
    while (bitsLeft < kMinGetBits)
    	{
    	
		int32 c = GetJpegChar ();

		// If it's 0xFF, check and discard stuffed zero byte

		if (c == 0xFF)
			{
			
			int32 c2 = GetJpegChar ();
			
	    	if (c2 != 0)
	    		{

				// Oops, it's actually a marker indicating end of
				// compressed data.  Better put it back for use later.

				UnGetJpegChar ();
				UnGetJpegChar ();

				// There should be enough bits still left in the data
				// segment; if so, just break out of the while loop.

				if (bitsLeft >= nbits)
				    break;

				// Uh-oh.  Corrupted data: stuff zeroes into the data
				// stream, since this sometimes occurs when we are on the
				// last show_bits8 during decoding of the Huffman
				// segment.

				c = 0;
				
	    		}
	    		
			}
			
		getBuffer = (getBuffer << 8) | c;
		
		bitsLeft += 8;
		
   		}
 
	}

/*****************************************************************************/

inline int32 dng_lossless_decoder::show_bits8 ()
	{
	
	if (bitsLeft < 8)
		FillBitBuffer (8);
		
	return (int32) ((getBuffer >> (bitsLeft - 8)) & 0xff);
	
	}

/*****************************************************************************/

inline void dng_lossless_decoder::flush_bits (int32 nbits)
	{
	
	bitsLeft -= nbits;
	
	}

/*****************************************************************************/

inline int32 dng_lossless_decoder::get_bits (int32 nbits)
	{
	
	if (nbits > 16)
		{
		ThrowBadFormat ();
		}
	
	if (bitsLeft < nbits)
		FillBitBuffer (nbits);
		
	return (int32) ((getBuffer >> (bitsLeft -= nbits)) & (0x0FFFF >> (16 - nbits)));
	
	}

/*****************************************************************************/

inline int32 dng_lossless_decoder::get_bit ()
	{
	
	if (!bitsLeft)
		FillBitBuffer (1);
		
	return (int32) ((getBuffer >> (--bitsLeft)) & 1);
	
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * HuffDecode --
 *
 *	Taken from Figure F.16: extract next coded symbol from
 *	input stream.  This should becode a macro.
 *
 * Results:
 *	Next coded symbol
 *
 * Side effects:
 *	Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */
 
inline int32 dng_lossless_decoder::HuffDecode (HuffmanTable *htbl)
	{
	
    // If the huffman code is less than 8 bits, we can use the fast
    // table lookup to get its value.  It's more than 8 bits about
    // 3-4% of the time.

    int32 code = show_bits8 ();
    
    if (htbl->numbits [code])
    	{
    	
		flush_bits (htbl->numbits [code]);
		
		return htbl->value [code];
		
    	}
    	
    else
    	{
    	
		flush_bits (8);
		
		int32 l = 8;
		
		while (code > htbl->maxcode [l]) 
			{
	    	code = (code << 1) | get_bit ();
	    	l++;
			}

		// With garbage input we may reach the sentinel value l = 17.

		if (l > 16) 
			{
	    	return 0;		// fake a zero as the safest result
			}
		else
			{
	    	return htbl->huffval [htbl->valptr [l] +
	    						  ((int32) (code - htbl->mincode [l]))];
			}
			
   		}
   		
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * HuffExtend --
 *
 *	Code and table for Figure F.12: extend sign bit
 *
 * Results:
 *	The extended value.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

inline void dng_lossless_decoder::HuffExtend (int32 &x, int32 s)
	{

	if (x < (0x08000 >> (16 - s)))
		{
		x += -(1 << s) + 1;
		}

	}

/*****************************************************************************/

// Called from DecodeImage () to write one row.
 
void dng_lossless_decoder::PmPutRow (MCU *buf,
								     int32 numComp,
								     int32 numCol,
								     int32 /* row */)
	{
	
	uint16 *sPtr = &buf [0] [0];
	
	uint32 pixels = numCol * numComp;
	
	fSpooler->Spool (sPtr, pixels * (uint32) sizeof (uint16));
		
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * DecodeFirstRow --
 *
 *	Decode the first raster line of samples at the start of 
 *      the scan and at the beginning of each restart interval.
 *	This includes modifying the component value so the real
 *      value, not the difference is returned.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::DecodeFirstRow (MCU *curRowBuf)
	{
	
    int32 compsInScan = info.compsInScan;
    
    // Process the first column in the row.

    for (int32 curComp = 0; curComp < compsInScan; curComp++) 
    	{
    	
        int32 ci = info.MCUmembership [curComp];
        
        JpegComponentInfo *compptr = info.curCompInfo [ci];
        
        HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];

        // Section F.2.2.1: decode the difference

  		int32 d = 0;
	
        int32 s = HuffDecode (dctbl);
        
      	if (s)
      		{
      		
      		if (s == 16 && !fBug16)
      			{
      			d = -32768;
      			}
      		
      		else
      			{
				d = get_bits (s);
            	HuffExtend (d, s);
            	}

            }

		// Add the predictor to the difference.

	    int32 Pr = info.dataPrecision;
	    int32 Pt = info.Pt;
    
        curRowBuf [0] [curComp] = (ComponentType) (d + (1 << (Pr-Pt-1)));
        
    	}
    	
    // Process the rest of the row.
    
    int32 numCOL = info.imageWidth;
    
    for (int32 col = 1; col < numCOL; col++)
    	{

        for (int32 curComp = 0; curComp < compsInScan; curComp++)
        	{
        	
            int32 ci = info.MCUmembership [curComp];
            
            JpegComponentInfo *compptr = info.curCompInfo [ci];
            
            HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];

			// Section F.2.2.1: decode the difference

	  		int32 d = 0;
		
	        int32 s = HuffDecode (dctbl);
	        
	      	if (s)
	      		{

	      		if (s == 16 && !fBug16)
	      			{
	      			d = -32768;
	      			}
	      		
	      		else
	      			{
					d = get_bits (s);
	            	HuffExtend (d, s);
	            	}

	            }
	            
			// Add the predictor to the difference.

            curRowBuf [col] [curComp] = (ComponentType) (d + curRowBuf [col-1] [curComp]);
            
       		}
       		
    	}
    	
    // Update the restart counter

    if (info.restartInRows)
    	{
       	info.restartRowsToGo--;
    	}
    	
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * DecodeImage --
 *
 *      Decode the input stream. This includes modifying
 *      the component value so the real value, not the
 *      difference is returned.
 *
 * Results:
 *      None.
 *
 * Side effects:
 *      Bitstream is parsed.
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_decoder::DecodeImage ()
	{
	
	#define swap(type,a,b) {type c; c=(a); (a)=(b); (b)=c;}

    int32 numCOL      = info.imageWidth;
    int32 numROW	  = info.imageHeight;
    int32 compsInScan = info.compsInScan;
    
    // Precompute the decoding table for each table.
    
    HuffmanTable *ht [4];
    
	for (int32 curComp = 0; curComp < compsInScan; curComp++)
    	{
    	
        int32 ci = info.MCUmembership [curComp];
        
        JpegComponentInfo *compptr = info.curCompInfo [ci];
        
        ht [curComp] = info.dcHuffTblPtrs [compptr->dcTblNo];

   		}
		
	MCU *prevRowBuf = mcuROW1;
	MCU *curRowBuf  = mcuROW2;
	
	#if qSupportCanon_sRAW
		
	// Canon sRAW support
	
	if (info.compInfo [0].hSampFactor == 2 &&
		info.compInfo [0].vSampFactor == 1)
		{
	
		for (int32 row = 0; row < numROW; row++)
			{
			
			// Initialize predictors.
			
			int32 p0;
			int32 p1;
			int32 p2;
			
			if (row == 0)
				{
				p0 = 1 << 14;
				p1 = 1 << 14;
				p2 = 1 << 14;
				}
				
			else
				{
				p0 = prevRowBuf [0] [0];
				p1 = prevRowBuf [0] [1];
				p2 = prevRowBuf [0] [2];
				}
			
			for (int32 col = 0; col < numCOL; col += 2)
				{
				
				// Read first luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					curRowBuf [col] [0] = (ComponentType) p0;
				
					}
				
				// Read second luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					curRowBuf [col + 1] [0] = (ComponentType) p0;
				
					}
				
				// Read first chroma component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [1]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p1 += d;
					
					curRowBuf [col    ] [1] = (ComponentType) p1;
					curRowBuf [col + 1] [1] = (ComponentType) p1;
				
					}
				
				// Read second chroma component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [2]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p2 += d;
					
					curRowBuf [col    ] [2] = (ComponentType) p2;
					curRowBuf [col + 1] [2] = (ComponentType) p2;
				
					}
								
				}
			
			PmPutRow (curRowBuf, compsInScan, numCOL, row);

			swap (MCU *, prevRowBuf, curRowBuf);
			
			}
			
		return;
		
		}
		
	if (info.compInfo [0].hSampFactor == 2 &&
		info.compInfo [0].vSampFactor == 2)
		{
	
		for (int32 row = 0; row < numROW; row += 2)
			{
			
			// Initialize predictors.
			
			int32 p0;
			int32 p1;
			int32 p2;
			
			if (row == 0)
				{
				p0 = 1 << 14;
				p1 = 1 << 14;
				p2 = 1 << 14;
				}
				
			else
				{
				p0 = prevRowBuf [0] [0];
				p1 = prevRowBuf [0] [1];
				p2 = prevRowBuf [0] [2];
				}
			
			for (int32 col = 0; col < numCOL; col += 2)
				{
				
				// Read first luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					prevRowBuf [col] [0] = (ComponentType) p0;
				
					}
				
				// Read second luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					prevRowBuf [col + 1] [0] = (ComponentType) p0;
				
					}
				
				// Read third luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					curRowBuf [col] [0] = (ComponentType) p0;
				
					}
				
				// Read fourth luminance component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [0]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p0 += d;
					
					curRowBuf [col + 1] [0] = (ComponentType) p0;
				
					}
				
				// Read first chroma component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [1]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p1 += d;
					
					prevRowBuf [col    ] [1] = (ComponentType) p1;
					prevRowBuf [col + 1] [1] = (ComponentType) p1;

					curRowBuf [col    ] [1] = (ComponentType) p1;
					curRowBuf [col + 1] [1] = (ComponentType) p1;
				
					}
				
				// Read second chroma component.
				
					{
				
					int32 d = 0;
				
					int32 s = HuffDecode (ht [2]);
					
					if (s)
						{

						if (s == 16)
							{
							d = -32768;
							}
						
						else
							{
							d = get_bits (s);
							HuffExtend (d, s);
							}

						}
						
					p2 += d;
					
					prevRowBuf [col    ] [2] = (ComponentType) p2;
					prevRowBuf [col + 1] [2] = (ComponentType) p2;
				
					curRowBuf [col    ] [2] = (ComponentType) p2;
					curRowBuf [col + 1] [2] = (ComponentType) p2;
				
					}
								
				}
			
			PmPutRow (prevRowBuf, compsInScan, numCOL, row);
			PmPutRow (curRowBuf, compsInScan, numCOL, row);

			}
			
		return;
		
		}

	#endif
	
	#if qSupportHasselblad_3FR
	
	if (info.Ss == 8 && (numCOL & 1) == 0)
		{
		
		fHasselblad3FR = true;
		
		for (int32 row = 0; row < numROW; row++)
			{
			
			int32 p0 = 32768;
			int32 p1 = 32768;
			
			for (int32 col = 0; col < numCOL; col += 2)
				{
				
				int32 s0 = HuffDecode (ht [0]);
				int32 s1 = HuffDecode (ht [0]);
				
				if (s0)
					{
					int32 d = get_bits (s0);
					if (s0 == 16)
						{
						d = -32768;
						}
					else
						{
						HuffExtend (d, s0);
						}
					p0 += d;
					}

				if (s1)
					{
					int32 d = get_bits (s1);
					if (s1 == 16)
						{
						d = -32768;
						}
					else
						{
						HuffExtend (d, s1);
						}
					p1 += d;
					}

				curRowBuf [col    ] [0] = (ComponentType) p0;
				curRowBuf [col + 1] [0] = (ComponentType) p1;
				
				}
			
			PmPutRow (curRowBuf, compsInScan, numCOL, row);

			}

		return;
		
		}
	
	#endif
	
    // Decode the first row of image. Output the row and
    // turn this row into a previous row for later predictor
    // calculation.

    DecodeFirstRow (mcuROW1);
    
    PmPutRow (mcuROW1, compsInScan, numCOL, 0);
    
	// Process each row.

    for (int32 row = 1; row < numROW; row++)
    	{

        // Account for restart interval, process restart marker if needed.

		if (info.restartInRows)
			{
			
			if (info.restartRowsToGo == 0)
				{
				
				ProcessRestart ();
            
                // Reset predictors at restart.
                
				DecodeFirstRow (curRowBuf);
				
				PmPutRow (curRowBuf, compsInScan, numCOL, row);
				
				swap (MCU *, prevRowBuf, curRowBuf);
				
				continue;
				
           		}
           		
			info.restartRowsToGo--;
           
			}
			
		// The upper neighbors are predictors for the first column.

        for (int32 curComp = 0; curComp < compsInScan; curComp++)
        	{
        	
	        // Section F.2.2.1: decode the difference

	  		int32 d = 0;
		
	        int32 s = HuffDecode (ht [curComp]);
	        
	      	if (s)
	      		{

	      		if (s == 16 && !fBug16)
	      			{
	      			d = -32768;
	      			}
	      		
	      		else
	      			{
					d = get_bits (s);
	            	HuffExtend (d, s);
	            	}

	            }
	            
	        // First column of row above is predictor for first column.

            curRowBuf [0] [curComp] = (ComponentType) (d + prevRowBuf [0] [curComp]);
            
			}

        // For the rest of the column on this row, predictor
        // calculations are based on PSV. 

     	if (compsInScan == 2 && info.Ss == 1 && numCOL > 1)
    		{
    		
    		// This is the combination used by both the Canon and Kodak raw formats. 
    		// Unrolling the general case logic results in a significant speed increase.
    		
    		uint16 *dPtr = &curRowBuf [1] [0];
    		
    		int32 prev0 = dPtr [-2];
    		int32 prev1 = dPtr [-1];
    		
			for (int32 col = 1; col < numCOL; col++)
	        	{
	        	
		        int32 s = HuffDecode (ht [0]);
		        
		      	if (s)
		      		{
		      		
		      		int32 d;

		      		if (s == 16 && !fBug16)
		      			{
		      			d = -32768;
		      			}
		      		
		      		else
		      			{
						d = get_bits (s);
		            	HuffExtend (d, s);
		            	}

		        	prev0 += d;
		        	
		            }
		            
		        s = HuffDecode (ht [1]);
		        
		      	if (s)
		      		{
		      		
		      		int32 d;

		      		if (s == 16 && !fBug16)
		      			{
		      			d = -32768;
		      			}
		      		
		      		else
		      			{
						d = get_bits (s);
		            	HuffExtend (d, s);
		            	}

					prev1 += d;
					
		            }
		        
				dPtr [0] = (uint16) prev0;
				dPtr [1] = (uint16) prev1;
				
				dPtr += 2;
				
       			}
       			
       		}
       		
       	else
       		{
       		
			for (int32 col = 1; col < numCOL; col++)
	        	{
	        	
	            for (int32 curComp = 0; curComp < compsInScan; curComp++)
	            	{
	            	
		 	        // Section F.2.2.1: decode the difference

			  		int32 d = 0;
				
			        int32 s = HuffDecode (ht [curComp]);
			        
			      	if (s)
			      		{
			      		
			      		if (s == 16 && !fBug16)
			      			{
			      			d = -32768;
			      			}
			      		
			      		else
			      			{
							d = get_bits (s);
			            	HuffExtend (d, s);
			            	}

			            }
			            
			        // Predict the pixel value.
		            
	                int32 predictor = QuickPredict (col,
		                						    curComp,
		                						    curRowBuf,
		                						    prevRowBuf);
		                						  
	                // Save the difference.

	                curRowBuf [col] [curComp] = (ComponentType) (d + predictor);
	                
					}
					
				}

        	}

		PmPutRow (curRowBuf, compsInScan, numCOL, row);
		
		swap (MCU *, prevRowBuf, curRowBuf);
		
    	}
    	
    #undef swap
	
	}

/*****************************************************************************/

void dng_lossless_decoder::StartRead (uint32 &imageWidth,
								      uint32 &imageHeight,
								      uint32 &imageChannels)
	{ 
	
	ReadFileHeader    ();
	ReadScanHeader    ();
	DecoderStructInit ();
	HuffDecoderInit   ();
	
	imageWidth    = info.imageWidth;
	imageHeight   = info.imageHeight;
	imageChannels = info.compsInScan;
	
	}

/*****************************************************************************/

void dng_lossless_decoder::FinishRead ()
	{
	
	DecodeImage ();
		
	}

/*****************************************************************************/

void DecodeLosslessJPEG (dng_stream &stream,
					     dng_spooler &spooler,
					     uint32 minDecodedSize,
					     uint32 maxDecodedSize,
						 bool bug16)
	{
	
	dng_lossless_decoder decoder (&stream,
							      &spooler,
							      bug16);
	
	uint32 imageWidth;
	uint32 imageHeight;
	uint32 imageChannels;
	
	decoder.StartRead (imageWidth,
					   imageHeight,
					   imageChannels);
					   
	uint32 decodedSize = imageWidth    *
						 imageHeight   *
						 imageChannels *
						 (uint32) sizeof (uint16);
					   
	if (decodedSize < minDecodedSize ||
		decodedSize > maxDecodedSize)
		{
		ThrowBadFormat ();
		}
	
	decoder.FinishRead ();
	
	}

/*****************************************************************************/

class dng_lossless_encoder
	{
	
	private:
	
		const uint16 *fSrcData;
		
		uint32 fSrcRows;
		uint32 fSrcCols;
		uint32 fSrcChannels;
		uint32 fSrcBitDepth;
		
		int32 fSrcRowStep;
		int32 fSrcColStep;
	
		dng_stream &fStream;
	
		HuffmanTable huffTable [4];
		
		uint32 freqCount [4] [257];
		
		// Current bit-accumulation buffer

		int32 huffPutBuffer;
		int32 huffPutBits;
		
		// Lookup table for number of bits in an 8 bit value.
		
		int numBitsTable [256];
		
	public:
	
		dng_lossless_encoder (const uint16 *srcData,
					 	      uint32 srcRows,
					 	      uint32 srcCols,
					 	      uint32 srcChannels,
					 	      uint32 srcBitDepth,
					 	      int32 srcRowStep,
					 	      int32 srcColStep,
					 	      dng_stream &stream);
		
		void Encode ();
		
	private:
	
		void EmitByte (uint8 value);
	
		void EmitBits (int code, int size);

		void FlushBits ();

		void CountOneDiff (int diff, uint32 *countTable);

		void EncodeOneDiff (int diff, HuffmanTable *dctbl);
		
		void FreqCountSet ();

		void HuffEncode ();

		void GenHuffCoding (HuffmanTable *htbl, uint32 *freq);

		void HuffOptimize ();

		void EmitMarker (JpegMarker mark);

		void Emit2bytes (int value);

		void EmitDht (int index);

		void EmitSof (JpegMarker code);

		void EmitSos ();

		void WriteFileHeader ();

		void WriteScanHeader ();

		void WriteFileTrailer ();

	};
	
/*****************************************************************************/

dng_lossless_encoder::dng_lossless_encoder (const uint16 *srcData,
											uint32 srcRows,
											uint32 srcCols,
											uint32 srcChannels,
											uint32 srcBitDepth,
											int32 srcRowStep,
											int32 srcColStep,
											dng_stream &stream)
								    
	:	fSrcData     (srcData    )
	,	fSrcRows     (srcRows    )
	,	fSrcCols     (srcCols    )
	,	fSrcChannels (srcChannels)
	,	fSrcBitDepth (srcBitDepth)
	,	fSrcRowStep  (srcRowStep )
	,	fSrcColStep  (srcColStep )
	,	fStream      (stream     )
	
	,	huffPutBuffer (0)
	,	huffPutBits   (0)
	
	{
	
    // Initialize number of bits lookup table.
    
    numBitsTable [0] = 0;
    	
    for (int i = 1; i < 256; i++)
    	{
    	
		int temp = i;
		int nbits = 1;
		
		while (temp >>= 1)
			{
	    	nbits++;
			}
			
		numBitsTable [i] = nbits;
		
    	}
    	
	}

/*****************************************************************************/

inline void dng_lossless_encoder::EmitByte (uint8 value)
	{
	
	fStream.Put_uint8 (value);
	
	}
	
/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EmitBits --
 *
 *	Code for outputting bits to the file
 *
 *	Only the right 24 bits of huffPutBuffer are used; the valid
 *	bits are left-justified in this part.  At most 16 bits can be
 *	passed to EmitBits in one call, and we never retain more than 7
 *	bits in huffPutBuffer between calls, so 24 bits are
 *	sufficient.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	huffPutBuffer and huffPutBits are updated.
 *
 *--------------------------------------------------------------
 */
 
inline void dng_lossless_encoder::EmitBits (int code, int size)
	{
	
    DNG_ASSERT (size != 0, "Bad Huffman table entry");

    int putBits   = size;
	int putBuffer = code;
    
    putBits += huffPutBits;
    
    putBuffer <<= 24 - putBits;
    putBuffer |= huffPutBuffer;

    while (putBits >= 8)
    	{
    	
		uint8 c = (uint8) (putBuffer >> 16);

		// Output whole bytes we've accumulated with byte stuffing

		EmitByte (c);
		
		if (c == 0xFF)
			{
	   	 	EmitByte (0);
			}

		putBuffer <<= 8;
		putBits -= 8;
		
    	}

    huffPutBuffer = putBuffer;
    huffPutBits   = putBits;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * FlushBits --
 *
 *	Flush any remaining bits in the bit buffer. Used before emitting
 *	a marker.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	huffPutBuffer and huffPutBits are reset
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::FlushBits ()
	{
	
    // The first call forces output of any partial bytes.

    EmitBits (0x007F, 7);
    
    // We can then zero the buffer.

    huffPutBuffer = 0;
    huffPutBits   = 0;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * CountOneDiff --
 *
 *      Count the difference value in countTable.
 *
 * Results:
 *      diff is counted in countTable.
 *
 * Side effects:
 *      None. 
 *
 *--------------------------------------------------------------
 */

inline void dng_lossless_encoder::CountOneDiff (int diff, uint32 *countTable)
	{
	
    // Encode the DC coefficient difference per section F.1.2.1
     
    int temp = diff;
    
    if (temp < 0)
    	{
    	
 		temp = -temp;
 
	    }

    // Find the number of bits needed for the magnitude of the coefficient

    int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
    						: numBitsTable [temp & 0xFF];
        	
    // Update count for this bit length

    countTable [nbits] ++;
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EncodeOneDiff --
 *
 *	Encode a single difference value.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

inline void dng_lossless_encoder::EncodeOneDiff (int diff, HuffmanTable *dctbl)
	{

    // Encode the DC coefficient difference per section F.1.2.1
     
    int temp  = diff;
    int temp2 = diff;
    
    if (temp < 0)
    	{
    	
		temp = -temp;
		
		// For a negative input, want temp2 = bitwise complement of
		// abs (input).  This code assumes we are on a two's complement
		// machine.

		temp2--;
		
	    }

    // Find the number of bits needed for the magnitude of the coefficient

    int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
    						: numBitsTable [temp & 0xFF];

    // Emit the Huffman-coded symbol for the number of bits

    EmitBits (dctbl->ehufco [nbits],
    		  dctbl->ehufsi [nbits]);

    // Emit that number of bits of the value, if positive,
    // or the complement of its magnitude, if negative.
    
    // If the number of bits is 16, there is only one possible difference
    // value (-32786), so the lossless JPEG spec says not to output anything
    // in that case.  So we only need to output the diference value if
    // the number of bits is between 1 and 15.

    if (nbits & 15)
    	{
    	
		EmitBits (temp2 & (0x0FFFF >> (16 - nbits)),
				  nbits);
		
		}

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * FreqCountSet --
 *
 *      Count the times each category symbol occurs in this image.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	The freqCount has counted all category 
 *	symbols appeared in the image.        
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::FreqCountSet ()
	{
    
	memset (freqCount, 0, sizeof (freqCount));
	
	DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::FreqCountSet: fSrcRpws too large.");

    for (int32 row = 0; row < (int32)fSrcRows; row++)
    	{
    	
		const uint16 *sPtr = fSrcData + row * fSrcRowStep;
		
		// Initialize predictors for this row.
		
		int32 predictor [4];
		
		for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
			{
			
			if (row == 0)
				predictor [channel] = 1 << (fSrcBitDepth - 1);
				
			else
				predictor [channel] = sPtr [channel - fSrcRowStep];
			
			}
			
		// Unroll most common case of two channels
		
		if (fSrcChannels == 2)
			{
			
			int32 pred0 = predictor [0];
			int32 pred1 = predictor [1];
			
			uint32 srcCols    = fSrcCols;
			int32  srcColStep = fSrcColStep;
			
	    	for (uint32 col = 0; col < srcCols; col++)
	    		{
	    		
    			int32 pixel0 = sPtr [0];
				int32 pixel1 = sPtr [1];
    			
    			int16 diff0 = (int16) (pixel0 - pred0);
    			int16 diff1 = (int16) (pixel1 - pred1);
    			
    			CountOneDiff (diff0, freqCount [0]);
    			CountOneDiff (diff1, freqCount [1]);
    			
    			pred0 = pixel0;
   				pred1 = pixel1;
	    			
	    		sPtr += srcColStep;
	    			
	    		}
			
			}
			
		// General case.
			
		else
			{
			
	    	for (uint32 col = 0; col < fSrcCols; col++)
	    		{
	    		
	    		for (uint32 channel = 0; channel < fSrcChannels; channel++)
	    			{
	    			
	    			int32 pixel = sPtr [channel];
	    			
	    			int16 diff = (int16) (pixel - predictor [channel]);
	    			
	    			CountOneDiff (diff, freqCount [channel]);
	    			
	    			predictor [channel] = pixel;
	    			
	    			}
	    			
	    		sPtr += fSrcColStep;
	    			
	    		}
	    		
	    	}
    		
    	}

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * HuffEncode --
 *
 *      Encode and output Huffman-compressed image data.
 *
 * Results:
 *      None.
 *
 * Side effects:
 *      None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::HuffEncode ()
	{
    
	DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::HuffEncode: fSrcRows too large.");

	for (int32 row = 0; row < (int32)fSrcRows; row++)
    	{
    	
		const uint16 *sPtr = fSrcData + row * fSrcRowStep;
		
		// Initialize predictors for this row.
		
		int32 predictor [4];
		
		for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
			{
			
			if (row == 0)
				predictor [channel] = 1 << (fSrcBitDepth - 1);
				
			else
				predictor [channel] = sPtr [channel - fSrcRowStep];
			
			}
			
		// Unroll most common case of two channels
		
		if (fSrcChannels == 2)
			{
			
			int32 pred0 = predictor [0];
			int32 pred1 = predictor [1];
			
			uint32 srcCols    = fSrcCols;
			int32  srcColStep = fSrcColStep;
			
	    	for (uint32 col = 0; col < srcCols; col++)
	    		{
	    		
    			int32 pixel0 = sPtr [0];
				int32 pixel1 = sPtr [1];
    			
    			int16 diff0 = (int16) (pixel0 - pred0);
    			int16 diff1 = (int16) (pixel1 - pred1);
    			
    			EncodeOneDiff (diff0, &huffTable [0]);
   				EncodeOneDiff (diff1, &huffTable [1]);
    			
    			pred0 = pixel0;
   				pred1 = pixel1;
	    			
	    		sPtr += srcColStep;
	    			
	    		}
			
			}
			
		// General case.
			
		else
			{
			
	    	for (uint32 col = 0; col < fSrcCols; col++)
	    		{
	    		
	    		for (uint32 channel = 0; channel < fSrcChannels; channel++)
	    			{
	    			
	    			int32 pixel = sPtr [channel];
	    			
	    			int16 diff = (int16) (pixel - predictor [channel]);
	    			
    				EncodeOneDiff (diff, &huffTable [channel]);
	    			
	    			predictor [channel] = pixel;
	    			
	    			}
	    			
	    		sPtr += fSrcColStep;
	    			
	    		}
	    		
	    	}
    		
    	}
  
    FlushBits ();
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * GenHuffCoding --
 *
 * 	Generate the optimal coding for the given counts. 
 *	This algorithm is explained in section K.2 of the
 *	JPEG standard. 
 *
 * Results:
 *      htbl->bits and htbl->huffval are constructed.
 *
 * Side effects:
 *      None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::GenHuffCoding (HuffmanTable *htbl, uint32 *freq)
	{
	
	int i;
	int j;
	
	const int MAX_CLEN = 32;     	// assumed maximum initial code length
	
	uint8 bits [MAX_CLEN + 1];	// bits [k] = # of symbols with code length k
	short codesize [257];			// codesize [k] = code length of symbol k
	short others   [257];			// next symbol in current branch of tree
	
	memset (bits    , 0, sizeof (bits    ));
  	memset (codesize, 0, sizeof (codesize));
	
	for (i = 0; i < 257; i++)
		others [i] = -1;			// init links to empty

	// Including the pseudo-symbol 256 in the Huffman procedure guarantees
	// that no real symbol is given code-value of all ones, because 256
	// will be placed in the largest codeword category.

	freq [256] = 1;					// make sure there is a nonzero count

	// Huffman's basic algorithm to assign optimal code lengths to symbols
	
	while (true)
		{

		// Find the smallest nonzero frequency, set c1 = its symbol.
		// In case of ties, take the larger symbol number.

		int c1 = -1;
		
		uint32 v = 0xFFFFFFFF;
		
		for (i = 0; i <= 256; i++)
			{
			
			if (freq [i] && freq [i] <= v)
				{
				v = freq [i];
				c1 = i;
				}
	
			}

		// Find the next smallest nonzero frequency, set c2 = its symbol.
		// In case of ties, take the larger symbol number.

		int c2 = -1;
		
		v = 0xFFFFFFFF;
		
		for (i = 0; i <= 256; i++)
			{
			
      		if (freq [i] && freq [i] <= v && i != c1) 
      			{
				v = freq [i];
				c2 = i;
				}
				
			}

		// Done if we've merged everything into one frequency.

		if (c2 < 0)
      		break;
    
 		// Else merge the two counts/trees.

		freq [c1] += freq [c2];
		freq [c2] = 0;

		// Increment the codesize of everything in c1's tree branch.

		codesize [c1] ++;
		
		while (others [c1] >= 0)
			{
			c1 = others [c1];
			codesize [c1] ++;
    		}
    
		// chain c2 onto c1's tree branch 

		others [c1] = (short) c2;
    
		// Increment the codesize of everything in c2's tree branch.

		codesize [c2] ++;
		
		while (others [c2] >= 0) 
			{
			c2 = others [c2];
			codesize [c2] ++;
			}

		}

	// Now count the number of symbols of each code length.

	for (i = 0; i <= 256; i++)
		{
		
		if (codesize [i])
			{

 			// The JPEG standard seems to think that this can't happen,
			// but I'm paranoid...
			
			if (codesize [i] > MAX_CLEN)
				{
       
       			DNG_REPORT ("Huffman code size table overflow");
       			
       			ThrowProgramError ();
       			
       			}

			bits [codesize [i]]++;
			
			}

		}

	// JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
	// Huffman procedure assigned any such lengths, we must adjust the coding.
	// Here is what the JPEG spec says about how this next bit works:
	// Since symbols are paired for the longest Huffman code, the symbols are
	// removed from this length category two at a time.  The prefix for the pair
	// (which is one bit shorter) is allocated to one of the pair; then,
	// skipping the BITS entry for that prefix length, a code word from the next
	// shortest nonzero BITS entry is converted into a prefix for two code words
	// one bit longer.
  
	for (i = MAX_CLEN; i > 16; i--)
		{
		
		while (bits [i] > 0)
			{
			
			// Kludge: I have never been able to test this logic, and there
			// are comments on the web that this encoder has bugs with 16-bit
			// data, so just throw an error if we get here and revert to a
			// default table.	 - tknoll 12/1/03.
			
       		DNG_REPORT ("Info: Optimal huffman table bigger than 16 bits");
        	
 			ThrowProgramError ();
			
			// Original logic:
			
			j = i - 2;		// find length of new prefix to be used
			
			while (bits [j] == 0)
				j--;
      
			bits [i    ] -= 2;		// remove two symbols
			bits [i - 1] ++;		// one goes in this length
			bits [j + 1] += 2;		// two new symbols in this length
			bits [j    ] --;		// symbol of this length is now a prefix
			
			}
			
		}

	// Remove the count for the pseudo-symbol 256 from
	// the largest codelength.
	
	while (bits [i] == 0)		// find largest codelength still in use
    	i--;
    	
	bits [i] --;
  
	// Return final symbol counts (only for lengths 0..16).

	memcpy (htbl->bits, bits, sizeof (htbl->bits));
  
 	// Return a list of the symbols sorted by code length. 
	// It's not real clear to me why we don't need to consider the codelength
	// changes made above, but the JPEG spec seems to think this works.
   
	int p = 0;
	
	for (i = 1; i <= MAX_CLEN; i++)
		{
		
		for (j = 0; j <= 255; j++)
			{
			
			if (codesize [j] == i)
				{
				htbl->huffval [p] = (uint8) j;
				p++;
				}

    		}
    		
  		}
 
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * HuffOptimize --
 *
 *	Find the best coding parameters for a Huffman-coded scan.
 *	When called, the scan data has already been converted to
 *	a sequence of MCU groups of source image samples, which
 *	are stored in a "big" array, mcuTable.
 *
 *	It counts the times each category symbol occurs. Based on
 *	this counting, optimal Huffman tables are built. Then it
 *	uses this optimal Huffman table and counting table to find
 *	the best PSV. 
 *
 * Results:
 *	Optimal Huffman tables are retured in cPtr->dcHuffTblPtrs[tbl].
 *	Best PSV is retured in cPtr->Ss.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::HuffOptimize ()
	{
	
    // Collect the frequency counts.
     
	FreqCountSet ();
	
	// Generate Huffman encoding tables.
	
	for (uint32 channel = 0; channel < fSrcChannels; channel++)
		{
		
		try
			{
			
        	GenHuffCoding (&huffTable [channel], freqCount [channel]);
        	
        	}
        	
        catch (...)
        	{
        	
        	DNG_REPORT ("Info: Reverting to default huffman table");
        	
        	for (uint32 j = 0; j <= 256; j++)
        		{
        		
        		freqCount [channel] [j] = (j <= 16 ? 1 : 0);
        		
        		}
        	
        	GenHuffCoding (&huffTable [channel], freqCount [channel]);
        	
        	}
        
        FixHuffTbl (&huffTable [channel]);
        
		}
 
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EmitMarker --
 *
 *	Emit a marker code into the output stream.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::EmitMarker (JpegMarker mark)
	{
	
    EmitByte (0xFF);
    EmitByte ((uint8) mark);
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * Emit2bytes --
 *
 *	Emit a 2-byte integer; these are always MSB first in JPEG
 *	files
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::Emit2bytes (int value)
	{
	
    EmitByte ((value >> 8) & 0xFF);
    EmitByte (value & 0xFF);
 
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EmitDht --
 *
 *	Emit a DHT marker, follwed by the huffman data.
 *
 * Results:
 *	None
 *
 * Side effects:
 *	None
 *
 *--------------------------------------------------------------
 */
 
void dng_lossless_encoder::EmitDht (int index)
	{
	
	int i;
	
    HuffmanTable *htbl = &huffTable [index];
    
 	EmitMarker (M_DHT);

    int length = 0;
    
	for (i = 1; i <= 16; i++)
	    length += htbl->bits [i];

	Emit2bytes (length + 2 + 1 + 16);
	
	EmitByte ((uint8) index);

	for (i = 1; i <= 16; i++)
	    EmitByte (htbl->bits [i]);

	for (i = 0; i < length; i++)
	    EmitByte (htbl->huffval [i]);

	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EmitSof --
 *
 *	Emit a SOF marker plus data.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::EmitSof (JpegMarker code)
	{
	
    EmitMarker (code);

    Emit2bytes (3 * fSrcChannels + 2 + 5 + 1);	// length

    EmitByte ((uint8) fSrcBitDepth);
    
    Emit2bytes (fSrcRows);
    Emit2bytes (fSrcCols);

    EmitByte ((uint8) fSrcChannels);

    for (uint32 i = 0; i < fSrcChannels; i++)
    	{
    	
		EmitByte ((uint8) i);
		
		EmitByte ((uint8) ((1 << 4) + 1));		// Not subsampled.
		   		 
        EmitByte (0);					// Tq shall be 0 for lossless.
        
    	}
   
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * EmitSos --
 *
 *	Emit a SOS marker plus data.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::EmitSos ()
	{
	
    EmitMarker (M_SOS);

    Emit2bytes (2 * fSrcChannels + 2 + 1 + 3);	// length

    EmitByte ((uint8) fSrcChannels);			// Ns

    for (uint32 i = 0; i < fSrcChannels; i++) 
    	{ 
    	
    	// Cs,Td,Ta
    	
		EmitByte ((uint8) i);
		EmitByte ((uint8) (i << 4));
		
    	}

    EmitByte (1);		// PSV - hardcoded - tknoll
    EmitByte (0);	    // Spectral selection end  - Se
    EmitByte (0);  		// The point transform parameter 
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * WriteFileHeader --
 *
 *	Write the file header.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::WriteFileHeader ()
	{
	
    EmitMarker (M_SOI);		// first the SOI
    
    EmitSof (M_SOF3);
    
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * WriteScanHeader --
 *
 *	Write the start of a scan (everything through the SOS marker).
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::WriteScanHeader ()
	{

    // Emit Huffman tables.
    
    for (uint32 i = 0; i < fSrcChannels; i++)
    	{
    	
		EmitDht (i);
		
    	}

	EmitSos ();
     
	}

/*****************************************************************************/

/*
 *--------------------------------------------------------------
 *
 * WriteFileTrailer --
 *
 *	Write the End of image marker at the end of a JPEG file.
 *
 * Results:
 *	None.
 *
 * Side effects:
 *	None.
 *
 *--------------------------------------------------------------
 */

void dng_lossless_encoder::WriteFileTrailer ()
	{
	
    EmitMarker (M_EOI);
    
	}

/*****************************************************************************/

void dng_lossless_encoder::Encode ()
	{
	
	DNG_ASSERT (fSrcChannels <= 4, "Too many components in scan");
    
	// Count the times each difference category occurs. 
	// Construct the optimal Huffman table.
    
	HuffOptimize ();

    // Write the frame and scan headers.

    WriteFileHeader (); 
    
    WriteScanHeader ();

    // Encode the image.
    
    HuffEncode ();

    // Clean up everything.
    
	WriteFileTrailer ();

	}

/*****************************************************************************/

void EncodeLosslessJPEG (const uint16 *srcData,
						 uint32 srcRows,
						 uint32 srcCols,
						 uint32 srcChannels,
						 uint32 srcBitDepth,
						 int32 srcRowStep,
						 int32 srcColStep,
						 dng_stream &stream)
	{
	
	dng_lossless_encoder encoder (srcData,
							      srcRows,
							      srcCols,
							      srcChannels,
							      srcBitDepth,
							      srcRowStep,
							      srcColStep,
							      stream);

	encoder.Encode ();
	
    }

/*****************************************************************************/
