/*
 * Small jpeg decoder library
 *
 * Copyright (c) 2006, Luc Saillard <luc@saillard.org>
 * Copyright (c) 2012 Intel Corporation.
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 *
 * - Neither the name of the author nor the names of its contributors may be
 *  used to endorse or promote products derived from this software without
 *  specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>

#include "tinyjpeg.h"
#include "tinyjpeg-internal.h"

// for libva
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <va/va.h>
#include "va_display.h"


#define cY	0
#define cCb	1
#define cCr	2

#define BLACK_Y 0
#define BLACK_U 127
#define BLACK_V 127

#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#define ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))

#if DEBUG
#define trace(fmt, args...) do { \
   fprintf(stderr, fmt, ## args); \
   fflush(stderr); \
} while(0)
#else
#define trace(fmt, args...) do { } while (0)
#endif
#define error(fmt, args...) do { \
   snprintf(error_string, sizeof(error_string), fmt, ## args); \
   return -1; \
} while(0)
/* The variables for different image scans */
static int scan_num=0;
static int next_image_found=0;
/* Global variable to return the last error found while deconding */
static char error_string[256];
static VAHuffmanTableBufferJPEGBaseline default_huffman_table_param={
    .huffman_table =
    {
        // lumiance component
        {
            .num_dc_codes = {0,1,5,1,1,1,1,1,1,0,0,0}, // 12 bits is ok for baseline profile
            .dc_values = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b},
            .num_ac_codes = {0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125},
            .ac_values = {
              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,
              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,
              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,
              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,
              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,
              0xf9, 0xfa
           },/*,0xonly,0xthe,0xfirst,0x162,0xbytes,0xare,0xavailable,0x*/
        },
        // chrom component
        {
            .num_dc_codes = {0,3,1,1,1,1,1,1,1,1,1,0}, // 12 bits is ok for baseline profile
            .dc_values = {0,1,2,3,4,5,6,7,8,9,0xa,0xb},
            .num_ac_codes = {0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119},
            .ac_values = {
              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,
              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,
              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,
              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,
              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,
              0xf9, 0xfa
            },/*,0xonly,0xthe,0xfirst,0x162,0xbytes,0xare,0xavailable,0x*/
        },
    }
};

#define be16_to_cpu(x) (((x)[0]<<8)|(x)[1])


static int build_default_huffman_tables(struct jdec_private *priv)
{
    int i = 0;
    if (priv->default_huffman_table_initialized)
        return 0;

    for (i = 0; i < 4; i++) {
        priv->HTDC_valid[i] = 1;
        memcpy(priv->HTDC[i].bits, default_huffman_table_param.huffman_table[i%2].num_dc_codes,
               sizeof(default_huffman_table_param.huffman_table[i%2].num_dc_codes));
        memcpy(priv->HTDC[i].values, default_huffman_table_param.huffman_table[i%2].dc_values,
               sizeof(default_huffman_table_param.huffman_table[i%2].dc_values));
        priv->HTAC_valid[i] = 1;
        memcpy(priv->HTAC[i].bits, default_huffman_table_param.huffman_table[i%2].num_ac_codes,
               sizeof(default_huffman_table_param.huffman_table[i%2].num_ac_codes));
        memcpy(priv->HTAC[i].values, default_huffman_table_param.huffman_table[i%2].ac_values,
               sizeof(default_huffman_table_param.huffman_table[i%2].ac_values));
    }
    priv->default_huffman_table_initialized = 1;
    return 0;
}


static void print_SOF(const unsigned char *stream)
{
  int width, height, nr_components, precision;
#if DEBUG
  const char *nr_components_to_string[] = {
     "????",
     "Grayscale",
     "????",
     "YCbCr",
     "CYMK"
  };
#endif

  precision = stream[2];
  height = be16_to_cpu(stream+3);
  width  = be16_to_cpu(stream+5);
  nr_components = stream[7];

  trace("> SOF marker\n");
  trace("Size:%dx%d nr_components:%d (%s)  precision:%d\n", 
      width, height,
      nr_components, nr_components_to_string[nr_components],
      precision);
}

static int parse_DQT(struct jdec_private *priv, const unsigned char *stream)
{
  int qi;
  const unsigned char *dqt_block_end;

  trace("> DQT marker\n");
  dqt_block_end = stream + be16_to_cpu(stream);
  stream += 2;	/* Skip length */

  while (stream < dqt_block_end)
   {
     qi = *stream++;
#if SANITY_CHECK
     if (qi>>4)
       error("16 bits quantization table is not supported\n");
     if (qi>4)
       error("No more 4 quantization table is supported (got %d)\n", qi);
#endif
     memcpy(priv->Q_tables[qi&0x0F], stream, 64);
     priv->Q_tables_valid[qi & 0x0f] = 1;
     stream += 64;
   }
  trace("< DQT marker\n");
  return 0;
}

static int parse_SOF(struct jdec_private *priv, const unsigned char *stream)
{
  int i, width, height, nr_components, cid, sampling_factor;
  unsigned char Q_table;
  struct component *c;

  trace("> SOF marker\n");
  print_SOF(stream);

  height = be16_to_cpu(stream+3);
  width  = be16_to_cpu(stream+5);
  nr_components = stream[7];
  priv->nf_components = nr_components;
#if SANITY_CHECK
  if (stream[2] != 8)
    error("Precision other than 8 is not supported\n");
  if (width>JPEG_MAX_WIDTH || height>JPEG_MAX_HEIGHT)
    printf("WARNING:Width and Height (%dx%d) seems suspicious\n", width, height);
  if (nr_components != 3)
    printf("ERROR:We only support YUV images\n");
  if (height%16)
    printf("WARNING:Height need to be a multiple of 16 (current height is %d)\n", height);
  if (width%16)
    printf("WARNING:Width need to be a multiple of 16 (current Width is %d)\n", width);
#endif
  stream += 8;
  for (i=0; i<nr_components; i++) {
     cid = *stream++;
     sampling_factor = *stream++;
     Q_table = *stream++;
     c = &priv->component_infos[i];
     c->cid = cid;
     if (Q_table >= COMPONENTS)
       error("Bad Quantization table index (got %d, max allowed %d)\n", Q_table, COMPONENTS-1);
     c->Vfactor = sampling_factor&0xf;
     c->Hfactor = sampling_factor>>4;
     c->quant_table_index = Q_table;
     trace("Component:%d  factor:%dx%d  Quantization table:%d\n",
           cid, c->Hfactor, c->Vfactor, Q_table );

  }
  priv->width[scan_num] = width;
  priv->height[scan_num] = height;

  trace("< SOF marker\n");

  return 0;
}

static int parse_SOS(struct jdec_private *priv, const unsigned char *stream)
{
  unsigned int i, cid, table;
  unsigned int nr_components = stream[2];

  trace("> SOS marker\n");

  priv->cur_sos.nr_components= nr_components;

  stream += 3;
  for (i=0;i<nr_components;i++) {
     cid = *stream++;
     table = *stream++;
     priv->cur_sos.components[i].component_id = cid;
     priv->cur_sos.components[i].dc_selector = ((table>>4)&0x0F);
     priv->cur_sos.components[i].ac_selector = (table&0x0F);
#if SANITY_CHECK
     if ((table&0xf)>=4)
	error("We do not support more than 2 AC Huffman table\n");
     if ((table>>4)>=4)
	error("We do not support more than 2 DC Huffman table\n");
     if (cid != priv->component_infos[i].cid)
        error("SOS cid order (%d:%d) isn't compatible with the SOF marker (%d:%d)\n",
	      i, cid, i, priv->component_infos[i].cid);
     trace("ComponentId:%d  tableAC:%d tableDC:%d\n", cid, table&0xf, table>>4);
#endif
  }
  priv->stream = stream+3;
  trace("< SOS marker\n");
  return 0;
}

int tinyjpeg_parse_SOS(struct jdec_private *priv, const unsigned char *stream)
{
    return parse_SOS(priv, stream);
}


static int parse_DHT(struct jdec_private *priv, const unsigned char *stream)
{
  unsigned int count, i;
  int length, index;
  unsigned char Tc, Th;

  length = be16_to_cpu(stream) - 2;
  stream += 2;	/* Skip length */

  trace("> DHT marker (length=%d)\n", length);

  while (length>0) {
     index = *stream++;

     Tc = index & 0xf0; // it is not important to <<4
     Th = index & 0x0f;
     if (Tc) {
        memcpy(priv->HTAC[Th].bits, stream, 16);
     }
     else {
         memcpy(priv->HTDC[Th].bits, stream, 16);
     }

     count = 0;
     for (i=0; i<16; i++) {
        count += *stream++;
     }

#if SANITY_CHECK
     if (count >= HUFFMAN_BITS_SIZE)
       error("No more than %d bytes is allowed to describe a huffman table", HUFFMAN_BITS_SIZE);
     if (Th >= HUFFMAN_TABLES)
       error("No more than %d Huffman tables is supported (got %d)\n", HUFFMAN_TABLES, Th);
     trace("Huffman table %s[%d] length=%d\n", Tc ? "AC":"DC", Th, count);
#endif

     if (Tc) {
        memcpy(priv->HTAC[Th].values, stream, count);
        priv->HTAC_valid[Th] = 1;
     }
     else {
        memcpy(priv->HTDC[Th].values, stream, count);
        priv->HTDC_valid[Th] = 1;
     }

     length -= 1;
     length -= 16;
     length -= count;
     stream += count;
  }
  trace("< DHT marker\n");
  return 0;
}
static int parse_DRI(struct jdec_private *priv, const unsigned char *stream)
{
  unsigned int length;

  trace("> DRI marker\n");

  length = be16_to_cpu(stream);

#if SANITY_CHECK
  if (length != 4)
    error("Length of DRI marker need to be 4\n");
#endif

  priv->restart_interval = be16_to_cpu(stream+2);

#if DEBUG
  trace("Restart interval = %d\n", priv->restart_interval);
#endif

  trace("< DRI marker\n");

  return 0;
}

static int findEOI(struct jdec_private *priv,const unsigned char *stream)
{
   while (stream<=priv->stream_end&& !(*stream == 0xff  && *(stream+1) == 0xd9 )) //searching for the end of image marker
   {
      stream++;
      continue;
   }
  priv->stream_scan=stream;
  return 0;
}

static int findSOI(struct jdec_private *priv,const unsigned char *stream)
{
   while (!(*stream == 0xff  && *(stream+1) == 0xd8 ) ) //searching for the start of image marker
   {
      if(stream<=priv->stream_end)
        {
           stream++;
           continue;
         }
      else
         return 0;  // No more images in the file.
   }
   priv->stream=stream+2;
   return 1;
}

static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream)
{
  int chuck_len;
  int marker;
  int sos_marker_found = 0;
  int dht_marker_found = 0;
  int dqt_marker_found = 0;
  const unsigned char *next_chunck;

  next_image_found = findSOI(priv,stream);
  stream=priv->stream;

   while (!sos_marker_found  && stream<=priv->stream_end)
   {
     while((*stream == 0xff))
        stream++;    
            	    
     marker = *stream++;
     chuck_len = be16_to_cpu(stream);
     next_chunck = stream + chuck_len;
     switch (marker)
      {
       case SOF:
	 if (parse_SOF(priv, stream) < 0)
	   return -1;
	 break;
       case DQT:
	 if (parse_DQT(priv, stream) < 0)
	   return -1;
	 dqt_marker_found = 1;
	 break;
       case SOS:
	 if (parse_SOS(priv, stream) < 0)
	   return -1;
	 sos_marker_found = 1;
	 break;
       case DHT:
	 if (parse_DHT(priv, stream) < 0)
	   return -1;
	 dht_marker_found = 1;
	 break;
       case DRI:
	 if (parse_DRI(priv, stream) < 0)
	   return -1;
	 break;
       default:
	 trace("> Unknown marker %2.2x\n", marker);
	 break;
      }

     stream = next_chunck;
   }

   if(next_image_found){
      if (!dht_marker_found) {
        trace("No Huffman table loaded, using the default one\n");
        build_default_huffman_tables(priv);
      }
      if (!dqt_marker_found) {
        error("ERROR:No Quantization table loaded, using the default one\n");
      }
   } 
#ifdef SANITY_CHECK
  if (   (priv->component_infos[cY].Hfactor < priv->component_infos[cCb].Hfactor)
      || (priv->component_infos[cY].Hfactor < priv->component_infos[cCr].Hfactor))
    error("Horizontal sampling factor for Y should be greater than horitontal sampling factor for Cb or Cr\n");
  if (   (priv->component_infos[cY].Vfactor < priv->component_infos[cCb].Vfactor)
      || (priv->component_infos[cY].Vfactor < priv->component_infos[cCr].Vfactor))
    error("Vertical sampling factor for Y should be greater than vertical sampling factor for Cb or Cr\n");
  if (   (priv->component_infos[cCb].Hfactor!=1) 
      || (priv->component_infos[cCr].Hfactor!=1)
      || (priv->component_infos[cCb].Vfactor!=1)
      || (priv->component_infos[cCr].Vfactor!=1))
    printf("ERROR:Sampling other than 1x1 for Cr and Cb is not supported");
#endif
  findEOI(priv,stream);
  return next_image_found;
}

/*******************************************************************************
 *
 * Functions exported of the library.
 *
 * Note: Some applications can access directly to internal pointer of the
 * structure. It's is not recommended, but if you have many images to
 * uncompress with the same parameters, some functions can be called to speedup
 * the decoding.
 *
 ******************************************************************************/

/**
 * Allocate a new tinyjpeg decoder object.
 *
 * Before calling any other functions, an object need to be called.
 */
struct jdec_private *tinyjpeg_init(void)
{
  struct jdec_private *priv;
 
  priv = (struct jdec_private *)calloc(1, sizeof(struct jdec_private));
  if (priv == NULL)
    return NULL;
  return priv;
}

/**
 * Free a tinyjpeg object.
 *
 * No others function can be called after this one.
 */
void tinyjpeg_free(struct jdec_private *priv)
{
  free(priv);
}

/**
 * Initialize the tinyjpeg object and prepare the decoding of the stream.
 *
 * Check if the jpeg can be decoded with this jpeg decoder.
 * Fill some table used for preprocessing.
 */
int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size)
{
  int ret;

  /* Identify the file */
  if ((buf[0] != 0xFF) || (buf[1] != SOI))
    error("Not a JPG file ?\n");

  priv->stream_begin = buf;
  priv->stream_length = size;
  priv->stream_end = priv->stream_begin + priv->stream_length;

  priv->stream = priv->stream_begin;
  ret = parse_JFIF(priv, priv->stream);
  return ret;
}


int tinyjpeg_decode(struct jdec_private *priv)
{
#define CHECK_VASTATUS(va_status,func)                                  \
    if (va_status != VA_STATUS_SUCCESS) {                                   \
        fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \
        exit(1);                                                            \
    }

    VAEntrypoint entrypoints[5];
    int num_entrypoints,vld_entrypoint;
    VAConfigAttrib attrib;
    VAConfigID config_id;
    VASurfaceID surface_id;
    VAContextID context_id;
    VABufferID pic_param_buf,iqmatrix_buf,huffmantable_buf,slice_param_buf,slice_data_buf;
    int major_ver, minor_ver;
    VADisplay	va_dpy;
    VAStatus va_status;
    int max_h_factor, max_v_factor;
    int putsurface=1;
    unsigned int i, j;

    int surface_type;
    char *type;
    int ChromaTypeIndex;

    VASurfaceAttrib forcc;
    forcc.type =VASurfaceAttribPixelFormat;
    forcc.flags=VA_SURFACE_ATTRIB_SETTABLE;
    forcc.value.type=VAGenericValueTypeInteger;
     

    va_dpy = va_open_display();
    va_status = vaInitialize(va_dpy, &major_ver, &minor_ver);
    assert(va_status == VA_STATUS_SUCCESS);
    
    va_status = vaQueryConfigEntrypoints(va_dpy, VAProfileJPEGBaseline, entrypoints, 
                             &num_entrypoints);
    CHECK_VASTATUS(va_status, "vaQueryConfigEntrypoints");

    for	(vld_entrypoint = 0; vld_entrypoint < num_entrypoints; vld_entrypoint++) {
        if (entrypoints[vld_entrypoint] == VAEntrypointVLD)
            break;
    }
    if (vld_entrypoint == num_entrypoints) {
        /* not find VLD entry point */
        assert(0);
    }

    /* Assuming finding VLD, find out the format for the render target */
    attrib.type = VAConfigAttribRTFormat;
    vaGetConfigAttributes(va_dpy, VAProfileJPEGBaseline, VAEntrypointVLD,
                          &attrib, 1);
    if ((attrib.value & VA_RT_FORMAT_YUV420) == 0) {
        /* not find desired YUV420 RT format */
        assert(0);
    }
    
    va_status = vaCreateConfig(va_dpy, VAProfileJPEGBaseline, VAEntrypointVLD,
                              &attrib, 1,&config_id);
    CHECK_VASTATUS(va_status, "vaQueryConfigEntrypoints");

    while (next_image_found){  
       VAPictureParameterBufferJPEGBaseline pic_param;
       memset(&pic_param, 0, sizeof(pic_param));
       pic_param.picture_width = priv->width[scan_num];
       pic_param.picture_height = priv->height[scan_num];
       pic_param.num_components = priv->nf_components;


       for (i=0; i<pic_param.num_components; i++) { // tinyjpeg support 3 components only, does it match va?
           pic_param.components[i].component_id = priv->component_infos[i].cid;
           pic_param.components[i].h_sampling_factor = priv->component_infos[i].Hfactor;
           pic_param.components[i].v_sampling_factor = priv->component_infos[i].Vfactor;
           pic_param.components[i].quantiser_table_selector = priv->component_infos[i].quant_table_index;
       }
       int h1, h2, h3, v1, v2, v3;
       h1 = pic_param.components[0].h_sampling_factor;
       h2 = pic_param.components[1].h_sampling_factor;
       h3 = pic_param.components[2].h_sampling_factor;
       v1 = pic_param.components[0].v_sampling_factor;
       v2 = pic_param.components[1].v_sampling_factor;
       v3 = pic_param.components[2].v_sampling_factor;

       if (h1 == 2 && h2 == 1 && h3 == 1 &&
               v1 == 2 && v2 == 1 && v3 == 1) {
           //surface_type = VA_RT_FORMAT_IMC3;
           surface_type = VA_RT_FORMAT_YUV420;
           forcc.value.value.i = VA_FOURCC_IMC3;
           ChromaTypeIndex = 1;
           type = "VA_FOURCC_IMC3";
       }
       else if (h1 == 2 && h2 == 1 && h3 == 1 &&
               v1 == 1 && v2 == 1 && v3 == 1) {
           //surface_type = VA_RT_FORMAT_YUV422H;
           surface_type = VA_RT_FORMAT_YUV422;
           forcc.value.value.i = VA_FOURCC_422H;
           ChromaTypeIndex = 2;
           type = "VA_FOURCC_422H";
       }
       else if (h1 == 1 && h2 == 1 && h3 == 1 &&
               v1 == 1 && v2 == 1 && v3 == 1) {
           surface_type = VA_RT_FORMAT_YUV444;
           forcc.value.value.i = VA_FOURCC_444P;
           //forcc.value.value.i = VA_FOURCC_RGBP;
           ChromaTypeIndex = 3;
           type = "VA_FOURCC_444P";
       }
       else if (h1 == 4 && h2 == 1 && h3 == 1 &&
               v1 == 1 && v2 == 1 && v3 == 1) {
           surface_type = VA_RT_FORMAT_YUV411;
           forcc.value.value.i = VA_FOURCC_411P;
           ChromaTypeIndex = 4;
           type = "VA_FOURCC_411P";
       }
       else if (h1 == 1 && h2 == 1 && h3 == 1 &&
               v1 == 2 && v2 == 1 && v3 == 1) {
           //surface_type = VA_RT_FORMAT_YUV422V;
           surface_type = VA_RT_FORMAT_YUV422;
           forcc.value.value.i = VA_FOURCC_422V;
           ChromaTypeIndex = 5;
           type = "VA_FOURCC_422V";
       }
       else if (h1 == 2 && h2 == 1 && h3 == 1 &&
               v1 == 2 && v2 == 2 && v3 == 2) {
           //surface_type = VA_RT_FORMAT_YUV422H;
           surface_type = VA_RT_FORMAT_YUV422;
           forcc.value.value.i = VA_FOURCC_422H;
           ChromaTypeIndex = 6;
           type = "VA_FOURCC_422H";
       }
       else if (h2 == 2 && h2 == 2 && h3 == 2 &&
               v1 == 2 && v2 == 1 && v3 == 1) {
           //surface_type = VA_RT_FORMAT_YUV422V;
           surface_type = VA_RT_FORMAT_YUV422;
           forcc.value.value.i = VA_FOURCC_422V;
           ChromaTypeIndex = 7;
           type = "VA_FOURCC_422V";
       }
       else
       {
           surface_type = VA_RT_FORMAT_YUV400;
           forcc.value.value.i = VA_FOURCC('Y','8','0','0');
           ChromaTypeIndex = 0;
           type = "Format_400P";
       }

       va_status = vaCreateSurfaces(va_dpy,surface_type,
                                    priv->width[scan_num],priv->height[scan_num], //alignment?
                                    &surface_id, 1, &forcc, 1);
       CHECK_VASTATUS(va_status, "vaCreateSurfaces");
  
       /* Create a context for this decode pipe */
       va_status = vaCreateContext(va_dpy, config_id,
                                  priv->width[scan_num], priv->height[scan_num], // alignment?
                                  VA_PROGRESSIVE,
                                  &surface_id,
                                  1,
                                  &context_id);
       CHECK_VASTATUS(va_status, "vaCreateContext");

       va_status = vaCreateBuffer(va_dpy, context_id,
                                 VAPictureParameterBufferType, // VAPictureParameterBufferJPEGBaseline?
                                 sizeof(VAPictureParameterBufferJPEGBaseline),
                                 1, &pic_param,
                                 &pic_param_buf);
       CHECK_VASTATUS(va_status, "vaCreateBuffer");

       VAIQMatrixBufferJPEGBaseline iq_matrix;
       const unsigned int num_quant_tables =
           MIN(COMPONENTS, ARRAY_ELEMS(iq_matrix.load_quantiser_table));
       // todo, only mask it if non-default quant matrix is used. do we need build default quant matrix?
       memset(&iq_matrix, 0, sizeof(VAIQMatrixBufferJPEGBaseline));
       for (i = 0; i < num_quant_tables; i++) {
           if (!priv->Q_tables_valid[i])
               continue;
           iq_matrix.load_quantiser_table[i] = 1;
           for (j = 0; j < 64; j++)
               iq_matrix.quantiser_table[i][j] = priv->Q_tables[i][j];
       }
       va_status = vaCreateBuffer(va_dpy, context_id,
                                 VAIQMatrixBufferType, // VAIQMatrixBufferJPEGBaseline?
                                 sizeof(VAIQMatrixBufferJPEGBaseline),
                                 1, &iq_matrix,
                                 &iqmatrix_buf );
       CHECK_VASTATUS(va_status, "vaCreateBuffer");

       VAHuffmanTableBufferJPEGBaseline huffman_table;
       const unsigned int num_huffman_tables =
           MIN(COMPONENTS, ARRAY_ELEMS(huffman_table.load_huffman_table));
       memset(&huffman_table, 0, sizeof(VAHuffmanTableBufferJPEGBaseline));
       assert(sizeof(huffman_table.huffman_table[0].num_dc_codes) ==
           sizeof(priv->HTDC[0].bits));
          assert(sizeof(huffman_table.huffman_table[0].dc_values[0]) ==
           sizeof(priv->HTDC[0].values[0]));
       for (i = 0; i < num_huffman_tables; i++) {
           if (!priv->HTDC_valid[i] || !priv->HTAC_valid[i])
               continue;
           huffman_table.load_huffman_table[i] = 1;
           memcpy(huffman_table.huffman_table[i].num_dc_codes, priv->HTDC[i].bits,
                  sizeof(huffman_table.huffman_table[i].num_dc_codes));
           memcpy(huffman_table.huffman_table[i].dc_values, priv->HTDC[i].values,
                  sizeof(huffman_table.huffman_table[i].dc_values));
           memcpy(huffman_table.huffman_table[i].num_ac_codes, priv->HTAC[i].bits,
                  sizeof(huffman_table.huffman_table[i].num_ac_codes));   
           memcpy(huffman_table.huffman_table[i].ac_values, priv->HTAC[i].values,
                  sizeof(huffman_table.huffman_table[i].ac_values));
           memset(huffman_table.huffman_table[i].pad, 0,
                  sizeof(huffman_table.huffman_table[i].pad));
       }
       va_status = vaCreateBuffer(va_dpy, context_id,
                                 VAHuffmanTableBufferType, // VAHuffmanTableBufferJPEGBaseline?
                                 sizeof(VAHuffmanTableBufferJPEGBaseline),
                                 1, &huffman_table,
                                 &huffmantable_buf );
       CHECK_VASTATUS(va_status, "vaCreateBuffer");
    
       // one slice for whole image?
       max_h_factor = priv->component_infos[0].Hfactor;
       max_v_factor = priv->component_infos[0].Vfactor;
       static VASliceParameterBufferJPEGBaseline slice_param;
       slice_param.slice_data_size = (priv->stream_scan - priv->stream);
       slice_param.slice_data_offset = 0;
       slice_param.slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
       slice_param.slice_horizontal_position = 0;    
       slice_param.slice_vertical_position = 0;    
       slice_param.num_components = priv->cur_sos.nr_components;
       for (i = 0; i < slice_param.num_components; i++) {
           slice_param.components[i].component_selector = priv->cur_sos.components[i].component_id; /* FIXME: set to values specified in SOS  */
           slice_param.components[i].dc_table_selector = priv->cur_sos.components[i].dc_selector;  /* FIXME: set to values specified in SOS  */
           slice_param.components[i].ac_table_selector = priv->cur_sos.components[i].ac_selector;  /* FIXME: set to values specified in SOS  */
       }
       slice_param.restart_interval = priv->restart_interval;
       slice_param.num_mcus = ((priv->width[scan_num]+max_h_factor*8-1)/(max_h_factor*8))*
                             ((priv->height[scan_num]+max_v_factor*8-1)/(max_v_factor*8)); // ?? 720/16? 
 
       va_status = vaCreateBuffer(va_dpy, context_id,
                                 VASliceParameterBufferType, // VASliceParameterBufferJPEGBaseline?
                                 sizeof(VASliceParameterBufferJPEGBaseline),
                                 1,
                                 &slice_param, &slice_param_buf);
       CHECK_VASTATUS(va_status, "vaCreateBuffer");

       va_status = vaCreateBuffer(va_dpy, context_id,
                                 VASliceDataBufferType,
                                 priv->stream_scan - priv->stream,
                                 1,
                                 (void*)priv->stream, // jpeg_clip,
                                 &slice_data_buf);
       CHECK_VASTATUS(va_status, "vaCreateBuffer");

       va_status = vaBeginPicture(va_dpy, context_id, surface_id);
       CHECK_VASTATUS(va_status, "vaBeginPicture");   

       va_status = vaRenderPicture(va_dpy,context_id, &pic_param_buf, 1);
       CHECK_VASTATUS(va_status, "vaRenderPicture");
   
       va_status = vaRenderPicture(va_dpy,context_id, &iqmatrix_buf, 1);
       CHECK_VASTATUS(va_status, "vaRenderPicture");

       va_status = vaRenderPicture(va_dpy,context_id, &huffmantable_buf, 1);
       CHECK_VASTATUS(va_status, "vaRenderPicture");
   
       va_status = vaRenderPicture(va_dpy,context_id, &slice_param_buf, 1);
       CHECK_VASTATUS(va_status, "vaRenderPicture");
    
       va_status = vaRenderPicture(va_dpy,context_id, &slice_data_buf, 1);
       CHECK_VASTATUS(va_status, "vaRenderPicture");
    
       va_status = vaEndPicture(va_dpy,context_id);
       CHECK_VASTATUS(va_status, "vaEndPicture");

       va_status = vaSyncSurface(va_dpy, surface_id);
       CHECK_VASTATUS(va_status, "vaSyncSurface");

       if (putsurface) {
           VARectangle src_rect, dst_rect;

           src_rect.x      = 0;
           src_rect.y      = 0;
           src_rect.width  = priv->width[scan_num];
           src_rect.height = priv->height[scan_num];
           dst_rect        = src_rect;

           va_status = va_put_surface(va_dpy, surface_id, &src_rect, &dst_rect);
           CHECK_VASTATUS(va_status, "vaPutSurface");
       }
       scan_num++;

       vaDestroySurfaces(va_dpy,&surface_id,1);
       vaDestroyConfig(va_dpy,config_id);
       vaDestroyContext(va_dpy,context_id);
    
       parse_JFIF(priv,priv->stream);
       if(priv->width[scan_num] == 0 && priv->height[scan_num] == 0)
          break;
    }
   // va_close_display(va_dpy);
    vaTerminate(va_dpy);
    printf("press any key to exit23\n");
    getchar();
    return 0;
}
const char *tinyjpeg_get_errorstring(struct jdec_private *priv)
{
  /* FIXME: the error string must be store in the context */
  return error_string;
}
void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height)
{
  *width = priv->width[scan_num];
  *height = priv->height[scan_num];
}


