github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/jxrlib/test/jpeg/jpge.cpp (about)

     1  // jpge.cpp - C++ class for JPEG compression.
     2  // Public domain, Rich Geldreich <richgel99@gmail.com>
     3  // v1.01, Dec. 18, 2010 - Initial release
     4  // v1.02, Apr. 6, 2011 - Removed 2x2 ordered dither in H2V1 chroma subsampling method load_block_16_8_8(). (The rounding factor was 2, when it should have been 1. Either way, it wasn't helping.)
     5  // v1.03, Apr. 16, 2011 - Added support for optimized Huffman code tables, optimized dynamic memory allocation down to only 1 alloc.
     6  //                        Also from Alex Evans: Added RGBA support, linear memory allocator (no longer needed in v1.03).
     7  // v1.04, May. 19, 2012: Forgot to set m_pFile ptr to NULL in cfile_stream::close(). Thanks to Owen Kaluza for reporting this bug.
     8  //                       Code tweaks to fix VS2008 static code analysis warnings (all looked harmless).
     9  //                       Code review revealed method load_block_16_8_8() (used for the non-default H2V1 sampling mode to downsample chroma) somehow didn't get the rounding factor fix from v1.02.
    10  
    11  #include "jpge.h"
    12  
    13  #include <stdlib.h>
    14  #include <string.h>
    15  #include <malloc.h>
    16  
    17  #define JPGE_MAX(a,b) (((a)>(b))?(a):(b))
    18  #define JPGE_MIN(a,b) (((a)<(b))?(a):(b))
    19  
    20  namespace jpge {
    21  
    22  static inline void *jpge_malloc(size_t nSize) { return malloc(nSize); }
    23  static inline void jpge_free(void *p) { free(p); }
    24  
    25  // Various JPEG enums and tables.
    26  enum { M_SOF0 = 0xC0, M_DHT = 0xC4, M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_APP0 = 0xE0 };
    27  enum { DC_LUM_CODES = 12, AC_LUM_CODES = 256, DC_CHROMA_CODES = 12, AC_CHROMA_CODES = 256, MAX_HUFF_SYMBOLS = 257, MAX_HUFF_CODESIZE = 32 };
    28  
    29  static uint8 s_zag[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 };
    30  static int16 s_std_lum_quant[64] = { 16,11,12,14,12,10,16,14,13,14,18,17,16,19,24,40,26,24,22,22,24,49,35,37,29,40,58,51,61,60,57,51,56,55,64,72,92,78,64,68,87,69,55,56,80,109,81,87,95,98,103,104,103,62,77,113,121,112,100,120,92,101,103,99 };
    31  static int16 s_std_croma_quant[64] = { 17,18,18,24,21,24,47,26,26,47,99,66,56,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99 };
    32  static uint8 s_dc_lum_bits[17] = { 0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0 };
    33  static uint8 s_dc_lum_val[DC_LUM_CODES] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
    34  static uint8 s_ac_lum_bits[17] = { 0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d };
    35  static uint8 s_ac_lum_val[AC_LUM_CODES]  =
    36  {
    37    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
    38    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
    39    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
    40    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
    41    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
    42    0xf9,0xfa
    43  };
    44  static uint8 s_dc_chroma_bits[17] = { 0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0 };
    45  static uint8 s_dc_chroma_val[DC_CHROMA_CODES]  = { 0,1,2,3,4,5,6,7,8,9,10,11 };
    46  static uint8 s_ac_chroma_bits[17] = { 0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77 };
    47  static uint8 s_ac_chroma_val[AC_CHROMA_CODES] =
    48  {
    49    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
    50    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
    51    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
    52    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
    53    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
    54    0xf9,0xfa
    55  };
    56  
    57  // Low-level helper functions.
    58  template <class T> inline void clear_obj(T &obj) { memset(&obj, 0, sizeof(obj)); }
    59  
    60  const int YR = 19595, YG = 38470, YB = 7471, CB_R = -11059, CB_G = -21709, CB_B = 32768, CR_R = 32768, CR_G = -27439, CR_B = -5329;
    61  static inline uint8 clamp(int i) { if (static_cast<uint>(i) > 255U) { if (i < 0) i = 0; else if (i > 255) i = 255; } return static_cast<uint8>(i); }
    62  
    63  static void RGB_to_YCC(uint8* pDst, const uint8 *pSrc, int num_pixels)
    64  {
    65    for ( ; num_pixels; pDst += 3, pSrc += 3, num_pixels--)
    66    {
    67      const int r = pSrc[0], g = pSrc[1], b = pSrc[2];
    68      pDst[0] = static_cast<uint8>((r * YR + g * YG + b * YB + 32768) >> 16);
    69      pDst[1] = clamp(128 + ((r * CB_R + g * CB_G + b * CB_B + 32768) >> 16));
    70      pDst[2] = clamp(128 + ((r * CR_R + g * CR_G + b * CR_B + 32768) >> 16));
    71    }
    72  }
    73  
    74  static void RGB_to_Y(uint8* pDst, const uint8 *pSrc, int num_pixels)
    75  {
    76    for ( ; num_pixels; pDst++, pSrc += 3, num_pixels--)
    77      pDst[0] = static_cast<uint8>((pSrc[0] * YR + pSrc[1] * YG + pSrc[2] * YB + 32768) >> 16);
    78  }
    79  
    80  static void RGBA_to_YCC(uint8* pDst, const uint8 *pSrc, int num_pixels)
    81  {
    82    for ( ; num_pixels; pDst += 3, pSrc += 4, num_pixels--)
    83    {
    84      const int r = pSrc[0], g = pSrc[1], b = pSrc[2];
    85      pDst[0] = static_cast<uint8>((r * YR + g * YG + b * YB + 32768) >> 16);
    86      pDst[1] = clamp(128 + ((r * CB_R + g * CB_G + b * CB_B + 32768) >> 16));
    87      pDst[2] = clamp(128 + ((r * CR_R + g * CR_G + b * CR_B + 32768) >> 16));
    88    }
    89  }
    90  
    91  static void RGBA_to_Y(uint8* pDst, const uint8 *pSrc, int num_pixels)
    92  {
    93    for ( ; num_pixels; pDst++, pSrc += 4, num_pixels--)
    94      pDst[0] = static_cast<uint8>((pSrc[0] * YR + pSrc[1] * YG + pSrc[2] * YB + 32768) >> 16);
    95  }
    96  
    97  static void Y_to_YCC(uint8* pDst, const uint8* pSrc, int num_pixels)
    98  {
    99    for( ; num_pixels; pDst += 3, pSrc++, num_pixels--) { pDst[0] = pSrc[0]; pDst[1] = 128; pDst[2] = 128; }
   100  }
   101  
   102  // Forward DCT - DCT derived from jfdctint.
   103  enum { CONST_BITS = 13, ROW_BITS = 2 };
   104  #define DCT_DESCALE(x, n) (((x) + (((int32)1) << ((n) - 1))) >> (n))
   105  #define DCT_MUL(var, c) (static_cast<int16>(var) * static_cast<int32>(c))
   106  #define DCT1D(s0, s1, s2, s3, s4, s5, s6, s7) \
   107    int32 t0 = s0 + s7, t7 = s0 - s7, t1 = s1 + s6, t6 = s1 - s6, t2 = s2 + s5, t5 = s2 - s5, t3 = s3 + s4, t4 = s3 - s4; \
   108    int32 t10 = t0 + t3, t13 = t0 - t3, t11 = t1 + t2, t12 = t1 - t2; \
   109    int32 u1 = DCT_MUL(t12 + t13, 4433); \
   110    s2 = u1 + DCT_MUL(t13, 6270); \
   111    s6 = u1 + DCT_MUL(t12, -15137); \
   112    u1 = t4 + t7; \
   113    int32 u2 = t5 + t6, u3 = t4 + t6, u4 = t5 + t7; \
   114    int32 z5 = DCT_MUL(u3 + u4, 9633); \
   115    t4 = DCT_MUL(t4, 2446); t5 = DCT_MUL(t5, 16819); \
   116    t6 = DCT_MUL(t6, 25172); t7 = DCT_MUL(t7, 12299); \
   117    u1 = DCT_MUL(u1, -7373); u2 = DCT_MUL(u2, -20995); \
   118    u3 = DCT_MUL(u3, -16069); u4 = DCT_MUL(u4, -3196); \
   119    u3 += z5; u4 += z5; \
   120    s0 = t10 + t11; s1 = t7 + u1 + u4; s3 = t6 + u2 + u3; s4 = t10 - t11; s5 = t5 + u2 + u4; s7 = t4 + u1 + u3;
   121  
   122  static void DCT2D(int32 *p)
   123  {
   124    int32 c, *q = p;
   125    for (c = 7; c >= 0; c--, q += 8)
   126    {
   127      int32 s0 = q[0], s1 = q[1], s2 = q[2], s3 = q[3], s4 = q[4], s5 = q[5], s6 = q[6], s7 = q[7];
   128      DCT1D(s0, s1, s2, s3, s4, s5, s6, s7);
   129      q[0] = s0 << ROW_BITS; q[1] = DCT_DESCALE(s1, CONST_BITS-ROW_BITS); q[2] = DCT_DESCALE(s2, CONST_BITS-ROW_BITS); q[3] = DCT_DESCALE(s3, CONST_BITS-ROW_BITS);
   130      q[4] = s4 << ROW_BITS; q[5] = DCT_DESCALE(s5, CONST_BITS-ROW_BITS); q[6] = DCT_DESCALE(s6, CONST_BITS-ROW_BITS); q[7] = DCT_DESCALE(s7, CONST_BITS-ROW_BITS);
   131    }
   132    for (q = p, c = 7; c >= 0; c--, q++)
   133    {
   134      int32 s0 = q[0*8], s1 = q[1*8], s2 = q[2*8], s3 = q[3*8], s4 = q[4*8], s5 = q[5*8], s6 = q[6*8], s7 = q[7*8];
   135      DCT1D(s0, s1, s2, s3, s4, s5, s6, s7);
   136      q[0*8] = DCT_DESCALE(s0, ROW_BITS+3); q[1*8] = DCT_DESCALE(s1, CONST_BITS+ROW_BITS+3); q[2*8] = DCT_DESCALE(s2, CONST_BITS+ROW_BITS+3); q[3*8] = DCT_DESCALE(s3, CONST_BITS+ROW_BITS+3);
   137      q[4*8] = DCT_DESCALE(s4, ROW_BITS+3); q[5*8] = DCT_DESCALE(s5, CONST_BITS+ROW_BITS+3); q[6*8] = DCT_DESCALE(s6, CONST_BITS+ROW_BITS+3); q[7*8] = DCT_DESCALE(s7, CONST_BITS+ROW_BITS+3);
   138    }
   139  }
   140  
   141  struct sym_freq { uint m_key, m_sym_index; };
   142  
   143  // Radix sorts sym_freq[] array by 32-bit key m_key. Returns ptr to sorted values.
   144  static inline sym_freq* radix_sort_syms(uint num_syms, sym_freq* pSyms0, sym_freq* pSyms1)
   145  {
   146    const uint cMaxPasses = 4;
   147    uint32 hist[256 * cMaxPasses]; clear_obj(hist);
   148    for (uint i = 0; i < num_syms; i++) { uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; hist[256*2 + ((freq >> 16) & 0xFF)]++; hist[256*3 + ((freq >> 24) & 0xFF)]++; }
   149    sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1;
   150    uint total_passes = cMaxPasses; while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;
   151    for (uint pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8)
   152    {
   153      const uint32* pHist = &hist[pass << 8];
   154      uint offsets[256], cur_ofs = 0;
   155      for (uint i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }
   156      for (uint i = 0; i < num_syms; i++)
   157        pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];
   158      sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t;
   159    }
   160    return pCur_syms;
   161  }
   162  
   163  // calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.
   164  static void calculate_minimum_redundancy(sym_freq *A, int n)
   165  {
   166    int root, leaf, next, avbl, used, dpth;
   167    if (n==0) return; else if (n==1) { A[0].m_key = 1; return; }
   168    A[0].m_key += A[1].m_key; root = 0; leaf = 2;
   169    for (next=1; next < n-1; next++)
   170    {
   171      if (leaf>=n || A[root].m_key<A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = next; } else A[next].m_key = A[leaf++].m_key;
   172      if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].m_key += A[root].m_key; A[root++].m_key = next; } else A[next].m_key += A[leaf++].m_key;
   173    }
   174    A[n-2].m_key = 0;
   175    for (next=n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;
   176    avbl = 1; used = dpth = 0; root = n-2; next = n-1;
   177    while (avbl>0)
   178    {
   179      while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; }
   180      while (avbl>used) { A[next--].m_key = dpth; avbl--; }
   181      avbl = 2*used; dpth++; used = 0;
   182    }
   183  }
   184  
   185  // Limits canonical Huffman code table's max code size to max_code_size.
   186  static void huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)
   187  {
   188    if (code_list_len <= 1) return;
   189  
   190    for (int i = max_code_size + 1; i <= MAX_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i];
   191  
   192    uint32 total = 0;
   193    for (int i = max_code_size; i > 0; i--)
   194      total += (((uint32)pNum_codes[i]) << (max_code_size - i));
   195  
   196    while (total != (1UL << max_code_size))
   197    {
   198      pNum_codes[max_code_size]--;
   199      for (int i = max_code_size - 1; i > 0; i--)
   200      {
   201        if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; }
   202      }
   203      total--;
   204    }
   205  }
   206  
   207  // Generates an optimized offman table.
   208  void jpeg_encoder::optimize_huffman_table(int table_num, int table_len)
   209  {
   210    sym_freq syms0[MAX_HUFF_SYMBOLS], syms1[MAX_HUFF_SYMBOLS];
   211    syms0[0].m_key = 1; syms0[0].m_sym_index = 0;  // dummy symbol, assures that no valid code contains all 1's
   212    int num_used_syms = 1;
   213    const uint32 *pSym_count = &m_huff_count[table_num][0];
   214    for (int i = 0; i < table_len; i++)
   215      if (pSym_count[i]) { syms0[num_used_syms].m_key = pSym_count[i]; syms0[num_used_syms++].m_sym_index = i + 1; }
   216    sym_freq* pSyms = radix_sort_syms(num_used_syms, syms0, syms1);
   217    calculate_minimum_redundancy(pSyms, num_used_syms);
   218  
   219    // Count the # of symbols of each code size.
   220    int num_codes[1 + MAX_HUFF_CODESIZE]; clear_obj(num_codes);
   221    for (int i = 0; i < num_used_syms; i++)
   222      num_codes[pSyms[i].m_key]++;
   223  
   224    const uint JPGE_CODE_SIZE_LIMIT = 16; // the maximum possible size of a JPEG Huffman code (valid range is [9,16] - 9 vs. 8 because of the dummy symbol)
   225    huffman_enforce_max_code_size(num_codes, num_used_syms, JPGE_CODE_SIZE_LIMIT);
   226  
   227    // Compute m_huff_bits array, which contains the # of symbols per code size.
   228    clear_obj(m_huff_bits[table_num]);
   229    for (int i = 1; i <= (int)JPGE_CODE_SIZE_LIMIT; i++)
   230      m_huff_bits[table_num][i] = static_cast<uint8>(num_codes[i]);
   231  
   232    // Remove the dummy symbol added above, which must be in largest bucket.
   233    for (int i = JPGE_CODE_SIZE_LIMIT; i >= 1; i--)
   234    {
   235      if (m_huff_bits[table_num][i]) { m_huff_bits[table_num][i]--; break; }
   236    }
   237  
   238    // Compute the m_huff_val array, which contains the symbol indices sorted by code size (smallest to largest).
   239    for (int i = num_used_syms - 1; i >= 1; i--)
   240      m_huff_val[table_num][num_used_syms - 1 - i] = static_cast<uint8>(pSyms[i].m_sym_index - 1);
   241  }
   242  
   243  // JPEG marker generation.
   244  void jpeg_encoder::emit_byte(uint8 i)
   245  {
   246    m_all_stream_writes_succeeded = m_all_stream_writes_succeeded && m_pStream->put_obj(i);
   247  }
   248  
   249  void jpeg_encoder::emit_word(uint i)
   250  {
   251    emit_byte(uint8(i >> 8)); emit_byte(uint8(i & 0xFF));
   252  }
   253  
   254  void jpeg_encoder::emit_marker(int marker)
   255  {
   256    emit_byte(uint8(0xFF)); emit_byte(uint8(marker));
   257  }
   258  
   259  // Emit JFIF marker
   260  void jpeg_encoder::emit_jfif_app0()
   261  {
   262    emit_marker(M_APP0);
   263    emit_word(2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1);
   264    emit_byte(0x4A); emit_byte(0x46); emit_byte(0x49); emit_byte(0x46); /* Identifier: ASCII "JFIF" */
   265    emit_byte(0);
   266    emit_byte(1);      /* Major version */
   267    emit_byte(1);      /* Minor version */
   268    emit_byte(0);      /* Density unit */
   269    emit_word(1);
   270    emit_word(1);
   271    emit_byte(0);      /* No thumbnail image */
   272    emit_byte(0);
   273  }
   274  
   275  // Emit quantization tables
   276  void jpeg_encoder::emit_dqt()
   277  {
   278    for (int i = 0; i < ((m_num_components == 3) ? 2 : 1); i++)
   279    {
   280      emit_marker(M_DQT);
   281      emit_word(64 + 1 + 2);
   282      emit_byte(static_cast<uint8>(i));
   283      for (int j = 0; j < 64; j++)
   284        emit_byte(static_cast<uint8>(m_quantization_tables[i][j]));
   285    }
   286  }
   287  
   288  // Emit start of frame marker
   289  void jpeg_encoder::emit_sof()
   290  {
   291    emit_marker(M_SOF0);                           /* baseline */
   292    emit_word(3 * m_num_components + 2 + 5 + 1);
   293    emit_byte(8);                                  /* precision */
   294    emit_word(m_image_y);
   295    emit_word(m_image_x);
   296    emit_byte(m_num_components);
   297    for (int i = 0; i < m_num_components; i++)
   298    {
   299      emit_byte(static_cast<uint8>(i + 1));                                   /* component ID     */
   300      emit_byte((m_comp_h_samp[i] << 4) + m_comp_v_samp[i]);  /* h and v sampling */
   301      emit_byte(i > 0);                                   /* quant. table num */
   302    }
   303  }
   304  
   305  // Emit Huffman table.
   306  void jpeg_encoder::emit_dht(uint8 *bits, uint8 *val, int index, bool ac_flag)
   307  {
   308    emit_marker(M_DHT);
   309  
   310    int length = 0;
   311    for (int i = 1; i <= 16; i++)
   312      length += bits[i];
   313  
   314    emit_word(length + 2 + 1 + 16);
   315    emit_byte(static_cast<uint8>(index + (ac_flag << 4)));
   316  
   317    for (int i = 1; i <= 16; i++)
   318      emit_byte(bits[i]);
   319  
   320    for (int i = 0; i < length; i++)
   321      emit_byte(val[i]);
   322  }
   323  
   324  // Emit all Huffman tables.
   325  void jpeg_encoder::emit_dhts()
   326  {
   327    emit_dht(m_huff_bits[0+0], m_huff_val[0+0], 0, false);
   328    emit_dht(m_huff_bits[2+0], m_huff_val[2+0], 0, true);
   329    if (m_num_components == 3)
   330    {
   331      emit_dht(m_huff_bits[0+1], m_huff_val[0+1], 1, false);
   332      emit_dht(m_huff_bits[2+1], m_huff_val[2+1], 1, true);
   333    }
   334  }
   335  
   336  // emit start of scan
   337  void jpeg_encoder::emit_sos()
   338  {
   339    emit_marker(M_SOS);
   340    emit_word(2 * m_num_components + 2 + 1 + 3);
   341    emit_byte(m_num_components);
   342    for (int i = 0; i < m_num_components; i++)
   343    {
   344      emit_byte(static_cast<uint8>(i + 1));
   345      if (i == 0)
   346        emit_byte((0 << 4) + 0);
   347      else
   348        emit_byte((1 << 4) + 1);
   349    }
   350    emit_byte(0);     /* spectral selection */
   351    emit_byte(63);
   352    emit_byte(0);
   353  }
   354  
   355  // Emit all markers at beginning of image file.
   356  void jpeg_encoder::emit_markers()
   357  {
   358    emit_marker(M_SOI);
   359    emit_jfif_app0();
   360    emit_dqt();
   361    emit_sof();
   362    emit_dhts();
   363    emit_sos();
   364  }
   365  
   366  // Compute the actual canonical Huffman codes/code sizes given the JPEG huff bits and val arrays.
   367  void jpeg_encoder::compute_huffman_table(uint *codes, uint8 *code_sizes, uint8 *bits, uint8 *val)
   368  {
   369    int i, l, last_p, si;
   370    uint8 huff_size[257];
   371    uint huff_code[257];
   372    uint code;
   373  
   374    int p = 0;
   375    for (l = 1; l <= 16; l++)
   376      for (i = 1; i <= bits[l]; i++)
   377        huff_size[p++] = (char)l;
   378  
   379    huff_size[p] = 0; last_p = p; // write sentinel
   380  
   381    code = 0; si = huff_size[0]; p = 0;
   382  
   383    while (huff_size[p])
   384    {
   385      while (huff_size[p] == si)
   386        huff_code[p++] = code++;
   387      code <<= 1;
   388      si++;
   389    }
   390  
   391    memset(codes, 0, sizeof(codes[0])*256);
   392    memset(code_sizes, 0, sizeof(code_sizes[0])*256);
   393    for (p = 0; p < last_p; p++)
   394    {
   395      codes[val[p]]      = huff_code[p];
   396      code_sizes[val[p]] = huff_size[p];
   397    }
   398  }
   399  
   400  // Quantization table generation.
   401  void jpeg_encoder::compute_quant_table(int32 *pDst, int16 *pSrc)
   402  {
   403    int32 q;
   404    if (m_params.m_quality < 50)
   405      q = 5000 / m_params.m_quality;
   406    else
   407      q = 200 - m_params.m_quality * 2;
   408    for (int i = 0; i < 64; i++)
   409    {
   410      int32 j = *pSrc++; j = (j * q + 50L) / 100L;
   411      *pDst++ = JPGE_MIN(JPGE_MAX(j, 1), 255);
   412    }
   413  }
   414  
   415  // Higher-level methods.
   416  void jpeg_encoder::first_pass_init()
   417  {
   418    m_bit_buffer = 0; m_bits_in = 0;
   419    memset(m_last_dc_val, 0, 3 * sizeof(m_last_dc_val[0]));
   420    m_mcu_y_ofs = 0;
   421    m_pass_num = 1;
   422  }
   423  
   424  bool jpeg_encoder::second_pass_init()
   425  {
   426    compute_huffman_table(&m_huff_codes[0+0][0], &m_huff_code_sizes[0+0][0], m_huff_bits[0+0], m_huff_val[0+0]);
   427    compute_huffman_table(&m_huff_codes[2+0][0], &m_huff_code_sizes[2+0][0], m_huff_bits[2+0], m_huff_val[2+0]);
   428    if (m_num_components > 1)
   429    {
   430      compute_huffman_table(&m_huff_codes[0+1][0], &m_huff_code_sizes[0+1][0], m_huff_bits[0+1], m_huff_val[0+1]);
   431      compute_huffman_table(&m_huff_codes[2+1][0], &m_huff_code_sizes[2+1][0], m_huff_bits[2+1], m_huff_val[2+1]);
   432    }
   433    first_pass_init();
   434    emit_markers();
   435    m_pass_num = 2;
   436    return true;
   437  }
   438  
   439  bool jpeg_encoder::jpg_open(int p_x_res, int p_y_res, int src_channels)
   440  {
   441    m_num_components = 3;
   442    switch (m_params.m_subsampling)
   443    {
   444      case Y_ONLY:
   445      {
   446        m_num_components = 1;
   447        m_comp_h_samp[0] = 1; m_comp_v_samp[0] = 1;
   448        m_mcu_x          = 8; m_mcu_y          = 8;
   449        break;
   450      }
   451      case H1V1:
   452      {
   453        m_comp_h_samp[0] = 1; m_comp_v_samp[0] = 1;
   454        m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1;
   455        m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1;
   456        m_mcu_x          = 8; m_mcu_y          = 8;
   457        break;
   458      }
   459      case H2V1:
   460      {
   461        m_comp_h_samp[0] = 2; m_comp_v_samp[0] = 1;
   462        m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1;
   463        m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1;
   464        m_mcu_x          = 16; m_mcu_y         = 8;
   465        break;
   466      }
   467      case H2V2:
   468      {
   469        m_comp_h_samp[0] = 2; m_comp_v_samp[0] = 2;
   470        m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1;
   471        m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1;
   472        m_mcu_x          = 16; m_mcu_y         = 16;
   473      }
   474    }
   475  
   476    m_image_x        = p_x_res; m_image_y = p_y_res;
   477    m_image_bpp      = src_channels;
   478    m_image_bpl      = m_image_x * src_channels;
   479    m_image_x_mcu    = (m_image_x + m_mcu_x - 1) & (~(m_mcu_x - 1));
   480    m_image_y_mcu    = (m_image_y + m_mcu_y - 1) & (~(m_mcu_y - 1));
   481    m_image_bpl_xlt  = m_image_x * m_num_components;
   482    m_image_bpl_mcu  = m_image_x_mcu * m_num_components;
   483    m_mcus_per_row   = m_image_x_mcu / m_mcu_x;
   484  
   485    if ((m_mcu_lines[0] = static_cast<uint8*>(jpge_malloc(m_image_bpl_mcu * m_mcu_y))) == NULL) return false;
   486    for (int i = 1; i < m_mcu_y; i++)
   487      m_mcu_lines[i] = m_mcu_lines[i-1] + m_image_bpl_mcu;
   488  
   489    compute_quant_table(m_quantization_tables[0], s_std_lum_quant);
   490    compute_quant_table(m_quantization_tables[1], m_params.m_no_chroma_discrim_flag ? s_std_lum_quant : s_std_croma_quant);
   491  
   492    m_out_buf_left = JPGE_OUT_BUF_SIZE;
   493    m_pOut_buf = m_out_buf;
   494  
   495    if (m_params.m_two_pass_flag)
   496    {
   497      clear_obj(m_huff_count);
   498      first_pass_init();
   499    }
   500    else
   501    {
   502      memcpy(m_huff_bits[0+0], s_dc_lum_bits, 17);    memcpy(m_huff_val [0+0], s_dc_lum_val, DC_LUM_CODES);
   503      memcpy(m_huff_bits[2+0], s_ac_lum_bits, 17);    memcpy(m_huff_val [2+0], s_ac_lum_val, AC_LUM_CODES);
   504      memcpy(m_huff_bits[0+1], s_dc_chroma_bits, 17); memcpy(m_huff_val [0+1], s_dc_chroma_val, DC_CHROMA_CODES);
   505      memcpy(m_huff_bits[2+1], s_ac_chroma_bits, 17); memcpy(m_huff_val [2+1], s_ac_chroma_val, AC_CHROMA_CODES);
   506      if (!second_pass_init()) return false;   // in effect, skip over the first pass
   507    }
   508    return m_all_stream_writes_succeeded;
   509  }
   510  
   511  void jpeg_encoder::load_block_8_8_grey(int x)
   512  {
   513    uint8 *pSrc;
   514    sample_array_t *pDst = m_sample_array;
   515    x <<= 3;
   516    for (int i = 0; i < 8; i++, pDst += 8)
   517    {
   518      pSrc = m_mcu_lines[i] + x;
   519      pDst[0] = pSrc[0] - 128; pDst[1] = pSrc[1] - 128; pDst[2] = pSrc[2] - 128; pDst[3] = pSrc[3] - 128;
   520      pDst[4] = pSrc[4] - 128; pDst[5] = pSrc[5] - 128; pDst[6] = pSrc[6] - 128; pDst[7] = pSrc[7] - 128;
   521    }
   522  }
   523  
   524  void jpeg_encoder::load_block_8_8(int x, int y, int c)
   525  {
   526    uint8 *pSrc;
   527    sample_array_t *pDst = m_sample_array;
   528    x = (x * (8 * 3)) + c;
   529    y <<= 3;
   530    for (int i = 0; i < 8; i++, pDst += 8)
   531    {
   532      pSrc = m_mcu_lines[y + i] + x;
   533      pDst[0] = pSrc[0 * 3] - 128; pDst[1] = pSrc[1 * 3] - 128; pDst[2] = pSrc[2 * 3] - 128; pDst[3] = pSrc[3 * 3] - 128;
   534      pDst[4] = pSrc[4 * 3] - 128; pDst[5] = pSrc[5 * 3] - 128; pDst[6] = pSrc[6 * 3] - 128; pDst[7] = pSrc[7 * 3] - 128;
   535    }
   536  }
   537  
   538  void jpeg_encoder::load_block_16_8(int x, int c)
   539  {
   540    uint8 *pSrc1, *pSrc2;
   541    sample_array_t *pDst = m_sample_array;
   542    x = (x * (16 * 3)) + c;
   543    int a = 0, b = 2;
   544    for (int i = 0; i < 16; i += 2, pDst += 8)
   545    {
   546      pSrc1 = m_mcu_lines[i + 0] + x;
   547      pSrc2 = m_mcu_lines[i + 1] + x;
   548      pDst[0] = ((pSrc1[ 0 * 3] + pSrc1[ 1 * 3] + pSrc2[ 0 * 3] + pSrc2[ 1 * 3] + a) >> 2) - 128; pDst[1] = ((pSrc1[ 2 * 3] + pSrc1[ 3 * 3] + pSrc2[ 2 * 3] + pSrc2[ 3 * 3] + b) >> 2) - 128;
   549      pDst[2] = ((pSrc1[ 4 * 3] + pSrc1[ 5 * 3] + pSrc2[ 4 * 3] + pSrc2[ 5 * 3] + a) >> 2) - 128; pDst[3] = ((pSrc1[ 6 * 3] + pSrc1[ 7 * 3] + pSrc2[ 6 * 3] + pSrc2[ 7 * 3] + b) >> 2) - 128;
   550      pDst[4] = ((pSrc1[ 8 * 3] + pSrc1[ 9 * 3] + pSrc2[ 8 * 3] + pSrc2[ 9 * 3] + a) >> 2) - 128; pDst[5] = ((pSrc1[10 * 3] + pSrc1[11 * 3] + pSrc2[10 * 3] + pSrc2[11 * 3] + b) >> 2) - 128;
   551      pDst[6] = ((pSrc1[12 * 3] + pSrc1[13 * 3] + pSrc2[12 * 3] + pSrc2[13 * 3] + a) >> 2) - 128; pDst[7] = ((pSrc1[14 * 3] + pSrc1[15 * 3] + pSrc2[14 * 3] + pSrc2[15 * 3] + b) >> 2) - 128;
   552      int temp = a; a = b; b = temp;
   553    }
   554  }
   555  
   556  void jpeg_encoder::load_block_16_8_8(int x, int c)
   557  {
   558    uint8 *pSrc1;
   559    sample_array_t *pDst = m_sample_array;
   560    x = (x * (16 * 3)) + c;
   561    for (int i = 0; i < 8; i++, pDst += 8)
   562    {
   563      pSrc1 = m_mcu_lines[i + 0] + x;
   564      pDst[0] = ((pSrc1[ 0 * 3] + pSrc1[ 1 * 3]) >> 1) - 128; pDst[1] = ((pSrc1[ 2 * 3] + pSrc1[ 3 * 3]) >> 1) - 128;
   565      pDst[2] = ((pSrc1[ 4 * 3] + pSrc1[ 5 * 3]) >> 1) - 128; pDst[3] = ((pSrc1[ 6 * 3] + pSrc1[ 7 * 3]) >> 1) - 128;
   566      pDst[4] = ((pSrc1[ 8 * 3] + pSrc1[ 9 * 3]) >> 1) - 128; pDst[5] = ((pSrc1[10 * 3] + pSrc1[11 * 3]) >> 1) - 128;
   567      pDst[6] = ((pSrc1[12 * 3] + pSrc1[13 * 3]) >> 1) - 128; pDst[7] = ((pSrc1[14 * 3] + pSrc1[15 * 3]) >> 1) - 128;
   568    }
   569  }
   570  
   571  void jpeg_encoder::load_quantized_coefficients(int component_num)
   572  {
   573    int32 *q = m_quantization_tables[component_num > 0];
   574    int16 *pDst = m_coefficient_array;
   575    for (int i = 0; i < 64; i++)
   576    {
   577      sample_array_t j = m_sample_array[s_zag[i]];
   578      if (j < 0)
   579      {
   580        if ((j = -j + (*q >> 1)) < *q)
   581          *pDst++ = 0;
   582        else
   583          *pDst++ = static_cast<int16>(-(j / *q));
   584      }
   585      else
   586      {
   587        if ((j = j + (*q >> 1)) < *q)
   588          *pDst++ = 0;
   589        else
   590          *pDst++ = static_cast<int16>((j / *q));
   591      }
   592      q++;
   593    }
   594  }
   595  
   596  void jpeg_encoder::flush_output_buffer()
   597  {
   598    if (m_out_buf_left != JPGE_OUT_BUF_SIZE)
   599      m_all_stream_writes_succeeded = m_all_stream_writes_succeeded && m_pStream->put_buf(m_out_buf, JPGE_OUT_BUF_SIZE - m_out_buf_left);
   600    m_pOut_buf = m_out_buf;
   601    m_out_buf_left = JPGE_OUT_BUF_SIZE;
   602  }
   603  
   604  void jpeg_encoder::put_bits(uint bits, uint len)
   605  {
   606    m_bit_buffer |= ((uint32)bits << (24 - (m_bits_in += len)));
   607    while (m_bits_in >= 8)
   608    {
   609      uint8 c;
   610      #define JPGE_PUT_BYTE(c) { *m_pOut_buf++ = (c); if (--m_out_buf_left == 0) flush_output_buffer(); }
   611      JPGE_PUT_BYTE(c = (uint8)((m_bit_buffer >> 16) & 0xFF));
   612      if (c == 0xFF) JPGE_PUT_BYTE(0);
   613      m_bit_buffer <<= 8;
   614      m_bits_in -= 8;
   615    }
   616  }
   617  
   618  void jpeg_encoder::code_coefficients_pass_one(int component_num)
   619  {
   620    if (component_num >= 3) return; // just to shut up static analysis
   621    int i, run_len, nbits, temp1;
   622    int16 *src = m_coefficient_array;
   623    uint32 *dc_count = component_num ? m_huff_count[0 + 1] : m_huff_count[0 + 0], *ac_count = component_num ? m_huff_count[2 + 1] : m_huff_count[2 + 0];
   624  
   625    temp1 = src[0] - m_last_dc_val[component_num];
   626    m_last_dc_val[component_num] = src[0];
   627    if (temp1 < 0) temp1 = -temp1;
   628  
   629    nbits = 0;
   630    while (temp1)
   631    {
   632      nbits++; temp1 >>= 1;
   633    }
   634  
   635    dc_count[nbits]++;
   636    for (run_len = 0, i = 1; i < 64; i++)
   637    {
   638      if ((temp1 = m_coefficient_array[i]) == 0)
   639        run_len++;
   640      else
   641      {
   642        while (run_len >= 16)
   643        {
   644          ac_count[0xF0]++;
   645          run_len -= 16;
   646        }
   647        if (temp1 < 0) temp1 = -temp1;
   648        nbits = 1;
   649        while (temp1 >>= 1) nbits++;
   650        ac_count[(run_len << 4) + nbits]++;
   651        run_len = 0;
   652      }
   653    }
   654    if (run_len) ac_count[0]++;
   655  }
   656  
   657  void jpeg_encoder::code_coefficients_pass_two(int component_num)
   658  {
   659    int i, j, run_len, nbits, temp1, temp2;
   660    int16 *pSrc = m_coefficient_array;
   661    uint *codes[2];
   662    uint8 *code_sizes[2];
   663  
   664    if (component_num == 0)
   665    {
   666      codes[0] = m_huff_codes[0 + 0]; codes[1] = m_huff_codes[2 + 0];
   667      code_sizes[0] = m_huff_code_sizes[0 + 0]; code_sizes[1] = m_huff_code_sizes[2 + 0];
   668    }
   669    else
   670    {
   671      codes[0] = m_huff_codes[0 + 1]; codes[1] = m_huff_codes[2 + 1];
   672      code_sizes[0] = m_huff_code_sizes[0 + 1]; code_sizes[1] = m_huff_code_sizes[2 + 1];
   673    }
   674  
   675    temp1 = temp2 = pSrc[0] - m_last_dc_val[component_num];
   676    m_last_dc_val[component_num] = pSrc[0];
   677  
   678    if (temp1 < 0)
   679    {
   680      temp1 = -temp1; temp2--;
   681    }
   682  
   683    nbits = 0;
   684    while (temp1)
   685    {
   686      nbits++; temp1 >>= 1;
   687    }
   688  
   689    put_bits(codes[0][nbits], code_sizes[0][nbits]);
   690    if (nbits) put_bits(temp2 & ((1 << nbits) - 1), nbits);
   691  
   692    for (run_len = 0, i = 1; i < 64; i++)
   693    {
   694      if ((temp1 = m_coefficient_array[i]) == 0)
   695        run_len++;
   696      else
   697      {
   698        while (run_len >= 16)
   699        {
   700          put_bits(codes[1][0xF0], code_sizes[1][0xF0]);
   701          run_len -= 16;
   702        }
   703        if ((temp2 = temp1) < 0)
   704        {
   705          temp1 = -temp1;
   706          temp2--;
   707        }
   708        nbits = 1;
   709        while (temp1 >>= 1)
   710          nbits++;
   711        j = (run_len << 4) + nbits;
   712        put_bits(codes[1][j], code_sizes[1][j]);
   713        put_bits(temp2 & ((1 << nbits) - 1), nbits);
   714        run_len = 0;
   715      }
   716    }
   717    if (run_len)
   718      put_bits(codes[1][0], code_sizes[1][0]);
   719  }
   720  
   721  void jpeg_encoder::code_block(int component_num)
   722  {
   723    DCT2D(m_sample_array);
   724    load_quantized_coefficients(component_num);
   725    if (m_pass_num == 1)
   726      code_coefficients_pass_one(component_num);
   727    else
   728      code_coefficients_pass_two(component_num);
   729  }
   730  
   731  void jpeg_encoder::process_mcu_row()
   732  {
   733    if (m_num_components == 1)
   734    {
   735      for (int i = 0; i < m_mcus_per_row; i++)
   736      {
   737        load_block_8_8_grey(i); code_block(0);
   738      }
   739    }
   740    else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1))
   741    {
   742      for (int i = 0; i < m_mcus_per_row; i++)
   743      {
   744        load_block_8_8(i, 0, 0); code_block(0); load_block_8_8(i, 0, 1); code_block(1); load_block_8_8(i, 0, 2); code_block(2);
   745      }
   746    }
   747    else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1))
   748    {
   749      for (int i = 0; i < m_mcus_per_row; i++)
   750      {
   751        load_block_8_8(i * 2 + 0, 0, 0); code_block(0); load_block_8_8(i * 2 + 1, 0, 0); code_block(0);
   752        load_block_16_8_8(i, 1); code_block(1); load_block_16_8_8(i, 2); code_block(2);
   753      }
   754    }
   755    else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2))
   756    {
   757      for (int i = 0; i < m_mcus_per_row; i++)
   758      {
   759        load_block_8_8(i * 2 + 0, 0, 0); code_block(0); load_block_8_8(i * 2 + 1, 0, 0); code_block(0);
   760        load_block_8_8(i * 2 + 0, 1, 0); code_block(0); load_block_8_8(i * 2 + 1, 1, 0); code_block(0);
   761        load_block_16_8(i, 1); code_block(1); load_block_16_8(i, 2); code_block(2);
   762      }
   763    }
   764  }
   765  
   766  bool jpeg_encoder::terminate_pass_one()
   767  {
   768    optimize_huffman_table(0+0, DC_LUM_CODES); optimize_huffman_table(2+0, AC_LUM_CODES);
   769    if (m_num_components > 1)
   770    {
   771      optimize_huffman_table(0+1, DC_CHROMA_CODES); optimize_huffman_table(2+1, AC_CHROMA_CODES);
   772    }
   773    return second_pass_init();
   774  }
   775  
   776  bool jpeg_encoder::terminate_pass_two()
   777  {
   778    put_bits(0x7F, 7);
   779    flush_output_buffer();
   780    emit_marker(M_EOI);
   781    m_pass_num++; // purposely bump up m_pass_num, for debugging
   782    return true;
   783  }
   784  
   785  bool jpeg_encoder::process_end_of_image()
   786  {
   787    if (m_mcu_y_ofs)
   788    {
   789      if (m_mcu_y_ofs < 16) // check here just to shut up static analysis
   790      {
   791        for (int i = m_mcu_y_ofs; i < m_mcu_y; i++)
   792          memcpy(m_mcu_lines[i], m_mcu_lines[m_mcu_y_ofs - 1], m_image_bpl_mcu);
   793      }
   794  
   795      process_mcu_row();
   796    }
   797  
   798    if (m_pass_num == 1)
   799      return terminate_pass_one();
   800    else
   801      return terminate_pass_two();
   802  }
   803  
   804  void jpeg_encoder::load_mcu(const void *pSrc)
   805  {
   806    const uint8* Psrc = reinterpret_cast<const uint8*>(pSrc);
   807  
   808    uint8* pDst = m_mcu_lines[m_mcu_y_ofs]; // OK to write up to m_image_bpl_xlt bytes to pDst
   809  
   810    if (m_num_components == 1)
   811    {
   812      if (m_image_bpp == 4)
   813        RGBA_to_Y(pDst, Psrc, m_image_x);
   814      else if (m_image_bpp == 3)
   815        RGB_to_Y(pDst, Psrc, m_image_x);
   816      else
   817        memcpy(pDst, Psrc, m_image_x);
   818    }
   819    else
   820    {
   821      if (m_image_bpp == 4)
   822        RGBA_to_YCC(pDst, Psrc, m_image_x);
   823      else if (m_image_bpp == 3)
   824        RGB_to_YCC(pDst, Psrc, m_image_x);
   825      else
   826        Y_to_YCC(pDst, Psrc, m_image_x);
   827    }
   828  
   829    // Possibly duplicate pixels at end of scanline if not a multiple of 8 or 16
   830    if (m_num_components == 1)
   831      memset(m_mcu_lines[m_mcu_y_ofs] + m_image_bpl_xlt, pDst[m_image_bpl_xlt - 1], m_image_x_mcu - m_image_x);
   832    else
   833    {
   834      const uint8 y = pDst[m_image_bpl_xlt - 3 + 0], cb = pDst[m_image_bpl_xlt - 3 + 1], cr = pDst[m_image_bpl_xlt - 3 + 2];
   835      uint8 *q = m_mcu_lines[m_mcu_y_ofs] + m_image_bpl_xlt;
   836      for (int i = m_image_x; i < m_image_x_mcu; i++)
   837      {
   838        *q++ = y; *q++ = cb; *q++ = cr;
   839      }
   840    }
   841  
   842    if (++m_mcu_y_ofs == m_mcu_y)
   843    {
   844      process_mcu_row();
   845      m_mcu_y_ofs = 0;
   846    }
   847  }
   848  
   849  void jpeg_encoder::clear()
   850  {
   851    m_mcu_lines[0] = NULL;
   852    m_pass_num = 0;
   853    m_all_stream_writes_succeeded = true;
   854  }
   855  
   856  jpeg_encoder::jpeg_encoder()
   857  {
   858    clear();
   859  }
   860  
   861  jpeg_encoder::~jpeg_encoder()
   862  {
   863    deinit();
   864  }
   865  
   866  bool jpeg_encoder::init(output_stream *pStream, int width, int height, int src_channels, const params &comp_params)
   867  {
   868    deinit();
   869    if (((!pStream) || (width < 1) || (height < 1)) || ((src_channels != 1) && (src_channels != 3) && (src_channels != 4)) || (!comp_params.check())) return false;
   870    m_pStream = pStream;
   871    m_params = comp_params;
   872    return jpg_open(width, height, src_channels);
   873  }
   874  
   875  void jpeg_encoder::deinit()
   876  {
   877    jpge_free(m_mcu_lines[0]);
   878    clear();
   879  }
   880  
   881  bool jpeg_encoder::process_scanline(const void* pScanline)
   882  {
   883    if ((m_pass_num < 1) || (m_pass_num > 2)) return false;
   884    if (m_all_stream_writes_succeeded)
   885    {
   886      if (!pScanline)
   887      {
   888        if (!process_end_of_image()) return false;
   889      }
   890      else
   891      {
   892        load_mcu(pScanline);
   893      }
   894    }
   895    return m_all_stream_writes_succeeded;
   896  }
   897  
   898  // Higher level wrappers/examples (optional).
   899  #include <stdio.h>
   900  
   901  class cfile_stream : public output_stream
   902  {
   903     cfile_stream(const cfile_stream &);
   904     cfile_stream &operator= (const cfile_stream &);
   905  
   906     FILE* m_pFile;
   907     bool m_bStatus;
   908  
   909  public:
   910     cfile_stream() : m_pFile(NULL), m_bStatus(false) { }
   911  
   912     virtual ~cfile_stream()
   913     {
   914        close();
   915     }
   916  
   917     bool open(const char *pFilename)
   918     {
   919        close();
   920        m_pFile = fopen(pFilename, "wb");
   921        m_bStatus = (m_pFile != NULL);
   922        return m_bStatus;
   923     }
   924  
   925     bool close()
   926     {
   927        if (m_pFile)
   928        {
   929           if (fclose(m_pFile) == EOF)
   930           {
   931              m_bStatus = false;
   932           }
   933           m_pFile = NULL;
   934        }
   935        return m_bStatus;
   936     }
   937  
   938     virtual bool put_buf(const void* pBuf, int len)
   939     {
   940        m_bStatus = m_bStatus && (fwrite(pBuf, len, 1, m_pFile) == 1);
   941        return m_bStatus;
   942     }
   943  
   944     uint get_size() const
   945     {
   946        return m_pFile ? ftell(m_pFile) : 0;
   947     }
   948  };
   949  
   950  // Writes JPEG image to file.
   951  bool compress_image_to_jpeg_file(const char *pFilename, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params)
   952  {
   953    cfile_stream dst_stream;
   954    if (!dst_stream.open(pFilename))
   955      return false;
   956  
   957    jpge::jpeg_encoder dst_image;
   958    if (!dst_image.init(&dst_stream, width, height, num_channels, comp_params))
   959      return false;
   960  
   961    for (uint pass_index = 0; pass_index < dst_image.get_total_passes(); pass_index++)
   962    {
   963      for (int i = 0; i < height; i++)
   964      {
   965         const uint8* pBuf = pImage_data + i * width * num_channels;
   966         if (!dst_image.process_scanline(pBuf))
   967            return false;
   968      }
   969      if (!dst_image.process_scanline(NULL))
   970         return false;
   971    }
   972  
   973    dst_image.deinit();
   974  
   975    return dst_stream.close();
   976  }
   977  
   978  class memory_stream : public output_stream
   979  {
   980     memory_stream(const memory_stream &);
   981     memory_stream &operator= (const memory_stream &);
   982  
   983     uint8 *m_pBuf;
   984     uint m_buf_size, m_buf_ofs;
   985  
   986  public:
   987     memory_stream(void *pBuf, uint buf_size) : m_pBuf(static_cast<uint8*>(pBuf)), m_buf_size(buf_size), m_buf_ofs(0) { }
   988  
   989     virtual ~memory_stream() { }
   990  
   991     virtual bool put_buf(const void* pBuf, int len)
   992     {
   993        uint buf_remaining = m_buf_size - m_buf_ofs;
   994        if ((uint)len > buf_remaining)
   995           return false;
   996        memcpy(m_pBuf + m_buf_ofs, pBuf, len);
   997        m_buf_ofs += len;
   998        return true;
   999     }
  1000  
  1001     uint get_size() const
  1002     {
  1003        return m_buf_ofs;
  1004     }
  1005  };
  1006  
  1007  bool compress_image_to_jpeg_file_in_memory(void *pDstBuf, int &buf_size, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params)
  1008  {
  1009     if ((!pDstBuf) || (!buf_size))
  1010        return false;
  1011  
  1012     memory_stream dst_stream(pDstBuf, buf_size);
  1013  
  1014     buf_size = 0;
  1015  
  1016     jpge::jpeg_encoder dst_image;
  1017     if (!dst_image.init(&dst_stream, width, height, num_channels, comp_params))
  1018        return false;
  1019  
  1020     for (uint pass_index = 0; pass_index < dst_image.get_total_passes(); pass_index++)
  1021     {
  1022       for (int i = 0; i < height; i++)
  1023       {
  1024          const uint8* pScanline = pImage_data + i * width * num_channels;
  1025          if (!dst_image.process_scanline(pScanline))
  1026             return false;
  1027       }
  1028       if (!dst_image.process_scanline(NULL))
  1029          return false;
  1030     }
  1031  
  1032     dst_image.deinit();
  1033  
  1034     buf_size = dst_stream.get_size();
  1035     return true;
  1036  }
  1037  
  1038  } // namespace jpge