Home | History | Annotate | Download | only in libjpeg-turbo
      1 /*
      2 * jstdhuff.c
      3 *
      4 * This file was part of the Independent JPEG Group's software:
      5 * Copyright (C) 1991-1998, Thomas G. Lane.
      6 * libjpeg-turbo Modifications:
      7 * Copyright (C) 2013, D. R. Commander.
      8 * For conditions of distribution and use, see the accompanying README file.
      9 *
     10 * This file contains routines to set the default Huffman tables, if they are
     11 * not already set.
     12 */
     13 
     14 /*
     15  * Huffman table setup routines
     16  */
     17 
     18 LOCAL(void)
     19 add_huff_table (j_common_ptr cinfo,
     20                 JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
     21 /* Define a Huffman table */
     22 {
     23   int nsymbols, len;
     24 
     25   if (*htblptr == NULL)
     26     *htblptr = jpeg_alloc_huff_table(cinfo);
     27   else
     28     return;
     29 
     30   /* Copy the number-of-symbols-of-each-code-length counts */
     31   MEMCOPY((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
     32 
     33   /* Validate the counts.  We do this here mainly so we can copy the right
     34    * number of symbols from the val[] array, without risking marching off
     35    * the end of memory.  jchuff.c will do a more thorough test later.
     36    */
     37   nsymbols = 0;
     38   for (len = 1; len <= 16; len++)
     39     nsymbols += bits[len];
     40   if (nsymbols < 1 || nsymbols > 256)
     41     ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
     42 
     43   MEMCOPY((*htblptr)->huffval, val, nsymbols * sizeof(UINT8));
     44   MEMZERO(&((*htblptr)->huffval[nsymbols]), (256 - nsymbols) * sizeof(UINT8));
     45 
     46   /* Initialize sent_table FALSE so table will be written to JPEG file. */
     47   (*htblptr)->sent_table = FALSE;
     48 }
     49 
     50 
     51 LOCAL(void)
     52 std_huff_tables (j_common_ptr cinfo)
     53 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
     54 /* IMPORTANT: these are only valid for 8-bit data precision! */
     55 {
     56   JHUFF_TBL **dc_huff_tbl_ptrs, **ac_huff_tbl_ptrs;
     57 
     58   static const UINT8 bits_dc_luminance[17] =
     59     { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
     60   static const UINT8 val_dc_luminance[] =
     61     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
     62 
     63   static const UINT8 bits_dc_chrominance[17] =
     64     { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
     65   static const UINT8 val_dc_chrominance[] =
     66     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
     67 
     68   static const UINT8 bits_ac_luminance[17] =
     69     { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
     70   static const UINT8 val_ac_luminance[] =
     71     { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
     72       0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
     73       0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
     74       0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
     75       0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
     76       0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
     77       0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
     78       0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
     79       0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
     80       0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
     81       0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
     82       0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
     83       0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
     84       0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
     85       0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
     86       0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
     87       0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
     88       0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
     89       0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
     90       0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
     91       0xf9, 0xfa };
     92 
     93   static const UINT8 bits_ac_chrominance[17] =
     94     { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
     95   static const UINT8 val_ac_chrominance[] =
     96     { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
     97       0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
     98       0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
     99       0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
    100       0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
    101       0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
    102       0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
    103       0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
    104       0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
    105       0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
    106       0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
    107       0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
    108       0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
    109       0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
    110       0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
    111       0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
    112       0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
    113       0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
    114       0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
    115       0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
    116       0xf9, 0xfa };
    117 
    118   if (cinfo->is_decompressor) {
    119     dc_huff_tbl_ptrs = ((j_decompress_ptr)cinfo)->dc_huff_tbl_ptrs;
    120     ac_huff_tbl_ptrs = ((j_decompress_ptr)cinfo)->ac_huff_tbl_ptrs;
    121   } else {
    122     dc_huff_tbl_ptrs = ((j_compress_ptr)cinfo)->dc_huff_tbl_ptrs;
    123     ac_huff_tbl_ptrs = ((j_compress_ptr)cinfo)->ac_huff_tbl_ptrs;
    124   }
    125 
    126   add_huff_table(cinfo, &dc_huff_tbl_ptrs[0], bits_dc_luminance,
    127                  val_dc_luminance);
    128   add_huff_table(cinfo, &ac_huff_tbl_ptrs[0], bits_ac_luminance,
    129                  val_ac_luminance);
    130   add_huff_table(cinfo, &dc_huff_tbl_ptrs[1], bits_dc_chrominance,
    131                  val_dc_chrominance);
    132   add_huff_table(cinfo, &ac_huff_tbl_ptrs[1], bits_ac_chrominance,
    133                  val_ac_chrominance);
    134 }
    135