• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*****************************************************************************/
2 // Copyright 2006-2007 Adobe Systems Incorporated
3 // All Rights Reserved.
4 //
5 // NOTICE:  Adobe permits you to use, modify, and distribute this file in
6 // accordance with the terms of the Adobe license agreement accompanying it.
7 /*****************************************************************************/
8 
9 /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_lossless_jpeg.cpp#2 $ */
10 /* $DateTime: 2012/06/01 07:28:57 $ */
11 /* $Change: 832715 $ */
12 /* $Author: tknoll $ */
13 
14 /*****************************************************************************/
15 
16 // Lossless JPEG code adapted from:
17 
18 /* Copyright (C) 1991, 1992, Thomas G. Lane.
19  * Part of the Independent JPEG Group's software.
20  * See the file Copyright for more details.
21  *
22  * Copyright (c) 1993 Brian C. Smith, The Regents of the University
23  * of California
24  * All rights reserved.
25  *
26  * Copyright (c) 1994 Kongji Huang and Brian C. Smith.
27  * Cornell University
28  * All rights reserved.
29  *
30  * Permission to use, copy, modify, and distribute this software and its
31  * documentation for any purpose, without fee, and without written agreement is
32  * hereby granted, provided that the above copyright notice and the following
33  * two paragraphs appear in all copies of this software.
34  *
35  * IN NO EVENT SHALL CORNELL UNIVERSITY BE LIABLE TO ANY PARTY FOR
36  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
37  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF CORNELL
38  * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * CORNELL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
41  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
42  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
43  * ON AN "AS IS" BASIS, AND CORNELL UNIVERSITY HAS NO OBLIGATION TO
44  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
45  */
46 
47 /*****************************************************************************/
48 
49 #include "dng_lossless_jpeg.h"
50 
51 #include "dng_assertions.h"
52 #include "dng_exceptions.h"
53 #include "dng_memory.h"
54 #include "dng_stream.h"
55 #include "dng_tag_codes.h"
56 
57 /*****************************************************************************/
58 
59 // This module contains routines that should be as fast as possible, even
60 // at the expense of slight code size increases.
61 
62 #include "dng_fast_module.h"
63 
64 /*****************************************************************************/
65 
66 // The qSupportCanon_sRAW stuff not actually required for DNG support, but
67 // only included to allow this code to be used on Canon sRAW files.
68 
69 #ifndef qSupportCanon_sRAW
70 #define qSupportCanon_sRAW 1
71 #endif
72 
73 // The qSupportHasselblad_3FR stuff not actually required for DNG support, but
74 // only included to allow this code to be used on Hasselblad 3FR files.
75 
76 #ifndef qSupportHasselblad_3FR
77 #define qSupportHasselblad_3FR 1
78 #endif
79 
80 /*****************************************************************************/
81 
82 /*
83  * One of the following structures is created for each huffman coding
84  * table.  We use the same structure for encoding and decoding, so there
85  * may be some extra fields for encoding that aren't used in the decoding
86  * and vice-versa.
87  */
88 
89 struct HuffmanTable
90 	{
91 
92     /*
93      * These two fields directly represent the contents of a JPEG DHT
94      * marker
95      */
96     uint8 bits[17];
97     uint8 huffval[256];
98 
99     /*
100      * The remaining fields are computed from the above to allow more
101      * efficient coding and decoding.  These fields should be considered
102      * private to the Huffman compression & decompression modules.
103      */
104 
105     uint16 mincode[17];
106     int32 maxcode[18];
107     int16 valptr[17];
108     int32 numbits[256];
109     int32 value[256];
110 
111     uint16 ehufco[256];
112     int8 ehufsi[256];
113 
114 	};
115 
116 /*****************************************************************************/
117 
118 // Computes the derived fields in the Huffman table structure.
119 
FixHuffTbl(HuffmanTable * htbl)120 static void FixHuffTbl (HuffmanTable *htbl)
121 	{
122 
123 	int32 l;
124 	int32 i;
125 
126 	const uint32 bitMask [] =
127 		{
128 		0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff,
129         0x0fffffff, 0x07ffffff, 0x03ffffff, 0x01ffffff,
130         0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
131         0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff,
132         0x0000ffff, 0x00007fff, 0x00003fff, 0x00001fff,
133         0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
134         0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f,
135         0x0000000f, 0x00000007, 0x00000003, 0x00000001
136         };
137 
138     // Figure C.1: make table of Huffman code length for each symbol
139     // Note that this is in code-length order.
140 
141 	int8 huffsize [257];
142 
143     int32 p = 0;
144 
145 	for (l = 1; l <= 16; l++)
146     	{
147 
148         for (i = 1; i <= (int32) htbl->bits [l]; i++)
149             huffsize [p++] = (int8) l;
150 
151     	}
152 
153     huffsize [p] = 0;
154 
155     int32 lastp = p;
156 
157 	// Figure C.2: generate the codes themselves
158 	// Note that this is in code-length order.
159 
160 	uint16 huffcode [257];
161 
162 	uint16 code = 0;
163 
164     int32 si = huffsize [0];
165 
166     p = 0;
167 
168     while (huffsize [p])
169     	{
170 
171         while (((int32) huffsize [p]) == si)
172         	{
173             huffcode [p++] = code;
174             code++;
175         	}
176 
177         code <<= 1;
178 
179         si++;
180 
181     	}
182 
183     // Figure C.3: generate encoding tables
184     // These are code and size indexed by symbol value
185     // Set any codeless symbols to have code length 0; this allows
186     // EmitBits to detect any attempt to emit such symbols.
187 
188     memset (htbl->ehufsi, 0, sizeof (htbl->ehufsi));
189 
190     for (p = 0; p < lastp; p++)
191     	{
192 
193         htbl->ehufco [htbl->huffval [p]] = huffcode [p];
194         htbl->ehufsi [htbl->huffval [p]] = huffsize [p];
195 
196     	}
197 
198 	// Figure F.15: generate decoding tables
199 
200 	p = 0;
201 
202     for (l = 1; l <= 16; l++)
203     	{
204 
205         if (htbl->bits [l])
206         	{
207 
208             htbl->valptr  [l] = (int16) p;
209             htbl->mincode [l] = huffcode [p];
210 
211             p += htbl->bits [l];
212 
213             htbl->maxcode [l] = huffcode [p - 1];
214 
215         	}
216 
217         else
218         	{
219             htbl->maxcode [l] = -1;
220         	}
221 
222     	}
223 
224     // We put in this value to ensure HuffDecode terminates.
225 
226     htbl->maxcode[17] = 0xFFFFFL;
227 
228     // Build the numbits, value lookup tables.
229     // These table allow us to gather 8 bits from the bits stream,
230     // and immediately lookup the size and value of the huffman codes.
231     // If size is zero, it means that more than 8 bits are in the huffman
232     // code (this happens about 3-4% of the time).
233 
234     memset (htbl->numbits, 0, sizeof (htbl->numbits));
235 
236 	for (p = 0; p < lastp; p++)
237 		{
238 
239         int32 size = huffsize [p];
240 
241         if (size <= 8)
242         	{
243 
244             int32 value = htbl->huffval [p];
245 
246             code = huffcode [p];
247 
248             int32 ll = code << (8  -size);
249 
250      		int32 ul = (size < 8 ? ll | bitMask [24 + size]
251      						     : ll);
252             if (ul >= static_cast<int32>(sizeof(htbl->numbits) / sizeof(htbl->numbits[0])) ||
253                 ul >= static_cast<int32>(sizeof(htbl->value) / sizeof(htbl->value[0])))
254                 {
255                 ThrowBadFormat ();
256                 }
257 
258             for (i = ll; i <= ul; i++)
259             	{
260                 htbl->numbits [i] = size;
261                 htbl->value   [i] = value;
262            		}
263 
264 			}
265 
266 		}
267 
268 	}
269 
270 /*****************************************************************************/
271 
272 /*
273  * The following structure stores basic information about one component.
274  */
275 
276 struct JpegComponentInfo
277 	{
278 
279     /*
280      * These values are fixed over the whole image.
281      * They are read from the SOF marker.
282      */
283     int16 componentId;		/* identifier for this component (0..255) */
284     int16 componentIndex;	/* its index in SOF or cPtr->compInfo[]   */
285 
286     /*
287      * Downsampling is not normally used in lossless JPEG, although
288      * it is permitted by the JPEG standard (DIS). We set all sampling
289      * factors to 1 in this program.
290      */
291     int16 hSampFactor;		/* horizontal sampling factor */
292     int16 vSampFactor;		/* vertical sampling factor   */
293 
294     /*
295      * Huffman table selector (0..3). The value may vary
296      * between scans. It is read from the SOS marker.
297      */
298     int16 dcTblNo;
299 
300 	};
301 
302 /*
303  * One of the following structures is used to pass around the
304  * decompression information.
305  */
306 
307 struct DecompressInfo
308 	{
309 
310     /*
311      * Image width, height, and image data precision (bits/sample)
312      * These fields are set by ReadFileHeader or ReadScanHeader
313      */
314     int32 imageWidth;
315     int32 imageHeight;
316     int32 dataPrecision;
317 
318     /*
319      * compInfo[i] describes component that appears i'th in SOF
320      * numComponents is the # of color components in JPEG image.
321      */
322     JpegComponentInfo *compInfo;
323     int16 numComponents;
324 
325     /*
326      * *curCompInfo[i] describes component that appears i'th in SOS.
327      * compsInScan is the # of color components in current scan.
328      */
329     JpegComponentInfo *curCompInfo[4];
330     int16 compsInScan;
331 
332     /*
333      * MCUmembership[i] indexes the i'th component of MCU into the
334      * curCompInfo array.
335      */
336     int16 MCUmembership[10];
337 
338     /*
339      * ptrs to Huffman coding tables, or NULL if not defined
340      */
341     HuffmanTable *dcHuffTblPtrs[4];
342 
343     /*
344      * prediction selection value (PSV) and point transform parameter (Pt)
345      */
346     int32 Ss;
347     int32 Pt;
348 
349     /*
350      * In lossless JPEG, restart interval shall be an integer
351      * multiple of the number of MCU in a MCU row.
352      */
353     int32 restartInterval;/* MCUs per restart interval, 0 = no restart */
354     int32 restartInRows; /*if > 0, MCU rows per restart interval; 0 = no restart*/
355 
356     /*
357      * these fields are private data for the entropy decoder
358      */
359     int32 restartRowsToGo;	/* MCUs rows left in this restart interval */
360     int16 nextRestartNum;	/* # of next RSTn marker (0..7) */
361 
362 	};
363 
364 /*****************************************************************************/
365 
366 // An MCU (minimum coding unit) is an array of samples.
367 
368 typedef uint16 ComponentType; 		// the type of image components
369 
370 typedef ComponentType *MCU;  		// MCU - array of samples
371 
372 /*****************************************************************************/
373 
374 class dng_lossless_decoder
375 	{
376 
377 	private:
378 
379 		dng_stream *fStream;		// Input data.
380 
381 		dng_spooler *fSpooler;		// Output data.
382 
383 		bool fBug16;				// Decode data with the "16-bit" bug.
384 
385 		dng_memory_data huffmanBuffer [4];
386 
387 		dng_memory_data compInfoBuffer;
388 
389 		DecompressInfo info;
390 
391 		dng_memory_data mcuBuffer1;
392 		dng_memory_data mcuBuffer2;
393 		dng_memory_data mcuBuffer3;
394 		dng_memory_data mcuBuffer4;
395 
396 		MCU *mcuROW1;
397 		MCU *mcuROW2;
398 
399 		uint64 getBuffer;			// current bit-extraction buffer
400 		int32 bitsLeft;				// # of unused bits in it
401 
402 		#if qSupportHasselblad_3FR
403 		bool fHasselblad3FR;
404 		#endif
405 
406 	public:
407 
408 		dng_lossless_decoder (dng_stream *stream,
409 						      dng_spooler *spooler,
410 						      bool bug16);
411 
412 		void StartRead (uint32 &imageWidth,
413 						uint32 &imageHeight,
414 						uint32 &imageChannels);
415 
416 		void FinishRead ();
417 
418 	private:
419 
GetJpegChar()420 		uint8 GetJpegChar ()
421 			{
422 			return fStream->Get_uint8 ();
423 			}
424 
UnGetJpegChar()425 		void UnGetJpegChar ()
426 			{
427 			fStream->SetReadPosition (fStream->Position () - 1);
428 			}
429 
430 		uint16 Get2bytes ();
431 
432 		void SkipVariable ();
433 
434 		void GetDht ();
435 
436 		void GetDri ();
437 
438 		void GetApp0 ();
439 
440 		void GetSof (int32 code);
441 
442 		void GetSos ();
443 
444 		void GetSoi ();
445 
446 		int32 NextMarker ();
447 
448 		JpegMarker ProcessTables ();
449 
450 		void ReadFileHeader ();
451 
452 		int32 ReadScanHeader ();
453 
454 		void DecoderStructInit ();
455 
456 		void HuffDecoderInit ();
457 
458 		void ProcessRestart ();
459 
460 		int32 QuickPredict (int32 col,
461 						    int32 curComp,
462 						    MCU *curRowBuf,
463 						    MCU *prevRowBuf);
464 
465 		void FillBitBuffer (int32 nbits);
466 
467 		int32 show_bits8 ();
468 
469 		void flush_bits (int32 nbits);
470 
471 		int32 get_bits (int32 nbits);
472 
473 		int32 get_bit ();
474 
475 		int32 HuffDecode (HuffmanTable *htbl);
476 
477 		void HuffExtend (int32 &x, int32 s);
478 
479 		void PmPutRow (MCU *buf,
480 					   int32 numComp,
481 					   int32 numCol,
482 					   int32 row);
483 
484 		void DecodeFirstRow (MCU *curRowBuf);
485 
486 		void DecodeImage ();
487 
488 		// Hidden copy constructor and assignment operator.
489 
490 		dng_lossless_decoder (const dng_lossless_decoder &decoder);
491 
492 		dng_lossless_decoder & operator= (const dng_lossless_decoder &decoder);
493 
494 	};
495 
496 /*****************************************************************************/
497 
dng_lossless_decoder(dng_stream * stream,dng_spooler * spooler,bool bug16)498 dng_lossless_decoder::dng_lossless_decoder (dng_stream *stream,
499 									        dng_spooler *spooler,
500 									        bool bug16)
501 
502 	:	fStream  (stream )
503 	,	fSpooler (spooler)
504 	,	fBug16   (bug16  )
505 
506 	,	compInfoBuffer ()
507 	,	info           ()
508 	,	mcuBuffer1     ()
509 	,	mcuBuffer2     ()
510 	,	mcuBuffer3     ()
511 	,	mcuBuffer4     ()
512 	,	mcuROW1		   (NULL)
513 	,	mcuROW2		   (NULL)
514 	,	getBuffer      (0)
515 	,	bitsLeft	   (0)
516 
517 	#if qSupportHasselblad_3FR
518 	,	fHasselblad3FR (false)
519 	#endif
520 
521 	{
522 
523 	memset (&info, 0, sizeof (info));
524 
525 	}
526 
527 /*****************************************************************************/
528 
Get2bytes()529 uint16 dng_lossless_decoder::Get2bytes ()
530 	{
531 
532     uint16 a = GetJpegChar ();
533 
534     return (uint16) ((a << 8) + GetJpegChar ());
535 
536 	}
537 
538 /*****************************************************************************/
539 
540 /*
541  *--------------------------------------------------------------
542  *
543  * SkipVariable --
544  *
545  *	Skip over an unknown or uninteresting variable-length marker
546  *
547  * Results:
548  *	None.
549  *
550  * Side effects:
551  *	Bitstream is parsed over marker.
552  *
553  *
554  *--------------------------------------------------------------
555  */
556 
SkipVariable()557 void dng_lossless_decoder::SkipVariable ()
558 	{
559 
560     uint32 length = Get2bytes () - 2;
561 
562     fStream->Skip (length);
563 
564 	}
565 
566 /*****************************************************************************/
567 
568 /*
569  *--------------------------------------------------------------
570  *
571  * GetDht --
572  *
573  *	Process a DHT marker
574  *
575  * Results:
576  *	None
577  *
578  * Side effects:
579  *	A huffman table is read.
580  *	Exits on error.
581  *
582  *--------------------------------------------------------------
583  */
584 
GetDht()585 void dng_lossless_decoder::GetDht ()
586 	{
587 
588     int32 length = Get2bytes () - 2;
589 
590     while (length > 0)
591     	{
592 
593 		int32 index = GetJpegChar ();
594 
595 		if (index < 0 || index >= 4)
596 			{
597 		    ThrowBadFormat ();
598 			}
599 
600 		HuffmanTable *&htblptr = info.dcHuffTblPtrs [index];
601 
602 		if (htblptr == NULL)
603 			{
604 
605 			huffmanBuffer [index] . Allocate (sizeof (HuffmanTable));
606 
607 		    htblptr = (HuffmanTable *) huffmanBuffer [index] . Buffer ();
608 
609 			}
610 
611 		htblptr->bits [0] = 0;
612 
613 	    int32 count = 0;
614 
615 		for (int32 i = 1; i <= 16; i++)
616 			{
617 
618 		    htblptr->bits [i] = GetJpegChar ();
619 
620 		    count += htblptr->bits [i];
621 
622 			}
623 
624 		if (count > 256)
625 			{
626 		    ThrowBadFormat ();
627 			}
628 
629 		for (int32 j = 0; j < count; j++)
630 			{
631 
632 		    htblptr->huffval [j] = GetJpegChar ();
633 
634 		    }
635 
636 		length -= 1 + 16 + count;
637 
638 	    }
639 
640 	}
641 
642 /*****************************************************************************/
643 
644 /*
645  *--------------------------------------------------------------
646  *
647  * GetDri --
648  *
649  *	Process a DRI marker
650  *
651  * Results:
652  *	None
653  *
654  * Side effects:
655  *	Exits on error.
656  *	Bitstream is parsed.
657  *
658  *--------------------------------------------------------------
659  */
660 
GetDri()661 void dng_lossless_decoder::GetDri ()
662 	{
663 
664     if (Get2bytes () != 4)
665     	{
666 		ThrowBadFormat ();
667 		}
668 
669     info.restartInterval = Get2bytes ();
670 
671 	}
672 
673 /*****************************************************************************/
674 
675 /*
676  *--------------------------------------------------------------
677  *
678  * GetApp0 --
679  *
680  *	Process an APP0 marker.
681  *
682  * Results:
683  *	None
684  *
685  * Side effects:
686  *	Bitstream is parsed
687  *
688  *--------------------------------------------------------------
689  */
690 
GetApp0()691 void dng_lossless_decoder::GetApp0 ()
692 	{
693 
694 	SkipVariable ();
695 
696 	}
697 
698 /*****************************************************************************/
699 
700 /*
701  *--------------------------------------------------------------
702  *
703  * GetSof --
704  *
705  *	Process a SOFn marker
706  *
707  * Results:
708  *	None.
709  *
710  * Side effects:
711  *	Bitstream is parsed
712  *	Exits on error
713  *	info structure is filled in
714  *
715  *--------------------------------------------------------------
716  */
717 
GetSof(int32)718 void dng_lossless_decoder::GetSof (int32 /*code*/)
719 	{
720 
721     int32 length = Get2bytes ();
722 
723     info.dataPrecision = GetJpegChar ();
724     info.imageHeight   = Get2bytes   ();
725     info.imageWidth    = Get2bytes   ();
726     info.numComponents = GetJpegChar ();
727 
728     // We don't support files in which the image height is initially
729     // specified as 0 and is later redefined by DNL.  As long as we
730     // have to check that, might as well have a general sanity check.
731 
732     if ((info.imageHeight   <= 0) ||
733 		(info.imageWidth    <= 0) ||
734 		(info.numComponents <= 0))
735 		{
736 		ThrowBadFormat ();
737     	}
738 
739 	// Lossless JPEG specifies data precision to be from 2 to 16 bits/sample.
740 
741 	const int32 MinPrecisionBits = 2;
742 	const int32 MaxPrecisionBits = 16;
743 
744     if ((info.dataPrecision < MinPrecisionBits) ||
745         (info.dataPrecision > MaxPrecisionBits))
746         {
747 		ThrowBadFormat ();
748     	}
749 
750     // Check length of tag.
751 
752     if (length != (info.numComponents * 3 + 8))
753     	{
754 		ThrowBadFormat ();
755     	}
756 
757     // Allocate per component info.
758 
759     // We can cast info.numComponents to a uint32 because the check above
760     // guarantees that it cannot be negative.
761     compInfoBuffer.Allocate (static_cast<uint32> (info.numComponents),
762                              sizeof (JpegComponentInfo));
763 
764     info.compInfo = (JpegComponentInfo *) compInfoBuffer.Buffer ();
765 
766     // Read in the per compent info.
767 
768     for (int32 ci = 0; ci < info.numComponents; ci++)
769     	{
770 
771    		JpegComponentInfo *compptr = &info.compInfo [ci];
772 
773 		compptr->componentIndex = (int16) ci;
774 
775 		compptr->componentId = GetJpegChar ();
776 
777     	int32 c = GetJpegChar ();
778 
779 		compptr->hSampFactor = (int16) ((c >> 4) & 15);
780 		compptr->vSampFactor = (int16) ((c     ) & 15);
781 
782         (void) GetJpegChar ();   /* skip Tq */
783 
784     	}
785 
786 	}
787 
788 /*****************************************************************************/
789 
790 /*
791  *--------------------------------------------------------------
792  *
793  * GetSos --
794  *
795  *	Process a SOS marker
796  *
797  * Results:
798  *	None.
799  *
800  * Side effects:
801  *	Bitstream is parsed.
802  *	Exits on error.
803  *
804  *--------------------------------------------------------------
805  */
806 
GetSos()807 void dng_lossless_decoder::GetSos ()
808 	{
809 
810     int32 length = Get2bytes ();
811 
812     // Get the number of image components.
813 
814     int32 n = GetJpegChar ();
815     info.compsInScan = (int16) n;
816 
817     // Check length.
818 
819     length -= 3;
820 
821     if (length != (n * 2 + 3) || n < 1 || n > 4)
822     	{
823 		ThrowBadFormat ();
824 		}
825 
826 	// Find index and huffman table for each component.
827 
828     for (int32 i = 0; i < n; i++)
829     	{
830 
831  		int32 cc = GetJpegChar ();
832 		int32 c  = GetJpegChar ();
833 
834  		int32 ci;
835 
836 		for (ci = 0; ci < info.numComponents; ci++)
837 			{
838 
839 		    if (cc == info.compInfo[ci].componentId)
840 		    	{
841 				break;
842 		    	}
843 
844 		    }
845 
846 		if (ci >= info.numComponents)
847 			{
848 		    ThrowBadFormat ();
849 			}
850 
851     	JpegComponentInfo *compptr = &info.compInfo [ci];
852 
853 		info.curCompInfo [i] = compptr;
854 
855 		compptr->dcTblNo = (int16) ((c >> 4) & 15);
856 
857 	    }
858 
859     // Get the PSV, skip Se, and get the point transform parameter.
860 
861     info.Ss = GetJpegChar ();
862 
863     (void) GetJpegChar ();
864 
865     info.Pt = GetJpegChar () & 0x0F;
866 
867 	}
868 
869 /*****************************************************************************/
870 
871 /*
872  *--------------------------------------------------------------
873  *
874  * GetSoi --
875  *
876  *	Process an SOI marker
877  *
878  * Results:
879  *	None.
880  *
881  * Side effects:
882  *	Bitstream is parsed.
883  *	Exits on error.
884  *
885  *--------------------------------------------------------------
886  */
887 
GetSoi()888 void dng_lossless_decoder::GetSoi ()
889 	{
890 
891     // Reset all parameters that are defined to be reset by SOI
892 
893     info.restartInterval = 0;
894 
895 	}
896 
897 /*****************************************************************************/
898 
899 /*
900  *--------------------------------------------------------------
901  *
902  * NextMarker --
903  *
904  *      Find the next JPEG marker Note that the output might not
905  *	be a valid marker code but it will never be 0 or FF
906  *
907  * Results:
908  *	The marker found.
909  *
910  * Side effects:
911  *	Bitstream is parsed.
912  *
913  *--------------------------------------------------------------
914  */
915 
NextMarker()916 int32 dng_lossless_decoder::NextMarker ()
917 	{
918 
919     int32 c;
920 
921     do
922     	{
923 
924 		// skip any non-FF bytes
925 
926 		do
927 			{
928 	   		c = GetJpegChar ();
929 			}
930 		while (c != 0xFF);
931 
932 		// skip any duplicate FFs, since extra FFs are legal
933 
934 		do
935 			{
936 			c = GetJpegChar();
937 			}
938 		while (c == 0xFF);
939 
940 		}
941 	while (c == 0);		// repeat if it was a stuffed FF/00
942 
943     return c;
944 
945 	}
946 
947 /*****************************************************************************/
948 
949 /*
950  *--------------------------------------------------------------
951  *
952  * ProcessTables --
953  *
954  *	Scan and process JPEG markers that can appear in any order
955  *	Return when an SOI, EOI, SOFn, or SOS is found
956  *
957  * Results:
958  *	The marker found.
959  *
960  * Side effects:
961  *	Bitstream is parsed.
962  *
963  *--------------------------------------------------------------
964  */
965 
ProcessTables()966 JpegMarker dng_lossless_decoder::ProcessTables ()
967 	{
968 
969     while (true)
970     	{
971 
972 		int32 c = NextMarker ();
973 
974 		switch (c)
975 			{
976 
977 			case M_SOF0:
978 			case M_SOF1:
979 			case M_SOF2:
980 			case M_SOF3:
981 			case M_SOF5:
982 			case M_SOF6:
983 			case M_SOF7:
984 			case M_JPG:
985 			case M_SOF9:
986 			case M_SOF10:
987 			case M_SOF11:
988 			case M_SOF13:
989 			case M_SOF14:
990 			case M_SOF15:
991 			case M_SOI:
992 			case M_EOI:
993 			case M_SOS:
994 			    return (JpegMarker) c;
995 
996 			case M_DHT:
997 			    GetDht ();
998 			    break;
999 
1000 			case M_DQT:
1001 			    break;
1002 
1003 			case M_DRI:
1004 			    GetDri ();
1005 			    break;
1006 
1007 			case M_APP0:
1008 			    GetApp0 ();
1009 			    break;
1010 
1011 			case M_RST0:	// these are all parameterless
1012 			case M_RST1:
1013 			case M_RST2:
1014 			case M_RST3:
1015 			case M_RST4:
1016 			case M_RST5:
1017 			case M_RST6:
1018 			case M_RST7:
1019 			case M_TEM:
1020 			    break;
1021 
1022 			default:		// must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn
1023 			    SkipVariable ();
1024 			    break;
1025 
1026 			}
1027 
1028     	}
1029 
1030     	return M_ERROR;
1031 	}
1032 
1033 /*****************************************************************************/
1034 
1035 /*
1036  *--------------------------------------------------------------
1037  *
1038  * ReadFileHeader --
1039  *
1040  *	Initialize and read the stream header (everything through
1041  *	the SOF marker).
1042  *
1043  * Results:
1044  *	None
1045  *
1046  * Side effects:
1047  *	Exit on error.
1048  *
1049  *--------------------------------------------------------------
1050  */
1051 
ReadFileHeader()1052 void dng_lossless_decoder::ReadFileHeader ()
1053 	{
1054 
1055     // Demand an SOI marker at the start of the stream --- otherwise it's
1056     // probably not a JPEG stream at all.
1057 
1058     int32 c  = GetJpegChar ();
1059     int32 c2 = GetJpegChar ();
1060 
1061     if ((c != 0xFF) || (c2 != M_SOI))
1062     	{
1063 		ThrowBadFormat ();
1064     	}
1065 
1066     // OK, process SOI
1067 
1068     GetSoi ();
1069 
1070     // Process markers until SOF
1071 
1072     c = ProcessTables ();
1073 
1074     switch (c)
1075     	{
1076 
1077 		case M_SOF0:
1078 		case M_SOF1:
1079 		case M_SOF3:
1080 			GetSof (c);
1081 			break;
1082 
1083     	default:
1084 			ThrowBadFormat ();
1085 			break;
1086 
1087     	}
1088 
1089 	}
1090 
1091 /*****************************************************************************/
1092 
1093 /*
1094  *--------------------------------------------------------------
1095  *
1096  * ReadScanHeader --
1097  *
1098  *	Read the start of a scan (everything through the SOS marker).
1099  *
1100  * Results:
1101  *	1 if find SOS, 0 if find EOI
1102  *
1103  * Side effects:
1104  *	Bitstream is parsed, may exit on errors.
1105  *
1106  *--------------------------------------------------------------
1107  */
1108 
ReadScanHeader()1109 int32 dng_lossless_decoder::ReadScanHeader ()
1110 	{
1111 
1112     // Process markers until SOS or EOI
1113 
1114     int32 c = ProcessTables ();
1115 
1116     switch (c)
1117     	{
1118 
1119 		case M_SOS:
1120 			GetSos ();
1121 			return 1;
1122 
1123     	case M_EOI:
1124 			return 0;
1125 
1126     	default:
1127 			ThrowBadFormat ();
1128 			break;
1129 
1130     	}
1131 
1132     return 0;
1133 
1134 	}
1135 
1136 /*****************************************************************************/
1137 
1138 /*
1139  *--------------------------------------------------------------
1140  *
1141  * DecoderStructInit --
1142  *
1143  *	Initalize the rest of the fields in the decompression
1144  *	structure.
1145  *
1146  * Results:
1147  *	None.
1148  *
1149  * Side effects:
1150  *	None.
1151  *
1152  *--------------------------------------------------------------
1153  */
1154 
DecoderStructInit()1155 void dng_lossless_decoder::DecoderStructInit ()
1156 	{
1157 
1158 	int32 ci;
1159 
1160 	#if qSupportCanon_sRAW
1161 
1162 	bool canon_sRAW = (info.numComponents == 3) &&
1163 					  (info.compInfo [0].hSampFactor == 2) &&
1164 					  (info.compInfo [1].hSampFactor == 1) &&
1165 					  (info.compInfo [2].hSampFactor == 1) &&
1166 					  (info.compInfo [0].vSampFactor == 1) &&
1167 					  (info.compInfo [1].vSampFactor == 1) &&
1168 					  (info.compInfo [2].vSampFactor == 1) &&
1169 					  (info.dataPrecision == 15) &&
1170 					  (info.Ss == 1) &&
1171 					  ((info.imageWidth & 1) == 0);
1172 
1173 	bool canon_sRAW2 = (info.numComponents == 3) &&
1174 					   (info.compInfo [0].hSampFactor == 2) &&
1175 					   (info.compInfo [1].hSampFactor == 1) &&
1176 					   (info.compInfo [2].hSampFactor == 1) &&
1177 					   (info.compInfo [0].vSampFactor == 2) &&
1178 					   (info.compInfo [1].vSampFactor == 1) &&
1179 					   (info.compInfo [2].vSampFactor == 1) &&
1180 					   (info.dataPrecision == 15) &&
1181 					   (info.Ss == 1) &&
1182 					   ((info.imageWidth  & 1) == 0) &&
1183 					   ((info.imageHeight & 1) == 0);
1184 
1185 	if (!canon_sRAW && !canon_sRAW2)
1186 
1187 	#endif
1188 
1189 		{
1190 
1191 		// Check sampling factor validity.
1192 
1193 		for (ci = 0; ci < info.numComponents; ci++)
1194 			{
1195 
1196 			JpegComponentInfo *compPtr = &info.compInfo [ci];
1197 
1198 			if (compPtr->hSampFactor != 1 ||
1199 				compPtr->vSampFactor != 1)
1200 				{
1201 				ThrowBadFormat ();
1202 				}
1203 
1204 			}
1205 
1206 		}
1207 
1208     // Prepare array describing MCU composition.
1209 
1210 	if (info.compsInScan < 0 || info.compsInScan > 4)
1211 		{
1212     	ThrowBadFormat ();
1213 		}
1214 
1215 	for (ci = 0; ci < info.compsInScan; ci++)
1216 		{
1217         info.MCUmembership [ci] = (int16) ci;
1218 		}
1219 
1220 	// Initialize mucROW1 and mcuROW2 which buffer two rows of
1221     // pixels for predictor calculation.
1222 
1223 	// This multiplication cannot overflow because info.compsInScan is
1224 	// guaranteed to be between 0 and 4 inclusive (see checks above).
1225 	int32 mcuSize = info.compsInScan * (uint32) sizeof (ComponentType);
1226 
1227 	mcuBuffer1.Allocate (info.imageWidth, sizeof (MCU));
1228 	mcuBuffer2.Allocate (info.imageWidth, sizeof (MCU));
1229 
1230 	mcuROW1 = (MCU *) mcuBuffer1.Buffer ();
1231 	mcuROW2 = (MCU *) mcuBuffer2.Buffer ();
1232 
1233 	mcuBuffer3.Allocate (info.imageWidth, mcuSize);
1234 	mcuBuffer4.Allocate (info.imageWidth, mcuSize);
1235 
1236  	mcuROW1 [0] = (ComponentType *) mcuBuffer3.Buffer ();
1237  	mcuROW2 [0] = (ComponentType *) mcuBuffer4.Buffer ();
1238 
1239  	for (int32 j = 1; j < info.imageWidth; j++)
1240  		{
1241 
1242  		mcuROW1 [j] = mcuROW1 [j - 1] + info.compsInScan;
1243  		mcuROW2 [j] = mcuROW2 [j - 1] + info.compsInScan;
1244 
1245  		}
1246 
1247 	}
1248 
1249 /*****************************************************************************/
1250 
1251 /*
1252  *--------------------------------------------------------------
1253  *
1254  * HuffDecoderInit --
1255  *
1256  *	Initialize for a Huffman-compressed scan.
1257  *	This is invoked after reading the SOS marker.
1258  *
1259  * Results:
1260  *	None
1261  *
1262  * Side effects:
1263  *	None.
1264  *
1265  *--------------------------------------------------------------
1266  */
1267 
HuffDecoderInit()1268 void dng_lossless_decoder::HuffDecoderInit ()
1269 	{
1270 
1271     // Initialize bit parser state
1272 
1273  	getBuffer = 0;
1274     bitsLeft  = 0;
1275 
1276     // Prepare Huffman tables.
1277 
1278     for (int16 ci = 0; ci < info.compsInScan; ci++)
1279     	{
1280 
1281 		JpegComponentInfo *compptr = info.curCompInfo [ci];
1282 
1283 		// Make sure requested tables are present
1284 
1285 		if (compptr->dcTblNo < 0 || compptr->dcTblNo > 3)
1286 			{
1287 			ThrowBadFormat ();
1288 			}
1289 
1290 		if (info.dcHuffTblPtrs [compptr->dcTblNo] == NULL)
1291 			{
1292 	    	ThrowBadFormat ();
1293 			}
1294 
1295 		// Compute derived values for Huffman tables.
1296 		// We may do this more than once for same table, but it's not a
1297 		// big deal
1298 
1299 		FixHuffTbl (info.dcHuffTblPtrs [compptr->dcTblNo]);
1300 
1301 	    }
1302 
1303    	// Initialize restart stuff
1304 
1305 	info.restartInRows   = info.restartInterval / info.imageWidth;
1306     info.restartRowsToGo = info.restartInRows;
1307     info.nextRestartNum  = 0;
1308 
1309 	}
1310 
1311 /*****************************************************************************/
1312 
1313 /*
1314  *--------------------------------------------------------------
1315  *
1316  * ProcessRestart --
1317  *
1318  *	Check for a restart marker & resynchronize decoder.
1319  *
1320  * Results:
1321  *	None.
1322  *
1323  * Side effects:
1324  *	BitStream is parsed, bit buffer is reset, etc.
1325  *
1326  *--------------------------------------------------------------
1327  */
1328 
ProcessRestart()1329 void dng_lossless_decoder::ProcessRestart ()
1330 	{
1331 
1332 	// Throw away and unused odd bits in the bit buffer.
1333 
1334 	fStream->SetReadPosition (fStream->Position () - bitsLeft / 8);
1335 
1336 	bitsLeft  = 0;
1337 	getBuffer = 0;
1338 
1339    	// Scan for next JPEG marker
1340 
1341     int32 c;
1342 
1343     do
1344     	{
1345 
1346 		// skip any non-FF bytes
1347 
1348 		do
1349 			{
1350 	    	c = GetJpegChar ();
1351 			}
1352 		while (c != 0xFF);
1353 
1354 		// skip any duplicate FFs
1355 
1356 		do
1357 			{
1358 			c = GetJpegChar ();
1359 			}
1360 		while (c == 0xFF);
1361 
1362     	}
1363     while (c == 0);		// repeat if it was a stuffed FF/00
1364 
1365     // Verify correct restart code.
1366 
1367     if (c != (M_RST0 + info.nextRestartNum))
1368     	{
1369 		ThrowBadFormat ();
1370     	}
1371 
1372     // Update restart state.
1373 
1374     info.restartRowsToGo = info.restartInRows;
1375     info.nextRestartNum  = (info.nextRestartNum + 1) & 7;
1376 
1377 	}
1378 
1379 /*****************************************************************************/
1380 
1381 /*
1382  *--------------------------------------------------------------
1383  *
1384  * QuickPredict --
1385  *
1386  *      Calculate the predictor for sample curRowBuf[col][curComp].
1387  *	It does not handle the special cases at image edges, such
1388  *      as first row and first column of a scan. We put the special
1389  *	case checkings outside so that the computations in main
1390  *	loop can be simpler. This has enhenced the performance
1391  *	significantly.
1392  *
1393  * Results:
1394  *      predictor is passed out.
1395  *
1396  * Side effects:
1397  *      None.
1398  *
1399  *--------------------------------------------------------------
1400  */
1401 
QuickPredict(int32 col,int32 curComp,MCU * curRowBuf,MCU * prevRowBuf)1402 inline int32 dng_lossless_decoder::QuickPredict (int32 col,
1403 						 				         int32 curComp,
1404 						 				         MCU *curRowBuf,
1405 						 				         MCU *prevRowBuf)
1406 	{
1407 
1408     int32 diag  = prevRowBuf [col - 1] [curComp];
1409     int32 upper = prevRowBuf [col    ] [curComp];
1410     int32 left  = curRowBuf  [col - 1] [curComp];
1411 
1412     switch (info.Ss)
1413     	{
1414 
1415 		case 0:
1416 			return 0;
1417 
1418 		case 1:
1419 			return left;
1420 
1421 		case 2:
1422 			return upper;
1423 
1424 		case 3:
1425 			return diag;
1426 
1427 		case 4:
1428 			return left + upper - diag;
1429 
1430 		case 5:
1431 			return left + ((upper - diag) >> 1);
1432 
1433 		case 6:
1434        		return upper + ((left - diag) >> 1);
1435 
1436 		case 7:
1437             return (left + upper) >> 1;
1438 
1439 		default:
1440 			{
1441 			ThrowBadFormat ();
1442             return 0;
1443             }
1444 
1445      	}
1446 
1447 	}
1448 
1449 /*****************************************************************************/
1450 
1451 /*
1452  *--------------------------------------------------------------
1453  *
1454  * FillBitBuffer --
1455  *
1456  *	Load up the bit buffer with at least nbits
1457  *	Process any stuffed bytes at this time.
1458  *
1459  * Results:
1460  *	None
1461  *
1462  * Side effects:
1463  *	The bitwise global variables are updated.
1464  *
1465  *--------------------------------------------------------------
1466  */
1467 
FillBitBuffer(int32 nbits)1468 inline void dng_lossless_decoder::FillBitBuffer (int32 nbits)
1469 	{
1470 
1471 	const int32 kMinGetBits = sizeof (uint32) * 8 - 7;
1472 
1473 	#if qSupportHasselblad_3FR
1474 
1475 	if (fHasselblad3FR)
1476 		{
1477 
1478 		while (bitsLeft < kMinGetBits)
1479 			{
1480 
1481 			int32 c0 = GetJpegChar ();
1482 			int32 c1 = GetJpegChar ();
1483 			int32 c2 = GetJpegChar ();
1484 			int32 c3 = GetJpegChar ();
1485 
1486 			getBuffer = (getBuffer << 8) | c3;
1487 			getBuffer = (getBuffer << 8) | c2;
1488 			getBuffer = (getBuffer << 8) | c1;
1489 			getBuffer = (getBuffer << 8) | c0;
1490 
1491 			bitsLeft += 32;
1492 
1493 			}
1494 
1495 		return;
1496 
1497 		}
1498 
1499 	#endif
1500 
1501     while (bitsLeft < kMinGetBits)
1502     	{
1503 
1504 		int32 c = GetJpegChar ();
1505 
1506 		// If it's 0xFF, check and discard stuffed zero byte
1507 
1508 		if (c == 0xFF)
1509 			{
1510 
1511 			int32 c2 = GetJpegChar ();
1512 
1513 	    	if (c2 != 0)
1514 	    		{
1515 
1516 				// Oops, it's actually a marker indicating end of
1517 				// compressed data.  Better put it back for use later.
1518 
1519 				UnGetJpegChar ();
1520 				UnGetJpegChar ();
1521 
1522 				// There should be enough bits still left in the data
1523 				// segment; if so, just break out of the while loop.
1524 
1525 				if (bitsLeft >= nbits)
1526 				    break;
1527 
1528 				// Uh-oh.  Corrupted data: stuff zeroes into the data
1529 				// stream, since this sometimes occurs when we are on the
1530 				// last show_bits8 during decoding of the Huffman
1531 				// segment.
1532 
1533 				c = 0;
1534 
1535 	    		}
1536 
1537 			}
1538 
1539 		getBuffer = (getBuffer << 8) | c;
1540 
1541 		bitsLeft += 8;
1542 
1543    		}
1544 
1545 	}
1546 
1547 /*****************************************************************************/
1548 
show_bits8()1549 inline int32 dng_lossless_decoder::show_bits8 ()
1550 	{
1551 
1552 	if (bitsLeft < 8)
1553 		FillBitBuffer (8);
1554 
1555 	return (int32) ((getBuffer >> (bitsLeft - 8)) & 0xff);
1556 
1557 	}
1558 
1559 /*****************************************************************************/
1560 
flush_bits(int32 nbits)1561 inline void dng_lossless_decoder::flush_bits (int32 nbits)
1562 	{
1563 
1564 	bitsLeft -= nbits;
1565 
1566 	}
1567 
1568 /*****************************************************************************/
1569 
get_bits(int32 nbits)1570 inline int32 dng_lossless_decoder::get_bits (int32 nbits)
1571 	{
1572 
1573 	if (nbits > 16)
1574 		{
1575 		ThrowBadFormat ();
1576 		}
1577 
1578 	if (bitsLeft < nbits)
1579 		FillBitBuffer (nbits);
1580 
1581 	return (int32) ((getBuffer >> (bitsLeft -= nbits)) & (0x0FFFF >> (16 - nbits)));
1582 
1583 	}
1584 
1585 /*****************************************************************************/
1586 
get_bit()1587 inline int32 dng_lossless_decoder::get_bit ()
1588 	{
1589 
1590 	if (!bitsLeft)
1591 		FillBitBuffer (1);
1592 
1593 	return (int32) ((getBuffer >> (--bitsLeft)) & 1);
1594 
1595 	}
1596 
1597 /*****************************************************************************/
1598 
1599 /*
1600  *--------------------------------------------------------------
1601  *
1602  * HuffDecode --
1603  *
1604  *	Taken from Figure F.16: extract next coded symbol from
1605  *	input stream.  This should becode a macro.
1606  *
1607  * Results:
1608  *	Next coded symbol
1609  *
1610  * Side effects:
1611  *	Bitstream is parsed.
1612  *
1613  *--------------------------------------------------------------
1614  */
1615 
HuffDecode(HuffmanTable * htbl)1616 inline int32 dng_lossless_decoder::HuffDecode (HuffmanTable *htbl)
1617 	{
1618 
1619     // If the huffman code is less than 8 bits, we can use the fast
1620     // table lookup to get its value.  It's more than 8 bits about
1621     // 3-4% of the time.
1622 
1623     int32 code = show_bits8 ();
1624 
1625     if (htbl->numbits [code])
1626     	{
1627 
1628 		flush_bits (htbl->numbits [code]);
1629 
1630 		return htbl->value [code];
1631 
1632     	}
1633 
1634     else
1635     	{
1636 
1637 		flush_bits (8);
1638 
1639 		int32 l = 8;
1640 
1641 		while (code > htbl->maxcode [l])
1642 			{
1643 	    	code = (code << 1) | get_bit ();
1644 	    	l++;
1645 			}
1646 
1647 		// With garbage input we may reach the sentinel value l = 17.
1648 
1649 		if (l > 16)
1650 			{
1651 	    	return 0;		// fake a zero as the safest result
1652 			}
1653 		else
1654 			{
1655 	    	return htbl->huffval [htbl->valptr [l] +
1656 	    						  ((int32) (code - htbl->mincode [l]))];
1657 			}
1658 
1659    		}
1660 
1661 	}
1662 
1663 /*****************************************************************************/
1664 
1665 /*
1666  *--------------------------------------------------------------
1667  *
1668  * HuffExtend --
1669  *
1670  *	Code and table for Figure F.12: extend sign bit
1671  *
1672  * Results:
1673  *	The extended value.
1674  *
1675  * Side effects:
1676  *	None.
1677  *
1678  *--------------------------------------------------------------
1679  */
1680 
HuffExtend(int32 & x,int32 s)1681 inline void dng_lossless_decoder::HuffExtend (int32 &x, int32 s)
1682 	{
1683 
1684 	if (x < (0x08000 >> (16 - s)))
1685 		{
1686 		x += -(1 << s) + 1;
1687 		}
1688 
1689 	}
1690 
1691 /*****************************************************************************/
1692 
1693 // Called from DecodeImage () to write one row.
1694 
PmPutRow(MCU * buf,int32 numComp,int32 numCol,int32)1695 void dng_lossless_decoder::PmPutRow (MCU *buf,
1696 								     int32 numComp,
1697 								     int32 numCol,
1698 								     int32 /* row */)
1699 	{
1700 
1701 	uint16 *sPtr = &buf [0] [0];
1702 
1703 	uint32 pixels = numCol * numComp;
1704 
1705 	fSpooler->Spool (sPtr, pixels * (uint32) sizeof (uint16));
1706 
1707 	}
1708 
1709 /*****************************************************************************/
1710 
1711 /*
1712  *--------------------------------------------------------------
1713  *
1714  * DecodeFirstRow --
1715  *
1716  *	Decode the first raster line of samples at the start of
1717  *      the scan and at the beginning of each restart interval.
1718  *	This includes modifying the component value so the real
1719  *      value, not the difference is returned.
1720  *
1721  * Results:
1722  *	None.
1723  *
1724  * Side effects:
1725  *	Bitstream is parsed.
1726  *
1727  *--------------------------------------------------------------
1728  */
1729 
DecodeFirstRow(MCU * curRowBuf)1730 void dng_lossless_decoder::DecodeFirstRow (MCU *curRowBuf)
1731 	{
1732 
1733     int32 compsInScan = info.compsInScan;
1734 
1735     // Process the first column in the row.
1736 
1737     for (int32 curComp = 0; curComp < compsInScan; curComp++)
1738     	{
1739 
1740         int32 ci = info.MCUmembership [curComp];
1741 
1742         JpegComponentInfo *compptr = info.curCompInfo [ci];
1743 
1744         HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];
1745 
1746         // Section F.2.2.1: decode the difference
1747 
1748   		int32 d = 0;
1749 
1750         int32 s = HuffDecode (dctbl);
1751 
1752       	if (s)
1753       		{
1754 
1755       		if (s == 16 && !fBug16)
1756       			{
1757       			d = -32768;
1758       			}
1759 
1760       		else
1761       			{
1762 				d = get_bits (s);
1763             	HuffExtend (d, s);
1764             	}
1765 
1766             }
1767 
1768 		// Add the predictor to the difference.
1769 
1770 	    int32 Pr = info.dataPrecision;
1771 	    int32 Pt = info.Pt;
1772 
1773         curRowBuf [0] [curComp] = (ComponentType) (d + (1 << (Pr-Pt-1)));
1774 
1775     	}
1776 
1777     // Process the rest of the row.
1778 
1779     int32 numCOL = info.imageWidth;
1780 
1781     for (int32 col = 1; col < numCOL; col++)
1782     	{
1783 
1784         for (int32 curComp = 0; curComp < compsInScan; curComp++)
1785         	{
1786 
1787             int32 ci = info.MCUmembership [curComp];
1788 
1789             JpegComponentInfo *compptr = info.curCompInfo [ci];
1790 
1791             HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];
1792 
1793 			// Section F.2.2.1: decode the difference
1794 
1795 	  		int32 d = 0;
1796 
1797 	        int32 s = HuffDecode (dctbl);
1798 
1799 	      	if (s)
1800 	      		{
1801 
1802 	      		if (s == 16 && !fBug16)
1803 	      			{
1804 	      			d = -32768;
1805 	      			}
1806 
1807 	      		else
1808 	      			{
1809 					d = get_bits (s);
1810 	            	HuffExtend (d, s);
1811 	            	}
1812 
1813 	            }
1814 
1815 			// Add the predictor to the difference.
1816 
1817             curRowBuf [col] [curComp] = (ComponentType) (d + curRowBuf [col-1] [curComp]);
1818 
1819        		}
1820 
1821     	}
1822 
1823     // Update the restart counter
1824 
1825     if (info.restartInRows)
1826     	{
1827        	info.restartRowsToGo--;
1828     	}
1829 
1830 	}
1831 
1832 /*****************************************************************************/
1833 
1834 /*
1835  *--------------------------------------------------------------
1836  *
1837  * DecodeImage --
1838  *
1839  *      Decode the input stream. This includes modifying
1840  *      the component value so the real value, not the
1841  *      difference is returned.
1842  *
1843  * Results:
1844  *      None.
1845  *
1846  * Side effects:
1847  *      Bitstream is parsed.
1848  *
1849  *--------------------------------------------------------------
1850  */
1851 
DecodeImage()1852 void dng_lossless_decoder::DecodeImage ()
1853 	{
1854 
1855 	#define swap(type,a,b) {type c; c=(a); (a)=(b); (b)=c;}
1856 
1857     int32 numCOL      = info.imageWidth;
1858     int32 numROW	  = info.imageHeight;
1859     int32 compsInScan = info.compsInScan;
1860 
1861     // Precompute the decoding table for each table.
1862 
1863     HuffmanTable *ht [4];
1864 
1865 	for (int32 curComp = 0; curComp < compsInScan; curComp++)
1866     	{
1867 
1868         int32 ci = info.MCUmembership [curComp];
1869 
1870         JpegComponentInfo *compptr = info.curCompInfo [ci];
1871 
1872         ht [curComp] = info.dcHuffTblPtrs [compptr->dcTblNo];
1873 
1874    		}
1875 
1876 	MCU *prevRowBuf = mcuROW1;
1877 	MCU *curRowBuf  = mcuROW2;
1878 
1879 	#if qSupportCanon_sRAW
1880 
1881 	// Canon sRAW support
1882 
1883 	if (info.compInfo [0].hSampFactor == 2 &&
1884 		info.compInfo [0].vSampFactor == 1)
1885 		{
1886 
1887 		for (int32 row = 0; row < numROW; row++)
1888 			{
1889 
1890 			// Initialize predictors.
1891 
1892 			int32 p0;
1893 			int32 p1;
1894 			int32 p2;
1895 
1896 			if (row == 0)
1897 				{
1898 				p0 = 1 << 14;
1899 				p1 = 1 << 14;
1900 				p2 = 1 << 14;
1901 				}
1902 
1903 			else
1904 				{
1905 				p0 = prevRowBuf [0] [0];
1906 				p1 = prevRowBuf [0] [1];
1907 				p2 = prevRowBuf [0] [2];
1908 				}
1909 
1910 			for (int32 col = 0; col < numCOL; col += 2)
1911 				{
1912 
1913 				// Read first luminance component.
1914 
1915 					{
1916 
1917 					int32 d = 0;
1918 
1919 					int32 s = HuffDecode (ht [0]);
1920 
1921 					if (s)
1922 						{
1923 
1924 						if (s == 16)
1925 							{
1926 							d = -32768;
1927 							}
1928 
1929 						else
1930 							{
1931 							d = get_bits (s);
1932 							HuffExtend (d, s);
1933 							}
1934 
1935 						}
1936 
1937 					p0 += d;
1938 
1939 					curRowBuf [col] [0] = (ComponentType) p0;
1940 
1941 					}
1942 
1943 				// Read second luminance component.
1944 
1945 					{
1946 
1947 					int32 d = 0;
1948 
1949 					int32 s = HuffDecode (ht [0]);
1950 
1951 					if (s)
1952 						{
1953 
1954 						if (s == 16)
1955 							{
1956 							d = -32768;
1957 							}
1958 
1959 						else
1960 							{
1961 							d = get_bits (s);
1962 							HuffExtend (d, s);
1963 							}
1964 
1965 						}
1966 
1967 					p0 += d;
1968 
1969 					curRowBuf [col + 1] [0] = (ComponentType) p0;
1970 
1971 					}
1972 
1973 				// Read first chroma component.
1974 
1975 					{
1976 
1977 					int32 d = 0;
1978 
1979 					int32 s = HuffDecode (ht [1]);
1980 
1981 					if (s)
1982 						{
1983 
1984 						if (s == 16)
1985 							{
1986 							d = -32768;
1987 							}
1988 
1989 						else
1990 							{
1991 							d = get_bits (s);
1992 							HuffExtend (d, s);
1993 							}
1994 
1995 						}
1996 
1997 					p1 += d;
1998 
1999 					curRowBuf [col    ] [1] = (ComponentType) p1;
2000 					curRowBuf [col + 1] [1] = (ComponentType) p1;
2001 
2002 					}
2003 
2004 				// Read second chroma component.
2005 
2006 					{
2007 
2008 					int32 d = 0;
2009 
2010 					int32 s = HuffDecode (ht [2]);
2011 
2012 					if (s)
2013 						{
2014 
2015 						if (s == 16)
2016 							{
2017 							d = -32768;
2018 							}
2019 
2020 						else
2021 							{
2022 							d = get_bits (s);
2023 							HuffExtend (d, s);
2024 							}
2025 
2026 						}
2027 
2028 					p2 += d;
2029 
2030 					curRowBuf [col    ] [2] = (ComponentType) p2;
2031 					curRowBuf [col + 1] [2] = (ComponentType) p2;
2032 
2033 					}
2034 
2035 				}
2036 
2037 			PmPutRow (curRowBuf, compsInScan, numCOL, row);
2038 
2039 			swap (MCU *, prevRowBuf, curRowBuf);
2040 
2041 			}
2042 
2043 		return;
2044 
2045 		}
2046 
2047 	if (info.compInfo [0].hSampFactor == 2 &&
2048 		info.compInfo [0].vSampFactor == 2)
2049 		{
2050 
2051 		for (int32 row = 0; row < numROW; row += 2)
2052 			{
2053 
2054 			// Initialize predictors.
2055 
2056 			int32 p0;
2057 			int32 p1;
2058 			int32 p2;
2059 
2060 			if (row == 0)
2061 				{
2062 				p0 = 1 << 14;
2063 				p1 = 1 << 14;
2064 				p2 = 1 << 14;
2065 				}
2066 
2067 			else
2068 				{
2069 				p0 = prevRowBuf [0] [0];
2070 				p1 = prevRowBuf [0] [1];
2071 				p2 = prevRowBuf [0] [2];
2072 				}
2073 
2074 			for (int32 col = 0; col < numCOL; col += 2)
2075 				{
2076 
2077 				// Read first luminance component.
2078 
2079 					{
2080 
2081 					int32 d = 0;
2082 
2083 					int32 s = HuffDecode (ht [0]);
2084 
2085 					if (s)
2086 						{
2087 
2088 						if (s == 16)
2089 							{
2090 							d = -32768;
2091 							}
2092 
2093 						else
2094 							{
2095 							d = get_bits (s);
2096 							HuffExtend (d, s);
2097 							}
2098 
2099 						}
2100 
2101 					p0 += d;
2102 
2103 					prevRowBuf [col] [0] = (ComponentType) p0;
2104 
2105 					}
2106 
2107 				// Read second luminance component.
2108 
2109 					{
2110 
2111 					int32 d = 0;
2112 
2113 					int32 s = HuffDecode (ht [0]);
2114 
2115 					if (s)
2116 						{
2117 
2118 						if (s == 16)
2119 							{
2120 							d = -32768;
2121 							}
2122 
2123 						else
2124 							{
2125 							d = get_bits (s);
2126 							HuffExtend (d, s);
2127 							}
2128 
2129 						}
2130 
2131 					p0 += d;
2132 
2133 					prevRowBuf [col + 1] [0] = (ComponentType) p0;
2134 
2135 					}
2136 
2137 				// Read third luminance component.
2138 
2139 					{
2140 
2141 					int32 d = 0;
2142 
2143 					int32 s = HuffDecode (ht [0]);
2144 
2145 					if (s)
2146 						{
2147 
2148 						if (s == 16)
2149 							{
2150 							d = -32768;
2151 							}
2152 
2153 						else
2154 							{
2155 							d = get_bits (s);
2156 							HuffExtend (d, s);
2157 							}
2158 
2159 						}
2160 
2161 					p0 += d;
2162 
2163 					curRowBuf [col] [0] = (ComponentType) p0;
2164 
2165 					}
2166 
2167 				// Read fourth luminance component.
2168 
2169 					{
2170 
2171 					int32 d = 0;
2172 
2173 					int32 s = HuffDecode (ht [0]);
2174 
2175 					if (s)
2176 						{
2177 
2178 						if (s == 16)
2179 							{
2180 							d = -32768;
2181 							}
2182 
2183 						else
2184 							{
2185 							d = get_bits (s);
2186 							HuffExtend (d, s);
2187 							}
2188 
2189 						}
2190 
2191 					p0 += d;
2192 
2193 					curRowBuf [col + 1] [0] = (ComponentType) p0;
2194 
2195 					}
2196 
2197 				// Read first chroma component.
2198 
2199 					{
2200 
2201 					int32 d = 0;
2202 
2203 					int32 s = HuffDecode (ht [1]);
2204 
2205 					if (s)
2206 						{
2207 
2208 						if (s == 16)
2209 							{
2210 							d = -32768;
2211 							}
2212 
2213 						else
2214 							{
2215 							d = get_bits (s);
2216 							HuffExtend (d, s);
2217 							}
2218 
2219 						}
2220 
2221 					p1 += d;
2222 
2223 					prevRowBuf [col    ] [1] = (ComponentType) p1;
2224 					prevRowBuf [col + 1] [1] = (ComponentType) p1;
2225 
2226 					curRowBuf [col    ] [1] = (ComponentType) p1;
2227 					curRowBuf [col + 1] [1] = (ComponentType) p1;
2228 
2229 					}
2230 
2231 				// Read second chroma component.
2232 
2233 					{
2234 
2235 					int32 d = 0;
2236 
2237 					int32 s = HuffDecode (ht [2]);
2238 
2239 					if (s)
2240 						{
2241 
2242 						if (s == 16)
2243 							{
2244 							d = -32768;
2245 							}
2246 
2247 						else
2248 							{
2249 							d = get_bits (s);
2250 							HuffExtend (d, s);
2251 							}
2252 
2253 						}
2254 
2255 					p2 += d;
2256 
2257 					prevRowBuf [col    ] [2] = (ComponentType) p2;
2258 					prevRowBuf [col + 1] [2] = (ComponentType) p2;
2259 
2260 					curRowBuf [col    ] [2] = (ComponentType) p2;
2261 					curRowBuf [col + 1] [2] = (ComponentType) p2;
2262 
2263 					}
2264 
2265 				}
2266 
2267 			PmPutRow (prevRowBuf, compsInScan, numCOL, row);
2268 			PmPutRow (curRowBuf, compsInScan, numCOL, row);
2269 
2270 			}
2271 
2272 		return;
2273 
2274 		}
2275 
2276 	#endif
2277 
2278 	#if qSupportHasselblad_3FR
2279 
2280 	if (info.Ss == 8 && (numCOL & 1) == 0)
2281 		{
2282 
2283 		fHasselblad3FR = true;
2284 
2285 		for (int32 row = 0; row < numROW; row++)
2286 			{
2287 
2288 			int32 p0 = 32768;
2289 			int32 p1 = 32768;
2290 
2291 			for (int32 col = 0; col < numCOL; col += 2)
2292 				{
2293 
2294 				int32 s0 = HuffDecode (ht [0]);
2295 				int32 s1 = HuffDecode (ht [0]);
2296 
2297 				if (s0)
2298 					{
2299 					int32 d = get_bits (s0);
2300 					if (s0 == 16)
2301 						{
2302 						d = -32768;
2303 						}
2304 					else
2305 						{
2306 						HuffExtend (d, s0);
2307 						}
2308 					p0 += d;
2309 					}
2310 
2311 				if (s1)
2312 					{
2313 					int32 d = get_bits (s1);
2314 					if (s1 == 16)
2315 						{
2316 						d = -32768;
2317 						}
2318 					else
2319 						{
2320 						HuffExtend (d, s1);
2321 						}
2322 					p1 += d;
2323 					}
2324 
2325 				curRowBuf [col    ] [0] = (ComponentType) p0;
2326 				curRowBuf [col + 1] [0] = (ComponentType) p1;
2327 
2328 				}
2329 
2330 			PmPutRow (curRowBuf, compsInScan, numCOL, row);
2331 
2332 			}
2333 
2334 		return;
2335 
2336 		}
2337 
2338 	#endif
2339 
2340     // Decode the first row of image. Output the row and
2341     // turn this row into a previous row for later predictor
2342     // calculation.
2343 
2344     DecodeFirstRow (mcuROW1);
2345 
2346     PmPutRow (mcuROW1, compsInScan, numCOL, 0);
2347 
2348 	// Process each row.
2349 
2350     for (int32 row = 1; row < numROW; row++)
2351     	{
2352 
2353         // Account for restart interval, process restart marker if needed.
2354 
2355 		if (info.restartInRows)
2356 			{
2357 
2358 			if (info.restartRowsToGo == 0)
2359 				{
2360 
2361 				ProcessRestart ();
2362 
2363                 // Reset predictors at restart.
2364 
2365 				DecodeFirstRow (curRowBuf);
2366 
2367 				PmPutRow (curRowBuf, compsInScan, numCOL, row);
2368 
2369 				swap (MCU *, prevRowBuf, curRowBuf);
2370 
2371 				continue;
2372 
2373            		}
2374 
2375 			info.restartRowsToGo--;
2376 
2377 			}
2378 
2379 		// The upper neighbors are predictors for the first column.
2380 
2381         for (int32 curComp = 0; curComp < compsInScan; curComp++)
2382         	{
2383 
2384 	        // Section F.2.2.1: decode the difference
2385 
2386 	  		int32 d = 0;
2387 
2388 	        int32 s = HuffDecode (ht [curComp]);
2389 
2390 	      	if (s)
2391 	      		{
2392 
2393 	      		if (s == 16 && !fBug16)
2394 	      			{
2395 	      			d = -32768;
2396 	      			}
2397 
2398 	      		else
2399 	      			{
2400 					d = get_bits (s);
2401 	            	HuffExtend (d, s);
2402 	            	}
2403 
2404 	            }
2405 
2406 	        // First column of row above is predictor for first column.
2407 
2408             curRowBuf [0] [curComp] = (ComponentType) (d + prevRowBuf [0] [curComp]);
2409 
2410 			}
2411 
2412         // For the rest of the column on this row, predictor
2413         // calculations are based on PSV.
2414 
2415      	if (compsInScan == 2 && info.Ss == 1 && numCOL > 1)
2416     		{
2417 
2418     		// This is the combination used by both the Canon and Kodak raw formats.
2419     		// Unrolling the general case logic results in a significant speed increase.
2420 
2421     		uint16 *dPtr = &curRowBuf [1] [0];
2422 
2423     		int32 prev0 = dPtr [-2];
2424     		int32 prev1 = dPtr [-1];
2425 
2426 			for (int32 col = 1; col < numCOL; col++)
2427 	        	{
2428 
2429 		        int32 s = HuffDecode (ht [0]);
2430 
2431 		      	if (s)
2432 		      		{
2433 
2434 		      		int32 d;
2435 
2436 		      		if (s == 16 && !fBug16)
2437 		      			{
2438 		      			d = -32768;
2439 		      			}
2440 
2441 		      		else
2442 		      			{
2443 						d = get_bits (s);
2444 		            	HuffExtend (d, s);
2445 		            	}
2446 
2447 		        	prev0 += d;
2448 
2449 		            }
2450 
2451 		        s = HuffDecode (ht [1]);
2452 
2453 		      	if (s)
2454 		      		{
2455 
2456 		      		int32 d;
2457 
2458 		      		if (s == 16 && !fBug16)
2459 		      			{
2460 		      			d = -32768;
2461 		      			}
2462 
2463 		      		else
2464 		      			{
2465 						d = get_bits (s);
2466 		            	HuffExtend (d, s);
2467 		            	}
2468 
2469 					prev1 += d;
2470 
2471 		            }
2472 
2473 				dPtr [0] = (uint16) prev0;
2474 				dPtr [1] = (uint16) prev1;
2475 
2476 				dPtr += 2;
2477 
2478        			}
2479 
2480        		}
2481 
2482        	else
2483        		{
2484 
2485 			for (int32 col = 1; col < numCOL; col++)
2486 	        	{
2487 
2488 	            for (int32 curComp = 0; curComp < compsInScan; curComp++)
2489 	            	{
2490 
2491 		 	        // Section F.2.2.1: decode the difference
2492 
2493 			  		int32 d = 0;
2494 
2495 			        int32 s = HuffDecode (ht [curComp]);
2496 
2497 			      	if (s)
2498 			      		{
2499 
2500 			      		if (s == 16 && !fBug16)
2501 			      			{
2502 			      			d = -32768;
2503 			      			}
2504 
2505 			      		else
2506 			      			{
2507 							d = get_bits (s);
2508 			            	HuffExtend (d, s);
2509 			            	}
2510 
2511 			            }
2512 
2513 			        // Predict the pixel value.
2514 
2515 	                int32 predictor = QuickPredict (col,
2516 		                						    curComp,
2517 		                						    curRowBuf,
2518 		                						    prevRowBuf);
2519 
2520 	                // Save the difference.
2521 
2522 	                curRowBuf [col] [curComp] = (ComponentType) (d + predictor);
2523 
2524 					}
2525 
2526 				}
2527 
2528         	}
2529 
2530 		PmPutRow (curRowBuf, compsInScan, numCOL, row);
2531 
2532 		swap (MCU *, prevRowBuf, curRowBuf);
2533 
2534     	}
2535 
2536     #undef swap
2537 
2538 	}
2539 
2540 /*****************************************************************************/
2541 
StartRead(uint32 & imageWidth,uint32 & imageHeight,uint32 & imageChannels)2542 void dng_lossless_decoder::StartRead (uint32 &imageWidth,
2543 								      uint32 &imageHeight,
2544 								      uint32 &imageChannels)
2545 	{
2546 
2547 	ReadFileHeader    ();
2548 	ReadScanHeader    ();
2549 	DecoderStructInit ();
2550 	HuffDecoderInit   ();
2551 
2552 	imageWidth    = info.imageWidth;
2553 	imageHeight   = info.imageHeight;
2554 	imageChannels = info.compsInScan;
2555 
2556 	}
2557 
2558 /*****************************************************************************/
2559 
FinishRead()2560 void dng_lossless_decoder::FinishRead ()
2561 	{
2562 
2563 	DecodeImage ();
2564 
2565 	}
2566 
2567 /*****************************************************************************/
2568 
DecodeLosslessJPEG(dng_stream & stream,dng_spooler & spooler,uint32 minDecodedSize,uint32 maxDecodedSize,bool bug16)2569 void DecodeLosslessJPEG (dng_stream &stream,
2570 					     dng_spooler &spooler,
2571 					     uint32 minDecodedSize,
2572 					     uint32 maxDecodedSize,
2573 						 bool bug16)
2574 	{
2575 
2576 	dng_lossless_decoder decoder (&stream,
2577 							      &spooler,
2578 							      bug16);
2579 
2580 	uint32 imageWidth;
2581 	uint32 imageHeight;
2582 	uint32 imageChannels;
2583 
2584 	decoder.StartRead (imageWidth,
2585 					   imageHeight,
2586 					   imageChannels);
2587 
2588 	uint32 decodedSize = imageWidth    *
2589 						 imageHeight   *
2590 						 imageChannels *
2591 						 (uint32) sizeof (uint16);
2592 
2593 	if (decodedSize < minDecodedSize ||
2594 		decodedSize > maxDecodedSize)
2595 		{
2596 		ThrowBadFormat ();
2597 		}
2598 
2599 	decoder.FinishRead ();
2600 
2601 	}
2602 
2603 /*****************************************************************************/
2604 
2605 class dng_lossless_encoder
2606 	{
2607 
2608 	private:
2609 
2610 		const uint16 *fSrcData;
2611 
2612 		uint32 fSrcRows;
2613 		uint32 fSrcCols;
2614 		uint32 fSrcChannels;
2615 		uint32 fSrcBitDepth;
2616 
2617 		int32 fSrcRowStep;
2618 		int32 fSrcColStep;
2619 
2620 		dng_stream &fStream;
2621 
2622 		HuffmanTable huffTable [4];
2623 
2624 		uint32 freqCount [4] [257];
2625 
2626 		// Current bit-accumulation buffer
2627 
2628 		int32 huffPutBuffer;
2629 		int32 huffPutBits;
2630 
2631 		// Lookup table for number of bits in an 8 bit value.
2632 
2633 		int numBitsTable [256];
2634 
2635 	public:
2636 
2637 		dng_lossless_encoder (const uint16 *srcData,
2638 					 	      uint32 srcRows,
2639 					 	      uint32 srcCols,
2640 					 	      uint32 srcChannels,
2641 					 	      uint32 srcBitDepth,
2642 					 	      int32 srcRowStep,
2643 					 	      int32 srcColStep,
2644 					 	      dng_stream &stream);
2645 
2646 		void Encode ();
2647 
2648 	private:
2649 
2650 		void EmitByte (uint8 value);
2651 
2652 		void EmitBits (int code, int size);
2653 
2654 		void FlushBits ();
2655 
2656 		void CountOneDiff (int diff, uint32 *countTable);
2657 
2658 		void EncodeOneDiff (int diff, HuffmanTable *dctbl);
2659 
2660 		void FreqCountSet ();
2661 
2662 		void HuffEncode ();
2663 
2664 		void GenHuffCoding (HuffmanTable *htbl, uint32 *freq);
2665 
2666 		void HuffOptimize ();
2667 
2668 		void EmitMarker (JpegMarker mark);
2669 
2670 		void Emit2bytes (int value);
2671 
2672 		void EmitDht (int index);
2673 
2674 		void EmitSof (JpegMarker code);
2675 
2676 		void EmitSos ();
2677 
2678 		void WriteFileHeader ();
2679 
2680 		void WriteScanHeader ();
2681 
2682 		void WriteFileTrailer ();
2683 
2684 	};
2685 
2686 /*****************************************************************************/
2687 
dng_lossless_encoder(const uint16 * srcData,uint32 srcRows,uint32 srcCols,uint32 srcChannels,uint32 srcBitDepth,int32 srcRowStep,int32 srcColStep,dng_stream & stream)2688 dng_lossless_encoder::dng_lossless_encoder (const uint16 *srcData,
2689 											uint32 srcRows,
2690 											uint32 srcCols,
2691 											uint32 srcChannels,
2692 											uint32 srcBitDepth,
2693 											int32 srcRowStep,
2694 											int32 srcColStep,
2695 											dng_stream &stream)
2696 
2697 	:	fSrcData     (srcData    )
2698 	,	fSrcRows     (srcRows    )
2699 	,	fSrcCols     (srcCols    )
2700 	,	fSrcChannels (srcChannels)
2701 	,	fSrcBitDepth (srcBitDepth)
2702 	,	fSrcRowStep  (srcRowStep )
2703 	,	fSrcColStep  (srcColStep )
2704 	,	fStream      (stream     )
2705 
2706 	,	huffPutBuffer (0)
2707 	,	huffPutBits   (0)
2708 
2709 	{
2710 
2711     // Initialize number of bits lookup table.
2712 
2713     numBitsTable [0] = 0;
2714 
2715     for (int i = 1; i < 256; i++)
2716     	{
2717 
2718 		int temp = i;
2719 		int nbits = 1;
2720 
2721 		while (temp >>= 1)
2722 			{
2723 	    	nbits++;
2724 			}
2725 
2726 		numBitsTable [i] = nbits;
2727 
2728     	}
2729 
2730 	}
2731 
2732 /*****************************************************************************/
2733 
EmitByte(uint8 value)2734 inline void dng_lossless_encoder::EmitByte (uint8 value)
2735 	{
2736 
2737 	fStream.Put_uint8 (value);
2738 
2739 	}
2740 
2741 /*****************************************************************************/
2742 
2743 /*
2744  *--------------------------------------------------------------
2745  *
2746  * EmitBits --
2747  *
2748  *	Code for outputting bits to the file
2749  *
2750  *	Only the right 24 bits of huffPutBuffer are used; the valid
2751  *	bits are left-justified in this part.  At most 16 bits can be
2752  *	passed to EmitBits in one call, and we never retain more than 7
2753  *	bits in huffPutBuffer between calls, so 24 bits are
2754  *	sufficient.
2755  *
2756  * Results:
2757  *	None.
2758  *
2759  * Side effects:
2760  *	huffPutBuffer and huffPutBits are updated.
2761  *
2762  *--------------------------------------------------------------
2763  */
2764 
EmitBits(int code,int size)2765 inline void dng_lossless_encoder::EmitBits (int code, int size)
2766 	{
2767 
2768     DNG_ASSERT (size != 0, "Bad Huffman table entry");
2769 
2770     int putBits   = size;
2771 	int putBuffer = code;
2772 
2773     putBits += huffPutBits;
2774 
2775     putBuffer <<= 24 - putBits;
2776     putBuffer |= huffPutBuffer;
2777 
2778     while (putBits >= 8)
2779     	{
2780 
2781 		uint8 c = (uint8) (putBuffer >> 16);
2782 
2783 		// Output whole bytes we've accumulated with byte stuffing
2784 
2785 		EmitByte (c);
2786 
2787 		if (c == 0xFF)
2788 			{
2789 	   	 	EmitByte (0);
2790 			}
2791 
2792 		putBuffer <<= 8;
2793 		putBits -= 8;
2794 
2795     	}
2796 
2797     huffPutBuffer = putBuffer;
2798     huffPutBits   = putBits;
2799 
2800 	}
2801 
2802 /*****************************************************************************/
2803 
2804 /*
2805  *--------------------------------------------------------------
2806  *
2807  * FlushBits --
2808  *
2809  *	Flush any remaining bits in the bit buffer. Used before emitting
2810  *	a marker.
2811  *
2812  * Results:
2813  *	None.
2814  *
2815  * Side effects:
2816  *	huffPutBuffer and huffPutBits are reset
2817  *
2818  *--------------------------------------------------------------
2819  */
2820 
FlushBits()2821 void dng_lossless_encoder::FlushBits ()
2822 	{
2823 
2824     // The first call forces output of any partial bytes.
2825 
2826     EmitBits (0x007F, 7);
2827 
2828     // We can then zero the buffer.
2829 
2830     huffPutBuffer = 0;
2831     huffPutBits   = 0;
2832 
2833 	}
2834 
2835 /*****************************************************************************/
2836 
2837 /*
2838  *--------------------------------------------------------------
2839  *
2840  * CountOneDiff --
2841  *
2842  *      Count the difference value in countTable.
2843  *
2844  * Results:
2845  *      diff is counted in countTable.
2846  *
2847  * Side effects:
2848  *      None.
2849  *
2850  *--------------------------------------------------------------
2851  */
2852 
CountOneDiff(int diff,uint32 * countTable)2853 inline void dng_lossless_encoder::CountOneDiff (int diff, uint32 *countTable)
2854 	{
2855 
2856     // Encode the DC coefficient difference per section F.1.2.1
2857 
2858     int temp = diff;
2859 
2860     if (temp < 0)
2861     	{
2862 
2863  		temp = -temp;
2864 
2865 	    }
2866 
2867     // Find the number of bits needed for the magnitude of the coefficient
2868 
2869     int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
2870     						: numBitsTable [temp & 0xFF];
2871 
2872     // Update count for this bit length
2873 
2874     countTable [nbits] ++;
2875 
2876 	}
2877 
2878 /*****************************************************************************/
2879 
2880 /*
2881  *--------------------------------------------------------------
2882  *
2883  * EncodeOneDiff --
2884  *
2885  *	Encode a single difference value.
2886  *
2887  * Results:
2888  *	None.
2889  *
2890  * Side effects:
2891  *	None.
2892  *
2893  *--------------------------------------------------------------
2894  */
2895 
EncodeOneDiff(int diff,HuffmanTable * dctbl)2896 inline void dng_lossless_encoder::EncodeOneDiff (int diff, HuffmanTable *dctbl)
2897 	{
2898 
2899     // Encode the DC coefficient difference per section F.1.2.1
2900 
2901     int temp  = diff;
2902     int temp2 = diff;
2903 
2904     if (temp < 0)
2905     	{
2906 
2907 		temp = -temp;
2908 
2909 		// For a negative input, want temp2 = bitwise complement of
2910 		// abs (input).  This code assumes we are on a two's complement
2911 		// machine.
2912 
2913 		temp2--;
2914 
2915 	    }
2916 
2917     // Find the number of bits needed for the magnitude of the coefficient
2918 
2919     int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
2920     						: numBitsTable [temp & 0xFF];
2921 
2922     // Emit the Huffman-coded symbol for the number of bits
2923 
2924     EmitBits (dctbl->ehufco [nbits],
2925     		  dctbl->ehufsi [nbits]);
2926 
2927     // Emit that number of bits of the value, if positive,
2928     // or the complement of its magnitude, if negative.
2929 
2930     // If the number of bits is 16, there is only one possible difference
2931     // value (-32786), so the lossless JPEG spec says not to output anything
2932     // in that case.  So we only need to output the diference value if
2933     // the number of bits is between 1 and 15.
2934 
2935     if (nbits & 15)
2936     	{
2937 
2938 		EmitBits (temp2 & (0x0FFFF >> (16 - nbits)),
2939 				  nbits);
2940 
2941 		}
2942 
2943 	}
2944 
2945 /*****************************************************************************/
2946 
2947 /*
2948  *--------------------------------------------------------------
2949  *
2950  * FreqCountSet --
2951  *
2952  *      Count the times each category symbol occurs in this image.
2953  *
2954  * Results:
2955  *	None.
2956  *
2957  * Side effects:
2958  *	The freqCount has counted all category
2959  *	symbols appeared in the image.
2960  *
2961  *--------------------------------------------------------------
2962  */
2963 
FreqCountSet()2964 void dng_lossless_encoder::FreqCountSet ()
2965 	{
2966 
2967 	memset (freqCount, 0, sizeof (freqCount));
2968 
2969 	DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::FreqCountSet: fSrcRpws too large.");
2970 
2971     for (int32 row = 0; row < (int32)fSrcRows; row++)
2972     	{
2973 
2974 		const uint16 *sPtr = fSrcData + row * fSrcRowStep;
2975 
2976 		// Initialize predictors for this row.
2977 
2978 		int32 predictor [4];
2979 
2980 		for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
2981 			{
2982 
2983 			if (row == 0)
2984 				predictor [channel] = 1 << (fSrcBitDepth - 1);
2985 
2986 			else
2987 				predictor [channel] = sPtr [channel - fSrcRowStep];
2988 
2989 			}
2990 
2991 		// Unroll most common case of two channels
2992 
2993 		if (fSrcChannels == 2)
2994 			{
2995 
2996 			int32 pred0 = predictor [0];
2997 			int32 pred1 = predictor [1];
2998 
2999 			uint32 srcCols    = fSrcCols;
3000 			int32  srcColStep = fSrcColStep;
3001 
3002 	    	for (uint32 col = 0; col < srcCols; col++)
3003 	    		{
3004 
3005     			int32 pixel0 = sPtr [0];
3006 				int32 pixel1 = sPtr [1];
3007 
3008     			int16 diff0 = (int16) (pixel0 - pred0);
3009     			int16 diff1 = (int16) (pixel1 - pred1);
3010 
3011     			CountOneDiff (diff0, freqCount [0]);
3012     			CountOneDiff (diff1, freqCount [1]);
3013 
3014     			pred0 = pixel0;
3015    				pred1 = pixel1;
3016 
3017 	    		sPtr += srcColStep;
3018 
3019 	    		}
3020 
3021 			}
3022 
3023 		// General case.
3024 
3025 		else
3026 			{
3027 
3028 	    	for (uint32 col = 0; col < fSrcCols; col++)
3029 	    		{
3030 
3031 	    		for (uint32 channel = 0; channel < fSrcChannels; channel++)
3032 	    			{
3033 
3034 	    			int32 pixel = sPtr [channel];
3035 
3036 	    			int16 diff = (int16) (pixel - predictor [channel]);
3037 
3038 	    			CountOneDiff (diff, freqCount [channel]);
3039 
3040 	    			predictor [channel] = pixel;
3041 
3042 	    			}
3043 
3044 	    		sPtr += fSrcColStep;
3045 
3046 	    		}
3047 
3048 	    	}
3049 
3050     	}
3051 
3052 	}
3053 
3054 /*****************************************************************************/
3055 
3056 /*
3057  *--------------------------------------------------------------
3058  *
3059  * HuffEncode --
3060  *
3061  *      Encode and output Huffman-compressed image data.
3062  *
3063  * Results:
3064  *      None.
3065  *
3066  * Side effects:
3067  *      None.
3068  *
3069  *--------------------------------------------------------------
3070  */
3071 
HuffEncode()3072 void dng_lossless_encoder::HuffEncode ()
3073 	{
3074 
3075 	DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::HuffEncode: fSrcRows too large.");
3076 
3077 	for (int32 row = 0; row < (int32)fSrcRows; row++)
3078     	{
3079 
3080 		const uint16 *sPtr = fSrcData + row * fSrcRowStep;
3081 
3082 		// Initialize predictors for this row.
3083 
3084 		int32 predictor [4];
3085 
3086 		for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
3087 			{
3088 
3089 			if (row == 0)
3090 				predictor [channel] = 1 << (fSrcBitDepth - 1);
3091 
3092 			else
3093 				predictor [channel] = sPtr [channel - fSrcRowStep];
3094 
3095 			}
3096 
3097 		// Unroll most common case of two channels
3098 
3099 		if (fSrcChannels == 2)
3100 			{
3101 
3102 			int32 pred0 = predictor [0];
3103 			int32 pred1 = predictor [1];
3104 
3105 			uint32 srcCols    = fSrcCols;
3106 			int32  srcColStep = fSrcColStep;
3107 
3108 	    	for (uint32 col = 0; col < srcCols; col++)
3109 	    		{
3110 
3111     			int32 pixel0 = sPtr [0];
3112 				int32 pixel1 = sPtr [1];
3113 
3114     			int16 diff0 = (int16) (pixel0 - pred0);
3115     			int16 diff1 = (int16) (pixel1 - pred1);
3116 
3117     			EncodeOneDiff (diff0, &huffTable [0]);
3118    				EncodeOneDiff (diff1, &huffTable [1]);
3119 
3120     			pred0 = pixel0;
3121    				pred1 = pixel1;
3122 
3123 	    		sPtr += srcColStep;
3124 
3125 	    		}
3126 
3127 			}
3128 
3129 		// General case.
3130 
3131 		else
3132 			{
3133 
3134 	    	for (uint32 col = 0; col < fSrcCols; col++)
3135 	    		{
3136 
3137 	    		for (uint32 channel = 0; channel < fSrcChannels; channel++)
3138 	    			{
3139 
3140 	    			int32 pixel = sPtr [channel];
3141 
3142 	    			int16 diff = (int16) (pixel - predictor [channel]);
3143 
3144     				EncodeOneDiff (diff, &huffTable [channel]);
3145 
3146 	    			predictor [channel] = pixel;
3147 
3148 	    			}
3149 
3150 	    		sPtr += fSrcColStep;
3151 
3152 	    		}
3153 
3154 	    	}
3155 
3156     	}
3157 
3158     FlushBits ();
3159 
3160 	}
3161 
3162 /*****************************************************************************/
3163 
3164 /*
3165  *--------------------------------------------------------------
3166  *
3167  * GenHuffCoding --
3168  *
3169  * 	Generate the optimal coding for the given counts.
3170  *	This algorithm is explained in section K.2 of the
3171  *	JPEG standard.
3172  *
3173  * Results:
3174  *      htbl->bits and htbl->huffval are constructed.
3175  *
3176  * Side effects:
3177  *      None.
3178  *
3179  *--------------------------------------------------------------
3180  */
3181 
GenHuffCoding(HuffmanTable * htbl,uint32 * freq)3182 void dng_lossless_encoder::GenHuffCoding (HuffmanTable *htbl, uint32 *freq)
3183 	{
3184 
3185 	int i;
3186 	int j;
3187 
3188 	const int MAX_CLEN = 32;     	// assumed maximum initial code length
3189 
3190 	uint8 bits [MAX_CLEN + 1];	// bits [k] = # of symbols with code length k
3191 	short codesize [257];			// codesize [k] = code length of symbol k
3192 	short others   [257];			// next symbol in current branch of tree
3193 
3194 	memset (bits    , 0, sizeof (bits    ));
3195   	memset (codesize, 0, sizeof (codesize));
3196 
3197 	for (i = 0; i < 257; i++)
3198 		others [i] = -1;			// init links to empty
3199 
3200 	// Including the pseudo-symbol 256 in the Huffman procedure guarantees
3201 	// that no real symbol is given code-value of all ones, because 256
3202 	// will be placed in the largest codeword category.
3203 
3204 	freq [256] = 1;					// make sure there is a nonzero count
3205 
3206 	// Huffman's basic algorithm to assign optimal code lengths to symbols
3207 
3208 	while (true)
3209 		{
3210 
3211 		// Find the smallest nonzero frequency, set c1 = its symbol.
3212 		// In case of ties, take the larger symbol number.
3213 
3214 		int c1 = -1;
3215 
3216 		uint32 v = 0xFFFFFFFF;
3217 
3218 		for (i = 0; i <= 256; i++)
3219 			{
3220 
3221 			if (freq [i] && freq [i] <= v)
3222 				{
3223 				v = freq [i];
3224 				c1 = i;
3225 				}
3226 
3227 			}
3228 
3229 		// Find the next smallest nonzero frequency, set c2 = its symbol.
3230 		// In case of ties, take the larger symbol number.
3231 
3232 		int c2 = -1;
3233 
3234 		v = 0xFFFFFFFF;
3235 
3236 		for (i = 0; i <= 256; i++)
3237 			{
3238 
3239       		if (freq [i] && freq [i] <= v && i != c1)
3240       			{
3241 				v = freq [i];
3242 				c2 = i;
3243 				}
3244 
3245 			}
3246 
3247 		// Done if we've merged everything into one frequency.
3248 
3249 		if (c2 < 0)
3250       		break;
3251 
3252  		// Else merge the two counts/trees.
3253 
3254 		freq [c1] += freq [c2];
3255 		freq [c2] = 0;
3256 
3257 		// Increment the codesize of everything in c1's tree branch.
3258 
3259 		codesize [c1] ++;
3260 
3261 		while (others [c1] >= 0)
3262 			{
3263 			c1 = others [c1];
3264 			codesize [c1] ++;
3265     		}
3266 
3267 		// chain c2 onto c1's tree branch
3268 
3269 		others [c1] = (short) c2;
3270 
3271 		// Increment the codesize of everything in c2's tree branch.
3272 
3273 		codesize [c2] ++;
3274 
3275 		while (others [c2] >= 0)
3276 			{
3277 			c2 = others [c2];
3278 			codesize [c2] ++;
3279 			}
3280 
3281 		}
3282 
3283 	// Now count the number of symbols of each code length.
3284 
3285 	for (i = 0; i <= 256; i++)
3286 		{
3287 
3288 		if (codesize [i])
3289 			{
3290 
3291  			// The JPEG standard seems to think that this can't happen,
3292 			// but I'm paranoid...
3293 
3294 			if (codesize [i] > MAX_CLEN)
3295 				{
3296 
3297        			DNG_REPORT ("Huffman code size table overflow");
3298 
3299        			ThrowProgramError ();
3300 
3301        			}
3302 
3303 			bits [codesize [i]]++;
3304 
3305 			}
3306 
3307 		}
3308 
3309 	// JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
3310 	// Huffman procedure assigned any such lengths, we must adjust the coding.
3311 	// Here is what the JPEG spec says about how this next bit works:
3312 	// Since symbols are paired for the longest Huffman code, the symbols are
3313 	// removed from this length category two at a time.  The prefix for the pair
3314 	// (which is one bit shorter) is allocated to one of the pair; then,
3315 	// skipping the BITS entry for that prefix length, a code word from the next
3316 	// shortest nonzero BITS entry is converted into a prefix for two code words
3317 	// one bit longer.
3318 
3319 	for (i = MAX_CLEN; i > 16; i--)
3320 		{
3321 
3322 		while (bits [i] > 0)
3323 			{
3324 
3325 			// Kludge: I have never been able to test this logic, and there
3326 			// are comments on the web that this encoder has bugs with 16-bit
3327 			// data, so just throw an error if we get here and revert to a
3328 			// default table.	 - tknoll 12/1/03.
3329 
3330        		DNG_REPORT ("Info: Optimal huffman table bigger than 16 bits");
3331 
3332  			ThrowProgramError ();
3333 
3334 			// Original logic:
3335 
3336 			j = i - 2;		// find length of new prefix to be used
3337 
3338 			while (bits [j] == 0)
3339 				j--;
3340 
3341 			bits [i    ] -= 2;		// remove two symbols
3342 			bits [i - 1] ++;		// one goes in this length
3343 			bits [j + 1] += 2;		// two new symbols in this length
3344 			bits [j    ] --;		// symbol of this length is now a prefix
3345 
3346 			}
3347 
3348 		}
3349 
3350 	// Remove the count for the pseudo-symbol 256 from
3351 	// the largest codelength.
3352 
3353 	while (bits [i] == 0)		// find largest codelength still in use
3354     	i--;
3355 
3356 	bits [i] --;
3357 
3358 	// Return final symbol counts (only for lengths 0..16).
3359 
3360 	memcpy (htbl->bits, bits, sizeof (htbl->bits));
3361 
3362  	// Return a list of the symbols sorted by code length.
3363 	// It's not real clear to me why we don't need to consider the codelength
3364 	// changes made above, but the JPEG spec seems to think this works.
3365 
3366 	int p = 0;
3367 
3368 	for (i = 1; i <= MAX_CLEN; i++)
3369 		{
3370 
3371 		for (j = 0; j <= 255; j++)
3372 			{
3373 
3374 			if (codesize [j] == i)
3375 				{
3376 				htbl->huffval [p] = (uint8) j;
3377 				p++;
3378 				}
3379 
3380     		}
3381 
3382   		}
3383 
3384 	}
3385 
3386 /*****************************************************************************/
3387 
3388 /*
3389  *--------------------------------------------------------------
3390  *
3391  * HuffOptimize --
3392  *
3393  *	Find the best coding parameters for a Huffman-coded scan.
3394  *	When called, the scan data has already been converted to
3395  *	a sequence of MCU groups of source image samples, which
3396  *	are stored in a "big" array, mcuTable.
3397  *
3398  *	It counts the times each category symbol occurs. Based on
3399  *	this counting, optimal Huffman tables are built. Then it
3400  *	uses this optimal Huffman table and counting table to find
3401  *	the best PSV.
3402  *
3403  * Results:
3404  *	Optimal Huffman tables are retured in cPtr->dcHuffTblPtrs[tbl].
3405  *	Best PSV is retured in cPtr->Ss.
3406  *
3407  * Side effects:
3408  *	None.
3409  *
3410  *--------------------------------------------------------------
3411  */
3412 
HuffOptimize()3413 void dng_lossless_encoder::HuffOptimize ()
3414 	{
3415 
3416     // Collect the frequency counts.
3417 
3418 	FreqCountSet ();
3419 
3420 	// Generate Huffman encoding tables.
3421 
3422 	for (uint32 channel = 0; channel < fSrcChannels; channel++)
3423 		{
3424 
3425 		try
3426 			{
3427 
3428         	GenHuffCoding (&huffTable [channel], freqCount [channel]);
3429 
3430         	}
3431 
3432         catch (...)
3433         	{
3434 
3435         	DNG_REPORT ("Info: Reverting to default huffman table");
3436 
3437         	for (uint32 j = 0; j <= 256; j++)
3438         		{
3439 
3440         		freqCount [channel] [j] = (j <= 16 ? 1 : 0);
3441 
3442         		}
3443 
3444         	GenHuffCoding (&huffTable [channel], freqCount [channel]);
3445 
3446         	}
3447 
3448         FixHuffTbl (&huffTable [channel]);
3449 
3450 		}
3451 
3452 	}
3453 
3454 /*****************************************************************************/
3455 
3456 /*
3457  *--------------------------------------------------------------
3458  *
3459  * EmitMarker --
3460  *
3461  *	Emit a marker code into the output stream.
3462  *
3463  * Results:
3464  *	None.
3465  *
3466  * Side effects:
3467  *	None.
3468  *
3469  *--------------------------------------------------------------
3470  */
3471 
EmitMarker(JpegMarker mark)3472 void dng_lossless_encoder::EmitMarker (JpegMarker mark)
3473 	{
3474 
3475     EmitByte (0xFF);
3476     EmitByte ((uint8) mark);
3477 
3478 	}
3479 
3480 /*****************************************************************************/
3481 
3482 /*
3483  *--------------------------------------------------------------
3484  *
3485  * Emit2bytes --
3486  *
3487  *	Emit a 2-byte integer; these are always MSB first in JPEG
3488  *	files
3489  *
3490  * Results:
3491  *	None.
3492  *
3493  * Side effects:
3494  *	None.
3495  *
3496  *--------------------------------------------------------------
3497  */
3498 
Emit2bytes(int value)3499 void dng_lossless_encoder::Emit2bytes (int value)
3500 	{
3501 
3502     EmitByte ((value >> 8) & 0xFF);
3503     EmitByte (value & 0xFF);
3504 
3505 	}
3506 
3507 /*****************************************************************************/
3508 
3509 /*
3510  *--------------------------------------------------------------
3511  *
3512  * EmitDht --
3513  *
3514  *	Emit a DHT marker, follwed by the huffman data.
3515  *
3516  * Results:
3517  *	None
3518  *
3519  * Side effects:
3520  *	None
3521  *
3522  *--------------------------------------------------------------
3523  */
3524 
EmitDht(int index)3525 void dng_lossless_encoder::EmitDht (int index)
3526 	{
3527 
3528 	int i;
3529 
3530     HuffmanTable *htbl = &huffTable [index];
3531 
3532  	EmitMarker (M_DHT);
3533 
3534     int length = 0;
3535 
3536 	for (i = 1; i <= 16; i++)
3537 	    length += htbl->bits [i];
3538 
3539 	Emit2bytes (length + 2 + 1 + 16);
3540 
3541 	EmitByte ((uint8) index);
3542 
3543 	for (i = 1; i <= 16; i++)
3544 	    EmitByte (htbl->bits [i]);
3545 
3546 	for (i = 0; i < length; i++)
3547 	    EmitByte (htbl->huffval [i]);
3548 
3549 	}
3550 
3551 /*****************************************************************************/
3552 
3553 /*
3554  *--------------------------------------------------------------
3555  *
3556  * EmitSof --
3557  *
3558  *	Emit a SOF marker plus data.
3559  *
3560  * Results:
3561  *	None.
3562  *
3563  * Side effects:
3564  *	None.
3565  *
3566  *--------------------------------------------------------------
3567  */
3568 
EmitSof(JpegMarker code)3569 void dng_lossless_encoder::EmitSof (JpegMarker code)
3570 	{
3571 
3572     EmitMarker (code);
3573 
3574     Emit2bytes (3 * fSrcChannels + 2 + 5 + 1);	// length
3575 
3576     EmitByte ((uint8) fSrcBitDepth);
3577 
3578     Emit2bytes (fSrcRows);
3579     Emit2bytes (fSrcCols);
3580 
3581     EmitByte ((uint8) fSrcChannels);
3582 
3583     for (uint32 i = 0; i < fSrcChannels; i++)
3584     	{
3585 
3586 		EmitByte ((uint8) i);
3587 
3588 		EmitByte ((uint8) ((1 << 4) + 1));		// Not subsampled.
3589 
3590         EmitByte (0);					// Tq shall be 0 for lossless.
3591 
3592     	}
3593 
3594 	}
3595 
3596 /*****************************************************************************/
3597 
3598 /*
3599  *--------------------------------------------------------------
3600  *
3601  * EmitSos --
3602  *
3603  *	Emit a SOS marker plus data.
3604  *
3605  * Results:
3606  *	None.
3607  *
3608  * Side effects:
3609  *	None.
3610  *
3611  *--------------------------------------------------------------
3612  */
3613 
EmitSos()3614 void dng_lossless_encoder::EmitSos ()
3615 	{
3616 
3617     EmitMarker (M_SOS);
3618 
3619     Emit2bytes (2 * fSrcChannels + 2 + 1 + 3);	// length
3620 
3621     EmitByte ((uint8) fSrcChannels);			// Ns
3622 
3623     for (uint32 i = 0; i < fSrcChannels; i++)
3624     	{
3625 
3626     	// Cs,Td,Ta
3627 
3628 		EmitByte ((uint8) i);
3629 		EmitByte ((uint8) (i << 4));
3630 
3631     	}
3632 
3633     EmitByte (1);		// PSV - hardcoded - tknoll
3634     EmitByte (0);	    // Spectral selection end  - Se
3635     EmitByte (0);  		// The point transform parameter
3636 
3637 	}
3638 
3639 /*****************************************************************************/
3640 
3641 /*
3642  *--------------------------------------------------------------
3643  *
3644  * WriteFileHeader --
3645  *
3646  *	Write the file header.
3647  *
3648  * Results:
3649  *	None.
3650  *
3651  * Side effects:
3652  *	None.
3653  *
3654  *--------------------------------------------------------------
3655  */
3656 
WriteFileHeader()3657 void dng_lossless_encoder::WriteFileHeader ()
3658 	{
3659 
3660     EmitMarker (M_SOI);		// first the SOI
3661 
3662     EmitSof (M_SOF3);
3663 
3664 	}
3665 
3666 /*****************************************************************************/
3667 
3668 /*
3669  *--------------------------------------------------------------
3670  *
3671  * WriteScanHeader --
3672  *
3673  *	Write the start of a scan (everything through the SOS marker).
3674  *
3675  * Results:
3676  *	None.
3677  *
3678  * Side effects:
3679  *	None.
3680  *
3681  *--------------------------------------------------------------
3682  */
3683 
WriteScanHeader()3684 void dng_lossless_encoder::WriteScanHeader ()
3685 	{
3686 
3687     // Emit Huffman tables.
3688 
3689     for (uint32 i = 0; i < fSrcChannels; i++)
3690     	{
3691 
3692 		EmitDht (i);
3693 
3694     	}
3695 
3696 	EmitSos ();
3697 
3698 	}
3699 
3700 /*****************************************************************************/
3701 
3702 /*
3703  *--------------------------------------------------------------
3704  *
3705  * WriteFileTrailer --
3706  *
3707  *	Write the End of image marker at the end of a JPEG file.
3708  *
3709  * Results:
3710  *	None.
3711  *
3712  * Side effects:
3713  *	None.
3714  *
3715  *--------------------------------------------------------------
3716  */
3717 
WriteFileTrailer()3718 void dng_lossless_encoder::WriteFileTrailer ()
3719 	{
3720 
3721     EmitMarker (M_EOI);
3722 
3723 	}
3724 
3725 /*****************************************************************************/
3726 
Encode()3727 void dng_lossless_encoder::Encode ()
3728 	{
3729 
3730 	DNG_ASSERT (fSrcChannels <= 4, "Too many components in scan");
3731 
3732 	// Count the times each difference category occurs.
3733 	// Construct the optimal Huffman table.
3734 
3735 	HuffOptimize ();
3736 
3737     // Write the frame and scan headers.
3738 
3739     WriteFileHeader ();
3740 
3741     WriteScanHeader ();
3742 
3743     // Encode the image.
3744 
3745     HuffEncode ();
3746 
3747     // Clean up everything.
3748 
3749 	WriteFileTrailer ();
3750 
3751 	}
3752 
3753 /*****************************************************************************/
3754 
EncodeLosslessJPEG(const uint16 * srcData,uint32 srcRows,uint32 srcCols,uint32 srcChannels,uint32 srcBitDepth,int32 srcRowStep,int32 srcColStep,dng_stream & stream)3755 void EncodeLosslessJPEG (const uint16 *srcData,
3756 						 uint32 srcRows,
3757 						 uint32 srcCols,
3758 						 uint32 srcChannels,
3759 						 uint32 srcBitDepth,
3760 						 int32 srcRowStep,
3761 						 int32 srcColStep,
3762 						 dng_stream &stream)
3763 	{
3764 
3765 	dng_lossless_encoder encoder (srcData,
3766 							      srcRows,
3767 							      srcCols,
3768 							      srcChannels,
3769 							      srcBitDepth,
3770 							      srcRowStep,
3771 							      srcColStep,
3772 							      stream);
3773 
3774 	encoder.Encode ();
3775 
3776     }
3777 
3778 /*****************************************************************************/
3779