genericopenlibs/liboil/tsrc/examples/jpeg/src/jpeg.c
changeset 18 47c74d1534e1
equal deleted inserted replaced
0:e4d67989cc36 18:47c74d1534e1
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 #include <sys/stat.h>
       
    19 #include <fcntl.h>
       
    20 #include <unistd.h>
       
    21 #include <stdlib.h>
       
    22 #include <stdio.h>
       
    23 #include <string.h>
       
    24 #include <ctype.h>
       
    25 #include <limits.h>
       
    26 #include <liboil/liboil-stdint.h>
       
    27 #include <liboil/liboil.h>
       
    28 #include <liboil/liboildebug.h>
       
    29 #include <stdarg.h>
       
    30 
       
    31 #include "jpeg_internal.h"
       
    32 #include <liboil/globals.h>
       
    33 
       
    34 #define MAX(a,b) ((a)>(b) ? (a) : (b))
       
    35 
       
    36 
       
    37 extern uint8_t jpeg_standard_tables[];
       
    38 extern int jpeg_standard_tables_size;
       
    39 
       
    40 void jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...);
       
    41 
       
    42 void jpeg_decoder_define_huffman_tables (JpegDecoder * dec);
       
    43 void jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec);
       
    44 void jpeg_decoder_define_quantization_tables (JpegDecoder *dec);
       
    45 void jpeg_decoder_define_restart_interval (JpegDecoder *dec);
       
    46 void jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker);
       
    47 void jpeg_decoder_start_of_scan (JpegDecoder * dec);
       
    48 
       
    49 
       
    50 /* misc helper function declarations */
       
    51 
       
    52 static void dumpbits (JpegBits * bits);
       
    53 static char *sprintbits (char *str, unsigned int bits, int n);
       
    54 
       
    55 static void huffman_table_load_std_jpeg (JpegDecoder * dec);
       
    56 
       
    57 static void jpeg_decoder_verify_header (JpegDecoder *dec);
       
    58 static void jpeg_decoder_init_decoder (JpegDecoder *dec);
       
    59 
       
    60 
       
    61 
       
    62 static void
       
    63 jpeg_decoder_verify_header (JpegDecoder *dec)
       
    64 {
       
    65   int max_quant_table = 0;
       
    66   int i;
       
    67 
       
    68   if (dec->sof_type != JPEG_MARKER_SOF_0) {
       
    69     OIL_ERROR("only handle baseline DCT");
       
    70     dec->error = TRUE;
       
    71   }
       
    72 
       
    73   if (dec->width < 1) {
       
    74     OIL_ERROR("height can't be 0");
       
    75     dec->error = TRUE;
       
    76   }
       
    77 
       
    78   switch (dec->sof_type) {
       
    79     case JPEG_MARKER_SOF_0:
       
    80       /* baseline DCT */
       
    81       max_quant_table = 3;
       
    82       if (dec->depth != 8) {
       
    83         OIL_ERROR("depth must be 8 (%d)", dec->depth);
       
    84         dec->error = TRUE;
       
    85       }
       
    86       break;
       
    87     case JPEG_MARKER_SOF_1:
       
    88       /* extended DCT */
       
    89       max_quant_table = 3;
       
    90       if (dec->depth != 8 && dec->depth != 12) {
       
    91         OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
       
    92         dec->error = TRUE;
       
    93       }
       
    94       break;
       
    95     case JPEG_MARKER_SOF_2:
       
    96       /* progressive DCT */
       
    97       max_quant_table = 3;
       
    98       if (dec->depth != 8 && dec->depth != 12) {
       
    99         OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
       
   100         dec->error = TRUE;
       
   101       }
       
   102       break;
       
   103     case JPEG_MARKER_SOF_3:
       
   104       /* lossless DCT */
       
   105       max_quant_table = 0;
       
   106       if (dec->depth < 2 || dec->depth > 16) {
       
   107         OIL_ERROR("depth must be between 2 and 16 (%d)", dec->depth);
       
   108         dec->error = TRUE;
       
   109       }
       
   110       break;
       
   111     default:
       
   112       break;
       
   113   }
       
   114 
       
   115   if (dec->n_components < 0 || dec->n_components > 255) {
       
   116     OIL_ERROR("n_components must be in the range 0-255 (%d)",
       
   117         dec->n_components);
       
   118     dec->error = TRUE;
       
   119   }
       
   120   if (dec->sof_type == JPEG_MARKER_SOF_2 && dec->n_components > 4) {
       
   121     OIL_ERROR("n_components must be <= 4 for progressive DCT (%d)",
       
   122         dec->n_components);
       
   123     dec->error = TRUE;
       
   124   }
       
   125 
       
   126   for (i = 0; i < dec->n_components; i++) {
       
   127     if (dec->components[i].id < 0 || dec->components[i].id > 255) {
       
   128       OIL_ERROR("component ID out of range");
       
   129       dec->error = TRUE;
       
   130       break;
       
   131     }
       
   132     if (dec->components[i].h_sample < 1 || dec->components[i].h_sample > 4 ||
       
   133         dec->components[i].v_sample < 1 || dec->components[i].v_sample > 4) {
       
   134       OIL_ERROR("sample factor(s) for component %d out of range %d %d",
       
   135           i, dec->components[i].h_sample, dec->components[i].v_sample);
       
   136       dec->error = TRUE;
       
   137       break;
       
   138     }
       
   139     if (dec->components[i].quant_table < 0 ||
       
   140         dec->components[i].quant_table > max_quant_table) {
       
   141       OIL_ERROR("quant table for component %d out of range (%d)",
       
   142           i, dec->components[i].quant_table);
       
   143       dec->error = TRUE;
       
   144       break;
       
   145     }
       
   146   }
       
   147 }
       
   148 
       
   149 static void
       
   150 jpeg_decoder_init_decoder (JpegDecoder *dec)
       
   151 {
       
   152   int max_h_sample = 0;
       
   153   int max_v_sample = 0;
       
   154   int i;
       
   155 
       
   156   /* decoder limitations */
       
   157   if (dec->n_components != 3) {
       
   158     jpeg_decoder_error(dec, "wrong number of components %d", dec->n_components);
       
   159     return;
       
   160   }
       
   161   if (dec->sof_type != JPEG_MARKER_SOF_0) {
       
   162     jpeg_decoder_error(dec, "only handle baseline DCT");
       
   163     return;
       
   164   }
       
   165 
       
   166 
       
   167 
       
   168 
       
   169   for (i=0; i < dec->n_components; i++) {
       
   170     max_h_sample = MAX (max_h_sample, dec->components[i].h_sample);
       
   171     max_v_sample = MAX (max_v_sample, dec->components[i].v_sample);
       
   172   }
       
   173 
       
   174   dec->width_blocks =
       
   175       (dec->width + 8 * max_h_sample - 1) / (8 * max_h_sample);
       
   176   dec->height_blocks =
       
   177       (dec->height + 8 * max_v_sample - 1) / (8 * max_v_sample);
       
   178   for (i = 0; i < dec->n_components; i++) {
       
   179     int rowstride;
       
   180     int image_size;
       
   181 
       
   182     dec->components[i].h_subsample = max_h_sample /
       
   183         dec->components[i].h_sample;
       
   184     dec->components[i].v_subsample = max_v_sample /
       
   185         dec->components[i].v_sample;
       
   186 
       
   187     rowstride = dec->width_blocks * 8 * max_h_sample /
       
   188         dec->components[i].h_subsample;
       
   189     image_size = rowstride *
       
   190         (dec->height_blocks * 8 * max_v_sample /
       
   191         dec->components[i].v_subsample);
       
   192     dec->components[i].rowstride = rowstride;
       
   193     dec->components[i].image = malloc (image_size);
       
   194   }
       
   195 }
       
   196 
       
   197 
       
   198 void
       
   199 generate_code_table (int *huffsize)
       
   200 {
       
   201   int code;
       
   202   int i;
       
   203   int j;
       
   204   int k;
       
   205   char str[33];
       
   206 
       
   207   //int l;
       
   208 
       
   209   code = 0;
       
   210   k = 0;
       
   211   for (i = 0; i < 16; i++) {
       
   212     for (j = 0; j < huffsize[i]; j++) {
       
   213       OIL_DEBUG ("huffcode[%d] = %s", k,
       
   214           sprintbits (str, code >> (15 - i), i + 1));
       
   215       code++;
       
   216       k++;
       
   217     }
       
   218     code <<= 1;
       
   219   }
       
   220 
       
   221 }
       
   222 
       
   223 int
       
   224 huffman_table_init_jpeg (HuffmanTable *table, JpegBits * bits)
       
   225 {
       
   226   int n_symbols;
       
   227   int huffsize[16];
       
   228   int i, j, k;
       
   229   unsigned int symbol;
       
   230   int n = 0;
       
   231 
       
   232   huffman_table_init (table);
       
   233 
       
   234   /* huffsize[i] is the number of symbols that have length
       
   235    * (i+1) bits.  Maximum bit length is 16 bits, so there are
       
   236    * 16 entries. */
       
   237   n_symbols = 0;
       
   238   for (i = 0; i < 16; i++) {
       
   239     huffsize[i] = jpeg_bits_get_u8 (bits);
       
   240     n++;
       
   241     n_symbols += huffsize[i];
       
   242   }
       
   243 
       
   244   /* Build up the symbol table.  The first symbol is all 0's, with
       
   245    * the number of bits determined by the first non-zero entry in
       
   246    * huffsize[].  Subsequent symbols with the same bit length are
       
   247    * incremented by 1.  Increasing the bit length shifts the
       
   248    * symbol 1 bit to the left. */
       
   249   symbol = 0;
       
   250   k = 0;
       
   251   for (i = 0; i < 16; i++) {
       
   252     for (j = 0; j < huffsize[i]; j++) {
       
   253       huffman_table_add (table, symbol, i + 1, jpeg_bits_get_u8 (bits));
       
   254       n++;
       
   255       symbol++;
       
   256       k++;
       
   257     }
       
   258     /* This checks that our symbol is actually less than the
       
   259      * number of bits we think it is.  This is only triggered
       
   260      * for bad huffsize[] arrays. */
       
   261     if (symbol >= (1 << (i + 1))) {
       
   262       /* FIXME jpeg_decoder_error() */
       
   263       OIL_DEBUG ("bad huffsize[] array");
       
   264       return -1;
       
   265     }
       
   266 
       
   267     symbol <<= 1;
       
   268   }
       
   269 
       
   270   huffman_table_dump (table);
       
   271 
       
   272   return n;
       
   273 }
       
   274 
       
   275 static void
       
   276 dumpbits (JpegBits * bits)
       
   277 {
       
   278   int i;
       
   279   int j;
       
   280   unsigned char *p;
       
   281   char s[40];
       
   282 
       
   283   p = bits->ptr;
       
   284   for (i = 0; i < 8; i++) {
       
   285     sprintf (s, "%02x %02x %02x %02x %02x %02x %02x %02x ........",
       
   286         p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
       
   287     for (j = 0; j < 8; j++) {
       
   288       s[j + 24] = (isprint (p[j])) ? p[j] : '.';
       
   289     }
       
   290     OIL_DEBUG ("%s", s);
       
   291     p += 8;
       
   292   }
       
   293 
       
   294 }
       
   295 
       
   296 int
       
   297 jpeg_decoder_find_component_by_id (JpegDecoder * dec, int id)
       
   298 {
       
   299   int i;
       
   300 
       
   301   for (i = 0; i < dec->n_components; i++) {
       
   302     if (dec->components[i].id == id)
       
   303       return i;
       
   304   }
       
   305   OIL_DEBUG ("undefined component id %d", id);
       
   306   return 0;
       
   307 }
       
   308 
       
   309 int
       
   310 jpeg_decoder_application0 (JpegDecoder * dec, JpegBits * bits)
       
   311 {
       
   312   int length;
       
   313 
       
   314   OIL_DEBUG ("app0");
       
   315 
       
   316   length = get_be_u16 (bits);
       
   317   OIL_DEBUG ("length=%d", length);
       
   318 
       
   319   if (memcmp (bits->ptr, "JFIF", 4) == 0 && bits->ptr[4] == 0) {
       
   320     int version;
       
   321     int units;
       
   322     int x_density;
       
   323     int y_density;
       
   324     int x_thumbnail;
       
   325     int y_thumbnail;
       
   326 
       
   327     OIL_DEBUG ("JFIF");
       
   328     bits->ptr += 5;
       
   329 
       
   330     version = get_be_u16 (bits);
       
   331     units = get_u8 (bits);
       
   332     x_density = get_be_u16 (bits);
       
   333     y_density = get_be_u16 (bits);
       
   334     x_thumbnail = get_u8 (bits);
       
   335     y_thumbnail = get_u8 (bits);
       
   336 
       
   337     OIL_DEBUG ("version = %04x", version);
       
   338     OIL_DEBUG ("units = %d", units);
       
   339     OIL_DEBUG ("x_density = %d", x_density);
       
   340     OIL_DEBUG ("y_density = %d", y_density);
       
   341     OIL_DEBUG ("x_thumbnail = %d", x_thumbnail);
       
   342     OIL_DEBUG ("y_thumbnail = %d", y_thumbnail);
       
   343 
       
   344   }
       
   345 
       
   346   if (memcmp (bits->ptr, "JFXX", 4) == 0 && bits->ptr[4] == 0) {
       
   347     OIL_DEBUG ("JFIF extension (not handled)");
       
   348     bits->ptr += length - 2;
       
   349   }
       
   350 
       
   351   return length;
       
   352 }
       
   353 
       
   354 int
       
   355 jpeg_decoder_application_misc (JpegDecoder * dec, JpegBits * bits)
       
   356 {
       
   357   int length;
       
   358 
       
   359   OIL_DEBUG ("appX");
       
   360 
       
   361   length = get_be_u16 (bits);
       
   362   OIL_DEBUG ("length=%d", length);
       
   363 
       
   364   OIL_DEBUG ("JPEG application tag X ignored");
       
   365   dumpbits (bits);
       
   366 
       
   367   bits->ptr += length - 2;
       
   368 
       
   369   return length;
       
   370 }
       
   371 
       
   372 int
       
   373 jpeg_decoder_comment (JpegDecoder * dec, JpegBits * bits)
       
   374 {
       
   375   int length;
       
   376 
       
   377   OIL_DEBUG ("comment");
       
   378 
       
   379   length = get_be_u16 (bits);
       
   380   OIL_DEBUG ("length=%d", length);
       
   381 
       
   382   dumpbits (bits);
       
   383 
       
   384   bits->ptr += length - 2;
       
   385 
       
   386   return length;
       
   387 }
       
   388 
       
   389 int
       
   390 jpeg_decoder_restart_interval (JpegDecoder * dec, JpegBits * bits)
       
   391 {
       
   392   int length;
       
   393 
       
   394   OIL_DEBUG ("comment");
       
   395 
       
   396   length = get_be_u16 (bits);
       
   397   OIL_DEBUG ("length=%d", length);
       
   398 
       
   399   dec->restart_interval = get_be_u16 (bits);
       
   400   OIL_DEBUG ("restart_interval=%d", dec->restart_interval);
       
   401 
       
   402   return length;
       
   403 }
       
   404 
       
   405 int
       
   406 jpeg_decoder_restart (JpegDecoder * dec, JpegBits * bits)
       
   407 {
       
   408   OIL_DEBUG ("restart");
       
   409 
       
   410   return 0;
       
   411 }
       
   412 
       
   413 void
       
   414 jpeg_decoder_decode_entropy_segment (JpegDecoder * dec)
       
   415 {
       
   416   JpegBits * bits = &dec->bits;
       
   417   JpegBits b2, *bits2 = &b2;
       
   418   short block[64];
       
   419   short block2[64];
       
   420   unsigned char *newptr;
       
   421   int len;
       
   422   int j;
       
   423   int i;
       
   424   int go;
       
   425   int x, y;
       
   426   int n;
       
   427   int ret;
       
   428 
       
   429   len = 0;
       
   430   j = 0;
       
   431   while (1) {
       
   432     if (bits->ptr[len] == 0xff && bits->ptr[len + 1] != 0x00) {
       
   433       break;
       
   434     }
       
   435     len++;
       
   436   }
       
   437   OIL_DEBUG ("entropy length = %d", len);
       
   438 
       
   439   /* we allocate extra space, since the getbits() code can
       
   440    * potentially read past the end of the buffer */
       
   441   newptr = malloc (len + 2);
       
   442   for (i = 0; i < len; i++) {
       
   443     newptr[j] = bits->ptr[i];
       
   444     j++;
       
   445     if (bits->ptr[i] == 0xff)
       
   446       i++;
       
   447   }
       
   448   bits->ptr += len;
       
   449 
       
   450   bits2->ptr = newptr;
       
   451   bits2->idx = 0;
       
   452   bits2->end = newptr + j;
       
   453   newptr[j] = 0;
       
   454   newptr[j + 1] = 0;
       
   455 
       
   456   dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
       
   457   go = 1;
       
   458   x = dec->x;
       
   459   y = dec->y;
       
   460   n = dec->restart_interval;
       
   461   if (n == 0) n = INT_MAX;
       
   462   while (n-- > 0) {
       
   463     for (i = 0; i < dec->scan_list_length; i++) {
       
   464       int dc_table_index;
       
   465       int ac_table_index;
       
   466       int quant_index;
       
   467       unsigned char *ptr;
       
   468       int component_index;
       
   469 
       
   470       OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
       
   471           x, y,
       
   472           dec->scan_list[i].component_index,
       
   473           dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
       
   474 
       
   475       component_index = dec->scan_list[i].component_index;
       
   476       dc_table_index = dec->scan_list[i].dc_table;
       
   477       ac_table_index = dec->scan_list[i].ac_table;
       
   478       quant_index = dec->scan_list[i].quant_table;
       
   479 
       
   480       ret = huffman_table_decode_macroblock (block,
       
   481           &dec->dc_huff_table[dc_table_index],
       
   482           &dec->ac_huff_table[ac_table_index], bits2);
       
   483       if (ret < 0) {
       
   484         OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
       
   485             x, y,
       
   486             dec->scan_list[i].component_index,
       
   487             dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
       
   488         n = 0;
       
   489         break;
       
   490       }
       
   491 
       
   492       OIL_DEBUG ("using quant table %d", quant_index);
       
   493       oil_mult8x8_s16 (block2, block, dec->quant_tables[quant_index].quantizer,
       
   494           sizeof (short) * 8, sizeof(short) * 8, sizeof (short) * 8);
       
   495       dec->dc[component_index] += block2[0];
       
   496       block2[0] = dec->dc[component_index];
       
   497       oil_unzigzag8x8_s16 (block, sizeof (short) * 8, block2,
       
   498           sizeof (short) * 8);
       
   499       oil_idct8x8_s16 (block2, sizeof (short) * 8, block, sizeof (short) * 8);
       
   500       oil_trans8x8_s16 (block, sizeof (short) * 8, block2, sizeof (short) * 8);
       
   501 
       
   502       ptr = dec->components[component_index].image +
       
   503           x * dec->components[component_index].h_sample +
       
   504           dec->scan_list[i].offset +
       
   505           dec->components[component_index].rowstride * y *
       
   506           dec->components[component_index].v_sample;
       
   507 
       
   508       oil_clipconv8x8_u8_s16 (ptr,
       
   509           dec->components[component_index].rowstride,
       
   510           block, sizeof (short) * 8);
       
   511     }
       
   512     x += 8;
       
   513     if (x * dec->scan_h_subsample >= dec->width) {
       
   514       x = 0;
       
   515       y += 8;
       
   516     }
       
   517     if (y * dec->scan_v_subsample >= dec->height) {
       
   518       go = 0;
       
   519     }
       
   520   }
       
   521   dec->x = x;
       
   522   dec->y = y;
       
   523   free (newptr);
       
   524 }
       
   525 
       
   526 
       
   527 
       
   528 JpegDecoder *
       
   529 jpeg_decoder_new (void)
       
   530 {
       
   531   JpegDecoder *dec;
       
   532 
       
   533   oil_init ();
       
   534 
       
   535   dec = malloc (sizeof(JpegDecoder));
       
   536   memset (dec, 0, sizeof(JpegDecoder));
       
   537 
       
   538   huffman_table_load_std_jpeg (dec);
       
   539 
       
   540   return dec;
       
   541 }
       
   542 
       
   543 void
       
   544 jpeg_decoder_free (JpegDecoder * dec)
       
   545 {
       
   546   int i;
       
   547 
       
   548   for (i = 0; i < JPEG_MAX_COMPONENTS; i++) {
       
   549     if (dec->components[i].image)
       
   550       free (dec->components[i].image);
       
   551   }
       
   552 
       
   553   if (dec->data)
       
   554     free (dec->data);
       
   555 
       
   556   free (dec);
       
   557 }
       
   558 
       
   559 void
       
   560 jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...)
       
   561 {
       
   562   va_list varargs;
       
   563 
       
   564   if (dec->error) return;
       
   565 
       
   566   va_start (varargs, fmt);
       
   567 #if 0
       
   568   vasprintf(&dec->error_message, fmt, varargs);
       
   569 #else
       
   570   dec->error_message = malloc(100);
       
   571   vsnprintf(dec->error_message, 100, fmt, varargs);
       
   572 #endif
       
   573   va_end (varargs);
       
   574 
       
   575   OIL_ERROR("decoder error: %s", dec->error_message);
       
   576   abort();
       
   577   dec->error = TRUE;
       
   578 }
       
   579 
       
   580 int
       
   581 jpeg_decoder_get_marker (JpegDecoder *dec, int *marker)
       
   582 {
       
   583   int a,b;
       
   584   JpegBits *bits = &dec->bits;
       
   585 
       
   586   if (jpeg_bits_available(bits) < 2) {
       
   587     return FALSE;
       
   588   }
       
   589 
       
   590   a = jpeg_bits_get_u8(bits);
       
   591   if (a != 0xff) {
       
   592     jpeg_decoder_error(dec, "expected marker, not 0x%02x", a);
       
   593     return FALSE;
       
   594   }
       
   595 
       
   596   do {
       
   597     b = jpeg_bits_get_u8 (bits);
       
   598   } while (b == 0xff && jpeg_bits_error(bits));
       
   599 
       
   600   *marker = b;
       
   601   return TRUE;
       
   602 }
       
   603 
       
   604 void
       
   605 jpeg_decoder_skip (JpegDecoder *dec)
       
   606 {
       
   607   int length;
       
   608 
       
   609   length = jpeg_bits_get_u16_be (&dec->bits);
       
   610   jpeg_bits_skip (&dec->bits, length - 2);
       
   611 }
       
   612 
       
   613 int
       
   614 jpeg_decoder_decode (JpegDecoder *dec)
       
   615 {
       
   616   JpegBits *bits;
       
   617   int marker;
       
   618 
       
   619   dec->error = FALSE;
       
   620 
       
   621   bits = &dec->bits;
       
   622 
       
   623   /* Note: The spec is ambiguous as to whether fill bytes can preceed
       
   624    * the first marker.  We'll assume yes. */
       
   625   if (!jpeg_decoder_get_marker (dec, &marker)) {
       
   626     return FALSE;
       
   627   }
       
   628   if (marker != JPEG_MARKER_SOI) {
       
   629     jpeg_decoder_error(dec, "not a JPEG image");
       
   630     return FALSE;
       
   631   }
       
   632 
       
   633   /* Interpret markers up to the start of frame */
       
   634   while (!dec->error) {
       
   635     if (!jpeg_decoder_get_marker (dec, &marker)) {
       
   636       return FALSE;
       
   637     }
       
   638 
       
   639     if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
       
   640       jpeg_decoder_define_huffman_tables (dec);
       
   641     } else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
       
   642       jpeg_decoder_define_arithmetic_conditioning (dec);
       
   643     } else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
       
   644       jpeg_decoder_define_quantization_tables (dec);
       
   645     } else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
       
   646       jpeg_decoder_define_restart_interval (dec);
       
   647     } else if (JPEG_MARKER_IS_APP(marker)) {
       
   648       /* FIXME decode app segment */
       
   649       jpeg_decoder_skip (dec);
       
   650     } else if (marker == JPEG_MARKER_COMMENT) {
       
   651       jpeg_decoder_skip (dec);
       
   652     } else if (JPEG_MARKER_IS_START_OF_FRAME(marker)) {
       
   653       break;
       
   654     } else {
       
   655       jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
       
   656       return FALSE;
       
   657     }
       
   658   }
       
   659 
       
   660   jpeg_decoder_start_of_frame(dec, marker);
       
   661 
       
   662   jpeg_decoder_verify_header (dec);
       
   663   if (dec->error) {
       
   664     return FALSE;
       
   665   }
       
   666 
       
   667   jpeg_decoder_init_decoder (dec);
       
   668   if (dec->error) {
       
   669     return FALSE;
       
   670   }
       
   671 
       
   672   /* In this section, we loop over parse units until we reach the end
       
   673    * of the image. */
       
   674   while (!dec->error) {
       
   675     if (!jpeg_decoder_get_marker (dec, &marker)) {
       
   676       return FALSE;
       
   677     }
       
   678 
       
   679     if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
       
   680       jpeg_decoder_define_huffman_tables (dec);
       
   681     } else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
       
   682       jpeg_decoder_define_arithmetic_conditioning (dec);
       
   683     } else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
       
   684       jpeg_decoder_define_quantization_tables (dec);
       
   685     } else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
       
   686       jpeg_decoder_define_restart_interval (dec);
       
   687     } else if (JPEG_MARKER_IS_APP(marker)) {
       
   688       jpeg_decoder_skip (dec);
       
   689     } else if (marker == JPEG_MARKER_COMMENT) {
       
   690       jpeg_decoder_skip (dec);
       
   691     } else if (marker == JPEG_MARKER_SOS) {
       
   692       jpeg_decoder_start_of_scan (dec);
       
   693       jpeg_decoder_decode_entropy_segment (dec);
       
   694     } else if (JPEG_MARKER_IS_RESET(marker)) {
       
   695       jpeg_decoder_decode_entropy_segment (dec);
       
   696     } else if (marker == JPEG_MARKER_EOI) {
       
   697       break;
       
   698     } else {
       
   699       jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
       
   700       return FALSE;
       
   701     }
       
   702   }
       
   703 
       
   704   return TRUE;
       
   705 }
       
   706 
       
   707 /* handle markers */
       
   708 
       
   709 void
       
   710 jpeg_decoder_define_huffman_tables (JpegDecoder * dec)
       
   711 {
       
   712   JpegBits *bits = &dec->bits;
       
   713   int length;
       
   714   int tc;
       
   715   int th;
       
   716   int x;
       
   717   HuffmanTable *hufftab;
       
   718 
       
   719   OIL_DEBUG ("define huffman tables");
       
   720 
       
   721   length = jpeg_bits_get_u16_be (bits);
       
   722   if (length < 2) {
       
   723     jpeg_decoder_error(dec, "length too short");
       
   724     return;
       
   725   }
       
   726   length -= 2;
       
   727 
       
   728   while (length > 0) {
       
   729     x = jpeg_bits_get_u8 (bits);
       
   730     length--;
       
   731 
       
   732     tc = x >> 4;
       
   733     th = x & 0xf;
       
   734 
       
   735     OIL_DEBUG ("huff table type %d (%s) index %d", tc, tc ? "ac" : "dc", th);
       
   736     if (tc > 1 || th > 3) {
       
   737       jpeg_decoder_error(dec, "huffman table type or index out of range");
       
   738       return;
       
   739     }
       
   740 
       
   741     if (tc) {
       
   742       hufftab = &dec->ac_huff_table[th];
       
   743       length -= huffman_table_init_jpeg (hufftab, bits);
       
   744     } else {
       
   745       hufftab = &dec->dc_huff_table[th];
       
   746       length -= huffman_table_init_jpeg (hufftab, bits);
       
   747     }
       
   748   }
       
   749   if (length < 0) {
       
   750     jpeg_decoder_error(dec, "huffman table overran available bytes");
       
   751     return;
       
   752   }
       
   753 }
       
   754 
       
   755 void
       
   756 jpeg_decoder_define_quantization_tables (JpegDecoder *dec)
       
   757 {
       
   758   JpegBits *bits = &dec->bits;
       
   759   JpegQuantTable *table;
       
   760   int length;
       
   761   int pq;
       
   762   int tq;
       
   763   int i;
       
   764 
       
   765   OIL_INFO ("define quantization table");
       
   766 
       
   767   length = jpeg_bits_get_u16_be (bits);
       
   768   if (length < 2) {
       
   769     jpeg_decoder_error(dec, "length too short");
       
   770     return;
       
   771   }
       
   772   length -= 2;
       
   773 
       
   774   while (length > 0) {
       
   775     int x;
       
   776     
       
   777     x = jpeg_bits_get_u8 (bits);
       
   778     length--;
       
   779     pq = x >> 4;
       
   780     tq = x & 0xf;
       
   781 
       
   782     if (pq > 1) {
       
   783       jpeg_decoder_error (dec, "bad pq value");
       
   784       return;
       
   785     }
       
   786     if (tq > 3) {
       
   787       jpeg_decoder_error (dec, "bad tq value");
       
   788       return;
       
   789     }
       
   790 
       
   791     table = &dec->quant_tables[tq];
       
   792     if (pq) {
       
   793       for (i = 0; i < 64; i++) {
       
   794         table->quantizer[i] = jpeg_bits_get_u16_be (bits);
       
   795         length -= 2;
       
   796       }
       
   797     } else {
       
   798       for (i = 0; i < 64; i++) {
       
   799         table->quantizer[i] = jpeg_bits_get_u8 (bits);
       
   800         length -= 1;
       
   801       }
       
   802     }
       
   803   }
       
   804   if (length < 0) {
       
   805     jpeg_decoder_error(dec, "quantization table overran available bytes");
       
   806     return;
       
   807   }
       
   808 }
       
   809 
       
   810 void
       
   811 jpeg_decoder_define_restart_interval (JpegDecoder *dec)
       
   812 {
       
   813   JpegBits *bits = &dec->bits;
       
   814   int length;
       
   815 
       
   816   length = jpeg_bits_get_u16_be (bits);
       
   817   if (length != 4) {
       
   818     jpeg_decoder_error(dec, "length supposed to be 4 (%d)", length);
       
   819     return;
       
   820   }
       
   821 
       
   822   /* FIXME this needs to be checked somewhere */
       
   823   dec->restart_interval = jpeg_bits_get_u16_be (bits);
       
   824 }
       
   825 
       
   826 void
       
   827 jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec)
       
   828 {
       
   829   /* we don't handle arithmetic coding, so skip it */
       
   830   jpeg_decoder_skip (dec);
       
   831 }
       
   832 
       
   833 void
       
   834 jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker)
       
   835 {
       
   836   JpegBits *bits = &dec->bits;
       
   837   int i;
       
   838   int length;
       
   839 
       
   840   OIL_INFO ("start of frame");
       
   841 
       
   842   dec->sof_type = marker;
       
   843 
       
   844   length = jpeg_bits_get_u16_be (bits);
       
   845 
       
   846   if (jpeg_bits_available(bits) < length) {
       
   847     jpeg_decoder_error(dec, "not enough data for start_of_frame (%d < %d)",
       
   848         length, jpeg_bits_available(bits));
       
   849     return;
       
   850   }
       
   851 
       
   852   dec->depth = jpeg_bits_get_u8 (bits);
       
   853   dec->height = jpeg_bits_get_u16_be (bits);
       
   854   dec->width = jpeg_bits_get_u16_be (bits);
       
   855   dec->n_components = jpeg_bits_get_u8 (bits);
       
   856 
       
   857   OIL_DEBUG (
       
   858       "frame_length=%d depth=%d height=%d width=%d n_components=%d", length,
       
   859       dec->depth, dec->height, dec->width, dec->n_components);
       
   860 
       
   861   if (dec->n_components * 3 + 8 != length) {
       
   862     jpeg_decoder_error(dec, "inconsistent header");
       
   863     return;
       
   864   }
       
   865 
       
   866   for (i = 0; i < dec->n_components; i++) {
       
   867     dec->components[i].id = get_u8 (bits);
       
   868     dec->components[i].h_sample = getbits (bits, 4);
       
   869     dec->components[i].v_sample = getbits (bits, 4);
       
   870     dec->components[i].quant_table = get_u8 (bits);
       
   871 
       
   872     OIL_DEBUG (
       
   873         "[%d] id=%d h_sample=%d v_sample=%d quant_table=%d", i,
       
   874         dec->components[i].id, dec->components[i].h_sample,
       
   875         dec->components[i].v_sample, dec->components[i].quant_table);
       
   876   }
       
   877 }
       
   878 
       
   879 void
       
   880 jpeg_decoder_start_of_scan (JpegDecoder * dec)
       
   881 {
       
   882   JpegBits *bits = &dec->bits;
       
   883   int length;
       
   884   int i;
       
   885   int spectral_start;
       
   886   int spectral_end;
       
   887   int approx_high;
       
   888   int approx_low;
       
   889   int n;
       
   890   int tmp;
       
   891   int n_components;
       
   892 
       
   893   OIL_DEBUG ("start of scan");
       
   894 
       
   895   length = jpeg_bits_get_u16_be (bits);
       
   896   OIL_DEBUG ("length=%d", length);
       
   897 
       
   898   n_components = jpeg_bits_get_u8 (bits);
       
   899   n = 0;
       
   900   dec->scan_h_subsample = 0;
       
   901   dec->scan_v_subsample = 0;
       
   902   for (i = 0; i < n_components; i++) {
       
   903     int component_id;
       
   904     int dc_table;
       
   905     int ac_table;
       
   906     int x;
       
   907     int y;
       
   908     int index;
       
   909     int h_subsample;
       
   910     int v_subsample;
       
   911     int quant_index;
       
   912 
       
   913     component_id = jpeg_bits_get_u8 (bits);
       
   914     tmp = jpeg_bits_get_u8 (bits);
       
   915     dc_table = tmp >> 4;
       
   916     ac_table = tmp & 0xf;
       
   917     index = jpeg_decoder_find_component_by_id (dec, component_id);
       
   918 
       
   919     h_subsample = dec->components[index].h_sample;
       
   920     v_subsample = dec->components[index].v_sample;
       
   921     quant_index = dec->components[index].quant_table;
       
   922 
       
   923     for (y = 0; y < v_subsample; y++) {
       
   924       for (x = 0; x < h_subsample; x++) {
       
   925         dec->scan_list[n].component_index = index;
       
   926         dec->scan_list[n].dc_table = dc_table;
       
   927         dec->scan_list[n].ac_table = ac_table;
       
   928         dec->scan_list[n].quant_table = quant_index;
       
   929         dec->scan_list[n].x = x;
       
   930         dec->scan_list[n].y = y;
       
   931         dec->scan_list[n].offset =
       
   932             y * 8 * dec->components[index].rowstride + x * 8;
       
   933         n++;
       
   934       }
       
   935     }
       
   936 
       
   937     dec->scan_h_subsample = MAX (dec->scan_h_subsample, h_subsample);
       
   938     dec->scan_v_subsample = MAX (dec->scan_v_subsample, v_subsample);
       
   939 
       
   940     OIL_DEBUG ("component %d: index=%d dc_table=%d ac_table=%d n=%d",
       
   941         component_id, index, dc_table, ac_table, n);
       
   942   }
       
   943   dec->scan_list_length = n;
       
   944 
       
   945   spectral_start = jpeg_bits_get_u8 (bits);
       
   946   spectral_end = jpeg_bits_get_u8 (bits);
       
   947   OIL_DEBUG ("spectral range [%d,%d]", spectral_start, spectral_end);
       
   948   tmp = jpeg_bits_get_u8 (bits);
       
   949   approx_high = tmp >> 4;
       
   950   approx_low = tmp & 0xf;
       
   951   OIL_DEBUG ("approx range [%d,%d]", approx_low, approx_high);
       
   952 
       
   953   dec->x = 0;
       
   954   dec->y = 0;
       
   955   dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
       
   956 }
       
   957 
       
   958 
       
   959 
       
   960 
       
   961 
       
   962 
       
   963 
       
   964 
       
   965 
       
   966 
       
   967 
       
   968 
       
   969 int
       
   970 jpeg_decoder_addbits (JpegDecoder * dec, unsigned char *data, unsigned int len)
       
   971 {
       
   972   unsigned int offset;
       
   973 
       
   974   offset = dec->bits.ptr - dec->data;
       
   975 
       
   976   dec->data = realloc (dec->data, dec->data_len + len);
       
   977   memcpy (dec->data + dec->data_len, data, len);
       
   978   dec->data_len += len;
       
   979 
       
   980   dec->bits.ptr = dec->data + offset;
       
   981   dec->bits.end = dec->data + dec->data_len;
       
   982 
       
   983   return 0;
       
   984 }
       
   985 
       
   986 int
       
   987 jpeg_decoder_get_image_size (JpegDecoder * dec, int *width, int *height)
       
   988 {
       
   989   if (width)
       
   990     *width = dec->width;
       
   991   if (height)
       
   992     *height = dec->height;
       
   993 
       
   994   return 0;
       
   995 }
       
   996 
       
   997 int
       
   998 jpeg_decoder_get_component_ptr (JpegDecoder * dec, int id,
       
   999     unsigned char **image, int *rowstride)
       
  1000 {
       
  1001   int i;
       
  1002 
       
  1003   i = jpeg_decoder_find_component_by_id (dec, id);
       
  1004   if (image)
       
  1005     *image = dec->components[i].image;
       
  1006   if (rowstride)
       
  1007     *rowstride = dec->components[i].rowstride;
       
  1008 
       
  1009   return 0;
       
  1010 }
       
  1011 
       
  1012 int
       
  1013 jpeg_decoder_get_component_size (JpegDecoder * dec, int id,
       
  1014     int *width, int *height)
       
  1015 {
       
  1016   int i;
       
  1017 
       
  1018   /* subsampling sizes are rounded up */
       
  1019 
       
  1020   i = jpeg_decoder_find_component_by_id (dec, id);
       
  1021   if (width)
       
  1022     *width = (dec->width - 1) / dec->components[i].h_subsample + 1;
       
  1023   if (height)
       
  1024     *height = (dec->height - 1) / dec->components[i].v_subsample + 1;
       
  1025 
       
  1026   return 0;
       
  1027 }
       
  1028 
       
  1029 int
       
  1030 jpeg_decoder_get_component_subsampling (JpegDecoder * dec, int id,
       
  1031     int *h_subsample, int *v_subsample)
       
  1032 {
       
  1033   int i;
       
  1034 
       
  1035   i = jpeg_decoder_find_component_by_id (dec, id);
       
  1036   if (h_subsample)
       
  1037     *h_subsample = dec->components[i].h_subsample;
       
  1038   if (v_subsample)
       
  1039     *v_subsample = dec->components[i].v_subsample;
       
  1040 
       
  1041   return 0;
       
  1042 }
       
  1043 
       
  1044 #if 0
       
  1045 int
       
  1046 jpeg_decoder_parse (JpegDecoder * dec)
       
  1047 {
       
  1048   JpegBits *bits = &dec->bits;
       
  1049   JpegBits b2;
       
  1050   unsigned int x;
       
  1051   unsigned int tag;
       
  1052   int i;
       
  1053 
       
  1054   while (bits->ptr < bits->end) {
       
  1055     x = get_u8 (bits);
       
  1056     if (x != 0xff) {
       
  1057       int n = 0;
       
  1058 
       
  1059       while (x != 0xff) {
       
  1060         x = get_u8 (bits);
       
  1061         n++;
       
  1062       }
       
  1063       OIL_DEBUG ("lost sync, skipped %d bytes", n);
       
  1064     }
       
  1065     while (x == 0xff) {
       
  1066       x = get_u8 (bits);
       
  1067     }
       
  1068     tag = x;
       
  1069     OIL_DEBUG ("tag %02x", tag);
       
  1070 
       
  1071     b2 = *bits;
       
  1072 
       
  1073     for (i = 0; i < n_jpeg_markers - 1; i++) {
       
  1074       if (tag == jpeg_markers[i].tag) {
       
  1075         break;
       
  1076       }
       
  1077     }
       
  1078     OIL_DEBUG ("tag: %s", jpeg_markers[i].name);
       
  1079     if (jpeg_markers[i].func) {
       
  1080       jpeg_markers[i].func (dec, &b2);
       
  1081     } else {
       
  1082       OIL_DEBUG ("unhandled or illegal JPEG marker (0x%02x)", tag);
       
  1083       dumpbits (&b2);
       
  1084     }
       
  1085     if (jpeg_markers[i].flags & JPEG_ENTROPY_SEGMENT) {
       
  1086       jpeg_decoder_decode_entropy_segment (dec, &b2);
       
  1087     }
       
  1088     syncbits (&b2);
       
  1089     bits->ptr = b2.ptr;
       
  1090   }
       
  1091 
       
  1092   return 0;
       
  1093 }
       
  1094 #endif
       
  1095 
       
  1096 
       
  1097 /* misc helper functins */
       
  1098 
       
  1099 static char *
       
  1100 sprintbits (char *str, unsigned int bits, int n)
       
  1101 {
       
  1102   int i;
       
  1103   int bit = 1 << (n - 1);
       
  1104 
       
  1105   for (i = 0; i < n; i++) {
       
  1106     str[i] = (bits & bit) ? '1' : '0';
       
  1107     bit >>= 1;
       
  1108   }
       
  1109   str[i] = 0;
       
  1110 
       
  1111   return str;
       
  1112 }
       
  1113 
       
  1114 static void
       
  1115 huffman_table_load_std_jpeg (JpegDecoder * dec)
       
  1116 {
       
  1117   JpegBits b, *bits = &b;
       
  1118 
       
  1119   bits->ptr = jpeg_standard_tables;
       
  1120   bits->idx = 0;
       
  1121   bits->end = jpeg_standard_tables + jpeg_standard_tables_size;
       
  1122 
       
  1123   huffman_table_init_jpeg (&dec->dc_huff_table[0], bits);
       
  1124   huffman_table_init_jpeg (&dec->ac_huff_table[0], bits);
       
  1125   huffman_table_init_jpeg (&dec->dc_huff_table[1], bits);
       
  1126   huffman_table_init_jpeg (&dec->ac_huff_table[1], bits);
       
  1127 }
       
  1128 
       
  1129 
       
  1130