Coverage Report

Created: 2025-07-12 06:56

/src/dng_sdk/source/dng_lossless_jpeg.cpp
Line
Count
Source (jump to first uncovered line)
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
 
120
static void FixHuffTbl (HuffmanTable *htbl)
121
117k
  {
122
  
123
117k
  int32 l;
124
117k
  int32 i;
125
  
126
117k
  const uint32 bitMask [] =
127
117k
    {
128
117k
    0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff,
129
117k
        0x0fffffff, 0x07ffffff, 0x03ffffff, 0x01ffffff,
130
117k
        0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
131
117k
        0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff,
132
117k
        0x0000ffff, 0x00007fff, 0x00003fff, 0x00001fff,
133
117k
        0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
134
117k
        0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f,
135
117k
        0x0000000f, 0x00000007, 0x00000003, 0x00000001
136
117k
        };
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
117k
  int8 huffsize [257];
142
  
143
117k
    int32 p = 0;
144
    
145
2.00M
  for (l = 1; l <= 16; l++)
146
1.88M
      {
147
      
148
2.88M
        for (i = 1; i <= (int32) htbl->bits [l]; i++)
149
1.00M
            huffsize [p++] = (int8) l;
150
151
1.88M
      }
152
      
153
117k
    huffsize [p] = 0;
154
    
155
117k
    int32 lastp = p;
156
157
  // Figure C.2: generate the codes themselves
158
  // Note that this is in code-length order.
159
160
117k
  uint16 huffcode [257];
161
  
162
117k
  uint16 code = 0;
163
    
164
117k
    int32 si = huffsize [0];
165
    
166
117k
    p = 0;
167
    
168
817k
    while (huffsize [p])
169
699k
      {
170
      
171
1.70M
        while (((int32) huffsize [p]) == si) 
172
1.00M
          {
173
1.00M
            huffcode [p++] = code;
174
1.00M
            code++;
175
1.00M
          }
176
          
177
699k
        code <<= 1;
178
        
179
699k
        si++;
180
        
181
699k
      }
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
117k
    memset (htbl->ehufsi, 0, sizeof (htbl->ehufsi));
189
190
1.11M
    for (p = 0; p < lastp; p++)
191
1.00M
      {
192
      
193
1.00M
        htbl->ehufco [htbl->huffval [p]] = huffcode [p];
194
1.00M
        htbl->ehufsi [htbl->huffval [p]] = huffsize [p];
195
        
196
1.00M
      }
197
    
198
  // Figure F.15: generate decoding tables
199
 
200
117k
  p = 0;
201
  
202
2.00M
    for (l = 1; l <= 16; l++)
203
1.88M
      {
204
      
205
1.88M
        if (htbl->bits [l])
206
635k
          {
207
          
208
635k
            htbl->valptr  [l] = (int16) p;
209
635k
            htbl->mincode [l] = huffcode [p];
210
            
211
635k
            p += htbl->bits [l];
212
            
213
635k
            htbl->maxcode [l] = huffcode [p - 1];
214
            
215
635k
          }
216
          
217
1.25M
        else 
218
1.25M
          {
219
1.25M
            htbl->maxcode [l] = -1;
220
1.25M
          }
221
222
1.88M
      }
223
224
    // We put in this value to ensure HuffDecode terminates.
225
226
117k
    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
117k
    memset (htbl->numbits, 0, sizeof (htbl->numbits));
235
    
236
1.11M
  for (p = 0; p < lastp; p++)
237
999k
    {
238
    
239
999k
        int32 size = huffsize [p];
240
        
241
999k
        if (size <= 8)
242
749k
          {
243
          
244
749k
            int32 value = htbl->huffval [p];
245
            
246
749k
            code = huffcode [p];
247
            
248
749k
            int32 ll = code << (8  -size);
249
            
250
749k
        int32 ul = (size < 8 ? ll | bitMask [24 + size]
251
749k
                     : ll);
252
749k
            if (ul >= static_cast<int32>(sizeof(htbl->numbits) / sizeof(htbl->numbits[0])) ||
253
749k
                ul >= static_cast<int32>(sizeof(htbl->value) / sizeof(htbl->value[0])))
254
27
                {
255
27
                ThrowBadFormat ();
256
27
                }
257
  
258
27.9M
            for (i = ll; i <= ul; i++)
259
27.2M
              {
260
27.2M
                htbl->numbits [i] = size;
261
27.2M
                htbl->value   [i] = value;
262
27.2M
              }
263
              
264
749k
      }
265
266
999k
    }
267
268
117k
  }
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
420
    uint8 GetJpegChar ()
421
158M
      {
422
158M
      return fStream->Get_uint8 ();
423
158M
      }
424
      
425
    void UnGetJpegChar ()
426
98.2M
      {
427
98.2M
      fStream->SetReadPosition (fStream->Position () - 1);
428
98.2M
      }
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
498
dng_lossless_decoder::dng_lossless_decoder (dng_stream *stream,
499
                          dng_spooler *spooler,
500
                          bool bug16)
501
                  
502
4.30k
  : fStream  (stream )
503
4.30k
  , fSpooler (spooler)
504
4.30k
  , fBug16   (bug16  )
505
  
506
4.30k
  , compInfoBuffer ()
507
4.30k
  , info           ()
508
4.30k
  , mcuBuffer1     ()
509
4.30k
  , mcuBuffer2     ()
510
4.30k
  , mcuBuffer3     ()
511
4.30k
  , mcuBuffer4     ()
512
  , mcuROW1      (NULL)
513
  , mcuROW2      (NULL)
514
4.30k
  , getBuffer      (0)
515
4.30k
  , bitsLeft     (0)
516
  
517
  #if qSupportHasselblad_3FR
518
4.30k
  , fHasselblad3FR (false)
519
  #endif
520
  
521
4.30k
  {
522
  
523
4.30k
  memset (&info, 0, sizeof (info));
524
  
525
4.30k
  }
526
527
/*****************************************************************************/
528
529
uint16 dng_lossless_decoder::Get2bytes ()
530
31.5k
  {
531
  
532
31.5k
    uint16 a = GetJpegChar ();
533
    
534
31.5k
    return (uint16) ((a << 8) + GetJpegChar ());
535
    
536
31.5k
  }
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
 
557
void dng_lossless_decoder::SkipVariable ()
558
6.95k
  {
559
  
560
6.95k
    uint32 length = Get2bytes () - 2;
561
    
562
6.95k
    fStream->Skip (length);
563
564
6.95k
  }
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
 
585
void dng_lossless_decoder::GetDht ()
586
9.80k
  {
587
  
588
9.80k
    int32 length = Get2bytes () - 2;
589
    
590
53.9k
    while (length > 0)
591
44.1k
      {
592
593
44.1k
    int32 index = GetJpegChar ();
594
      
595
44.1k
    if (index < 0 || index >= 4)
596
43
      {
597
43
        ThrowBadFormat ();
598
43
      }
599
600
44.1k
    HuffmanTable *&htblptr = info.dcHuffTblPtrs [index];
601
602
44.1k
    if (htblptr == NULL)
603
8.06k
      {
604
      
605
8.06k
      huffmanBuffer [index] . Allocate (sizeof (HuffmanTable));
606
      
607
8.06k
        htblptr = (HuffmanTable *) huffmanBuffer [index] . Buffer ();
608
        
609
8.06k
      }
610
611
44.1k
    htblptr->bits [0] = 0;
612
    
613
44.1k
      int32 count = 0;
614
      
615
749k
    for (int32 i = 1; i <= 16; i++)
616
705k
      {
617
      
618
705k
        htblptr->bits [i] = GetJpegChar ();
619
        
620
705k
        count += htblptr->bits [i];
621
        
622
705k
      }
623
624
44.1k
    if (count > 256) 
625
36
      {
626
36
        ThrowBadFormat ();
627
36
      }
628
629
740k
    for (int32 j = 0; j < count; j++)
630
695k
      {
631
      
632
695k
        htblptr->huffval [j] = GetJpegChar ();
633
        
634
695k
        }
635
636
44.1k
    length -= 1 + 16 + count;
637
638
44.1k
      }
639
      
640
9.80k
  }
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
661
void dng_lossless_decoder::GetDri ()
662
993
  {
663
  
664
993
    if (Get2bytes () != 4)
665
15
      {
666
15
    ThrowBadFormat ();
667
15
    }
668
    
669
993
    info.restartInterval = Get2bytes ();
670
671
993
  }
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
691
void dng_lossless_decoder::GetApp0 ()
692
221
  {
693
694
221
  SkipVariable ();
695
  
696
221
  }
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
 
718
void dng_lossless_decoder::GetSof (int32 /*code*/)
719
3.32k
  {
720
  
721
3.32k
    int32 length = Get2bytes ();
722
723
3.32k
    info.dataPrecision = GetJpegChar ();
724
3.32k
    info.imageHeight   = Get2bytes   ();
725
3.32k
    info.imageWidth    = Get2bytes   ();
726
3.32k
    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
3.32k
    if ((info.imageHeight   <= 0) ||
733
3.32k
    (info.imageWidth    <= 0) || 
734
3.32k
    (info.numComponents <= 0))
735
31
    {
736
31
    ThrowBadFormat ();
737
31
      }
738
739
  // Lossless JPEG specifies data precision to be from 2 to 16 bits/sample.
740
741
3.32k
  const int32 MinPrecisionBits = 2;
742
3.32k
  const int32 MaxPrecisionBits = 16;
743
744
3.32k
    if ((info.dataPrecision < MinPrecisionBits) ||
745
3.32k
        (info.dataPrecision > MaxPrecisionBits))
746
50
        {
747
50
    ThrowBadFormat ();
748
50
      }
749
      
750
    // Check length of tag.
751
752
3.32k
    if (length != (info.numComponents * 3 + 8))
753
22
      {
754
22
    ThrowBadFormat ();
755
22
      }
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
3.32k
    compInfoBuffer.Allocate (static_cast<uint32> (info.numComponents),
762
3.32k
                             sizeof (JpegComponentInfo));
763
    
764
3.32k
    info.compInfo = (JpegComponentInfo *) compInfoBuffer.Buffer ();
765
                   
766
    // Read in the per compent info.
767
768
12.9k
    for (int32 ci = 0; ci < info.numComponents; ci++)
769
9.58k
      {
770
      
771
9.58k
      JpegComponentInfo *compptr = &info.compInfo [ci];
772
      
773
9.58k
    compptr->componentIndex = (int16) ci;
774
    
775
9.58k
    compptr->componentId = GetJpegChar ();
776
    
777
9.58k
      int32 c = GetJpegChar ();
778
      
779
9.58k
    compptr->hSampFactor = (int16) ((c >> 4) & 15);
780
9.58k
    compptr->vSampFactor = (int16) ((c     ) & 15);
781
    
782
9.58k
        (void) GetJpegChar ();   /* skip Tq */
783
        
784
9.58k
      }
785
786
3.32k
  }
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
807
void dng_lossless_decoder::GetSos ()
808
2.89k
  {
809
  
810
2.89k
    int32 length = Get2bytes ();
811
812
    // Get the number of image components.
813
814
2.89k
    int32 n = GetJpegChar ();
815
2.89k
    info.compsInScan = (int16) n;
816
    
817
    // Check length.
818
    
819
2.89k
    length -= 3;
820
821
2.89k
    if (length != (n * 2 + 3) || n < 1 || n > 4)
822
15
      {
823
15
    ThrowBadFormat ();
824
15
    }
825
  
826
  // Find index and huffman table for each component.
827
828
11.4k
    for (int32 i = 0; i < n; i++)
829
8.58k
      {
830
      
831
8.58k
    int32 cc = GetJpegChar ();
832
8.58k
    int32 c  = GetJpegChar ();
833
    
834
8.58k
    int32 ci;
835
    
836
15.6k
    for (ci = 0; ci < info.numComponents; ci++)
837
15.6k
      {
838
      
839
15.6k
        if (cc == info.compInfo[ci].componentId)
840
8.50k
          {
841
8.50k
        break;
842
8.50k
          }
843
          
844
15.6k
        }
845
846
8.58k
    if (ci >= info.numComponents) 
847
44
      {
848
44
        ThrowBadFormat ();
849
44
      }
850
851
8.58k
      JpegComponentInfo *compptr = &info.compInfo [ci];
852
      
853
8.58k
    info.curCompInfo [i] = compptr;
854
    
855
8.58k
    compptr->dcTblNo = (int16) ((c >> 4) & 15);
856
    
857
8.58k
      }
858
859
    // Get the PSV, skip Se, and get the point transform parameter.
860
861
2.89k
    info.Ss = GetJpegChar (); 
862
    
863
2.89k
    (void) GetJpegChar ();
864
    
865
2.89k
    info.Pt = GetJpegChar () & 0x0F;
866
    
867
2.89k
  }
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
888
void dng_lossless_decoder::GetSoi ()
889
3.67k
  {
890
891
    // Reset all parameters that are defined to be reset by SOI
892
     
893
3.67k
    info.restartInterval = 0;
894
    
895
3.67k
  }
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
916
int32 dng_lossless_decoder::NextMarker ()
917
65.8k
  {
918
  
919
65.8k
    int32 c;
920
921
65.8k
    do
922
70.8k
      {
923
924
    // skip any non-FF bytes
925
    
926
70.8k
    do 
927
20.4M
      {
928
20.4M
        c = GetJpegChar ();
929
20.4M
      }
930
20.4M
    while (c != 0xFF);
931
    
932
    // skip any duplicate FFs, since extra FFs are legal
933
    
934
70.8k
    do 
935
1.22M
      {
936
1.22M
      c = GetJpegChar();
937
1.22M
      } 
938
1.22M
    while (c == 0xFF);
939
    
940
70.8k
    }
941
70.8k
  while (c == 0);    // repeat if it was a stuffed FF/00
942
943
65.8k
    return c;
944
    
945
65.8k
  }
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
966
JpegMarker dng_lossless_decoder::ProcessTables ()
967
6.82k
  {
968
  
969
65.8k
    while (true)
970
65.8k
      {
971
    
972
65.8k
    int32 c = NextMarker ();
973
  
974
65.8k
    switch (c)
975
65.8k
      {
976
      
977
260
      case M_SOF0:
978
278
      case M_SOF1:
979
293
      case M_SOF2:
980
3.35k
      case M_SOF3:
981
3.36k
      case M_SOF5:
982
3.38k
      case M_SOF6:
983
3.39k
      case M_SOF7:
984
3.40k
      case M_JPG:
985
3.41k
      case M_SOF9:
986
3.41k
      case M_SOF10:
987
3.43k
      case M_SOF11:
988
3.45k
      case M_SOF13:
989
3.45k
      case M_SOF14:
990
3.46k
      case M_SOF15:
991
3.48k
      case M_SOI:
992
3.54k
      case M_EOI:
993
6.44k
      case M_SOS:
994
6.44k
          return (JpegMarker) c;
995
996
9.80k
      case M_DHT:
997
9.80k
          GetDht ();
998
9.80k
          break;
999
1000
210
      case M_DQT:
1001
210
          break;
1002
1003
993
      case M_DRI:
1004
993
          GetDri ();
1005
993
          break;
1006
1007
221
      case M_APP0:
1008
221
          GetApp0 ();
1009
221
          break;
1010
1011
941
      case M_RST0:  // these are all parameterless
1012
2.75k
      case M_RST1:
1013
6.77k
      case M_RST2:
1014
11.0k
      case M_RST3:
1015
14.9k
      case M_RST4:
1016
17.6k
      case M_RST5:
1017
20.0k
      case M_RST6:
1018
21.7k
      case M_RST7:
1019
41.3k
      case M_TEM:
1020
41.3k
          break;
1021
1022
6.73k
      default:    // must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn
1023
6.73k
          SkipVariable ();
1024
6.73k
          break;
1025
          
1026
65.8k
      }
1027
      
1028
65.8k
      }
1029
1030
0
      return M_ERROR;
1031
6.82k
  }
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
 
1052
void dng_lossless_decoder::ReadFileHeader ()
1053
4.30k
  {
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
4.30k
    int32 c  = GetJpegChar ();
1059
4.30k
    int32 c2 = GetJpegChar ();
1060
    
1061
4.30k
    if ((c != 0xFF) || (c2 != M_SOI)) 
1062
617
      {
1063
617
    ThrowBadFormat ();
1064
617
      }
1065
      
1066
    // OK, process SOI
1067
1068
4.30k
    GetSoi ();
1069
1070
    // Process markers until SOF
1071
1072
4.30k
    c = ProcessTables ();
1073
1074
4.30k
    switch (c)
1075
4.30k
      {
1076
      
1077
251
    case M_SOF0:
1078
269
    case M_SOF1:
1079
3.32k
    case M_SOF3:
1080
3.32k
      GetSof (c);
1081
3.32k
      break;
1082
1083
109
      default:
1084
109
      ThrowBadFormat ();
1085
109
      break;
1086
      
1087
4.30k
      }
1088
1089
4.30k
  }
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
1109
int32 dng_lossless_decoder::ReadScanHeader ()
1110
3.15k
  {
1111
1112
    // Process markers until SOS or EOI
1113
1114
3.15k
    int32 c = ProcessTables ();
1115
1116
3.15k
    switch (c)
1117
3.15k
      {
1118
      
1119
2.89k
    case M_SOS:
1120
2.89k
      GetSos ();
1121
2.89k
      return 1;
1122
1123
50
      case M_EOI:
1124
50
      return 0;
1125
1126
62
      default:
1127
62
      ThrowBadFormat ();
1128
62
      break;
1129
      
1130
3.15k
      }
1131
      
1132
0
    return 0;
1133
    
1134
3.15k
  }
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
1155
void dng_lossless_decoder::DecoderStructInit ()
1156
2.83k
  {
1157
  
1158
2.83k
  int32 ci;
1159
  
1160
2.83k
  #if qSupportCanon_sRAW
1161
  
1162
2.83k
  bool canon_sRAW = (info.numComponents == 3) &&
1163
2.83k
            (info.compInfo [0].hSampFactor == 2) &&
1164
2.83k
            (info.compInfo [1].hSampFactor == 1) &&
1165
2.83k
            (info.compInfo [2].hSampFactor == 1) &&
1166
2.83k
            (info.compInfo [0].vSampFactor == 1) &&
1167
2.83k
            (info.compInfo [1].vSampFactor == 1) &&
1168
2.83k
            (info.compInfo [2].vSampFactor == 1) &&
1169
2.83k
            (info.dataPrecision == 15) &&
1170
2.83k
            (info.Ss == 1) &&
1171
2.83k
            ((info.imageWidth & 1) == 0);
1172
            
1173
2.83k
  bool canon_sRAW2 = (info.numComponents == 3) &&
1174
2.83k
             (info.compInfo [0].hSampFactor == 2) &&
1175
2.83k
             (info.compInfo [1].hSampFactor == 1) &&
1176
2.83k
             (info.compInfo [2].hSampFactor == 1) &&
1177
2.83k
             (info.compInfo [0].vSampFactor == 2) &&
1178
2.83k
             (info.compInfo [1].vSampFactor == 1) &&
1179
2.83k
             (info.compInfo [2].vSampFactor == 1) &&
1180
2.83k
             (info.dataPrecision == 15) &&
1181
2.83k
             (info.Ss == 1) &&
1182
2.83k
             ((info.imageWidth  & 1) == 0) &&
1183
2.83k
             ((info.imageHeight & 1) == 0);
1184
             
1185
2.83k
  if (!canon_sRAW && !canon_sRAW2)
1186
  
1187
2.62k
  #endif
1188
  
1189
2.62k
    {
1190
  
1191
    // Check sampling factor validity.
1192
1193
10.2k
    for (ci = 0; ci < info.numComponents; ci++)
1194
7.65k
      {
1195
      
1196
7.65k
      JpegComponentInfo *compPtr = &info.compInfo [ci];
1197
      
1198
7.65k
      if (compPtr->hSampFactor != 1 ||
1199
7.65k
        compPtr->vSampFactor != 1) 
1200
123
        {
1201
123
        ThrowBadFormat ();
1202
123
        }
1203
    
1204
7.65k
      }
1205
      
1206
2.62k
    }
1207
  
1208
    // Prepare array describing MCU composition.
1209
1210
2.83k
  if (info.compsInScan < 0 || info.compsInScan > 4)
1211
0
    {
1212
0
      ThrowBadFormat ();
1213
0
    }
1214
1215
10.9k
  for (ci = 0; ci < info.compsInScan; ci++)
1216
8.07k
    {
1217
8.07k
        info.MCUmembership [ci] = (int16) ci;
1218
8.07k
    }
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
2.83k
  int32 mcuSize = info.compsInScan * (uint32) sizeof (ComponentType);
1226
  
1227
2.83k
  mcuBuffer1.Allocate (info.imageWidth, sizeof (MCU));
1228
2.83k
  mcuBuffer2.Allocate (info.imageWidth, sizeof (MCU));
1229
  
1230
2.83k
  mcuROW1 = (MCU *) mcuBuffer1.Buffer ();
1231
2.83k
  mcuROW2 = (MCU *) mcuBuffer2.Buffer ();
1232
  
1233
2.83k
  mcuBuffer3.Allocate (info.imageWidth, mcuSize);
1234
2.83k
  mcuBuffer4.Allocate (info.imageWidth, mcuSize);
1235
  
1236
2.83k
  mcuROW1 [0] = (ComponentType *) mcuBuffer3.Buffer ();
1237
2.83k
  mcuROW2 [0] = (ComponentType *) mcuBuffer4.Buffer ();
1238
  
1239
907k
  for (int32 j = 1; j < info.imageWidth; j++)
1240
904k
    {
1241
    
1242
904k
    mcuROW1 [j] = mcuROW1 [j - 1] + info.compsInScan;
1243
904k
    mcuROW2 [j] = mcuROW2 [j - 1] + info.compsInScan;
1244
  
1245
904k
    }
1246
  
1247
2.83k
  }
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
1268
void dng_lossless_decoder::HuffDecoderInit ()
1269
2.71k
  {
1270
  
1271
    // Initialize bit parser state
1272
 
1273
2.71k
  getBuffer = 0;
1274
2.71k
    bitsLeft  = 0;
1275
    
1276
    // Prepare Huffman tables.
1277
1278
10.6k
    for (int16 ci = 0; ci < info.compsInScan; ci++)
1279
7.95k
      {
1280
      
1281
7.95k
    JpegComponentInfo *compptr = info.curCompInfo [ci];
1282
    
1283
    // Make sure requested tables are present
1284
    
1285
7.95k
    if (compptr->dcTblNo < 0 || compptr->dcTblNo > 3)
1286
18
      {
1287
18
      ThrowBadFormat ();
1288
18
      }
1289
1290
7.95k
    if (info.dcHuffTblPtrs [compptr->dcTblNo] == NULL) 
1291
36
      { 
1292
36
        ThrowBadFormat ();
1293
36
      }
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
7.95k
    FixHuffTbl (info.dcHuffTblPtrs [compptr->dcTblNo]);
1300
1301
7.95k
      }
1302
1303
    // Initialize restart stuff
1304
1305
2.71k
  info.restartInRows   = info.restartInterval / info.imageWidth;
1306
2.71k
    info.restartRowsToGo = info.restartInRows;
1307
2.71k
    info.nextRestartNum  = 0;
1308
    
1309
2.71k
  }
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
1329
void dng_lossless_decoder::ProcessRestart ()
1330
2.96k
  {
1331
  
1332
  // Throw away and unused odd bits in the bit buffer.
1333
  
1334
2.96k
  fStream->SetReadPosition (fStream->Position () - bitsLeft / 8);
1335
  
1336
2.96k
  bitsLeft  = 0;
1337
2.96k
  getBuffer = 0;
1338
  
1339
    // Scan for next JPEG marker
1340
1341
2.96k
    int32 c;
1342
1343
2.96k
    do
1344
3.96k
      {
1345
      
1346
    // skip any non-FF bytes
1347
    
1348
3.96k
    do 
1349
1.90M
      { 
1350
1.90M
        c = GetJpegChar ();
1351
1.90M
      }
1352
1.90M
    while (c != 0xFF);
1353
    
1354
    // skip any duplicate FFs
1355
    
1356
3.96k
    do
1357
302k
      {
1358
302k
      c = GetJpegChar ();
1359
302k
      }
1360
302k
    while (c == 0xFF);
1361
    
1362
3.96k
      }
1363
3.96k
    while (c == 0);    // repeat if it was a stuffed FF/00
1364
    
1365
    // Verify correct restart code.
1366
1367
2.96k
    if (c != (M_RST0 + info.nextRestartNum))
1368
42
      {
1369
42
    ThrowBadFormat ();
1370
42
      }
1371
1372
    // Update restart state.
1373
1374
2.96k
    info.restartRowsToGo = info.restartInRows;
1375
2.96k
    info.nextRestartNum  = (info.nextRestartNum + 1) & 7;
1376
    
1377
2.96k
  }
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
 
1402
inline int32 dng_lossless_decoder::QuickPredict (int32 col,
1403
                             int32 curComp,
1404
                             MCU *curRowBuf,
1405
                             MCU *prevRowBuf)
1406
150M
  {
1407
  
1408
150M
    int32 diag  = prevRowBuf [col - 1] [curComp];
1409
150M
    int32 upper = prevRowBuf [col    ] [curComp];
1410
150M
    int32 left  = curRowBuf  [col - 1] [curComp];
1411
1412
150M
    switch (info.Ss)
1413
150M
      {
1414
      
1415
4.00M
    case 0:
1416
4.00M
      return 0;
1417
      
1418
142M
    case 1:
1419
142M
      return left;
1420
1421
551k
    case 2:
1422
551k
      return upper;
1423
1424
373k
    case 3:
1425
373k
      return diag;
1426
1427
787k
    case 4:
1428
787k
      return left + upper - diag;
1429
1430
196k
    case 5:
1431
196k
      return left + ((upper - diag) >> 1);
1432
1433
293k
    case 6:
1434
293k
          return upper + ((left - diag) >> 1);
1435
1436
1.98M
    case 7:
1437
1.98M
            return (left + upper) >> 1;
1438
1439
25
    default:
1440
25
      {
1441
25
      ThrowBadFormat ();
1442
25
            return 0;
1443
0
            }
1444
              
1445
150M
      }
1446
     
1447
150M
  }
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
1468
inline void dng_lossless_decoder::FillBitBuffer (int32 nbits)
1469
34.4M
  {
1470
  
1471
34.4M
  const int32 kMinGetBits = sizeof (uint32) * 8 - 7;
1472
  
1473
34.4M
  #if qSupportHasselblad_3FR
1474
  
1475
34.4M
  if (fHasselblad3FR)
1476
2.14M
    {
1477
    
1478
4.29M
    while (bitsLeft < kMinGetBits)
1479
2.14M
      {
1480
      
1481
2.14M
      int32 c0 = GetJpegChar ();
1482
2.14M
      int32 c1 = GetJpegChar ();
1483
2.14M
      int32 c2 = GetJpegChar ();
1484
2.14M
      int32 c3 = GetJpegChar ();
1485
      
1486
2.14M
      getBuffer = (getBuffer << 8) | c3;
1487
2.14M
      getBuffer = (getBuffer << 8) | c2;
1488
2.14M
      getBuffer = (getBuffer << 8) | c1;
1489
2.14M
      getBuffer = (getBuffer << 8) | c0;
1490
      
1491
2.14M
      bitsLeft += 32;
1492
      
1493
2.14M
      }
1494
      
1495
2.14M
    return;
1496
    
1497
2.14M
    }
1498
  
1499
32.3M
  #endif
1500
  
1501
83.6M
    while (bitsLeft < kMinGetBits)
1502
75.7M
      {
1503
      
1504
75.7M
    int32 c = GetJpegChar ();
1505
1506
    // If it's 0xFF, check and discard stuffed zero byte
1507
1508
75.7M
    if (c == 0xFF)
1509
49.1M
      {
1510
      
1511
49.1M
      int32 c2 = GetJpegChar ();
1512
      
1513
49.1M
        if (c2 != 0)
1514
49.1M
          {
1515
1516
        // Oops, it's actually a marker indicating end of
1517
        // compressed data.  Better put it back for use later.
1518
1519
49.1M
        UnGetJpegChar ();
1520
49.1M
        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
49.1M
        if (bitsLeft >= nbits)
1526
24.3M
            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
24.7M
        c = 0;
1534
        
1535
24.7M
          }
1536
          
1537
49.1M
      }
1538
      
1539
51.3M
    getBuffer = (getBuffer << 8) | c;
1540
    
1541
51.3M
    bitsLeft += 8;
1542
    
1543
51.3M
      }
1544
 
1545
32.3M
  }
1546
1547
/*****************************************************************************/
1548
1549
inline int32 dng_lossless_decoder::show_bits8 ()
1550
207M
  {
1551
  
1552
207M
  if (bitsLeft < 8)
1553
26.1M
    FillBitBuffer (8);
1554
    
1555
207M
  return (int32) ((getBuffer >> (bitsLeft - 8)) & 0xff);
1556
  
1557
207M
  }
1558
1559
/*****************************************************************************/
1560
1561
inline void dng_lossless_decoder::flush_bits (int32 nbits)
1562
207M
  {
1563
  
1564
207M
  bitsLeft -= nbits;
1565
  
1566
207M
  }
1567
1568
/*****************************************************************************/
1569
1570
inline int32 dng_lossless_decoder::get_bits (int32 nbits)
1571
9.27M
  {
1572
  
1573
9.27M
  if (nbits > 16)
1574
247
    {
1575
247
    ThrowBadFormat ();
1576
247
    }
1577
  
1578
9.27M
  if (bitsLeft < nbits)
1579
2.08M
    FillBitBuffer (nbits);
1580
    
1581
9.27M
  return (int32) ((getBuffer >> (bitsLeft -= nbits)) & (0x0FFFF >> (16 - nbits)));
1582
  
1583
9.27M
  }
1584
1585
/*****************************************************************************/
1586
1587
inline int32 dng_lossless_decoder::get_bit ()
1588
85.0M
  {
1589
  
1590
85.0M
  if (!bitsLeft)
1591
6.22M
    FillBitBuffer (1);
1592
    
1593
85.0M
  return (int32) ((getBuffer >> (--bitsLeft)) & 1);
1594
  
1595
85.0M
  }
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
 
1616
inline int32 dng_lossless_decoder::HuffDecode (HuffmanTable *htbl)
1617
207M
  {
1618
  
1619
207M
  if (htbl == nullptr) {
1620
0
    ThrowBadFormat ();
1621
0
  }
1622
1623
    // If the huffman code is less than 8 bits, we can use the fast
1624
    // table lookup to get its value.  It's more than 8 bits about
1625
    // 3-4% of the time.
1626
1627
207M
    int32 code = show_bits8 ();
1628
    
1629
207M
    if (htbl->numbits [code])
1630
193M
      {
1631
      
1632
193M
    flush_bits (htbl->numbits [code]);
1633
    
1634
193M
    return htbl->value [code];
1635
    
1636
193M
      }
1637
      
1638
13.7M
    else
1639
13.7M
      {
1640
      
1641
13.7M
    flush_bits (8);
1642
    
1643
13.7M
    int32 l = 8;
1644
    
1645
98.7M
    while (code > htbl->maxcode [l]) 
1646
85.0M
      {
1647
85.0M
        code = (code << 1) | get_bit ();
1648
85.0M
        l++;
1649
85.0M
      }
1650
1651
    // With garbage input we may reach the sentinel value l = 17.
1652
1653
13.7M
    if (l > 16) 
1654
8.10M
      {
1655
8.10M
        return 0;   // fake a zero as the safest result
1656
8.10M
      }
1657
5.60M
    else
1658
5.60M
      {
1659
5.60M
        return htbl->huffval [htbl->valptr [l] +
1660
5.60M
                    ((int32) (code - htbl->mincode [l]))];
1661
5.60M
      }
1662
      
1663
13.7M
      }
1664
      
1665
207M
  }
1666
1667
/*****************************************************************************/
1668
1669
/*
1670
 *--------------------------------------------------------------
1671
 *
1672
 * HuffExtend --
1673
 *
1674
 *  Code and table for Figure F.12: extend sign bit
1675
 *
1676
 * Results:
1677
 *  The extended value.
1678
 *
1679
 * Side effects:
1680
 *  None.
1681
 *
1682
 *--------------------------------------------------------------
1683
 */
1684
1685
inline void dng_lossless_decoder::HuffExtend (int32 &x, int32 s)
1686
8.77M
  {
1687
1688
8.77M
  if (x < (0x08000 >> (16 - s)))
1689
7.75M
    {
1690
7.75M
    x += -(1 << s) + 1;
1691
7.75M
    }
1692
1693
8.77M
  }
1694
1695
/*****************************************************************************/
1696
1697
// Called from DecodeImage () to write one row.
1698
 
1699
void dng_lossless_decoder::PmPutRow (MCU *buf,
1700
                     int32 numComp,
1701
                     int32 numCol,
1702
                     int32 /* row */)
1703
16.0M
  {
1704
  
1705
16.0M
  uint16 *sPtr = &buf [0] [0];
1706
  
1707
16.0M
  uint32 pixels = numCol * numComp;
1708
  
1709
16.0M
  fSpooler->Spool (sPtr, pixels * (uint32) sizeof (uint16));
1710
    
1711
16.0M
  }
1712
1713
/*****************************************************************************/
1714
1715
/*
1716
 *--------------------------------------------------------------
1717
 *
1718
 * DecodeFirstRow --
1719
 *
1720
 *  Decode the first raster line of samples at the start of 
1721
 *      the scan and at the beginning of each restart interval.
1722
 *  This includes modifying the component value so the real
1723
 *      value, not the difference is returned.
1724
 *
1725
 * Results:
1726
 *  None.
1727
 *
1728
 * Side effects:
1729
 *  Bitstream is parsed.
1730
 *
1731
 *--------------------------------------------------------------
1732
 */
1733
 
1734
void dng_lossless_decoder::DecodeFirstRow (MCU *curRowBuf)
1735
4.97k
  {
1736
  
1737
4.97k
    int32 compsInScan = info.compsInScan;
1738
    
1739
    // Process the first column in the row.
1740
1741
19.8k
    for (int32 curComp = 0; curComp < compsInScan; curComp++) 
1742
14.8k
      {
1743
      
1744
14.8k
        int32 ci = info.MCUmembership [curComp];
1745
        
1746
14.8k
        JpegComponentInfo *compptr = info.curCompInfo [ci];
1747
        
1748
14.8k
        HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];
1749
1750
        // Section F.2.2.1: decode the difference
1751
1752
14.8k
      int32 d = 0;
1753
  
1754
14.8k
        int32 s = HuffDecode (dctbl);
1755
        
1756
14.8k
        if (s)
1757
7.71k
          {
1758
          
1759
7.71k
          if (s == 16 && !fBug16)
1760
217
            {
1761
217
            d = -32768;
1762
217
            }
1763
          
1764
7.50k
          else
1765
7.50k
            {
1766
7.50k
        d = get_bits (s);
1767
7.50k
              HuffExtend (d, s);
1768
7.50k
              }
1769
1770
7.71k
            }
1771
1772
    // Add the predictor to the difference.
1773
1774
14.8k
      int32 Pr = info.dataPrecision;
1775
14.8k
      int32 Pt = info.Pt;
1776
    
1777
14.8k
        curRowBuf [0] [curComp] = (ComponentType) (d + (1 << (Pr-Pt-1)));
1778
        
1779
14.8k
      }
1780
      
1781
    // Process the rest of the row.
1782
    
1783
4.97k
    int32 numCOL = info.imageWidth;
1784
    
1785
446k
    for (int32 col = 1; col < numCOL; col++)
1786
441k
      {
1787
1788
1.76M
        for (int32 curComp = 0; curComp < compsInScan; curComp++)
1789
1.32M
          {
1790
          
1791
1.32M
            int32 ci = info.MCUmembership [curComp];
1792
            
1793
1.32M
            JpegComponentInfo *compptr = info.curCompInfo [ci];
1794
            
1795
1.32M
            HuffmanTable *dctbl = info.dcHuffTblPtrs [compptr->dcTblNo];
1796
1797
      // Section F.2.2.1: decode the difference
1798
1799
1.32M
        int32 d = 0;
1800
    
1801
1.32M
          int32 s = HuffDecode (dctbl);
1802
          
1803
1.32M
          if (s)
1804
117k
            {
1805
1806
117k
            if (s == 16 && !fBug16)
1807
3.80k
              {
1808
3.80k
              d = -32768;
1809
3.80k
              }
1810
            
1811
113k
            else
1812
113k
              {
1813
113k
          d = get_bits (s);
1814
113k
                HuffExtend (d, s);
1815
113k
                }
1816
1817
117k
              }
1818
              
1819
      // Add the predictor to the difference.
1820
1821
1.32M
            curRowBuf [col] [curComp] = (ComponentType) (d + curRowBuf [col-1] [curComp]);
1822
            
1823
1.32M
          }
1824
          
1825
441k
      }
1826
      
1827
    // Update the restart counter
1828
1829
4.97k
    if (info.restartInRows)
1830
2.98k
      {
1831
2.98k
        info.restartRowsToGo--;
1832
2.98k
      }
1833
      
1834
4.97k
  }
1835
1836
/*****************************************************************************/
1837
1838
/*
1839
 *--------------------------------------------------------------
1840
 *
1841
 * DecodeImage --
1842
 *
1843
 *      Decode the input stream. This includes modifying
1844
 *      the component value so the real value, not the
1845
 *      difference is returned.
1846
 *
1847
 * Results:
1848
 *      None.
1849
 *
1850
 * Side effects:
1851
 *      Bitstream is parsed.
1852
 *
1853
 *--------------------------------------------------------------
1854
 */
1855
 
1856
void dng_lossless_decoder::DecodeImage ()
1857
2.59k
  {
1858
  
1859
14.6M
  #define swap(type,a,b) {type c; c=(a); (a)=(b); (b)=c;}
1860
1861
2.59k
    int32 numCOL      = info.imageWidth;
1862
2.59k
    int32 numROW    = info.imageHeight;
1863
2.59k
    int32 compsInScan = info.compsInScan;
1864
    
1865
    // Precompute the decoding table for each table.
1866
    
1867
2.59k
    HuffmanTable *ht [4];
1868
    
1869
10.3k
  for (int32 curComp = 0; curComp < compsInScan; curComp++)
1870
7.77k
      {
1871
      
1872
7.77k
        int32 ci = info.MCUmembership [curComp];
1873
        
1874
7.77k
        JpegComponentInfo *compptr = info.curCompInfo [ci];
1875
        
1876
7.77k
        ht [curComp] = info.dcHuffTblPtrs [compptr->dcTblNo];
1877
1878
7.77k
      }
1879
    
1880
2.59k
  MCU *prevRowBuf = mcuROW1;
1881
2.59k
  MCU *curRowBuf  = mcuROW2;
1882
  
1883
2.59k
  #if qSupportCanon_sRAW
1884
    
1885
  // Canon sRAW support
1886
  
1887
2.59k
  if (info.compInfo [0].hSampFactor == 2 &&
1888
2.59k
    info.compInfo [0].vSampFactor == 1)
1889
90
    {
1890
  
1891
625k
    for (int32 row = 0; row < numROW; row++)
1892
625k
      {
1893
      
1894
      // Initialize predictors.
1895
      
1896
625k
      int32 p0;
1897
625k
      int32 p1;
1898
625k
      int32 p2;
1899
      
1900
625k
      if (row == 0)
1901
90
        {
1902
90
        p0 = 1 << 14;
1903
90
        p1 = 1 << 14;
1904
90
        p2 = 1 << 14;
1905
90
        }
1906
        
1907
624k
      else
1908
624k
        {
1909
624k
        p0 = prevRowBuf [0] [0];
1910
624k
        p1 = prevRowBuf [0] [1];
1911
624k
        p2 = prevRowBuf [0] [2];
1912
624k
        }
1913
      
1914
1.28M
      for (int32 col = 0; col < numCOL; col += 2)
1915
657k
        {
1916
        
1917
        // Read first luminance component.
1918
        
1919
657k
          {
1920
        
1921
657k
          int32 d = 0;
1922
        
1923
657k
          int32 s = HuffDecode (ht [0]);
1924
          
1925
657k
          if (s)
1926
394k
            {
1927
1928
394k
            if (s == 16)
1929
66.4k
              {
1930
66.4k
              d = -32768;
1931
66.4k
              }
1932
            
1933
327k
            else
1934
327k
              {
1935
327k
              d = get_bits (s);
1936
327k
              HuffExtend (d, s);
1937
327k
              }
1938
1939
394k
            }
1940
            
1941
657k
          p0 += d;
1942
          
1943
657k
          curRowBuf [col] [0] = (ComponentType) p0;
1944
        
1945
657k
          }
1946
        
1947
        // Read second luminance component.
1948
        
1949
657k
          {
1950
        
1951
657k
          int32 d = 0;
1952
        
1953
657k
          int32 s = HuffDecode (ht [0]);
1954
          
1955
657k
          if (s)
1956
394k
            {
1957
1958
394k
            if (s == 16)
1959
66.3k
              {
1960
66.3k
              d = -32768;
1961
66.3k
              }
1962
            
1963
327k
            else
1964
327k
              {
1965
327k
              d = get_bits (s);
1966
327k
              HuffExtend (d, s);
1967
327k
              }
1968
1969
394k
            }
1970
            
1971
657k
          p0 += d;
1972
          
1973
657k
          curRowBuf [col + 1] [0] = (ComponentType) p0;
1974
        
1975
657k
          }
1976
        
1977
        // Read first chroma component.
1978
        
1979
657k
          {
1980
        
1981
657k
          int32 d = 0;
1982
        
1983
657k
          int32 s = HuffDecode (ht [1]);
1984
          
1985
657k
          if (s)
1986
198k
            {
1987
1988
198k
            if (s == 16)
1989
66.3k
              {
1990
66.3k
              d = -32768;
1991
66.3k
              }
1992
            
1993
131k
            else
1994
131k
              {
1995
131k
              d = get_bits (s);
1996
131k
              HuffExtend (d, s);
1997
131k
              }
1998
1999
198k
            }
2000
            
2001
657k
          p1 += d;
2002
          
2003
657k
          curRowBuf [col    ] [1] = (ComponentType) p1;
2004
657k
          curRowBuf [col + 1] [1] = (ComponentType) p1;
2005
        
2006
657k
          }
2007
        
2008
        // Read second chroma component.
2009
        
2010
657k
          {
2011
        
2012
657k
          int32 d = 0;
2013
        
2014
657k
          int32 s = HuffDecode (ht [2]);
2015
          
2016
657k
          if (s)
2017
361k
            {
2018
2019
361k
            if (s == 16)
2020
66.3k
              {
2021
66.3k
              d = -32768;
2022
66.3k
              }
2023
            
2024
295k
            else
2025
295k
              {
2026
295k
              d = get_bits (s);
2027
295k
              HuffExtend (d, s);
2028
295k
              }
2029
2030
361k
            }
2031
            
2032
657k
          p2 += d;
2033
          
2034
657k
          curRowBuf [col    ] [2] = (ComponentType) p2;
2035
657k
          curRowBuf [col + 1] [2] = (ComponentType) p2;
2036
        
2037
657k
          }
2038
                
2039
657k
        }
2040
      
2041
625k
      PmPutRow (curRowBuf, compsInScan, numCOL, row);
2042
2043
625k
      swap (MCU *, prevRowBuf, curRowBuf);
2044
      
2045
625k
      }
2046
      
2047
90
    return;
2048
    
2049
90
    }
2050
    
2051
2.50k
  if (info.compInfo [0].hSampFactor == 2 &&
2052
2.50k
    info.compInfo [0].vSampFactor == 2)
2053
114
    {
2054
  
2055
379k
    for (int32 row = 0; row < numROW; row += 2)
2056
379k
      {
2057
      
2058
      // Initialize predictors.
2059
      
2060
379k
      int32 p0;
2061
379k
      int32 p1;
2062
379k
      int32 p2;
2063
      
2064
379k
      if (row == 0)
2065
114
        {
2066
114
        p0 = 1 << 14;
2067
114
        p1 = 1 << 14;
2068
114
        p2 = 1 << 14;
2069
114
        }
2070
        
2071
379k
      else
2072
379k
        {
2073
379k
        p0 = prevRowBuf [0] [0];
2074
379k
        p1 = prevRowBuf [0] [1];
2075
379k
        p2 = prevRowBuf [0] [2];
2076
379k
        }
2077
      
2078
825k
      for (int32 col = 0; col < numCOL; col += 2)
2079
446k
        {
2080
        
2081
        // Read first luminance component.
2082
        
2083
446k
          {
2084
        
2085
446k
          int32 d = 0;
2086
        
2087
446k
          int32 s = HuffDecode (ht [0]);
2088
          
2089
446k
          if (s)
2090
304k
            {
2091
2092
304k
            if (s == 16)
2093
82.3k
              {
2094
82.3k
              d = -32768;
2095
82.3k
              }
2096
            
2097
221k
            else
2098
221k
              {
2099
221k
              d = get_bits (s);
2100
221k
              HuffExtend (d, s);
2101
221k
              }
2102
2103
304k
            }
2104
            
2105
446k
          p0 += d;
2106
          
2107
446k
          prevRowBuf [col] [0] = (ComponentType) p0;
2108
        
2109
446k
          }
2110
        
2111
        // Read second luminance component.
2112
        
2113
446k
          {
2114
        
2115
446k
          int32 d = 0;
2116
        
2117
446k
          int32 s = HuffDecode (ht [0]);
2118
          
2119
446k
          if (s)
2120
303k
            {
2121
2122
303k
            if (s == 16)
2123
82.3k
              {
2124
82.3k
              d = -32768;
2125
82.3k
              }
2126
            
2127
221k
            else
2128
221k
              {
2129
221k
              d = get_bits (s);
2130
221k
              HuffExtend (d, s);
2131
221k
              }
2132
2133
303k
            }
2134
            
2135
446k
          p0 += d;
2136
          
2137
446k
          prevRowBuf [col + 1] [0] = (ComponentType) p0;
2138
        
2139
446k
          }
2140
        
2141
        // Read third luminance component.
2142
        
2143
446k
          {
2144
        
2145
446k
          int32 d = 0;
2146
        
2147
446k
          int32 s = HuffDecode (ht [0]);
2148
          
2149
446k
          if (s)
2150
303k
            {
2151
2152
303k
            if (s == 16)
2153
82.3k
              {
2154
82.3k
              d = -32768;
2155
82.3k
              }
2156
            
2157
221k
            else
2158
221k
              {
2159
221k
              d = get_bits (s);
2160
221k
              HuffExtend (d, s);
2161
221k
              }
2162
2163
303k
            }
2164
            
2165
446k
          p0 += d;
2166
          
2167
446k
          curRowBuf [col] [0] = (ComponentType) p0;
2168
        
2169
446k
          }
2170
        
2171
        // Read fourth luminance component.
2172
        
2173
446k
          {
2174
        
2175
446k
          int32 d = 0;
2176
        
2177
446k
          int32 s = HuffDecode (ht [0]);
2178
          
2179
446k
          if (s)
2180
304k
            {
2181
2182
304k
            if (s == 16)
2183
82.2k
              {
2184
82.2k
              d = -32768;
2185
82.2k
              }
2186
            
2187
221k
            else
2188
221k
              {
2189
221k
              d = get_bits (s);
2190
221k
              HuffExtend (d, s);
2191
221k
              }
2192
2193
304k
            }
2194
            
2195
446k
          p0 += d;
2196
          
2197
446k
          curRowBuf [col + 1] [0] = (ComponentType) p0;
2198
        
2199
446k
          }
2200
        
2201
        // Read first chroma component.
2202
        
2203
446k
          {
2204
        
2205
446k
          int32 d = 0;
2206
        
2207
446k
          int32 s = HuffDecode (ht [1]);
2208
          
2209
446k
          if (s)
2210
164k
            {
2211
2212
164k
            if (s == 16)
2213
82.3k
              {
2214
82.3k
              d = -32768;
2215
82.3k
              }
2216
            
2217
82.1k
            else
2218
82.1k
              {
2219
82.1k
              d = get_bits (s);
2220
82.1k
              HuffExtend (d, s);
2221
82.1k
              }
2222
2223
164k
            }
2224
            
2225
446k
          p1 += d;
2226
          
2227
446k
          prevRowBuf [col    ] [1] = (ComponentType) p1;
2228
446k
          prevRowBuf [col + 1] [1] = (ComponentType) p1;
2229
2230
446k
          curRowBuf [col    ] [1] = (ComponentType) p1;
2231
446k
          curRowBuf [col + 1] [1] = (ComponentType) p1;
2232
        
2233
446k
          }
2234
        
2235
        // Read second chroma component.
2236
        
2237
446k
          {
2238
        
2239
446k
          int32 d = 0;
2240
        
2241
446k
          int32 s = HuffDecode (ht [2]);
2242
          
2243
446k
          if (s)
2244
164k
            {
2245
2246
164k
            if (s == 16)
2247
82.3k
              {
2248
82.3k
              d = -32768;
2249
82.3k
              }
2250
            
2251
82.2k
            else
2252
82.2k
              {
2253
82.2k
              d = get_bits (s);
2254
82.2k
              HuffExtend (d, s);
2255
82.2k
              }
2256
2257
164k
            }
2258
            
2259
446k
          p2 += d;
2260
          
2261
446k
          prevRowBuf [col    ] [2] = (ComponentType) p2;
2262
446k
          prevRowBuf [col + 1] [2] = (ComponentType) p2;
2263
        
2264
446k
          curRowBuf [col    ] [2] = (ComponentType) p2;
2265
446k
          curRowBuf [col + 1] [2] = (ComponentType) p2;
2266
        
2267
446k
          }
2268
                
2269
446k
        }
2270
      
2271
379k
      PmPutRow (prevRowBuf, compsInScan, numCOL, row);
2272
379k
      PmPutRow (curRowBuf, compsInScan, numCOL, row);
2273
2274
379k
      }
2275
      
2276
114
    return;
2277
    
2278
114
    }
2279
2280
2.38k
  #endif
2281
  
2282
2.38k
  #if qSupportHasselblad_3FR
2283
  
2284
2.38k
  if (info.Ss == 8 && (numCOL & 1) == 0)
2285
326
    {
2286
    
2287
326
    fHasselblad3FR = true;
2288
    
2289
622k
    for (int32 row = 0; row < numROW; row++)
2290
621k
      {
2291
      
2292
621k
      int32 p0 = 32768;
2293
621k
      int32 p1 = 32768;
2294
      
2295
4.54M
      for (int32 col = 0; col < numCOL; col += 2)
2296
3.92M
        {
2297
        
2298
3.92M
        int32 s0 = HuffDecode (ht [0]);
2299
3.92M
        int32 s1 = HuffDecode (ht [0]);
2300
        
2301
3.92M
        if (s0)
2302
1.17M
          {
2303
1.17M
          int32 d = get_bits (s0);
2304
1.17M
          if (s0 == 16)
2305
250k
            {
2306
250k
            d = -32768;
2307
250k
            }
2308
920k
          else
2309
920k
            {
2310
920k
            HuffExtend (d, s0);
2311
920k
            }
2312
1.17M
          p0 += d;
2313
1.17M
          }
2314
2315
3.92M
        if (s1)
2316
1.38M
          {
2317
1.38M
          int32 d = get_bits (s1);
2318
1.38M
          if (s1 == 16)
2319
247k
            {
2320
247k
            d = -32768;
2321
247k
            }
2322
1.13M
          else
2323
1.13M
            {
2324
1.13M
            HuffExtend (d, s1);
2325
1.13M
            }
2326
1.38M
          p1 += d;
2327
1.38M
          }
2328
2329
3.92M
        curRowBuf [col    ] [0] = (ComponentType) p0;
2330
3.92M
        curRowBuf [col + 1] [0] = (ComponentType) p1;
2331
        
2332
3.92M
        }
2333
      
2334
621k
      PmPutRow (curRowBuf, compsInScan, numCOL, row);
2335
2336
621k
      }
2337
2338
326
    return;
2339
    
2340
326
    }
2341
  
2342
2.06k
  #endif
2343
  
2344
    // Decode the first row of image. Output the row and
2345
    // turn this row into a previous row for later predictor
2346
    // calculation.
2347
2348
2.06k
    DecodeFirstRow (mcuROW1);
2349
    
2350
2.06k
    PmPutRow (mcuROW1, compsInScan, numCOL, 0);
2351
    
2352
  // Process each row.
2353
2354
14.0M
    for (int32 row = 1; row < numROW; row++)
2355
14.0M
      {
2356
2357
        // Account for restart interval, process restart marker if needed.
2358
2359
14.0M
    if (info.restartInRows)
2360
117k
      {
2361
      
2362
117k
      if (info.restartRowsToGo == 0)
2363
2.96k
        {
2364
        
2365
2.96k
        ProcessRestart ();
2366
            
2367
                // Reset predictors at restart.
2368
                
2369
2.96k
        DecodeFirstRow (curRowBuf);
2370
        
2371
2.96k
        PmPutRow (curRowBuf, compsInScan, numCOL, row);
2372
        
2373
2.96k
        swap (MCU *, prevRowBuf, curRowBuf);
2374
        
2375
2.96k
        continue;
2376
        
2377
2.96k
              }
2378
              
2379
114k
      info.restartRowsToGo--;
2380
           
2381
114k
      }
2382
      
2383
    // The upper neighbors are predictors for the first column.
2384
2385
56.1M
        for (int32 curComp = 0; curComp < compsInScan; curComp++)
2386
42.1M
          {
2387
          
2388
          // Section F.2.2.1: decode the difference
2389
2390
42.1M
        int32 d = 0;
2391
    
2392
42.1M
          int32 s = HuffDecode (ht [curComp]);
2393
          
2394
42.1M
          if (s)
2395
1.15M
            {
2396
2397
1.15M
            if (s == 16 && !fBug16)
2398
99.8k
              {
2399
99.8k
              d = -32768;
2400
99.8k
              }
2401
            
2402
1.05M
            else
2403
1.05M
              {
2404
1.05M
          d = get_bits (s);
2405
1.05M
                HuffExtend (d, s);
2406
1.05M
                }
2407
2408
1.15M
              }
2409
              
2410
          // First column of row above is predictor for first column.
2411
2412
42.1M
            curRowBuf [0] [curComp] = (ComponentType) (d + prevRowBuf [0] [curComp]);
2413
            
2414
42.1M
      }
2415
2416
        // For the rest of the column on this row, predictor
2417
        // calculations are based on PSV. 
2418
2419
14.0M
      if (compsInScan == 2 && info.Ss == 1 && numCOL > 1)
2420
0
        {
2421
        
2422
        // This is the combination used by both the Canon and Kodak raw formats. 
2423
        // Unrolling the general case logic results in a significant speed increase.
2424
        
2425
0
        uint16 *dPtr = &curRowBuf [1] [0];
2426
        
2427
0
        int32 prev0 = dPtr [-2];
2428
0
        int32 prev1 = dPtr [-1];
2429
        
2430
0
      for (int32 col = 1; col < numCOL; col++)
2431
0
            {
2432
            
2433
0
            int32 s = HuffDecode (ht [0]);
2434
            
2435
0
            if (s)
2436
0
              {
2437
              
2438
0
              int32 d;
2439
2440
0
              if (s == 16 && !fBug16)
2441
0
                {
2442
0
                d = -32768;
2443
0
                }
2444
              
2445
0
              else
2446
0
                {
2447
0
            d = get_bits (s);
2448
0
                  HuffExtend (d, s);
2449
0
                  }
2450
2451
0
              prev0 += d;
2452
              
2453
0
                }
2454
                
2455
0
            s = HuffDecode (ht [1]);
2456
            
2457
0
            if (s)
2458
0
              {
2459
              
2460
0
              int32 d;
2461
2462
0
              if (s == 16 && !fBug16)
2463
0
                {
2464
0
                d = -32768;
2465
0
                }
2466
              
2467
0
              else
2468
0
                {
2469
0
            d = get_bits (s);
2470
0
                  HuffExtend (d, s);
2471
0
                  }
2472
2473
0
          prev1 += d;
2474
          
2475
0
                }
2476
            
2477
0
        dPtr [0] = (uint16) prev0;
2478
0
        dPtr [1] = (uint16) prev1;
2479
        
2480
0
        dPtr += 2;
2481
        
2482
0
            }
2483
            
2484
0
          }
2485
          
2486
14.0M
        else
2487
14.0M
          {
2488
          
2489
64.3M
      for (int32 col = 1; col < numCOL; col++)
2490
50.3M
            {
2491
            
2492
201M
              for (int32 curComp = 0; curComp < compsInScan; curComp++)
2493
150M
                {
2494
                
2495
              // Section F.2.2.1: decode the difference
2496
2497
150M
            int32 d = 0;
2498
        
2499
150M
              int32 s = HuffDecode (ht [curComp]);
2500
              
2501
150M
              if (s)
2502
3.75M
                {
2503
                
2504
3.75M
                if (s == 16 && !fBug16)
2505
338k
                  {
2506
338k
                  d = -32768;
2507
338k
                  }
2508
                
2509
3.41M
                else
2510
3.41M
                  {
2511
3.41M
              d = get_bits (s);
2512
3.41M
                    HuffExtend (d, s);
2513
3.41M
                    }
2514
2515
3.75M
                  }
2516
                  
2517
              // Predict the pixel value.
2518
                
2519
150M
                  int32 predictor = QuickPredict (col,
2520
150M
                                    curComp,
2521
150M
                                    curRowBuf,
2522
150M
                                    prevRowBuf);
2523
                                  
2524
                  // Save the difference.
2525
2526
150M
                  curRowBuf [col] [curComp] = (ComponentType) (d + predictor);
2527
                  
2528
150M
          }
2529
          
2530
50.3M
        }
2531
2532
14.0M
          }
2533
2534
14.0M
    PmPutRow (curRowBuf, compsInScan, numCOL, row);
2535
    
2536
14.0M
    swap (MCU *, prevRowBuf, curRowBuf);
2537
    
2538
14.0M
      }
2539
      
2540
2.06k
    #undef swap
2541
  
2542
2.06k
  }
2543
2544
/*****************************************************************************/
2545
2546
void dng_lossless_decoder::StartRead (uint32 &imageWidth,
2547
                      uint32 &imageHeight,
2548
                      uint32 &imageChannels)
2549
4.30k
  { 
2550
  
2551
4.30k
  ReadFileHeader    ();
2552
4.30k
  ReadScanHeader    ();
2553
4.30k
  DecoderStructInit ();
2554
4.30k
  HuffDecoderInit   ();
2555
  
2556
4.30k
  imageWidth    = info.imageWidth;
2557
4.30k
  imageHeight   = info.imageHeight;
2558
4.30k
  imageChannels = info.compsInScan;
2559
  
2560
4.30k
  }
2561
2562
/*****************************************************************************/
2563
2564
void dng_lossless_decoder::FinishRead ()
2565
2.59k
  {
2566
  
2567
2.59k
  DecodeImage ();
2568
    
2569
2.59k
  }
2570
2571
/*****************************************************************************/
2572
2573
void DecodeLosslessJPEG (dng_stream &stream,
2574
               dng_spooler &spooler,
2575
               uint32 minDecodedSize,
2576
               uint32 maxDecodedSize,
2577
             bool bug16)
2578
4.30k
  {
2579
  
2580
4.30k
  dng_lossless_decoder decoder (&stream,
2581
4.30k
                    &spooler,
2582
4.30k
                    bug16);
2583
  
2584
4.30k
  uint32 imageWidth;
2585
4.30k
  uint32 imageHeight;
2586
4.30k
  uint32 imageChannels;
2587
  
2588
4.30k
  decoder.StartRead (imageWidth,
2589
4.30k
             imageHeight,
2590
4.30k
             imageChannels);
2591
             
2592
4.30k
  uint32 decodedSize = imageWidth    *
2593
4.30k
             imageHeight   *
2594
4.30k
             imageChannels *
2595
4.30k
             (uint32) sizeof (uint16);
2596
             
2597
4.30k
  if (decodedSize < minDecodedSize ||
2598
4.30k
    decodedSize > maxDecodedSize)
2599
41
    {
2600
41
    ThrowBadFormat ();
2601
41
    }
2602
  
2603
4.30k
  decoder.FinishRead ();
2604
  
2605
4.30k
  }
2606
2607
/*****************************************************************************/
2608
2609
class dng_lossless_encoder
2610
  {
2611
  
2612
  private:
2613
  
2614
    const uint16 *fSrcData;
2615
    
2616
    uint32 fSrcRows;
2617
    uint32 fSrcCols;
2618
    uint32 fSrcChannels;
2619
    uint32 fSrcBitDepth;
2620
    
2621
    int32 fSrcRowStep;
2622
    int32 fSrcColStep;
2623
  
2624
    dng_stream &fStream;
2625
  
2626
    HuffmanTable huffTable [4];
2627
    
2628
    uint32 freqCount [4] [257];
2629
    
2630
    // Current bit-accumulation buffer
2631
2632
    int32 huffPutBuffer;
2633
    int32 huffPutBits;
2634
    
2635
    // Lookup table for number of bits in an 8 bit value.
2636
    
2637
    int numBitsTable [256];
2638
    
2639
  public:
2640
  
2641
    dng_lossless_encoder (const uint16 *srcData,
2642
                  uint32 srcRows,
2643
                  uint32 srcCols,
2644
                  uint32 srcChannels,
2645
                  uint32 srcBitDepth,
2646
                  int32 srcRowStep,
2647
                  int32 srcColStep,
2648
                  dng_stream &stream);
2649
    
2650
    void Encode ();
2651
    
2652
  private:
2653
  
2654
    void EmitByte (uint8 value);
2655
  
2656
    void EmitBits (int code, int size);
2657
2658
    void FlushBits ();
2659
2660
    void CountOneDiff (int diff, uint32 *countTable);
2661
2662
    void EncodeOneDiff (int diff, HuffmanTable *dctbl);
2663
    
2664
    void FreqCountSet ();
2665
2666
    void HuffEncode ();
2667
2668
    void GenHuffCoding (HuffmanTable *htbl, uint32 *freq);
2669
2670
    void HuffOptimize ();
2671
2672
    void EmitMarker (JpegMarker mark);
2673
2674
    void Emit2bytes (int value);
2675
2676
    void EmitDht (int index);
2677
2678
    void EmitSof (JpegMarker code);
2679
2680
    void EmitSos ();
2681
2682
    void WriteFileHeader ();
2683
2684
    void WriteScanHeader ();
2685
2686
    void WriteFileTrailer ();
2687
2688
  };
2689
  
2690
/*****************************************************************************/
2691
2692
dng_lossless_encoder::dng_lossless_encoder (const uint16 *srcData,
2693
                      uint32 srcRows,
2694
                      uint32 srcCols,
2695
                      uint32 srcChannels,
2696
                      uint32 srcBitDepth,
2697
                      int32 srcRowStep,
2698
                      int32 srcColStep,
2699
                      dng_stream &stream)
2700
                    
2701
70.3k
  : fSrcData     (srcData    )
2702
70.3k
  , fSrcRows     (srcRows    )
2703
70.3k
  , fSrcCols     (srcCols    )
2704
70.3k
  , fSrcChannels (srcChannels)
2705
70.3k
  , fSrcBitDepth (srcBitDepth)
2706
70.3k
  , fSrcRowStep  (srcRowStep )
2707
70.3k
  , fSrcColStep  (srcColStep )
2708
70.3k
  , fStream      (stream     )
2709
  
2710
70.3k
  , huffPutBuffer (0)
2711
70.3k
  , huffPutBits   (0)
2712
  
2713
70.3k
  {
2714
  
2715
    // Initialize number of bits lookup table.
2716
    
2717
70.3k
    numBitsTable [0] = 0;
2718
      
2719
18.0M
    for (int i = 1; i < 256; i++)
2720
17.9M
      {
2721
      
2722
17.9M
    int temp = i;
2723
17.9M
    int nbits = 1;
2724
    
2725
126M
    while (temp >>= 1)
2726
108M
      {
2727
108M
        nbits++;
2728
108M
      }
2729
      
2730
17.9M
    numBitsTable [i] = nbits;
2731
    
2732
17.9M
      }
2733
      
2734
70.3k
  }
2735
2736
/*****************************************************************************/
2737
2738
inline void dng_lossless_encoder::EmitByte (uint8 value)
2739
1.06G
  {
2740
  
2741
1.06G
  fStream.Put_uint8 (value);
2742
  
2743
1.06G
  }
2744
  
2745
/*****************************************************************************/
2746
2747
/*
2748
 *--------------------------------------------------------------
2749
 *
2750
 * EmitBits --
2751
 *
2752
 *  Code for outputting bits to the file
2753
 *
2754
 *  Only the right 24 bits of huffPutBuffer are used; the valid
2755
 *  bits are left-justified in this part.  At most 16 bits can be
2756
 *  passed to EmitBits in one call, and we never retain more than 7
2757
 *  bits in huffPutBuffer between calls, so 24 bits are
2758
 *  sufficient.
2759
 *
2760
 * Results:
2761
 *  None.
2762
 *
2763
 * Side effects:
2764
 *  huffPutBuffer and huffPutBits are updated.
2765
 *
2766
 *--------------------------------------------------------------
2767
 */
2768
 
2769
inline void dng_lossless_encoder::EmitBits (int code, int size)
2770
2.19G
  {
2771
  
2772
2.19G
    DNG_ASSERT (size != 0, "Bad Huffman table entry");
2773
2774
2.19G
    int putBits   = size;
2775
2.19G
  int putBuffer = code;
2776
    
2777
2.19G
    putBits += huffPutBits;
2778
    
2779
2.19G
    putBuffer <<= 24 - putBits;
2780
2.19G
    putBuffer |= huffPutBuffer;
2781
2782
3.24G
    while (putBits >= 8)
2783
1.05G
      {
2784
      
2785
1.05G
    uint8 c = (uint8) (putBuffer >> 16);
2786
2787
    // Output whole bytes we've accumulated with byte stuffing
2788
2789
1.05G
    EmitByte (c);
2790
    
2791
1.05G
    if (c == 0xFF)
2792
3.68M
      {
2793
3.68M
        EmitByte (0);
2794
3.68M
      }
2795
2796
1.05G
    putBuffer <<= 8;
2797
1.05G
    putBits -= 8;
2798
    
2799
1.05G
      }
2800
2801
2.19G
    huffPutBuffer = putBuffer;
2802
2.19G
    huffPutBits   = putBits;
2803
    
2804
2.19G
  }
2805
2806
/*****************************************************************************/
2807
2808
/*
2809
 *--------------------------------------------------------------
2810
 *
2811
 * FlushBits --
2812
 *
2813
 *  Flush any remaining bits in the bit buffer. Used before emitting
2814
 *  a marker.
2815
 *
2816
 * Results:
2817
 *  None.
2818
 *
2819
 * Side effects:
2820
 *  huffPutBuffer and huffPutBits are reset
2821
 *
2822
 *--------------------------------------------------------------
2823
 */
2824
2825
void dng_lossless_encoder::FlushBits ()
2826
70.3k
  {
2827
  
2828
    // The first call forces output of any partial bytes.
2829
2830
70.3k
    EmitBits (0x007F, 7);
2831
    
2832
    // We can then zero the buffer.
2833
2834
70.3k
    huffPutBuffer = 0;
2835
70.3k
    huffPutBits   = 0;
2836
    
2837
70.3k
  }
2838
2839
/*****************************************************************************/
2840
2841
/*
2842
 *--------------------------------------------------------------
2843
 *
2844
 * CountOneDiff --
2845
 *
2846
 *      Count the difference value in countTable.
2847
 *
2848
 * Results:
2849
 *      diff is counted in countTable.
2850
 *
2851
 * Side effects:
2852
 *      None. 
2853
 *
2854
 *--------------------------------------------------------------
2855
 */
2856
2857
inline void dng_lossless_encoder::CountOneDiff (int diff, uint32 *countTable)
2858
1.74G
  {
2859
  
2860
    // Encode the DC coefficient difference per section F.1.2.1
2861
     
2862
1.74G
    int temp = diff;
2863
    
2864
1.74G
    if (temp < 0)
2865
220M
      {
2866
      
2867
220M
    temp = -temp;
2868
 
2869
220M
      }
2870
2871
    // Find the number of bits needed for the magnitude of the coefficient
2872
2873
1.74G
    int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
2874
1.74G
                : numBitsTable [temp & 0xFF];
2875
          
2876
    // Update count for this bit length
2877
2878
1.74G
    countTable [nbits] ++;
2879
    
2880
1.74G
  }
2881
2882
/*****************************************************************************/
2883
2884
/*
2885
 *--------------------------------------------------------------
2886
 *
2887
 * EncodeOneDiff --
2888
 *
2889
 *  Encode a single difference value.
2890
 *
2891
 * Results:
2892
 *  None.
2893
 *
2894
 * Side effects:
2895
 *  None.
2896
 *
2897
 *--------------------------------------------------------------
2898
 */
2899
2900
inline void dng_lossless_encoder::EncodeOneDiff (int diff, HuffmanTable *dctbl)
2901
1.74G
  {
2902
2903
    // Encode the DC coefficient difference per section F.1.2.1
2904
     
2905
1.74G
    int temp  = diff;
2906
1.74G
    int temp2 = diff;
2907
    
2908
1.74G
    if (temp < 0)
2909
220M
      {
2910
      
2911
220M
    temp = -temp;
2912
    
2913
    // For a negative input, want temp2 = bitwise complement of
2914
    // abs (input).  This code assumes we are on a two's complement
2915
    // machine.
2916
2917
220M
    temp2--;
2918
    
2919
220M
      }
2920
2921
    // Find the number of bits needed for the magnitude of the coefficient
2922
2923
1.74G
    int nbits = temp >= 256 ? numBitsTable [temp >> 8  ] + 8
2924
1.74G
                : numBitsTable [temp & 0xFF];
2925
2926
    // Emit the Huffman-coded symbol for the number of bits
2927
2928
1.74G
    EmitBits (dctbl->ehufco [nbits],
2929
1.74G
          dctbl->ehufsi [nbits]);
2930
2931
    // Emit that number of bits of the value, if positive,
2932
    // or the complement of its magnitude, if negative.
2933
    
2934
    // If the number of bits is 16, there is only one possible difference
2935
    // value (-32786), so the lossless JPEG spec says not to output anything
2936
    // in that case.  So we only need to output the diference value if
2937
    // the number of bits is between 1 and 15.
2938
2939
1.74G
    if (nbits & 15)
2940
445M
      {
2941
      
2942
445M
    EmitBits (temp2 & (0x0FFFF >> (16 - nbits)),
2943
445M
          nbits);
2944
    
2945
445M
    }
2946
2947
1.74G
  }
2948
2949
/*****************************************************************************/
2950
2951
/*
2952
 *--------------------------------------------------------------
2953
 *
2954
 * FreqCountSet --
2955
 *
2956
 *      Count the times each category symbol occurs in this image.
2957
 *
2958
 * Results:
2959
 *  None.
2960
 *
2961
 * Side effects:
2962
 *  The freqCount has counted all category 
2963
 *  symbols appeared in the image.        
2964
 *
2965
 *--------------------------------------------------------------
2966
 */
2967
2968
void dng_lossless_encoder::FreqCountSet ()
2969
70.3k
  {
2970
    
2971
70.3k
  memset (freqCount, 0, sizeof (freqCount));
2972
  
2973
70.3k
  DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::FreqCountSet: fSrcRpws too large.");
2974
2975
18.4M
    for (int32 row = 0; row < (int32)fSrcRows; row++)
2976
18.3M
      {
2977
      
2978
18.3M
    const uint16 *sPtr = fSrcData + row * fSrcRowStep;
2979
    
2980
    // Initialize predictors for this row.
2981
    
2982
18.3M
    int32 predictor [4];
2983
    
2984
40.6M
    for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
2985
22.3M
      {
2986
      
2987
22.3M
      if (row == 0)
2988
110k
        predictor [channel] = 1 << (fSrcBitDepth - 1);
2989
        
2990
22.2M
      else
2991
22.2M
        predictor [channel] = sPtr [channel - fSrcRowStep];
2992
      
2993
22.3M
      }
2994
      
2995
    // Unroll most common case of two channels
2996
    
2997
18.3M
    if (fSrcChannels == 2)
2998
41.0k
      {
2999
      
3000
41.0k
      int32 pred0 = predictor [0];
3001
41.0k
      int32 pred1 = predictor [1];
3002
      
3003
41.0k
      uint32 srcCols    = fSrcCols;
3004
41.0k
      int32  srcColStep = fSrcColStep;
3005
      
3006
5.72M
        for (uint32 col = 0; col < srcCols; col++)
3007
5.68M
          {
3008
          
3009
5.68M
          int32 pixel0 = sPtr [0];
3010
5.68M
        int32 pixel1 = sPtr [1];
3011
          
3012
5.68M
          int16 diff0 = (int16) (pixel0 - pred0);
3013
5.68M
          int16 diff1 = (int16) (pixel1 - pred1);
3014
          
3015
5.68M
          CountOneDiff (diff0, freqCount [0]);
3016
5.68M
          CountOneDiff (diff1, freqCount [1]);
3017
          
3018
5.68M
          pred0 = pixel0;
3019
5.68M
          pred1 = pixel1;
3020
            
3021
5.68M
          sPtr += srcColStep;
3022
            
3023
5.68M
          }
3024
      
3025
41.0k
      }
3026
      
3027
    // General case.
3028
      
3029
18.2M
    else
3030
18.2M
      {
3031
      
3032
1.33G
        for (uint32 col = 0; col < fSrcCols; col++)
3033
1.31G
          {
3034
          
3035
3.05G
          for (uint32 channel = 0; channel < fSrcChannels; channel++)
3036
1.73G
            {
3037
            
3038
1.73G
            int32 pixel = sPtr [channel];
3039
            
3040
1.73G
            int16 diff = (int16) (pixel - predictor [channel]);
3041
            
3042
1.73G
            CountOneDiff (diff, freqCount [channel]);
3043
            
3044
1.73G
            predictor [channel] = pixel;
3045
            
3046
1.73G
            }
3047
            
3048
1.31G
          sPtr += fSrcColStep;
3049
            
3050
1.31G
          }
3051
          
3052
18.2M
        }
3053
        
3054
18.3M
      }
3055
3056
70.3k
  }
3057
3058
/*****************************************************************************/
3059
3060
/*
3061
 *--------------------------------------------------------------
3062
 *
3063
 * HuffEncode --
3064
 *
3065
 *      Encode and output Huffman-compressed image data.
3066
 *
3067
 * Results:
3068
 *      None.
3069
 *
3070
 * Side effects:
3071
 *      None.
3072
 *
3073
 *--------------------------------------------------------------
3074
 */
3075
3076
void dng_lossless_encoder::HuffEncode ()
3077
70.3k
  {
3078
    
3079
70.3k
  DNG_ASSERT ((int32)fSrcRows >= 0, "dng_lossless_encoder::HuffEncode: fSrcRows too large.");
3080
3081
18.4M
  for (int32 row = 0; row < (int32)fSrcRows; row++)
3082
18.3M
      {
3083
      
3084
18.3M
    const uint16 *sPtr = fSrcData + row * fSrcRowStep;
3085
    
3086
    // Initialize predictors for this row.
3087
    
3088
18.3M
    int32 predictor [4];
3089
    
3090
40.6M
    for (int32 channel = 0; channel < (int32)fSrcChannels; channel++)
3091
22.3M
      {
3092
      
3093
22.3M
      if (row == 0)
3094
110k
        predictor [channel] = 1 << (fSrcBitDepth - 1);
3095
        
3096
22.2M
      else
3097
22.2M
        predictor [channel] = sPtr [channel - fSrcRowStep];
3098
      
3099
22.3M
      }
3100
      
3101
    // Unroll most common case of two channels
3102
    
3103
18.3M
    if (fSrcChannels == 2)
3104
41.0k
      {
3105
      
3106
41.0k
      int32 pred0 = predictor [0];
3107
41.0k
      int32 pred1 = predictor [1];
3108
      
3109
41.0k
      uint32 srcCols    = fSrcCols;
3110
41.0k
      int32  srcColStep = fSrcColStep;
3111
      
3112
5.72M
        for (uint32 col = 0; col < srcCols; col++)
3113
5.68M
          {
3114
          
3115
5.68M
          int32 pixel0 = sPtr [0];
3116
5.68M
        int32 pixel1 = sPtr [1];
3117
          
3118
5.68M
          int16 diff0 = (int16) (pixel0 - pred0);
3119
5.68M
          int16 diff1 = (int16) (pixel1 - pred1);
3120
          
3121
5.68M
          EncodeOneDiff (diff0, &huffTable [0]);
3122
5.68M
          EncodeOneDiff (diff1, &huffTable [1]);
3123
          
3124
5.68M
          pred0 = pixel0;
3125
5.68M
          pred1 = pixel1;
3126
            
3127
5.68M
          sPtr += srcColStep;
3128
            
3129
5.68M
          }
3130
      
3131
41.0k
      }
3132
      
3133
    // General case.
3134
      
3135
18.2M
    else
3136
18.2M
      {
3137
      
3138
1.33G
        for (uint32 col = 0; col < fSrcCols; col++)
3139
1.31G
          {
3140
          
3141
3.05G
          for (uint32 channel = 0; channel < fSrcChannels; channel++)
3142
1.73G
            {
3143
            
3144
1.73G
            int32 pixel = sPtr [channel];
3145
            
3146
1.73G
            int16 diff = (int16) (pixel - predictor [channel]);
3147
            
3148
1.73G
            EncodeOneDiff (diff, &huffTable [channel]);
3149
            
3150
1.73G
            predictor [channel] = pixel;
3151
            
3152
1.73G
            }
3153
            
3154
1.31G
          sPtr += fSrcColStep;
3155
            
3156
1.31G
          }
3157
          
3158
18.2M
        }
3159
        
3160
18.3M
      }
3161
  
3162
70.3k
    FlushBits ();
3163
    
3164
70.3k
  }
3165
3166
/*****************************************************************************/
3167
3168
/*
3169
 *--------------------------------------------------------------
3170
 *
3171
 * GenHuffCoding --
3172
 *
3173
 *  Generate the optimal coding for the given counts. 
3174
 *  This algorithm is explained in section K.2 of the
3175
 *  JPEG standard. 
3176
 *
3177
 * Results:
3178
 *      htbl->bits and htbl->huffval are constructed.
3179
 *
3180
 * Side effects:
3181
 *      None.
3182
 *
3183
 *--------------------------------------------------------------
3184
 */
3185
3186
void dng_lossless_encoder::GenHuffCoding (HuffmanTable *htbl, uint32 *freq)
3187
110k
  {
3188
  
3189
110k
  int i;
3190
110k
  int j;
3191
  
3192
110k
  const int MAX_CLEN = 32;      // assumed maximum initial code length
3193
  
3194
110k
  uint8 bits [MAX_CLEN + 1];  // bits [k] = # of symbols with code length k
3195
110k
  short codesize [257];     // codesize [k] = code length of symbol k
3196
110k
  short others   [257];     // next symbol in current branch of tree
3197
  
3198
110k
  memset (bits    , 0, sizeof (bits    ));
3199
110k
    memset (codesize, 0, sizeof (codesize));
3200
  
3201
28.4M
  for (i = 0; i < 257; i++)
3202
28.3M
    others [i] = -1;     // init links to empty
3203
3204
  // Including the pseudo-symbol 256 in the Huffman procedure guarantees
3205
  // that no real symbol is given code-value of all ones, because 256
3206
  // will be placed in the largest codeword category.
3207
3208
110k
  freq [256] = 1;         // make sure there is a nonzero count
3209
3210
  // Huffman's basic algorithm to assign optimal code lengths to symbols
3211
  
3212
909k
  while (true)
3213
909k
    {
3214
3215
    // Find the smallest nonzero frequency, set c1 = its symbol.
3216
    // In case of ties, take the larger symbol number.
3217
3218
909k
    int c1 = -1;
3219
    
3220
909k
    uint32 v = 0xFFFFFFFF;
3221
    
3222
234M
    for (i = 0; i <= 256; i++)
3223
233M
      {
3224
      
3225
233M
      if (freq [i] && freq [i] <= v)
3226
2.55M
        {
3227
2.55M
        v = freq [i];
3228
2.55M
        c1 = i;
3229
2.55M
        }
3230
  
3231
233M
      }
3232
3233
    // Find the next smallest nonzero frequency, set c2 = its symbol.
3234
    // In case of ties, take the larger symbol number.
3235
3236
909k
    int c2 = -1;
3237
    
3238
909k
    v = 0xFFFFFFFF;
3239
    
3240
234M
    for (i = 0; i <= 256; i++)
3241
233M
      {
3242
      
3243
233M
          if (freq [i] && freq [i] <= v && i != c1) 
3244
1.99M
            {
3245
1.99M
        v = freq [i];
3246
1.99M
        c2 = i;
3247
1.99M
        }
3248
        
3249
233M
      }
3250
3251
    // Done if we've merged everything into one frequency.
3252
3253
909k
    if (c2 < 0)
3254
110k
          break;
3255
    
3256
    // Else merge the two counts/trees.
3257
3258
799k
    freq [c1] += freq [c2];
3259
799k
    freq [c2] = 0;
3260
3261
    // Increment the codesize of everything in c1's tree branch.
3262
3263
799k
    codesize [c1] ++;
3264
    
3265
2.38M
    while (others [c1] >= 0)
3266
1.58M
      {
3267
1.58M
      c1 = others [c1];
3268
1.58M
      codesize [c1] ++;
3269
1.58M
        }
3270
    
3271
    // chain c2 onto c1's tree branch 
3272
3273
799k
    others [c1] = (short) c2;
3274
    
3275
    // Increment the codesize of everything in c2's tree branch.
3276
3277
799k
    codesize [c2] ++;
3278
    
3279
2.10M
    while (others [c2] >= 0) 
3280
1.30M
      {
3281
1.30M
      c2 = others [c2];
3282
1.30M
      codesize [c2] ++;
3283
1.30M
      }
3284
3285
799k
    }
3286
3287
  // Now count the number of symbols of each code length.
3288
3289
28.4M
  for (i = 0; i <= 256; i++)
3290
28.3M
    {
3291
    
3292
28.3M
    if (codesize [i])
3293
909k
      {
3294
3295
      // The JPEG standard seems to think that this can't happen,
3296
      // but I'm paranoid...
3297
      
3298
909k
      if (codesize [i] > MAX_CLEN)
3299
0
        {
3300
       
3301
0
            DNG_REPORT ("Huffman code size table overflow");
3302
            
3303
0
            ThrowProgramError ();
3304
            
3305
0
            }
3306
3307
909k
      bits [codesize [i]]++;
3308
      
3309
909k
      }
3310
3311
28.3M
    }
3312
3313
  // JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
3314
  // Huffman procedure assigned any such lengths, we must adjust the coding.
3315
  // Here is what the JPEG spec says about how this next bit works:
3316
  // Since symbols are paired for the longest Huffman code, the symbols are
3317
  // removed from this length category two at a time.  The prefix for the pair
3318
  // (which is one bit shorter) is allocated to one of the pair; then,
3319
  // skipping the BITS entry for that prefix length, a code word from the next
3320
  // shortest nonzero BITS entry is converted into a prefix for two code words
3321
  // one bit longer.
3322
  
3323
1.87M
  for (i = MAX_CLEN; i > 16; i--)
3324
1.76M
    {
3325
    
3326
1.76M
    while (bits [i] > 0)
3327
234
      {
3328
      
3329
      // Kludge: I have never been able to test this logic, and there
3330
      // are comments on the web that this encoder has bugs with 16-bit
3331
      // data, so just throw an error if we get here and revert to a
3332
      // default table.  - tknoll 12/1/03.
3333
      
3334
234
          DNG_REPORT ("Info: Optimal huffman table bigger than 16 bits");
3335
          
3336
234
      ThrowProgramError ();
3337
      
3338
      // Original logic:
3339
      
3340
234
      j = i - 2;    // find length of new prefix to be used
3341
      
3342
234
      while (bits [j] == 0)
3343
0
        j--;
3344
      
3345
234
      bits [i    ] -= 2;    // remove two symbols
3346
234
      bits [i - 1] ++;    // one goes in this length
3347
234
      bits [j + 1] += 2;    // two new symbols in this length
3348
234
      bits [j    ] --;    // symbol of this length is now a prefix
3349
      
3350
234
      }
3351
      
3352
1.76M
    }
3353
3354
  // Remove the count for the pseudo-symbol 256 from
3355
  // the largest codelength.
3356
  
3357
1.20M
  while (bits [i] == 0)    // find largest codelength still in use
3358
1.09M
      i--;
3359
      
3360
110k
  bits [i] --;
3361
  
3362
  // Return final symbol counts (only for lengths 0..16).
3363
3364
110k
  memcpy (htbl->bits, bits, sizeof (htbl->bits));
3365
  
3366
  // Return a list of the symbols sorted by code length. 
3367
  // It's not real clear to me why we don't need to consider the codelength
3368
  // changes made above, but the JPEG spec seems to think this works.
3369
   
3370
110k
  int p = 0;
3371
  
3372
3.63M
  for (i = 1; i <= MAX_CLEN; i++)
3373
3.52M
    {
3374
    
3375
905M
    for (j = 0; j <= 255; j++)
3376
901M
      {
3377
      
3378
901M
      if (codesize [j] == i)
3379
795k
        {
3380
795k
        htbl->huffval [p] = (uint8) j;
3381
795k
        p++;
3382
795k
        }
3383
3384
901M
        }
3385
        
3386
3.52M
      }
3387
 
3388
110k
  }
3389
3390
/*****************************************************************************/
3391
3392
/*
3393
 *--------------------------------------------------------------
3394
 *
3395
 * HuffOptimize --
3396
 *
3397
 *  Find the best coding parameters for a Huffman-coded scan.
3398
 *  When called, the scan data has already been converted to
3399
 *  a sequence of MCU groups of source image samples, which
3400
 *  are stored in a "big" array, mcuTable.
3401
 *
3402
 *  It counts the times each category symbol occurs. Based on
3403
 *  this counting, optimal Huffman tables are built. Then it
3404
 *  uses this optimal Huffman table and counting table to find
3405
 *  the best PSV. 
3406
 *
3407
 * Results:
3408
 *  Optimal Huffman tables are retured in cPtr->dcHuffTblPtrs[tbl].
3409
 *  Best PSV is retured in cPtr->Ss.
3410
 *
3411
 * Side effects:
3412
 *  None.
3413
 *
3414
 *--------------------------------------------------------------
3415
 */
3416
3417
void dng_lossless_encoder::HuffOptimize ()
3418
70.3k
  {
3419
  
3420
    // Collect the frequency counts.
3421
     
3422
70.3k
  FreqCountSet ();
3423
  
3424
  // Generate Huffman encoding tables.
3425
  
3426
180k
  for (uint32 channel = 0; channel < fSrcChannels; channel++)
3427
110k
    {
3428
    
3429
110k
    try
3430
110k
      {
3431
      
3432
110k
          GenHuffCoding (&huffTable [channel], freqCount [channel]);
3433
          
3434
110k
          }
3435
          
3436
110k
        catch (...)
3437
110k
          {
3438
          
3439
234
          DNG_REPORT ("Info: Reverting to default huffman table");
3440
          
3441
60.3k
          for (uint32 j = 0; j <= 256; j++)
3442
60.1k
            {
3443
            
3444
60.1k
            freqCount [channel] [j] = (j <= 16 ? 1 : 0);
3445
            
3446
60.1k
            }
3447
          
3448
234
          GenHuffCoding (&huffTable [channel], freqCount [channel]);
3449
          
3450
234
          }
3451
        
3452
110k
        FixHuffTbl (&huffTable [channel]);
3453
        
3454
110k
    }
3455
 
3456
70.3k
  }
3457
3458
/*****************************************************************************/
3459
3460
/*
3461
 *--------------------------------------------------------------
3462
 *
3463
 * EmitMarker --
3464
 *
3465
 *  Emit a marker code into the output stream.
3466
 *
3467
 * Results:
3468
 *  None.
3469
 *
3470
 * Side effects:
3471
 *  None.
3472
 *
3473
 *--------------------------------------------------------------
3474
 */
3475
3476
void dng_lossless_encoder::EmitMarker (JpegMarker mark)
3477
391k
  {
3478
  
3479
391k
    EmitByte (0xFF);
3480
391k
    EmitByte ((uint8) mark);
3481
    
3482
391k
  }
3483
3484
/*****************************************************************************/
3485
3486
/*
3487
 *--------------------------------------------------------------
3488
 *
3489
 * Emit2bytes --
3490
 *
3491
 *  Emit a 2-byte integer; these are always MSB first in JPEG
3492
 *  files
3493
 *
3494
 * Results:
3495
 *  None.
3496
 *
3497
 * Side effects:
3498
 *  None.
3499
 *
3500
 *--------------------------------------------------------------
3501
 */
3502
3503
void dng_lossless_encoder::Emit2bytes (int value)
3504
391k
  {
3505
  
3506
391k
    EmitByte ((value >> 8) & 0xFF);
3507
391k
    EmitByte (value & 0xFF);
3508
 
3509
391k
  }
3510
3511
/*****************************************************************************/
3512
3513
/*
3514
 *--------------------------------------------------------------
3515
 *
3516
 * EmitDht --
3517
 *
3518
 *  Emit a DHT marker, follwed by the huffman data.
3519
 *
3520
 * Results:
3521
 *  None
3522
 *
3523
 * Side effects:
3524
 *  None
3525
 *
3526
 *--------------------------------------------------------------
3527
 */
3528
 
3529
void dng_lossless_encoder::EmitDht (int index)
3530
110k
  {
3531
  
3532
110k
  int i;
3533
  
3534
110k
    HuffmanTable *htbl = &huffTable [index];
3535
    
3536
110k
  EmitMarker (M_DHT);
3537
3538
110k
    int length = 0;
3539
    
3540
1.87M
  for (i = 1; i <= 16; i++)
3541
1.76M
      length += htbl->bits [i];
3542
3543
110k
  Emit2bytes (length + 2 + 1 + 16);
3544
  
3545
110k
  EmitByte ((uint8) index);
3546
3547
1.87M
  for (i = 1; i <= 16; i++)
3548
1.76M
      EmitByte (htbl->bits [i]);
3549
3550
905k
  for (i = 0; i < length; i++)
3551
795k
      EmitByte (htbl->huffval [i]);
3552
3553
110k
  }
3554
3555
/*****************************************************************************/
3556
3557
/*
3558
 *--------------------------------------------------------------
3559
 *
3560
 * EmitSof --
3561
 *
3562
 *  Emit a SOF marker plus data.
3563
 *
3564
 * Results:
3565
 *  None.
3566
 *
3567
 * Side effects:
3568
 *  None.
3569
 *
3570
 *--------------------------------------------------------------
3571
 */
3572
3573
void dng_lossless_encoder::EmitSof (JpegMarker code)
3574
70.3k
  {
3575
  
3576
70.3k
    EmitMarker (code);
3577
3578
70.3k
    Emit2bytes (3 * fSrcChannels + 2 + 5 + 1);  // length
3579
3580
70.3k
    EmitByte ((uint8) fSrcBitDepth);
3581
    
3582
70.3k
    Emit2bytes (fSrcRows);
3583
70.3k
    Emit2bytes (fSrcCols);
3584
3585
70.3k
    EmitByte ((uint8) fSrcChannels);
3586
3587
180k
    for (uint32 i = 0; i < fSrcChannels; i++)
3588
110k
      {
3589
      
3590
110k
    EmitByte ((uint8) i);
3591
    
3592
110k
    EmitByte ((uint8) ((1 << 4) + 1));    // Not subsampled.
3593
           
3594
110k
        EmitByte (0);         // Tq shall be 0 for lossless.
3595
        
3596
110k
      }
3597
   
3598
70.3k
  }
3599
3600
/*****************************************************************************/
3601
3602
/*
3603
 *--------------------------------------------------------------
3604
 *
3605
 * EmitSos --
3606
 *
3607
 *  Emit a SOS marker plus data.
3608
 *
3609
 * Results:
3610
 *  None.
3611
 *
3612
 * Side effects:
3613
 *  None.
3614
 *
3615
 *--------------------------------------------------------------
3616
 */
3617
3618
void dng_lossless_encoder::EmitSos ()
3619
70.3k
  {
3620
  
3621
70.3k
    EmitMarker (M_SOS);
3622
3623
70.3k
    Emit2bytes (2 * fSrcChannels + 2 + 1 + 3);  // length
3624
3625
70.3k
    EmitByte ((uint8) fSrcChannels);      // Ns
3626
3627
180k
    for (uint32 i = 0; i < fSrcChannels; i++) 
3628
110k
      { 
3629
      
3630
      // Cs,Td,Ta
3631
      
3632
110k
    EmitByte ((uint8) i);
3633
110k
    EmitByte ((uint8) (i << 4));
3634
    
3635
110k
      }
3636
3637
70.3k
    EmitByte (1);   // PSV - hardcoded - tknoll
3638
70.3k
    EmitByte (0);     // Spectral selection end  - Se
3639
70.3k
    EmitByte (0);     // The point transform parameter 
3640
    
3641
70.3k
  }
3642
3643
/*****************************************************************************/
3644
3645
/*
3646
 *--------------------------------------------------------------
3647
 *
3648
 * WriteFileHeader --
3649
 *
3650
 *  Write the file header.
3651
 *
3652
 * Results:
3653
 *  None.
3654
 *
3655
 * Side effects:
3656
 *  None.
3657
 *
3658
 *--------------------------------------------------------------
3659
 */
3660
3661
void dng_lossless_encoder::WriteFileHeader ()
3662
70.3k
  {
3663
  
3664
70.3k
    EmitMarker (M_SOI);   // first the SOI
3665
    
3666
70.3k
    EmitSof (M_SOF3);
3667
    
3668
70.3k
  }
3669
3670
/*****************************************************************************/
3671
3672
/*
3673
 *--------------------------------------------------------------
3674
 *
3675
 * WriteScanHeader --
3676
 *
3677
 *  Write the start of a scan (everything through the SOS marker).
3678
 *
3679
 * Results:
3680
 *  None.
3681
 *
3682
 * Side effects:
3683
 *  None.
3684
 *
3685
 *--------------------------------------------------------------
3686
 */
3687
3688
void dng_lossless_encoder::WriteScanHeader ()
3689
70.3k
  {
3690
3691
    // Emit Huffman tables.
3692
    
3693
180k
    for (uint32 i = 0; i < fSrcChannels; i++)
3694
110k
      {
3695
      
3696
110k
    EmitDht (i);
3697
    
3698
110k
      }
3699
3700
70.3k
  EmitSos ();
3701
     
3702
70.3k
  }
3703
3704
/*****************************************************************************/
3705
3706
/*
3707
 *--------------------------------------------------------------
3708
 *
3709
 * WriteFileTrailer --
3710
 *
3711
 *  Write the End of image marker at the end of a JPEG file.
3712
 *
3713
 * Results:
3714
 *  None.
3715
 *
3716
 * Side effects:
3717
 *  None.
3718
 *
3719
 *--------------------------------------------------------------
3720
 */
3721
3722
void dng_lossless_encoder::WriteFileTrailer ()
3723
70.3k
  {
3724
  
3725
70.3k
    EmitMarker (M_EOI);
3726
    
3727
70.3k
  }
3728
3729
/*****************************************************************************/
3730
3731
void dng_lossless_encoder::Encode ()
3732
70.3k
  {
3733
  
3734
70.3k
  DNG_ASSERT (fSrcChannels <= 4, "Too many components in scan");
3735
    
3736
  // Count the times each difference category occurs. 
3737
  // Construct the optimal Huffman table.
3738
    
3739
70.3k
  HuffOptimize ();
3740
3741
    // Write the frame and scan headers.
3742
3743
70.3k
    WriteFileHeader (); 
3744
    
3745
70.3k
    WriteScanHeader ();
3746
3747
    // Encode the image.
3748
    
3749
70.3k
    HuffEncode ();
3750
3751
    // Clean up everything.
3752
    
3753
70.3k
  WriteFileTrailer ();
3754
3755
70.3k
  }
3756
3757
/*****************************************************************************/
3758
3759
void EncodeLosslessJPEG (const uint16 *srcData,
3760
             uint32 srcRows,
3761
             uint32 srcCols,
3762
             uint32 srcChannels,
3763
             uint32 srcBitDepth,
3764
             int32 srcRowStep,
3765
             int32 srcColStep,
3766
             dng_stream &stream)
3767
70.3k
  {
3768
  
3769
70.3k
  dng_lossless_encoder encoder (srcData,
3770
70.3k
                    srcRows,
3771
70.3k
                    srcCols,
3772
70.3k
                    srcChannels,
3773
70.3k
                    srcBitDepth,
3774
70.3k
                    srcRowStep,
3775
70.3k
                    srcColStep,
3776
70.3k
                    stream);
3777
3778
70.3k
  encoder.Encode ();
3779
  
3780
70.3k
    }
3781
3782
/*****************************************************************************/