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