home *** CD-ROM | disk | FTP | other *** search
/ Dream 44 / Amiga_Dream_44.iso / Linux / Apps / xanim.tgz / xanim / xanim27064 / xa_jpg.c < prev    next >
C/C++ Source or Header  |  1997-01-26  |  49KB  |  1,634 lines

  1.  
  2. /*
  3.  * xa_jpg.c
  4.  *
  5.  * Copyright (C) 1994,1995,1996,1997 by Mark Podlipec.
  6.  * All rights reserved.
  7.  *
  8.  * This software may be freely copied, modified and redistributed without
  9.  * fee for non-commerical purposes provided that this copyright notice is
  10.  * preserved intact on all copies and modified copies.
  11.  *
  12.  * There is no warranty or other guarantee of fitness of this software.
  13.  * It is provided solely "as is". The author(s) disclaim(s) all
  14.  * responsibility and liability with respect to this software's usage
  15.  * or its effect upon hardware or computer systems.
  16.  *
  17.  */
  18.  
  19. /* Revision History
  20.  *
  21.  * 22Aug95 - +F dithering to MPEG.
  22.  */
  23.  
  24. #include "xa_jpg.h"
  25.  
  26. #include "xa_color.h"
  27. YUVBufs jpg_YUVBufs;
  28. extern YUVTabs def_yuv_tabs;
  29.  
  30. extern xaLONG xa_dither_flag;
  31.  
  32. /* JPEG Specific Variables */
  33. xaUBYTE  *jpg_buff = 0;
  34. xaLONG  jpg_bsize = 0;
  35.  
  36. xaLONG   jpg_h_bnum;  /* this must be signed */
  37. xaULONG  jpg_h_bbuf;
  38.  
  39. xaUBYTE  *jpg_samp_limit = 0;
  40. xaUBYTE  *xa_byte_limit = 0;
  41.  
  42. xaULONG  jpg_init_flag = xaFALSE;
  43. xaLONG   *jpg_quant_tables[JJ_NUM_QUANT_TBLS];
  44. xaULONG  jpg_marker = 0;
  45. xaULONG  jpg_saw_SOI,jpg_saw_SOF,jpg_saw_SOS;
  46. xaULONG  jpg_saw_DHT,jpg_saw_DQT,jpg_saw_EOI;
  47. xaULONG  jpg_std_DHT_flag = 0;
  48. xaLONG   jpg_dprec,jpg_height,jpg_width;
  49. xaLONG   jpg_num_comps,jpg_comps_in_scan;
  50. xaLONG   jpg_nxt_rst_num;
  51. xaLONG   jpg_rst_interval;
  52.  
  53. xaULONG xa_mjpg_kludge;
  54.  
  55.  
  56. JJ_HUFF_TBL jpg_ac_huff[JJ_NUM_HUFF_TBLS];
  57. JJ_HUFF_TBL jpg_dc_huff[JJ_NUM_HUFF_TBLS];
  58.  
  59. #define JPG_MAX_COMPS 4
  60. #define JPG_DUMMY_COMP (JPG_MAX_COMPS + 1)
  61. COMPONENT_HDR jpg_comps[JPG_MAX_COMPS + 1];
  62.  
  63.  
  64. #define JJ_INPUT_CHECK(val)  ((jpg_bsize >= (val))?(xaTRUE):(xaFALSE))
  65. #define JJ_INPUT_xaBYTE(var) { var = *jpg_buff++; jpg_bsize--; }
  66. #define JJ_INPUT_xaSHORT(var) \
  67.  { var = (*jpg_buff++) << 8; var |= (*jpg_buff++); jpg_bsize -= 2; }
  68.  
  69. xaLONG JJ_ZAG[DCTSIZE2+16] = {
  70.   0,  1,  8, 16,  9,  2,  3, 10,
  71.  17, 24, 32, 25, 18, 11,  4,  5,
  72.  12, 19, 26, 33, 40, 48, 41, 34,
  73.  27, 20, 13,  6,  7, 14, 21, 28,
  74.  35, 42, 49, 56, 57, 50, 43, 36,
  75.  29, 22, 15, 23, 30, 37, 44, 51,
  76.  58, 59, 52, 45, 38, 31, 39, 46,
  77.  53, 60, 61, 54, 47, 55, 62, 63,
  78.   0,  0,  0,  0,  0,  0,  0,  0, /* extra entries in case k>63 below */
  79.   0,  0,  0,  0,  0,  0,  0,  0
  80. };
  81.  
  82. xaULONG jpg_MCUbuf_size = 0;
  83. xaUBYTE *jpg_Ybuf = 0;
  84. xaUBYTE *jpg_Ubuf = 0;
  85. xaUBYTE *jpg_Vbuf = 0;
  86. xaSHORT jpg_dct_buf[DCTSIZE2];
  87.  
  88.  
  89. /* FUNCTIONS */
  90. xaULONG JFIF_Decode_JPEG();
  91. xaULONG jpg_read_markers();
  92. xaULONG jpg_decode_111111();
  93. xaULONG jpg_decode_211111();
  94. xaULONG jpg_decode_221111();
  95. xaULONG jpg_decode_411111();
  96. void  jpg_huff_build();
  97. xaULONG jpg_huffparse();
  98. extern void j_rev_dct();
  99. extern void j_rev_dct_sparse();
  100. void JPG_Setup_Samp_Limit_Table();
  101. void JPG_Free_Samp_Limit_Table();
  102. xaULONG jpg_read_EOI_marker();
  103. xaULONG jpg_std_DHT();
  104. void JPG_Alloc_MCU_Bufs();
  105. void JPG_Free_MCU_Bufs();
  106. xaULONG jpg_search_marker();
  107. xaULONG jpg_read_SOF();
  108. xaULONG jpg_skip_marker();
  109. xaULONG jpg_get_marker();
  110. void jpg_init_input();
  111. void jpg_huff_reset();
  112. void JFIF_Read_IJPG_Tables();
  113. void JFIF_Init_IJPG_Tables();
  114. char IJPG_Tab1[64];
  115. char IJPG_Tab2[64];
  116.  
  117. /* external */
  118. extern void XA_Gen_YUV_Tabs();
  119. extern void XA_MCU111111_To_Gray();
  120. extern void *XA_MCU111111_Func();
  121. extern void *XA_MCU211111_Func();
  122. extern void *XA_MCU221111_Func();
  123. extern void *XA_MCU411111_Func();
  124. extern void XA_Add_Func_To_Free_Chain();
  125.  
  126. /******* JFIF extern stuff and variables ***************/
  127. xaULONG JFIF_Read_File();
  128. XA_ACTION *ACT_Get_Action();
  129. XA_CHDR   *ACT_Get_CMAP();
  130. XA_CHDR *CMAP_Create_332();
  131. XA_CHDR *CMAP_Create_Gray();
  132. XA_CHDR *CMAP_Create_CHDR_From_True();
  133. xaUBYTE *UTIL_RGB_To_Map();
  134. xaUBYTE *UTIL_RGB_To_FS_Map();
  135. xaULONG UTIL_Get_LSB_Short();
  136. void ACT_Setup_Mapped();
  137. void ACT_Add_CHDR_To_Action();
  138. xaULONG CMAP_Find_Closest();
  139. extern XA_ANIM_SETUP *XA_Get_Anim_Setup();
  140. extern void XA_Free_Anim_Setup();
  141. extern void ACT_Setup_Delta();
  142.  
  143. /*******
  144.  *
  145.  */
  146. void jpg_init_stuff()
  147. { xaLONG i;
  148.   DEBUG_LEVEL1 fprintf(stderr,"JJINIT\n");
  149.   if (jpg_init_flag==xaTRUE) return;
  150.   for(i=0; i < JJ_NUM_QUANT_TBLS; i++) jpg_quant_tables[i] = 0;
  151.   if (jpg_samp_limit==0) JPG_Setup_Samp_Limit_Table(0);
  152.   jpg_init_flag = xaTRUE;
  153.   jpg_std_DHT_flag = 0;
  154. }
  155.  
  156.  
  157. /*******
  158.  *
  159.  */
  160. void jpg_free_stuff()
  161. { xaLONG i;
  162.   DEBUG_LEVEL1 fprintf(stderr,"JJFREE\n");
  163.   if (jpg_init_flag == xaFALSE) return;
  164.   for(i=0; i < JJ_NUM_QUANT_TBLS; i++)
  165.     if (jpg_quant_tables[i]) { free(jpg_quant_tables[i]); jpg_quant_tables[i]=0; }
  166.   if (jpg_samp_limit)    { free(jpg_samp_limit); jpg_samp_limit = 0; }
  167.   jpg_init_flag = xaFALSE;
  168.   jpg_std_DHT_flag = 0;
  169. }
  170.  
  171. #define JFIF_APP0_LEN 14
  172.  
  173. /*****
  174.  *
  175.  */
  176. xaULONG JFIF_Read_File(fname,anim_hdr)
  177. char *fname;
  178. XA_ANIM_HDR *anim_hdr;
  179. { XA_INPUT *xin = anim_hdr->xin;
  180.   ACT_DLTA_HDR *dlta_hdr = 0;
  181.   XA_ACTION *act = 0;
  182.   xaULONG jfif_flen;
  183.   xaUBYTE *inbuff = 0;
  184.   XA_ANIM_SETUP *jfif;
  185.  
  186.   jfif = XA_Get_Anim_Setup();
  187.   jfif->cmap_frame_num = 1; /* always 1 image per file */
  188.   jfif->vid_time   = XA_GET_TIME( 200 );
  189.  
  190.    /* find file size */
  191.   xin->Seek_FPos(xin,0L,2);
  192.   jfif_flen = xin->Get_FPos(xin); /* POD may not be portable */
  193.   xin->Seek_FPos(xin,0L,0);
  194.  
  195.   if (xa_file_flag==xaTRUE)
  196.   { xaLONG ret;
  197.     dlta_hdr = (ACT_DLTA_HDR *) malloc(sizeof(ACT_DLTA_HDR));
  198.     if (dlta_hdr == 0) TheEnd1("JFIF: malloc failed");
  199.     dlta_hdr->flags = 0;
  200.     dlta_hdr->fpos  = xin->Get_FPos(xin);
  201.     dlta_hdr->fsize = jfif_flen;
  202.     jfif->max_fvid_size = jfif_flen + 16;
  203.     inbuff = (xaUBYTE *)malloc(jfif_flen);
  204.     ret = xin->Read_Block(xin,inbuff,jfif_flen);
  205.     if (ret < jfif_flen)
  206.         {fprintf(stderr,"JFIF: inbuff read failed\n"); return(xaFALSE);}
  207.   }
  208.   else
  209.   { xaLONG ret,d;
  210.     d = jfif_flen + (sizeof(ACT_DLTA_HDR));
  211.     dlta_hdr = (ACT_DLTA_HDR *) malloc( d );
  212.     if (dlta_hdr == 0) TheEnd1("JFIF: malloc failed");
  213.     dlta_hdr->flags = DLTA_DATA;
  214.     dlta_hdr->fpos = 0; dlta_hdr->fsize = jfif_flen;
  215.     ret = xin->Read_Block(xin, dlta_hdr->data, jfif_flen);
  216.     if (ret < jfif_flen)
  217.         {fprintf(stderr,"JFIF: read failed\n"); return(xaFALSE);}
  218.     inbuff = dlta_hdr->data;
  219.   }
  220.  
  221.   /******** EXTRACT IMAGE SIZE ****************/
  222.   jpg_init_input(inbuff,jfif_flen);
  223.   jpg_saw_SOF = xaFALSE;
  224.   while(jpg_get_marker() == xaTRUE)
  225.   { 
  226.     if ( (jpg_marker == M_SOF0) || (jpg_marker == M_SOF1) )
  227.     {
  228.       if (jpg_read_SOF()==xaTRUE) jpg_saw_SOF = xaTRUE;
  229.       break;
  230.     }
  231.     else if ((jpg_marker == M_SOI) || (jpg_marker == M_TEM)) continue;
  232.     else if ((jpg_marker >= M_RST0) && (jpg_marker <= M_RST7)) continue;
  233.     else jpg_skip_marker();
  234.   }
  235.   if (jpg_saw_SOF == xaFALSE)
  236.   {
  237.     fprintf(stderr,"JPEG: not recognized as a JPEG file\n");
  238.     return(xaFALSE);
  239.   }
  240.   jfif->imagex = 4 * ((jpg_width + 3)/4);
  241.   jfif->imagey = 2 * ((jpg_height + 1)/2);
  242.   JPG_Alloc_MCU_Bufs(anim_hdr,jfif->imagex,0,xaFALSE);
  243.   XA_Gen_YUV_Tabs(anim_hdr);
  244.  
  245.   if (xa_verbose)
  246.   {
  247.     fprintf(stderr,"JFIF: size %d by %d\n",jfif->imagex,jfif->imagey);
  248.   }
  249.  
  250.   /* Allocate Colors */
  251.   if (jpg_num_comps == 1) /* assume grayscale */
  252.   { int i;
  253.     jfif->imagec = 256;    jfif->depth = 8;
  254.     for(i=0;i<jfif->imagec;i++)
  255.     { jfif->cmap[i].red = jfif->cmap[i].green = jfif->cmap[i].blue = i; }
  256.     jfif->chdr = ACT_Get_CMAP(jfif->cmap,jfif->imagec,0,jfif->imagec,0,8,8,8);
  257.   }
  258.   else if (jpg_num_comps == 3)
  259.   {
  260.     jfif->depth = 24;
  261.     if (   (cmap_true_map_flag == xaFALSE) /* depth 24 and not true_map */
  262.         || (xa_buffer_flag == xaFALSE) )
  263.     {
  264.     if (cmap_true_to_332 == xaTRUE)
  265.         jfif->chdr = CMAP_Create_332(jfif->cmap,&jfif->imagec);
  266.     else    jfif->chdr = CMAP_Create_Gray(jfif->cmap,&jfif->imagec);
  267.     }
  268.   }
  269.   else
  270.   {
  271.     fprintf(stderr,"JFIF: unsupported number of components %d\n",jpg_num_comps);
  272.     return(xaFALSE);
  273.   }
  274.  
  275.   act = ACT_Get_Action(anim_hdr,ACT_DELTA);
  276.   act->data = (xaUBYTE *)dlta_hdr;
  277.  
  278.   dlta_hdr->xpos = dlta_hdr->ypos = 0;
  279.   dlta_hdr->xsize = jfif->imagex;
  280.   dlta_hdr->ysize = jfif->imagey;
  281.   dlta_hdr->special = 0;
  282.   dlta_hdr->extra = (void *)(0);
  283.   dlta_hdr->xapi_rev = 0x0002;
  284.   dlta_hdr->delta = JFIF_Decode_JPEG;
  285.  
  286.   jfif->pic = 0; 
  287.   ACT_Setup_Delta(jfif,act,dlta_hdr,xin);
  288.  
  289.   xin->Close_File(xin);
  290.   /* free up buffer in necessary */
  291.   if (xa_file_flag==xaTRUE) {free(inbuff); inbuff = 0; }
  292.   
  293.   anim_hdr->imagex = jfif->imagex;
  294.   anim_hdr->imagey = jfif->imagey;
  295.   anim_hdr->imagec = jfif->imagec;
  296.   anim_hdr->imaged = 8; /* nop */
  297.   anim_hdr->frame_lst = (XA_FRAME *) malloc( sizeof(XA_FRAME) * 2);
  298.   anim_hdr->frame_lst[0].time_dur = jfif->vid_time;
  299.   anim_hdr->frame_lst[0].zztime = 0;
  300.   anim_hdr->frame_lst[0].act  = act;
  301.   anim_hdr->frame_lst[1].time_dur = 0;
  302.   anim_hdr->frame_lst[1].zztime = -1;
  303.   anim_hdr->frame_lst[1].act  = 0;
  304.   anim_hdr->loop_frame = 0;
  305.   anim_hdr->last_frame = 0;
  306.   anim_hdr->total_time = anim_hdr->frame_lst[0].time_dur;
  307.   if (xa_buffer_flag == xaFALSE) anim_hdr->anim_flags |= ANIM_SNG_BUF;
  308.   if (xa_file_flag == xaTRUE) anim_hdr->anim_flags |= ANIM_USE_FILE;
  309.   anim_hdr->anim_flags |= ANIM_FULL_IM;
  310.   anim_hdr->max_fvid_size = jfif->max_fvid_size;
  311.   anim_hdr->max_faud_size = 0;
  312.   anim_hdr->fname = anim_hdr->name;
  313.   XA_Free_Anim_Setup(jfif);
  314.   return(xaTRUE);
  315. }
  316.  
  317. /********* END OF JFIF Code *************************************************/
  318.  
  319.  
  320.  
  321. /******* 
  322.  *
  323.  */
  324. xaULONG jpg_read_SOI()
  325. {
  326.   DEBUG_LEVEL1 fprintf(stderr,"SOI: \n");
  327.   jpg_rst_interval = 0;
  328.   return(xaTRUE);
  329. }
  330.  
  331.  
  332. /******* 
  333.  *
  334.  */
  335. xaULONG jpg_read_SOF()
  336. {
  337.   xaLONG len,ci;
  338.   COMPONENT_HDR *comp;
  339.   
  340.   JJ_INPUT_xaSHORT(len);
  341.   if (xa_mjpg_kludge) len -= 6;
  342.   else len -= 8;
  343.  
  344.   JJ_INPUT_xaBYTE(jpg_dprec);
  345.   JJ_INPUT_xaSHORT(jpg_height);
  346.   JJ_INPUT_xaSHORT(jpg_width);
  347.   JJ_INPUT_xaBYTE(jpg_num_comps);
  348.  
  349.   DEBUG_LEVEL1 fprintf(stderr,"SOF: dprec %x res %d x %d comps %x\n",jpg_dprec,jpg_width,jpg_height,jpg_num_comps);
  350.  
  351.   for(ci = 0; ci < jpg_num_comps; ci++)
  352.   { xaULONG c;
  353.     if (ci > JPG_MAX_COMPS)    comp = &jpg_comps[JPG_DUMMY_COMP];
  354.     else            comp = &jpg_comps[ci];
  355.     JJ_INPUT_xaBYTE(comp->id);
  356.     JJ_INPUT_xaBYTE(c);
  357.     comp->hvsample = c;
  358.     JJ_INPUT_xaBYTE(comp->qtbl_num);
  359.     DEBUG_LEVEL1 fprintf(stderr,"   id %x hvsamp %x qtbl %x\n",comp->id,c,comp->qtbl_num);
  360.   }
  361.   return(JJ_INPUT_CHECK(0));
  362. }
  363.  
  364. /******* 
  365.  *
  366.  */
  367. xaULONG jpg_read_SOS()
  368. { xaLONG len,i;
  369.   xaLONG jpg_Ss, jpg_Se, jpg_AhAl;
  370.  
  371.   JJ_INPUT_xaSHORT(len);
  372.   /* if (xa_mjpg_kludge) len += 2; length ignored */
  373.  
  374.   JJ_INPUT_xaBYTE(jpg_comps_in_scan);
  375.  
  376.   for (i = 0; i < jpg_comps_in_scan; i++)
  377.   { xaLONG j,comp_id,htbl_num;
  378.     COMPONENT_HDR *comp = 0;
  379.  
  380.     JJ_INPUT_xaBYTE(comp_id);
  381.     j = 0;
  382.     while(j < jpg_num_comps)
  383.     { comp = &jpg_comps[j];
  384.       if (comp->id == comp_id) break;
  385.       j++;
  386.     }
  387.     if (j > jpg_num_comps) 
  388.     { fprintf(stderr,"JJ: bad id %x",comp_id); return(xaFALSE); }
  389.  
  390.     JJ_INPUT_xaBYTE(htbl_num);
  391.     comp->dc_htbl_num = (htbl_num >> 4) & 0x0f;
  392.     comp->ac_htbl_num = (htbl_num     ) & 0x0f;
  393.     DEBUG_LEVEL1 fprintf(stderr,"     id %x dc/ac %x\n",comp_id,htbl_num);
  394.   }
  395.   JJ_INPUT_xaBYTE(jpg_Ss);
  396.   JJ_INPUT_xaBYTE(jpg_Se);
  397.   JJ_INPUT_xaBYTE(jpg_AhAl);
  398.   return(JJ_INPUT_CHECK(0));
  399. }
  400.  
  401. /******* 
  402.  *
  403.  */
  404. xaULONG jpg_read_DQT()
  405. { xaLONG len;
  406.   JJ_INPUT_xaSHORT(len);
  407.   if ( !xa_mjpg_kludge ) len -= 2;
  408.  
  409.   DEBUG_LEVEL1 fprintf(stderr,"DQT:\n");
  410.  
  411.   while(len > 0)
  412.   { xaLONG i,tbl_num,prec;
  413.     xaLONG *quant_table;
  414.  
  415.     JJ_INPUT_xaBYTE(tbl_num);  len -= 1;
  416.     DEBUG_LEVEL1 fprintf(stderr,"     prec/tnum %02x\n",tbl_num);
  417.  
  418.     prec = (tbl_num >> 4) & 0x0f;
  419.     prec = (prec)?(2 * DCTSIZE2):(DCTSIZE2);  /* 128 or 64 */
  420.     tbl_num &= 0x0f;
  421.     if (tbl_num > 4)
  422.     { fprintf(stderr,"JJ: bad DQT tnum %x\n",tbl_num); return(xaFALSE); }
  423.  
  424.     if (jpg_quant_tables[tbl_num] == 0)
  425.     {
  426.       jpg_quant_tables[tbl_num] = (xaLONG *)malloc(64 * sizeof(xaLONG));
  427.       if (jpg_quant_tables[tbl_num] == 0)
  428.     { fprintf(stderr,"JJ: DQT alloc err %x \n",tbl_num); return(xaFALSE); }
  429.     }
  430.     len -= prec;
  431.     if (JJ_INPUT_CHECK(prec)==xaFALSE) return(xaFALSE);
  432.     quant_table = jpg_quant_tables[tbl_num];
  433.     if (prec==128)
  434.     { xaULONG tmp; 
  435.       for (i = 0; i < DCTSIZE2; i++)
  436.     { JJ_INPUT_xaSHORT(tmp); quant_table[ JJ_ZAG[i] ] = (xaLONG) tmp; }
  437.     }
  438.     else
  439.     { xaULONG tmp; 
  440.       for (i = 0; i < DCTSIZE2; i++)
  441.     { JJ_INPUT_xaBYTE(tmp); quant_table[ JJ_ZAG[i] ] = (xaLONG) tmp; }
  442.     }
  443.   }
  444.   return(xaTRUE);
  445. }
  446.  
  447. /******* 
  448.  * Handle DRI chunk 
  449.  */
  450. xaULONG jpg_read_DRI()
  451. { xaLONG len;
  452.   JJ_INPUT_xaSHORT(len);
  453.   JJ_INPUT_xaSHORT(jpg_rst_interval);
  454.   DEBUG_LEVEL1 fprintf(stderr,"DRI: int %x\n",jpg_rst_interval);
  455.   return(xaTRUE);
  456. }
  457.  
  458. /******* 
  459.  *
  460.  */
  461. xaULONG jpg_skip_marker()
  462. { xaLONG len,tmp;
  463.   JJ_INPUT_xaSHORT(len); 
  464.   DEBUG_LEVEL1 fprintf(stderr,"SKIP: marker %x len %x\n",jpg_marker,len);
  465.   len -= 2; if (JJ_INPUT_CHECK(len)==xaFALSE) return(xaFALSE);
  466.   while(len--) JJ_INPUT_xaBYTE(tmp); /* POD improve this */
  467.   return(xaTRUE);
  468. }
  469.  
  470. /*******
  471.  *
  472.  */
  473. xaULONG jpg_read_DHT()
  474. {
  475.   xaLONG len;
  476.   JJ_HUFF_TBL *htable;
  477.   xaUBYTE  *hbits;
  478.   xaUBYTE  *hvals;
  479.  
  480.   jpg_std_DHT_flag = 0;
  481.   JJ_INPUT_xaSHORT(len);
  482.   if (xa_mjpg_kludge) len += 2;
  483.   len -= 2;
  484.   if (JJ_INPUT_CHECK(len)==xaFALSE) return(xaFALSE);
  485.  
  486.   while(len > 0)
  487.   { xaLONG i,index,count;
  488.     JJ_INPUT_xaBYTE(index);
  489.     /* POD index check */
  490.     if (index & 0x10)                /* AC Table */
  491.     {
  492.       index &= 0x0f;
  493.       htable = &(jpg_ac_huff[index]);
  494.       hbits  = jpg_ac_huff[index].bits;
  495.       hvals  = jpg_ac_huff[index].vals;
  496.     }
  497.     else                    /* DC Table */
  498.     {
  499.       htable = &(jpg_dc_huff[index]);
  500.       hbits  = jpg_dc_huff[index].bits;
  501.       hvals  = jpg_dc_huff[index].vals;
  502.     }
  503.     hbits[0] = 0;        count = 0;
  504.     for (i = 1; i <= 16; i++)
  505.     {
  506.       JJ_INPUT_xaBYTE(hbits[i]);
  507.       count += hbits[i];
  508.     }
  509.     len -= 17;
  510.     if (count > 256)
  511.     { fprintf(stderr,"JJ: DHT bad count %d\n",count); return(xaFALSE); }
  512.  
  513.     for (i = 0; i < count; i++) JJ_INPUT_xaBYTE(hvals[i]);
  514.     len -= count;
  515.  
  516.     jpg_huff_build(htable,hbits,hvals);
  517.  
  518.   } /* end of len */
  519.   return(xaTRUE);
  520. }
  521.  
  522. /*******
  523.  *
  524.  */
  525. xaULONG jpg_get_marker()
  526. {
  527.   xaLONG c;
  528.  
  529.   for(;;)
  530.   {
  531.     JJ_INPUT_xaBYTE(c);
  532.     while(c != 0xFF)    /* look for FF */
  533.     {
  534.       if (JJ_INPUT_CHECK(1)==xaFALSE) return(xaFALSE);
  535.       JJ_INPUT_xaBYTE(c);
  536.     }
  537.     /* now we've got 1 0xFF, keep reading until next 0xFF */
  538.     do
  539.     {
  540.       if (JJ_INPUT_CHECK(1)==xaFALSE) return(xaFALSE);
  541.       JJ_INPUT_xaBYTE(c);
  542.     } while (c == 0xFF);
  543.     if (c != 0) break; /* ignore FF/00 sequences */
  544.   }
  545.   jpg_marker = c;
  546.   return(xaTRUE);
  547. }
  548.  
  549.  
  550. /******* 
  551.  *
  552.  */
  553. xaULONG jpg_read_markers()
  554. {
  555.   for(;;)
  556.   { 
  557.     if (jpg_get_marker() == xaFALSE) return(xaFALSE);
  558. DEBUG_LEVEL1 fprintf(stderr,"JJ: marker %x\n",jpg_marker);
  559.     switch(jpg_marker)
  560.     {
  561.       case M_SOI: 
  562.     if (jpg_read_SOI()==xaFALSE) return(xaFALSE);
  563.     jpg_saw_SOI = xaTRUE;
  564.     break;
  565.       case M_SOF0: 
  566.       case M_SOF1: 
  567.     if (jpg_read_SOF()==xaFALSE) return(xaFALSE);
  568.     jpg_saw_SOF = xaTRUE;
  569.     break;
  570.       case M_SOS: 
  571.     if (jpg_read_SOS()==xaFALSE) return(xaFALSE);
  572.     jpg_saw_SOS = xaTRUE;
  573.     jpg_nxt_rst_num = 0;
  574.     return(xaTRUE);
  575.     break;
  576.       case M_DHT:
  577.     if (jpg_read_DHT()==xaFALSE) return(xaFALSE);
  578.     jpg_saw_DHT = xaTRUE;
  579.     break;
  580.       case M_DQT:
  581.     if (jpg_read_DQT()==xaFALSE) return(xaFALSE);
  582.     jpg_saw_DQT = xaTRUE;
  583.     break;
  584.       case M_DRI:
  585.     if (jpg_read_DRI()==xaFALSE) return(xaFALSE);
  586.     break;
  587.       case M_EOI:
  588.     fprintf(stderr,"JJ: reached EOI without data\n");
  589.     return(xaFALSE);
  590.     break;
  591.      case M_RST0:                /* these are all parameterless */
  592.      case M_RST1:
  593.      case M_RST2:
  594.      case M_RST3:
  595.      case M_RST4:
  596.      case M_RST5:
  597.      case M_RST6:
  598.      case M_RST7:
  599.      case M_TEM:
  600.         break;
  601.       default:
  602.     if (jpg_skip_marker()==xaFALSE) return(xaFALSE);
  603.     DEBUG_LEVEL1 fprintf(stderr,"JJ: skipped marker %x\n",jpg_marker);
  604.     break;
  605.     } /* end of switch */
  606.   } /* end of forever */
  607. }
  608.  
  609.  
  610. /*****
  611.  *
  612.  */
  613. void jpg_huff_build(htbl,hbits,hvals)
  614. JJ_HUFF_TBL *htbl; 
  615. xaUBYTE *hbits,*hvals;
  616. { xaULONG clen,num_syms,p,i,si,code,lookbits;
  617.   xaULONG l,ctr;
  618.   xaUBYTE huffsize[257];
  619.   xaULONG huffcode[257];
  620.  
  621.   /*** generate code lengths for each symbol */
  622.   num_syms = 0;
  623.   for(clen = 1; clen <= 16; clen++)
  624.   {
  625.     for(i = 1; i <= (xaULONG)(hbits[clen]); i++) 
  626.                 huffsize[num_syms++] = (xaUBYTE)(clen);
  627.   }
  628.   huffsize[num_syms] = 0;
  629.  
  630.   /*** generate codes */
  631.   code = 0;
  632.   si = huffsize[0];
  633.   p = 0;
  634.   while (huffsize[p])
  635.   {
  636.     while ( ((xaULONG)huffsize[p]) == si) 
  637.     {
  638.       huffcode[p++] = code;
  639.       code++;
  640.     }
  641.     code <<= 1;
  642.     si++;
  643.   }
  644.  
  645. /* Init mincode/maxcode/valptr arrays */
  646.   p = 0;
  647.   for (l = 1; l <= 16; l++) 
  648.   {
  649.     if (htbl->bits[l]) 
  650.     {
  651.       htbl->valptr[l] = p; /* huffval[] index of 1st symbol of code length l */
  652.       htbl->mincode[l] = huffcode[p]; /* minimum code of length l */
  653.       p += (xaULONG)(htbl->bits[l]);
  654.       htbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
  655.     } 
  656.     else
  657.     {
  658.       htbl->valptr[l] = 0;  /* not needed */
  659.       htbl->mincode[l] = 0; /* not needed */
  660.       htbl->maxcode[l] = 0; /* WAS -1; */   /* -1 if no codes of this length */
  661.     }
  662.   }
  663.   htbl->maxcode[17] = 0xFFFFFL; /* ensures huff_DECODE terminates */
  664.  
  665.  
  666. /* Init huffman cache */
  667.   memset((char *)htbl->cache, 0, ((1<<HUFF_LOOKAHEAD) * sizeof(xaUSHORT)) );
  668.   p = 0;
  669.   for (l = 1; l <= HUFF_LOOKAHEAD; l++) 
  670.   {
  671.     for (i = 1; i <= (xaULONG) htbl->bits[l]; i++, p++) 
  672.     { xaSHORT the_code = (xaUSHORT)((l << 8) | htbl->vals[p]);
  673.  
  674.       /* l = current code's length, p = its index in huffcode[] & huffval[]. */
  675.       /* Generate left-justified code followed by all possible bit sequences */
  676.  
  677.       lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
  678.       for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) 
  679.       {
  680.         htbl->cache[lookbits] = the_code;
  681.         lookbits++;
  682.       }
  683.     }
  684.   }
  685. }
  686.  
  687.  
  688. /*******
  689.  *
  690.  */
  691. void jpg_init_input(buff,buff_size)
  692. xaUBYTE *buff;
  693. xaLONG buff_size;
  694. {
  695.   jpg_buff = buff;
  696.   jpg_bsize = buff_size;
  697. }
  698.  
  699. /*******
  700.  *
  701.  */
  702. xaULONG
  703. JFIF_Decode_JPEG(image,delta,dsize,dec_info)
  704. xaUBYTE *image;         /* Image Buffer. */
  705. xaUBYTE *delta;         /* delta data. */
  706. xaULONG dsize;          /* delta size */
  707. XA_DEC2_INFO *dec_info;  /* Decoder Info Header */
  708. { xaULONG imagex = dec_info->imagex;    xaULONG imagey = dec_info->imagey;
  709.   xaULONG map_flag = dec_info->map_flag;
  710.   void *extra = dec_info->extra;
  711.   xaLONG base_y;
  712.   xaULONG jpg_type;
  713.   xaULONG interleave,row_offset;
  714.  
  715.   dec_info->xs = dec_info->ys = 0; 
  716.   dec_info->xe = imagex; dec_info->ye = imagey;
  717.  
  718.     /* Indicate we can drop these frames */
  719.   if (dec_info->skip_flag > 0) return(ACT_DLTA_DROP);
  720.  
  721.   jpg_type = (xaULONG)(extra);
  722.   xa_mjpg_kludge = (jpg_type & 0x40)?(0x40):(0x00);
  723.  
  724.   if (jpg_init_flag==xaFALSE) jpg_init_stuff();
  725.  
  726. /* init buffer stuff */
  727.   jpg_init_input(delta,dsize);
  728.  
  729.   base_y = 0;
  730.   while(base_y < imagey)
  731.   {
  732.     jpg_saw_EOI = jpg_saw_DHT = xaFALSE;
  733.     if (jpg_type & 0x10) /* IJPG/JMOV File */
  734.     { xaLONG ci,*qtbl0,*qtbl1;
  735.       jpg_saw_SOI = jpg_saw_SOF = jpg_saw_SOS = jpg_saw_DQT = xaTRUE;
  736.       jpg_saw_EOI = xaTRUE;
  737.  
  738.       if (base_y == 0) /* 1st time through */
  739.       {
  740.         jpg_huff_reset(); /* only  1st time */
  741.         jpg_width  = imagex; 
  742.     if (jpg_type & 0x01) 
  743.         jpg_height = (imagey + 1) >> 1;/* interleaved */
  744.         else    jpg_height = imagey;
  745.         jpg_comps_in_scan = jpg_num_comps = 3;
  746.         jpg_rst_interval = 0;
  747.    
  748.         jpg_comps[0].hvsample     = 0x21;
  749.         jpg_comps[0].ac_htbl_num = 0; 
  750.         jpg_comps[0].dc_htbl_num = 0;
  751.         jpg_comps[0].qtbl_num    = 0;
  752.         jpg_comps[1].hvsample    = jpg_comps[2].hvsample    = 0x11;
  753.         jpg_comps[1].ac_htbl_num = jpg_comps[2].ac_htbl_num = 1; 
  754.         jpg_comps[1].dc_htbl_num = jpg_comps[2].dc_htbl_num = 1;
  755.         jpg_comps[1].qtbl_num    = jpg_comps[2].qtbl_num    = 1;
  756.         jpg_comps[0].id = 0;
  757.         jpg_comps[1].id = 1;
  758.         jpg_comps[2].id = 2;
  759.  
  760.          /* IJPG set up quant tables */
  761.         if (jpg_quant_tables[0] == 0)
  762.         {
  763.           jpg_quant_tables[0] = (xaLONG *)malloc(64 * sizeof(xaLONG));
  764.           if (jpg_quant_tables[0] == 0)
  765.             { fprintf(stderr,"JJ: IJPG DQT0 alloc err \n"); return(xaFALSE); }
  766.         }
  767.         if (jpg_quant_tables[1] == 0)
  768.         {
  769.           jpg_quant_tables[1] = (xaLONG *)malloc(64 * sizeof(xaLONG));
  770.           if (jpg_quant_tables[1] == 0)
  771.             { fprintf(stderr,"JJ: IJPG DQT1 alloc err \n"); return(xaFALSE); }
  772.         }
  773.         qtbl0 = jpg_quant_tables[0];
  774.         qtbl1 = jpg_quant_tables[1];
  775.         for(ci=0; ci < DCTSIZE2; ci++)
  776.         {
  777.           qtbl0[ JJ_ZAG[ci] ] = (xaLONG)IJPG_Tab1[ci];
  778.           qtbl1[ JJ_ZAG[ci] ] = (xaLONG)IJPG_Tab2[ci];
  779.         }
  780.       } else jpg_saw_DHT = xaTRUE; /* 2nd time through IJPG */
  781.  
  782.       if (jpg_type & 0x01) { interleave = 2; row_offset = (base_y)?(1):(0); }
  783.       else    { interleave = 1; row_offset = 0; }
  784.  
  785.     } else
  786.     {
  787.       /* read markers */
  788.       jpg_saw_SOI = jpg_saw_SOF = jpg_saw_SOS = jpg_saw_DHT = jpg_saw_DQT = xaFALSE;
  789.       if (jpg_read_markers() == xaFALSE) { jpg_free_stuff(); 
  790.     fprintf(stderr,"JPG: rd marker err\n"); return(ACT_DLTA_NOP); }
  791.       jpg_huff_reset();
  792.  
  793.       interleave = (jpg_height <= ((imagey>>1)+1) )?(2):(1);
  794.       row_offset = ((interleave == 2) && (base_y == 0))?(1):(0);
  795.     }
  796.     jpg_marker = 0x00;
  797.     if (jpg_width > imagex) JPG_Alloc_MCU_Bufs(0,jpg_width,0,xaFALSE);
  798.  
  799.  
  800.     if ((jpg_saw_DHT != xaTRUE) && (jpg_std_DHT_flag==0))
  801.     {
  802.       DEBUG_LEVEL1 fprintf(stderr,"standard DHT tables\n");
  803.       jpg_std_DHT();
  804.     }
  805.     DEBUG_LEVEL1 fprintf(stderr,"JJ: imagexy %d %d  jjxy %d %d basey %d\n",imagex,imagey,jpg_width,jpg_height,base_y);
  806.  
  807.     if (   (jpg_num_comps == 3) && (jpg_comps_in_scan == 3) 
  808.     && (jpg_comps[1].hvsample == 0x11) && (jpg_comps[2].hvsample== 0x11) )
  809.     {
  810.       if (jpg_comps[0].hvsample == 0x41) /* 411 */
  811.     { jpg_decode_411111(image,jpg_width,jpg_height,interleave,row_offset,
  812.             imagex,imagey,dec_info); }
  813.       else if (jpg_comps[0].hvsample == 0x22) /* 411 */
  814.     { jpg_decode_221111(image,jpg_width,jpg_height,interleave,row_offset,
  815.             imagex,imagey,dec_info); }
  816.       else if (jpg_comps[0].hvsample == 0x21) /* 211 */
  817.     { jpg_decode_211111(image,jpg_width,jpg_height,interleave,row_offset,
  818.             imagex,imagey,dec_info); }
  819.       else if (jpg_comps[0].hvsample == 0x11) /* 111 */
  820.     { jpg_decode_111111(image,jpg_width,jpg_height,interleave,row_offset,
  821.             imagex,imagey,dec_info,0); }
  822.       else 
  823.       { fprintf(stderr,"JPG: cmps %d %d mcu %04x %04x %04x unsupported\n",
  824.         jpg_num_comps,jpg_comps_in_scan,jpg_comps[0].hvsample,
  825.         jpg_comps[1].hvsample,jpg_comps[2].hvsample); 
  826.         break;
  827.       }
  828.     } 
  829.     else if ( (jpg_num_comps == 1) || (jpg_comps_in_scan == 1) )
  830.     {
  831.       jpg_decode_111111(image,jpg_width,jpg_height,interleave,row_offset,
  832.             imagex,imagey,dec_info,1);
  833.     }
  834.     else
  835.     { fprintf(stderr,"JPG: cmps %d %d mcu %04x %04x %04x unsupported.\n",
  836.         jpg_num_comps,jpg_comps_in_scan,jpg_comps[0].hvsample,
  837.         jpg_comps[1].hvsample,jpg_comps[2].hvsample); 
  838.       break;
  839.     }
  840.  
  841.     base_y += ((interleave == 1)?(imagey):(jpg_height));
  842.     if (jpg_marker == M_EOI) { jpg_saw_EOI = xaTRUE; jpg_marker = 0x00; }
  843.     else if (jpg_saw_EOI==xaFALSE) if (jpg_read_EOI_marker() == xaFALSE) break;
  844.   }
  845.   if (map_flag==xaTRUE) return(ACT_DLTA_MAPD);
  846.   else return(ACT_DLTA_NORM);
  847. }
  848.  
  849. /*******
  850.  *
  851.  */
  852. void jpg_huff_reset()
  853. {
  854.   jpg_comps[0].dc = 0;
  855.   jpg_comps[1].dc = 0;
  856.   jpg_comps[2].dc = 0;
  857.   jpg_h_bbuf = 0;  /* clear huffman bit buffer */
  858.   jpg_h_bnum = 0;
  859. }
  860.  
  861. /*******
  862.  *
  863.  */
  864. xaULONG jpg_read_EOI_marker()
  865.   /* POD make sure previous code restores bit buffer to input stream */ 
  866.   while( jpg_get_marker() == xaTRUE)
  867.   {
  868.     if (jpg_marker == M_EOI) {jpg_saw_EOI = xaTRUE; return(xaTRUE); }
  869.   }
  870.   return(xaFALSE);
  871. }
  872.  
  873. /*******
  874.  *
  875.  */
  876. xaULONG jpg_read_RST_marker()
  877. {
  878.   if ( (jpg_marker >= M_RST0) && (jpg_marker <= M_RST7) ) 
  879.   {
  880.     DEBUG_LEVEL1 fprintf(stderr,"JJ: RST marker %x found\n",jpg_marker);
  881.     return(xaTRUE);
  882.   }
  883.   else
  884.   {
  885.     fprintf(stderr,"JJ: NON-restart marker found %x\n",jpg_marker);
  886.     fprintf(stderr,"JJ: should resync-to-restart\n");
  887.   }
  888.   return(xaTRUE); /* POD NOTE just for now */
  889. }
  890.  
  891. void JPG_Free_MCU_Bufs()
  892. {
  893.   if (jpg_Ybuf)        { free(jpg_Ybuf); jpg_Ybuf = 0; }
  894.   if (jpg_Ubuf)        { free(jpg_Ubuf); jpg_Ubuf = 0; }
  895.   if (jpg_Vbuf)        { free(jpg_Vbuf); jpg_Vbuf = 0; }
  896.   jpg_YUVBufs.Ybuf = 0; jpg_YUVBufs.Ubuf = 0; jpg_YUVBufs.Vbuf = 0;
  897. }
  898.  
  899. /*******
  900.  *
  901.  */
  902. void JPG_Alloc_MCU_Bufs(anim_hdr,width,height,full_flag)
  903. XA_ANIM_HDR *anim_hdr;
  904. xaULONG width, height, full_flag;
  905. { xaULONG twidth  = (width + 15) / 16;
  906.   xaULONG theight = (height + 15) / 16;  if (theight & 1) theight++;
  907.  
  908.   if (full_flag==xaTRUE) twidth *= (theight << 2);
  909.   else              twidth <<= 2; /* four dct's deep */
  910.  
  911. DEBUG_LEVEL1 fprintf(stderr,"Alloc_MCU: wh %d %d twid %d act %d\n",
  912.             width,height,twidth,(twidth * DCTSIZE2) );
  913.  
  914.   if (anim_hdr) XA_Add_Func_To_Free_Chain(anim_hdr,JPG_Free_MCU_Bufs);
  915.   if (jpg_init_flag==xaFALSE) jpg_init_stuff();
  916.   if (jpg_Ybuf == 0)
  917.   { jpg_MCUbuf_size = twidth;
  918.     jpg_Ybuf = (xaUBYTE *)malloc(twidth * DCTSIZE2);
  919.     jpg_Ubuf = (xaUBYTE *)malloc(twidth * DCTSIZE2);
  920.     jpg_Vbuf = (xaUBYTE *)malloc(twidth * DCTSIZE2);
  921.   }
  922.   else if (twidth > jpg_MCUbuf_size)
  923.   { jpg_MCUbuf_size = twidth;
  924.     jpg_Ybuf = (xaUBYTE *)realloc( jpg_Ybuf,(twidth * DCTSIZE2) );
  925.     jpg_Ubuf = (xaUBYTE *)realloc( jpg_Ubuf,(twidth * DCTSIZE2) );
  926.     jpg_Vbuf = (xaUBYTE *)realloc( jpg_Vbuf,(twidth * DCTSIZE2) );
  927.   }
  928.   jpg_YUVBufs.Ybuf = jpg_Ybuf;
  929.   jpg_YUVBufs.Ubuf = jpg_Ubuf;
  930.   jpg_YUVBufs.Vbuf = jpg_Vbuf;
  931.  
  932. }
  933.  
  934. #define jpg_huff_EXTEND(val,sz) \
  935.  ((val) < (1<<((sz)-1)) ? (val) + (((-1)<<(sz)) + 1) : (val))
  936.  
  937.  
  938. /*
  939.  * IF marker is read then jpg_marker is set and nothing more is read in.
  940.  */
  941.  
  942. #define JJ_HBBUF_FILL8(hbbuf,hbnum)    \
  943. { register xaULONG _tmp;        \
  944.   hbbuf <<= 8;                \
  945.   if (jpg_marker) return(xaFALSE);     \
  946.   else { _tmp = *jpg_buff++;  jpg_bsize--; }     \
  947.   while(_tmp == 0xff)            \
  948.   { register xaULONG _t1; _t1 = *jpg_buff++; jpg_bsize--; \
  949.     if (_t1 == 0x00) break;        \
  950.     else if (_t1 == 0xff) continue;    \
  951.     else {jpg_marker = _t1; _tmp = 0x00; break;} \
  952.   }                    \
  953.   hbbuf |= _tmp;    hbnum += 8;    \
  954. }
  955.  
  956. #define JJ_HBBUF_FILL8_1(hbbuf,hbnum)    \
  957. { register xaULONG __tmp;        \
  958.   hbbuf <<= 8;    hbnum += 8;        \
  959.   if (jpg_marker) __tmp = 0x00;        \
  960.   else { __tmp = *jpg_buff++;  jpg_bsize--; } \
  961.   while(__tmp == 0xff)            \
  962.   { register xaULONG _t1; _t1 = *jpg_buff++; jpg_bsize--; \
  963.     if (_t1 == 0x00) break;        \
  964.     else if (_t1 == 0xff) continue;    \
  965.     else {jpg_marker = _t1; __tmp = 0x00; break;} \
  966.   }                    \
  967.   hbbuf |= __tmp;            \
  968. }
  969.  
  970. #define JJ_HUFF_DECODE(huff_hdr,htbl, hbnum, hbbuf, result)    \
  971. { register xaULONG _tmp, _hcode;                \
  972.   while(hbnum < 16) JJ_HBBUF_FILL8_1(hbbuf,hbnum);        \
  973.   _tmp = (hbbuf >> (hbnum - 8)) & 0xff;                \
  974.   _hcode = (htbl)[_tmp];                    \
  975.   if (_hcode) { hbnum -= (_hcode >> 8); (result) = _hcode & 0xff; } \
  976.   else \
  977.   { register xaULONG _hcode, _shift, _minbits = 9;        \
  978.     _tmp = (hbbuf >> (hbnum - 16)) & 0xffff; /* get 16 bits */    \
  979.     _shift = 16 - _minbits;    _hcode = _tmp >> _shift; \
  980.     while(_hcode > huff_hdr->maxcode[_minbits]) \
  981.     { _minbits++; _shift--; _hcode = _tmp >> _shift; } \
  982.     if (_minbits > 16) { fprintf(stderr,"JHDerr\n"); return(xaFALSE); } \
  983.     else  \
  984.     {  hbnum -= _minbits;  _hcode -= huff_hdr->mincode[_minbits]; \
  985.        result = huff_hdr->vals[ (huff_hdr->valptr[_minbits] + _hcode) ]; } \
  986.   } \
  987. }
  988.  
  989. #define JJ_HUFF_MASK(s) ((1 << (s)) - 1)
  990.  
  991. #define JJ_GET_BITS(n, hbnum, hbbuf, result) \
  992. { hbnum -= n; \
  993.   while(hbnum < 0)  { JJ_HBBUF_FILL8_1(hbbuf,hbnum); } \
  994.   (result) = ((hbbuf >> hbnum) & JJ_HUFF_MASK(n)); \
  995. }
  996.  
  997.  
  998.  
  999. /*  clears dctbuf to zeroes. 
  1000.  *  fills from huffman encode stream
  1001.  */
  1002. xaULONG jpg_huffparse(comp, dct_buf, qtab, OBuf)
  1003. register COMPONENT_HDR *comp;
  1004. register xaSHORT *dct_buf;
  1005. xaULONG *qtab;
  1006. xaUBYTE *OBuf;
  1007. { xaLONG i,dcval;
  1008.   xaULONG size;
  1009.   JJ_HUFF_TBL *huff_hdr = &(jpg_dc_huff[ comp->dc_htbl_num ]);
  1010.   xaUSHORT *huff_tbl = huff_hdr->cache;
  1011.   xaUBYTE *rnglimit = jpg_samp_limit + (CENTERJSAMPLE + MAXJSAMPLE + 1);
  1012.   xaULONG c_cnt,pos = 0;
  1013.  
  1014.   JJ_HUFF_DECODE(huff_hdr,huff_tbl,jpg_h_bnum,jpg_h_bbuf,size);
  1015.  
  1016. DEBUG_LEVEL2 fprintf(stderr," HUFF DECODE: size %d\n",size);
  1017.  
  1018.   if (size)
  1019.   { xaULONG bits;
  1020.     JJ_GET_BITS(size,jpg_h_bnum,jpg_h_bbuf,bits);
  1021.     dcval = jpg_huff_EXTEND(bits, size);
  1022.     comp->dc += dcval;
  1023. DEBUG_LEVEL2 fprintf(stderr,"   dcval %d  -dc %d\n",dcval,comp->dc);
  1024.   }
  1025.   dcval = comp->dc;
  1026.  
  1027.   /* clear reset of dct buffer */
  1028.   memset((char *)(dct_buf),0,(DCTSIZE2 * sizeof(xaSHORT)));
  1029.   dcval *= (xaLONG)qtab[0];
  1030.   dct_buf[0] = (xaSHORT)dcval;
  1031.   c_cnt = 0;
  1032.  
  1033.   huff_hdr = &(jpg_ac_huff[ comp->ac_htbl_num ]);
  1034.   huff_tbl = huff_hdr->cache;
  1035.   i = 1;
  1036.   while(i < 64)
  1037.   { xaLONG level;    xaULONG run,tmp;
  1038.     JJ_HUFF_DECODE(huff_hdr,huff_tbl,jpg_h_bnum,jpg_h_bbuf,tmp); 
  1039.     size =  tmp & 0x0f;
  1040.     run = (tmp >> 4) & 0x0f; /* leading zeroes */
  1041. DEBUG_LEVEL2 fprintf(stderr,"     %d) tmp %x size %x run %x\n",
  1042.                 i,tmp,size,run);
  1043.     if (size)
  1044.     { xaLONG coeff;
  1045.       i += run; /* skip zeroes */
  1046.       JJ_GET_BITS(size, jpg_h_bnum,jpg_h_bbuf,level);
  1047.       coeff = (xaLONG)jpg_huff_EXTEND(level, size);
  1048. DEBUG_LEVEL2 fprintf(stderr,"                   size %d coeff %x\n",size,coeff);
  1049.       pos = JJ_ZAG[i];
  1050.       coeff *= (xaLONG)qtab[ pos ];
  1051.       if (coeff)
  1052.       { c_cnt++;
  1053.         dct_buf[ pos ] = (xaSHORT)(coeff);
  1054.       }
  1055.       i++;
  1056.     }
  1057.     else
  1058.     {
  1059.       if (run != 15) break; /* EOB */
  1060.       i += 16;
  1061.     }
  1062.   }
  1063.  
  1064.   if (c_cnt) j_rev_dct(dct_buf, OBuf, rnglimit);
  1065.   else
  1066.   { register xaUBYTE *op = OBuf;
  1067.     register int jj = 8;
  1068.     xaSHORT v = *dct_buf;
  1069.     register xaUBYTE dc;
  1070.     v = (v < 0)?( (v-3)>>3 ):( (v+4)>>3 );
  1071.     dc = rnglimit[ (int) (v & RANGE_MASK) ];
  1072.     while(jj--)
  1073.     { op[0] = op[1] = op[2] = op[3] = op[4] = op[5] = op[6] = op[7] = dc;
  1074.       op += 8;
  1075.     }
  1076.   }
  1077.   return(xaTRUE);
  1078. }
  1079.  
  1080. /* POD since these are fixed, possibly eliminate */
  1081. #define FIX_0_298631336  ((xaLONG)  2446)    /* FIX(0.298631336) */
  1082. #define FIX_0_390180644  ((xaLONG)  3196)    /* FIX(0.390180644) */
  1083. #define FIX_0_541196100  ((xaLONG)  4433)    /* FIX(0.541196100) */
  1084. #define FIX_0_765366865  ((xaLONG)  6270)    /* FIX(0.765366865) */
  1085. #define FIX_0_899976223  ((xaLONG)  7373)    /* FIX(0.899976223) */
  1086. #define FIX_1_175875602  ((xaLONG)  9633)    /* FIX(1.175875602) */
  1087. #define FIX_1_501321110  ((xaLONG)  12299)    /* FIX(1.501321110) */
  1088. #define FIX_1_847759065  ((xaLONG)  15137)    /* FIX(1.847759065) */
  1089. #define FIX_1_961570560  ((xaLONG)  16069)    /* FIX(1.961570560) */
  1090. #define FIX_2_053119869  ((xaLONG)  16819)    /* FIX(2.053119869) */
  1091. #define FIX_2_562915447  ((xaLONG)  20995)    /* FIX(2.562915447) */
  1092. #define FIX_3_072711026  ((xaLONG)  25172)    /* FIX(3.072711026) */
  1093.  
  1094. /***********************************************************************
  1095.  * For most steps we can mathematically guarantee that the initial value
  1096.  * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
  1097.  * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
  1098.  * limiting step (just after the IDCT), a wildly out-of-range value is
  1099.  * possible if the input data is corrupt.  To avoid any chance of indexing
  1100.  * off the end of memory and getting a bad-pointer trap, we perform the
  1101.  * post-IDCT limiting thus:
  1102.  *              x = range_limit[x & MASK];
  1103.  * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
  1104.  * samples.  Under normal circumstances this is more than enough range and
  1105.  * a correct output will be generated; with bogus input data the mask will
  1106.  * cause wraparound, and we will safely generate a bogus-but-in-range output.
  1107.  * For the post-IDCT step, we want to convert the data from signed to unsigned
  1108.  * representation by adding CENTERJSAMPLE at the same time that we limit it.
  1109.  * So the post-IDCT limiting table ends up looking like this:
  1110.  *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
  1111.  *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
  1112.  *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
  1113.  *   0,1,...,CENTERJSAMPLE-1
  1114.  * Negative inputs select values from the upper half of the table after
  1115.  * masking.
  1116.  *
  1117.  * We can save some space by overlapping the start of the post-IDCT table
  1118.  * with the simpler range limiting table.  The post-IDCT table begins at
  1119.  * sample_range_limit + CENTERJSAMPLE.
  1120.  *
  1121.  * Note that the table is allocated in near data space on PCs; it's small
  1122.  * enough and used often enough to justify this.
  1123.  */
  1124.  
  1125. void JPG_Free_Samp_Limit_Table()
  1126. {
  1127.   if (jpg_samp_limit) { free(jpg_samp_limit); jpg_samp_limit = 0; }
  1128. }
  1129.  
  1130. void JPG_Setup_Samp_Limit_Table(anim_hdr)
  1131. XA_ANIM_HDR *anim_hdr;
  1132. {
  1133.   xaUBYTE *table;
  1134.   xaLONG i;
  1135.  
  1136.   if (jpg_samp_limit==0)
  1137.   {
  1138.      jpg_samp_limit = (xaUBYTE *)malloc((5 * (MAXJSAMPLE+1) + CENTERJSAMPLE));
  1139.      if (jpg_samp_limit==0) 
  1140.      { fprintf(stderr,"JJ: samp limit malloc err\n"); 
  1141.        return;
  1142.      } /*POD note improve this */
  1143.   }
  1144.   else return; /* already done */
  1145.  
  1146.   if (anim_hdr) XA_Add_Func_To_Free_Chain(anim_hdr,JPG_Free_Samp_Limit_Table);
  1147.   xa_byte_limit = jpg_samp_limit + (MAXJSAMPLE + 1);
  1148.  
  1149.   table = jpg_samp_limit;
  1150.   table += (MAXJSAMPLE+1);   /* allow negative subscripts of simple table */
  1151.  
  1152.   /* First segment of "simple" table: limit[x] = 0 for x < 0 */
  1153.   memset(table - (MAXJSAMPLE+1), 0, (MAXJSAMPLE+1));
  1154.  
  1155.   /* Main part of "simple" table: limit[x] = x */
  1156.   for (i = 0; i <= MAXJSAMPLE; i++) table[i] = (xaUBYTE) i;
  1157.  
  1158.   table += CENTERJSAMPLE;       /* Point to where post-IDCT table starts */
  1159.   /* End of simple table, rest of first half of post-IDCT table */
  1160.  
  1161.   for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) table[i] = MAXJSAMPLE;
  1162.  
  1163.   /* Second half of post-IDCT table */
  1164.   memset(table + (2 * (MAXJSAMPLE+1)), 0, (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE));
  1165.   memcpy(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
  1166.           (char *)(jpg_samp_limit+(MAXJSAMPLE+1)), CENTERJSAMPLE);
  1167. }
  1168.  
  1169. /*******
  1170.  *
  1171.  */
  1172. xaULONG jpg_std_DHT()
  1173. {
  1174.   xaLONG ttt,len;
  1175.   JJ_HUFF_TBL *htable;
  1176.   xaUBYTE  *hbits,*Sbits;
  1177.   xaUBYTE  *hvals,*Svals;
  1178.  
  1179.   static xaUBYTE dc_luminance_bits[17] =
  1180.     { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
  1181.   static xaUBYTE dc_luminance_vals[] =
  1182.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  1183.  
  1184.   static xaUBYTE dc_chrominance_bits[17] =
  1185.     { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
  1186.   static xaUBYTE dc_chrominance_vals[] =
  1187.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  1188.  
  1189.   static xaUBYTE ac_luminance_bits[17] =
  1190.     { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
  1191.   static xaUBYTE ac_luminance_vals[] =
  1192.     { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
  1193.       0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
  1194.       0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
  1195.       0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
  1196.       0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
  1197.       0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
  1198.       0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
  1199.       0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  1200.       0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
  1201.       0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
  1202.       0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  1203.       0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
  1204.       0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
  1205.       0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  1206.       0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
  1207.       0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
  1208.       0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
  1209.       0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
  1210.       0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
  1211.       0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  1212.       0xf9, 0xfa };
  1213.  
  1214.   static xaUBYTE ac_chrominance_bits[17] =
  1215.     { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
  1216.   static xaUBYTE ac_chrominance_vals[] =
  1217.     { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
  1218.       0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
  1219.       0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
  1220.       0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
  1221.       0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
  1222.       0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
  1223.       0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
  1224.       0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
  1225.       0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
  1226.       0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
  1227.       0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
  1228.       0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  1229.       0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
  1230.       0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
  1231.       0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
  1232.       0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
  1233.       0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
  1234.       0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
  1235.       0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
  1236.       0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  1237.       0xf9, 0xfa };
  1238.  
  1239.   for(ttt=0;ttt<4;ttt++)
  1240.   { xaULONG index = ttt & 1;
  1241.     xaLONG i,count;
  1242.  
  1243.     if (ttt <= 1)  /* DC tables */ 
  1244.     {
  1245.       htable = &(jpg_dc_huff[index]);
  1246.       hbits  = jpg_dc_huff[index].bits;
  1247.       hvals  = jpg_dc_huff[index].vals;
  1248.     if (index==0) { Sbits = dc_luminance_bits; Svals = dc_luminance_vals; }
  1249.     else { Sbits = dc_chrominance_bits; Svals = dc_chrominance_vals; }
  1250.     }
  1251.     else /* AC tables */
  1252.     {
  1253.       htable = &(jpg_ac_huff[index]);
  1254.       hbits  = jpg_ac_huff[index].bits;
  1255.       hvals  = jpg_ac_huff[index].vals;
  1256.     if (index==0) { Sbits = ac_luminance_bits; Svals = ac_luminance_vals; }
  1257.     else { Sbits = ac_chrominance_bits; Svals = ac_chrominance_vals; }
  1258.     }
  1259.     hbits[0] = 0;        count = 0;
  1260.     for (i = 1; i <= 16; i++)
  1261.     {
  1262.       hbits[i] = Sbits[i];
  1263.       count += hbits[i];
  1264.     }
  1265.     len -= 17;
  1266.     if (count > 256)
  1267.     { fprintf(stderr,"JJ: STD DHT bad count %d\n",count); return(xaFALSE); }
  1268.  
  1269.     for (i = 0; i < count; i++) hvals[i] = Svals[i];
  1270.     len -= count;
  1271.  
  1272.     jpg_huff_build(htable,hbits,hvals);
  1273.  
  1274.   } /* end of i */
  1275.   jpg_std_DHT_flag = 1;
  1276.   return(xaTRUE);
  1277. }
  1278.  
  1279. xaULONG jpg_search_marker(marker,data_ptr,data_size)
  1280. xaULONG marker;
  1281. xaUBYTE **data_ptr;
  1282. xaLONG *data_size;
  1283. { xaULONG d = 0;
  1284.   xaUBYTE *dptr = *data_ptr;
  1285.   xaLONG dsize = *data_size;
  1286.  
  1287.   while( dsize )
  1288.   {
  1289.     if (d == 0xff) /* potential marker */
  1290.     {
  1291.       d = *dptr++; dsize--;
  1292.       if (d == marker) 
  1293.       {
  1294.     *data_size = dsize; *data_ptr = dptr;     
  1295.     return(xaTRUE); /* found marker */
  1296.       }
  1297.     } else { d = *dptr++; dsize--; }
  1298.   }
  1299.   *data_size = dsize; *data_ptr = dptr;     
  1300.   return(xaFALSE);
  1301. }
  1302.  
  1303. void JFIF_Read_IJPG_Tables(xin)
  1304. XA_INPUT *xin;
  1305. { int i;
  1306.   for(i=0;i<64;i++) IJPG_Tab1[i] = xin->Read_U8(xin);
  1307.   for(i=0;i<64;i++) IJPG_Tab2[i] = xin->Read_U8(xin);
  1308. }
  1309.  
  1310. static char std_luminance_quant_tbl[64] = {
  1311.   16,  11,  12,  14,  12,  10,  16,  14,
  1312.   13,  14,  18,  17,  16,  19,  24,  40,
  1313.   26,  24,  22,  22,  24,  49,  35,  37,
  1314.   29,  40,  58,  51,  61,  60,  57,  51,
  1315.   56,  55,  64,  72,  92,  78,  64,  68,
  1316.   87,  69,  55,  56,  80, 109,  81,  87,
  1317.   95,  98, 103, 104, 103,  62,  77, 113,
  1318.  121, 112, 100, 120,  92, 101, 103,  99
  1319. };
  1320.  
  1321. static char std_chrominance_quant_tbl[64] = {
  1322.   17,  18,  18,  24,  21,  24,  47,  26,
  1323.   26,  47,  99,  66,  56,  66,  99,  99,
  1324.   99,  99,  99,  99,  99,  99,  99,  99,
  1325.   99,  99,  99,  99,  99,  99,  99,  99,
  1326.   99,  99,  99,  99,  99,  99,  99,  99,
  1327.   99,  99,  99,  99,  99,  99,  99,  99,
  1328.   99,  99,  99,  99,  99,  99,  99,  99,
  1329.   99,  99,  99,  99,  99,  99,  99,  99
  1330. };
  1331.  
  1332.  
  1333. void JFIF_Init_IJPG_Tables(qfactor)
  1334. int qfactor;
  1335. { int i;
  1336.   for(i=0;i<64;i++) IJPG_Tab1[i] = qfactor * std_luminance_quant_tbl[i];
  1337.   for(i=0;i<64;i++) IJPG_Tab2[i] = qfactor * std_chrominance_quant_tbl[i];
  1338. }
  1339.  
  1340. #define JPG_HANDLE_RST(rst_int,rst_cnt)    {        \
  1341. if ( ((rst_int) && (rst_cnt==0)) /* || (jpg_marker)*/ ) \
  1342. { jpg_h_bbuf = 0;  jpg_h_bnum = 0;            \
  1343.   DEBUG_LEVEL1 fprintf(stderr,"  jRST_INT %d rst_cnt %d\n", rst_int,rst_cnt);\
  1344.   if (jpg_marker)                            \
  1345.   { DEBUG_LEVEL1 fprintf(stderr,"  jpg_marker(%x)\n",jpg_marker);    \
  1346.     if (jpg_marker == M_EOI) { jpg_saw_EOI = xaTRUE; return(xaTRUE); }    \
  1347.     else if ( !((jpg_marker >= M_RST0) && (jpg_marker <= M_RST7)))    \
  1348.     {fprintf(stderr,"JPEG: unexp marker(%x)\n",jpg_marker); return(xaFALSE);}\
  1349.     jpg_marker = 0;                        \
  1350.   } else if (jpg_read_RST_marker()==xaFALSE)            \
  1351.                 { fprintf(stderr,"RST marker false\n"); return(xaFALSE); } \
  1352.   jpg_comps[0].dc = jpg_comps[1].dc = jpg_comps[2].dc = 0;    \
  1353.   rst_cnt = rst_int;                        \
  1354. } else rst_cnt--;                        }
  1355.  
  1356. #define JPG_TST_MARKER(rst_int,rst_cnt)    {        \
  1357. if (jpg_marker)                            \
  1358. { DEBUG_LEVEL1 fprintf(stderr,"  jpg_marker(%x)\n",jpg_marker);    \
  1359.   if (jpg_marker == M_EOI) { jpg_saw_EOI = xaTRUE; \
  1360.            /* return(xaTRUE); */ }    \
  1361.   else if ( !((jpg_marker >= M_RST0) && (jpg_marker <= M_RST7)))    \
  1362.   {fprintf(stderr,"JPEG: unexp marker(%x)\n",jpg_marker); return(xaFALSE);}\
  1363.   else { \
  1364.   jpg_comps[0].dc = jpg_comps[1].dc = jpg_comps[2].dc = 0;    \
  1365.   rst_cnt = rst_int;                        \
  1366.   jpg_marker = 0;                        \
  1367.   jpg_h_bbuf = 0;  jpg_h_bnum = 0; }            \
  1368. }                                }
  1369.  
  1370. /*******
  1371.  *
  1372.  */
  1373. xaULONG jpg_decode_111111(image,width,height,interleave,row_offset,
  1374.                 imagex,imagey,dec_info,gray)
  1375. xaUBYTE *image;
  1376. xaULONG width,height,interleave,row_offset;
  1377. xaULONG imagex,imagey;
  1378. XA_DEC2_INFO *dec_info;
  1379. xaULONG gray;
  1380. {
  1381.   xaUBYTE *iptr = image;
  1382.   xaULONG map_flag = dec_info->map_flag;
  1383.   xaULONG *map = dec_info->map;
  1384.   XA_CHDR *chdr = dec_info->chdr;
  1385.   xaULONG x,mcu_cols,mcu_rows;
  1386.   xaLONG *qtab0,*qtab1,*qtab2;
  1387.   xaUBYTE *Ybuf,*Ubuf,*Vbuf;
  1388.   xaULONG rst_count;
  1389.   xaULONG orow_size = imagex * dec_info->bytes_pixel;
  1390.   void (*color_func)();
  1391.  
  1392.   if (chdr) { if (chdr->new_chdr) chdr = chdr->new_chdr; }
  1393.  
  1394.   if (gray) color_func = XA_MCU111111_To_Gray;
  1395.   else        color_func = (void (*)())XA_MCU111111_Func(dec_info->image_type);
  1396.  
  1397.   if (row_offset) iptr += row_offset * orow_size;
  1398.   orow_size *= interleave;
  1399.   if (interleave == 2) imagey >>= 1;
  1400.  
  1401.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1402.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1403.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1404.  
  1405.   mcu_cols = (width  + 7) / 8;
  1406.   mcu_rows = (height + 7) / 8;
  1407.   DEBUG_LEVEL1 fprintf(stderr,"111111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1408.   jpg_marker = 0x00;
  1409.  
  1410.   rst_count = jpg_rst_interval;
  1411.   while(mcu_rows--)
  1412.   { 
  1413.     Ybuf = jpg_YUVBufs.Ybuf; Ubuf = jpg_YUVBufs.Ubuf; Vbuf = jpg_YUVBufs.Vbuf;
  1414.     x = mcu_cols;
  1415.     while(x--)
  1416.     { 
  1417. DEBUG_LEVEL1 fprintf(stderr,"  MCU XY(%d,%d)\n",x,mcu_rows);
  1418.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1419.  
  1420.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1421.       if (gray==0)
  1422.       {
  1423.         jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1424.         jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1425.       } 
  1426.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1427.     } /* end of mcu_cols */
  1428.  
  1429. DEBUG_LEVEL1 fprintf(stderr,"imagey %d\n",imagey);
  1430.     (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2),
  1431.     orow_size, &jpg_YUVBufs,&def_yuv_tabs, map_flag,map,chdr);
  1432.     imagey -= 8;  iptr += (orow_size << 3);
  1433.  
  1434.   } /* end of mcu_rows */
  1435.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1436.   return(xaTRUE);
  1437. }
  1438.  
  1439.  
  1440. /*******
  1441.  *
  1442.  */
  1443. xaULONG jpg_decode_211111(image,width,height,interleave,row_offset,
  1444.                 imagex,imagey,dec_info)
  1445. xaUBYTE *image;
  1446. xaULONG width,height,interleave,row_offset;
  1447. xaULONG imagex,imagey;
  1448. XA_DEC2_INFO *dec_info;
  1449. {
  1450.   xaUBYTE *iptr = image;
  1451.   xaULONG map_flag = dec_info->map_flag;
  1452.   xaULONG *map = dec_info->map;
  1453.   XA_CHDR *chdr = dec_info->chdr;
  1454.   xaULONG x,mcu_cols,mcu_rows;
  1455.   xaLONG *qtab0,*qtab1,*qtab2;
  1456.   xaUBYTE *Ybuf,*Ubuf,*Vbuf;
  1457.   xaULONG rst_count;
  1458.   xaULONG orow_size = imagex * dec_info->bytes_pixel;
  1459.   void (*color_func)() = (void (*)())XA_MCU211111_Func(dec_info->image_type);
  1460.  
  1461.   if (chdr) { if (chdr->new_chdr) chdr = chdr->new_chdr; }
  1462.  
  1463.   if (row_offset) iptr += row_offset * orow_size;
  1464.   orow_size *= interleave;
  1465.   if (interleave == 2) imagey >>= 1;
  1466.   imagex++; imagex >>= 1;
  1467.  
  1468.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1469.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1470.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1471.  
  1472.   mcu_cols = (width  + 15) / 16;
  1473.   mcu_rows = (height +  7) / 8;
  1474.   DEBUG_LEVEL1 fprintf(stderr,"211111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1475.   jpg_marker = 0x00;
  1476.  
  1477.   rst_count = jpg_rst_interval;
  1478.   while(mcu_rows--)
  1479.   { 
  1480.     Ybuf = jpg_YUVBufs.Ybuf; Ubuf = jpg_YUVBufs.Ubuf; Vbuf = jpg_YUVBufs.Vbuf;
  1481.     x = mcu_cols;
  1482.     while(x--)
  1483.     { /* DEBUG_LEVEL1 fprintf(stderr,"MCU XY(%d,%d)\n", x,mcu_rows); */
  1484.  
  1485.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1486.  
  1487.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1488.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1489.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1490.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1491.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1492.     } /* end of mcu_cols */
  1493.  
  1494.     (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2),
  1495.     orow_size, &jpg_YUVBufs,&def_yuv_tabs, map_flag,map,chdr);
  1496.     imagey -= 8;  iptr += (orow_size << 3);
  1497.  
  1498.   } /* end of mcu_rows */
  1499.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1500.   return(xaTRUE);
  1501. }
  1502.  
  1503.  
  1504. /*******
  1505.  *
  1506.  */
  1507. xaULONG jpg_decode_221111(image,width,height,interleave,row_offset,
  1508.                 imagex,imagey,dec_info)
  1509. xaUBYTE *image;
  1510. xaULONG width,height,interleave,row_offset;
  1511. xaLONG imagex,imagey;
  1512. XA_DEC2_INFO *dec_info;
  1513. { xaUBYTE *iptr = image;
  1514.   xaULONG map_flag = dec_info->map_flag;
  1515.   xaULONG *map = dec_info->map;
  1516.   XA_CHDR *chdr = dec_info->chdr;
  1517.   xaLONG x,mcu_cols,mcu_rows;
  1518.   xaLONG *qtab0,*qtab1,*qtab2;
  1519.   xaUBYTE *Ybuf,*Ubuf,*Vbuf;
  1520.   xaULONG rst_count;
  1521.   void (*color_func)() = (void (*)())XA_MCU221111_Func(dec_info->image_type);
  1522.   xaULONG orow_size = imagex * dec_info->bytes_pixel;
  1523.  
  1524.   if (chdr) { if (chdr->new_chdr) chdr = chdr->new_chdr; }
  1525.  
  1526.   if (row_offset) iptr += row_offset * orow_size;
  1527.   orow_size *= interleave;
  1528.   if (interleave == 2) imagey >>= 1;
  1529.   imagex++; imagex >>= 1;  /* 2h */
  1530.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1531.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1532.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1533.  
  1534.   mcu_cols = (width  + 15) / 16;
  1535.   mcu_rows = (height + 15) / 16;
  1536.   DEBUG_LEVEL1 fprintf(stderr,"221111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1537.   jpg_marker = 0x00;
  1538.  
  1539.   rst_count = jpg_rst_interval;
  1540.   while(mcu_rows--)
  1541.   { Ybuf = jpg_YUVBufs.Ybuf; Ubuf = jpg_YUVBufs.Ubuf; Vbuf = jpg_YUVBufs.Vbuf;
  1542.     x = mcu_cols; while(x--)
  1543.     { DEBUG_LEVEL1 fprintf(stderr,"  MCU XY(%d,%d)\n",x,mcu_rows);
  1544.  
  1545.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1546.  
  1547.     /* Y0 Y1 Y2 Y3 U V */
  1548.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1549.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1550.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1551.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1552.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1553.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1554.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1555.     } /* end of mcu_cols */
  1556.  
  1557.     (void)(color_func)(iptr,imagex,xaMIN(imagey,16),(mcu_cols * DCTSIZE2),orow_size,
  1558.             &jpg_YUVBufs,&def_yuv_tabs,map_flag,map,chdr);
  1559.     imagey -= 16;  iptr += (orow_size << 4);
  1560.  
  1561.   } /* end of mcu_rows */
  1562.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1563.   DEBUG_LEVEL1 fprintf(stderr,"411: done\n");
  1564.   return(xaTRUE);
  1565. }
  1566.  
  1567.  
  1568.  
  1569. /*******
  1570.  *
  1571.  */
  1572. xaULONG jpg_decode_411111(image,width,height,interleave,row_offset,
  1573.                 imagex,imagey,dec_info)
  1574. xaUBYTE *image;
  1575. xaULONG width,height,interleave,row_offset;
  1576. xaLONG imagex,imagey;
  1577. XA_DEC2_INFO *dec_info;
  1578. { xaUBYTE *iptr = image;
  1579.   xaULONG map_flag = dec_info->map_flag;
  1580.   xaULONG *map = dec_info->map;
  1581.   XA_CHDR *chdr = dec_info->chdr;
  1582.   xaLONG x,mcu_cols,mcu_rows;
  1583.   xaLONG *qtab0,*qtab1,*qtab2;
  1584.   xaUBYTE *Ybuf,*Ubuf,*Vbuf;
  1585.   xaULONG rst_count;
  1586.   xaULONG orow_size = imagex * dec_info->bytes_pixel;
  1587.   void (*color_func)() = (void (*)())XA_MCU411111_Func(dec_info->image_type);
  1588.  
  1589.   if (chdr) { if (chdr->new_chdr) chdr = chdr->new_chdr; }
  1590.  
  1591.   if (row_offset) iptr += row_offset * orow_size;
  1592.   orow_size *= interleave;
  1593.   if (interleave == 2) imagey >>= 1;
  1594.   imagex +=3; imagex >>= 2; /* 4h */
  1595.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1596.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1597.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1598.  
  1599.   mcu_cols = (width  + 31) / 32;
  1600.   mcu_rows = (height + 7) / 8;
  1601.   DEBUG_LEVEL1 fprintf(stderr,"411111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1602.   jpg_marker = 0x00;
  1603.  
  1604.   rst_count = jpg_rst_interval;
  1605.   while(mcu_rows--)
  1606.   { Ybuf = jpg_YUVBufs.Ybuf; Ubuf = jpg_YUVBufs.Ubuf; Vbuf = jpg_YUVBufs.Vbuf;
  1607.     x = mcu_cols; while(x--)
  1608.     { DEBUG_LEVEL1 fprintf(stderr,"  MCU XY(%d,%d)\n",x,mcu_rows);
  1609.  
  1610.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1611.  
  1612.     /* Y0 Y1 Y2 Y3 U V */
  1613.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1614.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1615.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1616.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1617.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1618.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1619.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1620.     } /* end of mcu_cols */
  1621.  
  1622.     (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2),orow_size,
  1623.             &jpg_YUVBufs,&def_yuv_tabs,map_flag,map,chdr);
  1624.     imagey -= 8;  iptr += (orow_size << 3);
  1625.  
  1626.   } /* end of mcu_rows */
  1627.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1628.   DEBUG_LEVEL1 fprintf(stderr,"411: done\n");
  1629.   return(xaTRUE);
  1630. }
  1631.  
  1632.  
  1633.