JpegDecoder.h
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:19k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. //------------------------------------------------------------------------------
  2. // jpegdecoder.h
  3. // Small JPEG Decoder Library v0.93b
  4. // Last updated: Dec. 28, 2001 
  5. // Copyright (C) 1994-2000 Rich Geldreich
  6. // richgel@voicenet.com
  7. //
  8. // This library is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU Lesser General Public
  10. // License as published by the Free Software Foundation; either
  11. // version 2.1 of the License, or (at your option) any later version.
  12. //
  13. // This library is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. // Lesser General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU Lesser General Public
  19. // License along with this library; if not, write to the Free Software
  20. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21. //------------------------------------------------------------------------------
  22. #ifndef JPEG_DECODER_H
  23. #define JPEG_DECODER_H
  24. //------------------------------------------------------------------------------
  25. #include "main.h"
  26. //------------------------------------------------------------------------------
  27. // Define SUPPORT_X86ASM to include the inline x86 assembler code.
  28. #define SUPPORT_X86ASM
  29. //------------------------------------------------------------------------------
  30. // Define SUPPORT_MMX to include MMX support.
  31. #define SUPPORT_MMX
  32. //------------------------------------------------------------------------------
  33. #define JPGD_INBUFSIZE       4096
  34. //------------------------------------------------------------------------------
  35. // May need to be adjusted if support for other colorspaces/sampling factors is added
  36. #define JPGD_MAXBLOCKSPERMCU 10
  37. //------------------------------------------------------------------------------
  38. #define JPGD_MAXHUFFTABLES   8
  39. #define JPGD_MAXQUANTTABLES  4
  40. #define JPGD_MAXCOMPONENTS   4
  41. #define JPGD_MAXCOMPSINSCAN  4
  42. //------------------------------------------------------------------------------
  43. // Increase this if you increase the max width!
  44. #define JPGD_MAXBLOCKSPERROW 6144
  45. //------------------------------------------------------------------------------
  46. // Max. allocated blocks
  47. #define JPGD_MAXBLOCKS    100
  48. //------------------------------------------------------------------------------
  49. #define JPGD_MAX_HEIGHT 8192
  50. #define JPGD_MAX_WIDTH  8192
  51. //------------------------------------------------------------------------------
  52. /* JPEG specific errors */
  53. #define JPGD_BAD_DHT_COUNTS              -200
  54. #define JPGD_BAD_DHT_INDEX               -201
  55. #define JPGD_BAD_DHT_MARKER              -202
  56. #define JPGD_BAD_DQT_MARKER              -203
  57. #define JPGD_BAD_DQT_TABLE               -204
  58. #define JPGD_BAD_PRECISION               -205
  59. #define JPGD_BAD_HEIGHT                  -206
  60. #define JPGD_BAD_WIDTH                   -207
  61. #define JPGD_TOO_MANY_COMPONENTS         -208
  62. #define JPGD_BAD_SOF_LENGTH              -209
  63. #define JPGD_BAD_VARIABLE_MARKER         -210
  64. #define JPGD_BAD_DRI_LENGTH              -211
  65. #define JPGD_BAD_SOS_LENGTH              -212
  66. #define JPGD_BAD_SOS_COMP_ID             -213
  67. #define JPGD_W_EXTRA_BYTES_BEFORE_MARKER -214
  68. #define JPGD_NO_ARITHMITIC_SUPPORT       -215
  69. #define JPGD_UNEXPECTED_MARKER           -216
  70. #define JPGD_NOT_JPEG                    -217
  71. #define JPGD_UNSUPPORTED_MARKER          -218
  72. #define JPGD_BAD_DQT_LENGTH              -219
  73. #define JPGD_TOO_MANY_BLOCKS             -221
  74. #define JPGD_UNDEFINED_QUANT_TABLE       -222
  75. #define JPGD_UNDEFINED_HUFF_TABLE        -223
  76. #define JPGD_NOT_SINGLE_SCAN             -224
  77. #define JPGD_UNSUPPORTED_COLORSPACE      -225
  78. #define JPGD_UNSUPPORTED_SAMP_FACTORS    -226
  79. #define JPGD_DECODE_ERROR                -227
  80. #define JPGD_BAD_RESTART_MARKER          -228
  81. #define JPGD_ASSERTION_ERROR             -229
  82. #define JPGD_BAD_SOS_SPECTRAL            -230
  83. #define JPGD_BAD_SOS_SUCCESSIVE          -231
  84. #define JPGD_STREAM_READ                 -232
  85. #define JPGD_NOTENOUGHMEM                -233
  86. //------------------------------------------------------------------------------
  87. #define JPGD_GRAYSCALE 0
  88. #define JPGD_YH1V1     1
  89. #define JPGD_YH2V1     2
  90. #define JPGD_YH1V2     3
  91. #define JPGD_YH2V2     4
  92. //------------------------------------------------------------------------------
  93. const int JPGD_FAILED = -1;
  94. const int JPGD_DONE = 1;
  95. const int JPGD_OKAY = 0;
  96. //------------------------------------------------------------------------------
  97. typedef enum
  98. {
  99.   M_SOF0  = 0xC0,
  100.   M_SOF1  = 0xC1,
  101.   M_SOF2  = 0xC2,
  102.   M_SOF3  = 0xC3,
  103.   M_SOF5  = 0xC5,
  104.   M_SOF6  = 0xC6,
  105.   M_SOF7  = 0xC7,
  106.   M_JPG   = 0xC8,
  107.   M_SOF9  = 0xC9,
  108.   M_SOF10 = 0xCA,
  109.   M_SOF11 = 0xCB,
  110.   M_SOF13 = 0xCD,
  111.   M_SOF14 = 0xCE,
  112.   M_SOF15 = 0xCF,
  113.   M_DHT   = 0xC4,
  114.   M_DAC   = 0xCC,
  115.   M_RST0  = 0xD0,
  116.   M_RST1  = 0xD1,
  117.   M_RST2  = 0xD2,
  118.   M_RST3  = 0xD3,
  119.   M_RST4  = 0xD4,
  120.   M_RST5  = 0xD5,
  121.   M_RST6  = 0xD6,
  122.   M_RST7  = 0xD7,
  123.   M_SOI   = 0xD8,
  124.   M_EOI   = 0xD9,
  125.   M_SOS   = 0xDA,
  126.   M_DQT   = 0xDB,
  127.   M_DNL   = 0xDC,
  128.   M_DRI   = 0xDD,
  129.   M_DHP   = 0xDE,
  130.   M_EXP   = 0xDF,
  131.   M_APP0  = 0xE0,
  132.   M_APP15 = 0xEF,
  133.   M_JPG0  = 0xF0,
  134.   M_JPG13 = 0xFD,
  135.   M_COM   = 0xFE,
  136.   M_TEM   = 0x01,
  137.   M_ERROR = 0x100
  138. } JPEG_MARKER;
  139. //------------------------------------------------------------------------------
  140. #define RST0 0xD0
  141. //------------------------------------------------------------------------------
  142. typedef struct huff_tables_tag
  143. {
  144.   uint  look_up[256];
  145.   uchar code_size[256];
  146.   // FIXME: Is 512 tree entries really enough to handle _all_ possible
  147.   // code sets? I think so but not 100% positive.
  148.   uint  tree[512];
  149. } huff_tables_t, *Phuff_tables_t;
  150. //------------------------------------------------------------------------------
  151. typedef struct coeff_buf_tag
  152. {
  153.   uchar *Pdata;
  154.   int block_num_x, block_num_y;
  155.   int block_len_x, block_len_y;
  156.   int block_size;
  157. } coeff_buf_t, *Pcoeff_buf_t;
  158. //------------------------------------------------------------------------------
  159. class jpeg_decoder;
  160. typedef void (*Pdecode_block_func)(jpeg_decoder *, int, int, int);
  161. //------------------------------------------------------------------------------
  162. class progressive_block_decoder
  163. {
  164. public:
  165.   static void decode_block_dc_first(
  166.     jpeg_decoder *Pd,
  167.     int component_id, int block_x, int block_y);
  168.   static void decode_block_dc_refine(
  169.     jpeg_decoder *Pd,
  170.     int component_id, int block_x, int block_y);
  171.   static void decode_block_ac_first(
  172.     jpeg_decoder *Pd,
  173.     int component_id, int block_x, int block_y);
  174.   static void decode_block_ac_refine(
  175.     jpeg_decoder *Pd,
  176.     int component_id, int block_x, int block_y);
  177. };
  178. //------------------------------------------------------------------------------
  179. // Input stream interface.
  180. // Derive from this class to fetch input data from sources other than
  181. // files. An important requirement is that you *must* set eof_flag to true
  182. // when no more data is available to fetch!
  183. // The decoder is rather "greedy": it will keep on calling this method until
  184. // its internal input buffer is full, or until the EOF flag is set.
  185. // It the input stream contains data after the JPEG stream's EOI (end of
  186. // image) marker it will probably be pulled into the internal buffer.
  187. // Call the get_total_bytes_read() method to determine the true
  188. // size of the JPEG stream.
  189. class jpeg_decoder_stream
  190. {
  191. public:
  192.   jpeg_decoder_stream()
  193.   {
  194.   }
  195.   virtual ~jpeg_decoder_stream()
  196.   {
  197.   }
  198.   // The read() method is called when the internal input buffer is empty.
  199.   // Pbuf - input buffer
  200.   // max_bytes_to_read - maximum bytes that can be written to Pbuf
  201.   // Peof_flag - set this to true if at end of stream (no more bytes remaining)
  202.   // Return -1 on error, otherwise return the number of bytes actually
  203.   // written to the buffer (which may be 0).
  204.   // Notes: This method will be called in a loop until you set *Peof_flag to
  205.   // true or the internal buffer is full.
  206.   // The MMX state will be automatically saved/restored before this method is
  207.   // called, unlike previous versions.
  208.   virtual int read(uchar *Pbuf, int max_bytes_to_read, bool *Peof_flag) = 0;
  209.   virtual void attach(void)
  210.   {
  211.   }
  212.   virtual void detach(void)
  213.   {
  214.   }
  215. };
  216. //------------------------------------------------------------------------------
  217. typedef jpeg_decoder_stream *Pjpeg_decoder_stream;
  218. //------------------------------------------------------------------------------
  219. // Here's an example FILE stream class.
  220. class jpeg_decoder_file_stream : public jpeg_decoder_stream
  221. {
  222.   FILE *Pfile;
  223.   bool eof_flag, error_flag;
  224. public:
  225.   jpeg_decoder_file_stream()
  226.   {
  227.     Pfile = NULL;
  228.     eof_flag = false;
  229.     error_flag = false;
  230.   }
  231.   void close(void)
  232.   {
  233.     if (Pfile)
  234.     {
  235.       fclose(Pfile);
  236.       Pfile = NULL;
  237.     }
  238.     eof_flag = false;
  239.     error_flag = false;
  240.   }
  241.   virtual ~jpeg_decoder_file_stream()
  242.   {
  243.     close();
  244.   }
  245.   bool open(const char *Pfilename)
  246.   {
  247.     close();
  248.     eof_flag = false;
  249.     error_flag = false;
  250.     Pfile = fopen(Pfilename, "rb");
  251.     if (!Pfile)
  252.       return (true);
  253.     return (false);
  254.   }
  255.   virtual int read(uchar *Pbuf, int max_bytes_to_read, bool *Peof_flag)
  256.   {
  257. #if 0
  258. // Empty/clear MMX state: For testing purposes only!
  259. #ifdef _DEBUG
  260. #ifdef SUPPORT_MMX
  261.       _asm
  262.       {
  263.         pxor mm0, mm0
  264.         pxor mm1, mm1
  265.         pxor mm2, mm2
  266.         pxor mm3, mm3
  267.         pxor mm4, mm4
  268.         pxor mm5, mm5
  269.         pxor mm6, mm6
  270.         pxor mm7, mm7
  271.         emms
  272.       }
  273. #endif
  274. #endif
  275. #endif
  276.     if (!Pfile)
  277.       return (-1);
  278.     if (eof_flag)
  279.     {
  280.       *Peof_flag = true;
  281.       return (0);
  282.     }
  283.     if (error_flag)
  284.       return (-1);
  285.     int bytes_read = fread(Pbuf, 1, max_bytes_to_read, Pfile);
  286.     if (bytes_read < max_bytes_to_read)
  287.     {
  288.       if (ferror(Pfile))
  289.       {
  290.         error_flag = true;
  291.         return (-1);
  292.       }
  293.       eof_flag = true;
  294.       *Peof_flag = true;
  295.     }
  296.     return (bytes_read);
  297.   }
  298.   bool get_error_status(void)
  299.   {
  300.     return (error_flag);
  301.   }
  302.   bool reset(void)
  303.   {
  304.     if (error_flag)
  305.       return (true);
  306.     fseek(Pfile, 0, SEEK_SET);
  307.     eof_flag = false;
  308.     return (false);
  309.   }
  310.   int get_size(void)
  311.   {
  312.     if (!Pfile)
  313.       return (-1);
  314.     int loc = ftell(Pfile);
  315.     fseek(Pfile, 0, SEEK_END);
  316.     int size = ftell(Pfile);
  317.     fseek(Pfile, loc, SEEK_SET);
  318.     return (size);
  319.   }
  320. };
  321. //------------------------------------------------------------------------------
  322. typedef jpeg_decoder_file_stream *Pjpeg_decoder_file_stream;
  323. //------------------------------------------------------------------------------
  324. #define QUANT_TYPE int16
  325. #define BLOCK_TYPE int16
  326. //------------------------------------------------------------------------------
  327. // Disable no return value warning, for rol() method
  328. #pragma warning(push)
  329. #pragma warning( disable : 4035 4799 )
  330. //------------------------------------------------------------------------------
  331. class jpeg_decoder
  332. {
  333.   friend class progressive_block_decoder;
  334. private:
  335.   void free_all_blocks(void);
  336.   void terminate(int status);
  337.   void *alloc(int n);
  338.   void word_clear(void *p, ushort c, uint n);
  339.   void prep_in_buffer(void);
  340.   void read_dht_marker(void);
  341.   void read_dqt_marker(void);
  342.   void read_sof_marker(void);
  343.   void skip_variable_marker(void);
  344.   void read_dri_marker(void);
  345.   void read_sos_marker(void);
  346.   int next_marker(void);
  347.   int process_markers(void);
  348.   void locate_soi_marker(void);
  349.   void locate_sof_marker(void);
  350.   int locate_sos_marker(void);
  351.   void init(Pjpeg_decoder_stream Pstream, bool use_mmx);
  352.   void create_look_ups(void);
  353.   void fix_in_buffer(void);
  354.   void transform_row(void);
  355.   Pcoeff_buf_t coeff_buf_open(
  356.     int block_num_x, int block_num_y,
  357.     int block_len_x, int block_len_y);
  358.   void coeff_buf_read(
  359.     Pcoeff_buf_t cb,
  360.     int block_x, int block_y,
  361.     BLOCK_TYPE *buffer);
  362.   void coeff_buf_write(
  363.     Pcoeff_buf_t cb,
  364.     int block_x, int block_y,
  365.     BLOCK_TYPE *buffer);
  366.   BLOCK_TYPE *coeff_buf_getp(
  367.     Pcoeff_buf_t cb,
  368.     int block_x, int block_y);
  369.   void load_next_row(void);
  370.   void decode_next_row(void);
  371. #ifdef SUPPORT_MMX
  372.   void decode_next_row_mmx(void);
  373. #endif
  374.   void make_huff_table(
  375.     int index,
  376.     Phuff_tables_t hs);
  377.   void check_quant_tables(void);
  378.   void check_huff_tables(void);
  379.   void calc_mcu_block_order(void);
  380.   int init_scan(void);
  381.   void init_frame(void);
  382.   void process_restart(void);
  383.   void decode_scan(
  384.     Pdecode_block_func decode_block_func);
  385.   void init_progressive(void);
  386.   void init_sequential(void);
  387.   void decode_start(void);
  388.   void decode_init(Pjpeg_decoder_stream Pstream, bool use_mmx);
  389.   void H2V2Convert(void);
  390.   void H2V1Convert(void);
  391.   void H1V2Convert(void);
  392.   void H1V1Convert(void);
  393.   void GrayConvert(void);
  394.   void find_eoi(void);
  395. //------------------
  396.   inline uint jpeg_decoder::rol(uint i, uchar j);
  397.   inline uint jpeg_decoder::get_char(void);
  398.   inline uint jpeg_decoder::get_char(bool *Ppadding_flag);
  399.   inline void jpeg_decoder::stuff_char(uchar q);
  400.   inline uchar jpeg_decoder::get_octet(void);
  401.   inline uint jpeg_decoder::get_bits_1(int num_bits);
  402.   inline uint jpeg_decoder::get_bits_2(int numbits);
  403.   inline int jpeg_decoder::huff_decode(Phuff_tables_t Ph);
  404. #ifdef SUPPORT_X86ASM
  405.   inline uint jpeg_decoder::huff_extend(uint i, int c);
  406. #endif
  407.   inline uchar jpeg_decoder::clamp(int i);
  408. #ifdef SUPPORT_MMX
  409.   inline uint jpeg_decoder::get_high_byte_mmx(void);
  410.   inline uint jpeg_decoder::get_high_word_mmx(void);
  411.   inline void jpeg_decoder::get_bits_2_mmx_init(void);
  412.   inline void jpeg_decoder::get_bits_2_mmx_deinit(void);
  413.   inline uint jpeg_decoder::get_bits_2_mmx(int numbits);
  414.   inline int jpeg_decoder::huff_decode_mmx(Phuff_tables_t Ph);
  415. #endif
  416. //------------------
  417.   int   image_x_size;
  418.   int   image_y_size;
  419.   Pjpeg_decoder_stream Pstream;
  420.   int   progressive_flag;
  421.   uchar *huff_num[JPGD_MAXHUFFTABLES];  /* pointer to number of Huffman codes per bit size */
  422.   uchar *huff_val[JPGD_MAXHUFFTABLES];  /* pointer to Huffman codes per bit size */
  423.   QUANT_TYPE *quant[JPGD_MAXQUANTTABLES];    /* pointer to quantization tables */
  424.   int   scan_type;                      /* Grey, Yh1v1, Yh1v2, Yh2v1, Yh2v2,
  425.                                            CMYK111, CMYK4114 */
  426.   int   comps_in_frame;                 /* # of components in frame */
  427.   int   comp_h_samp[JPGD_MAXCOMPONENTS];     /* component's horizontal sampling factor */
  428.   int   comp_v_samp[JPGD_MAXCOMPONENTS];     /* component's vertical sampling factor */
  429.   int   comp_quant[JPGD_MAXCOMPONENTS];      /* component's quantization table selector */
  430.   int   comp_ident[JPGD_MAXCOMPONENTS];      /* component's ID */
  431.   int   comp_h_blocks[JPGD_MAXCOMPONENTS];
  432.   int   comp_v_blocks[JPGD_MAXCOMPONENTS];
  433.   int   comps_in_scan;                  /* # of components in scan */
  434.   int   comp_list[JPGD_MAXCOMPSINSCAN];      /* components in this scan */
  435.   int   comp_dc_tab[JPGD_MAXCOMPONENTS];     /* component's DC Huffman coding table selector */
  436.   int   comp_ac_tab[JPGD_MAXCOMPONENTS];     /* component's AC Huffman coding table selector */
  437.   int   spectral_start;                 /* spectral selection start */
  438.   int   spectral_end;                   /* spectral selection end   */
  439.   int   successive_low;                 /* successive approximation low */
  440.   int   successive_high;                /* successive approximation high */
  441.   int   max_mcu_x_size;                 /* MCU's max. X size in pixels */
  442.   int   max_mcu_y_size;                 /* MCU's max. Y size in pixels */
  443.   int   blocks_per_mcu;
  444.   int   max_blocks_per_row;
  445.   int   mcus_per_row, mcus_per_col;
  446.   int   mcu_org[JPGD_MAXBLOCKSPERMCU];
  447.   int   total_lines_left;               /* total # lines left in image */
  448.   int   mcu_lines_left;                 /* total # lines left in this MCU */
  449.   int   real_dest_bytes_per_scan_line;
  450.   int   dest_bytes_per_scan_line;        /* rounded up */
  451.   int   dest_bytes_per_pixel;            /* currently, 4 (RGB) or 1 (Y) */
  452.   void  *blocks[JPGD_MAXBLOCKS];         /* list of all dynamically allocated blocks */
  453.   Phuff_tables_t h[JPGD_MAXHUFFTABLES];
  454.   Pcoeff_buf_t dc_coeffs[JPGD_MAXCOMPONENTS];
  455.   Pcoeff_buf_t ac_coeffs[JPGD_MAXCOMPONENTS];
  456.   int eob_run;
  457.   int block_y_mcu[JPGD_MAXCOMPONENTS];
  458.   uchar *Pin_buf_ofs;
  459.   int in_buf_left;
  460.   int tem_flag;
  461.   bool eof_flag;
  462.   uchar padd_1[128];
  463.   uchar in_buf[JPGD_INBUFSIZE + 128];
  464.   uchar padd_2[128];
  465.   int   bits_left;
  466.   union
  467.   {
  468.     uint bit_buf;
  469.     uint bit_buf_64[2];
  470.   };
  471.   
  472.   uint  saved_mm1[2];
  473.   bool  use_mmx_getbits;
  474.   int   restart_interval;
  475.   int   restarts_left;
  476.   int   next_restart_num;
  477.   int   max_mcus_per_row;
  478.   int   max_blocks_per_mcu;
  479.   int   max_mcus_per_col;
  480.   uint *component[JPGD_MAXBLOCKSPERMCU];   /* points into the lastdcvals table */
  481.   uint  last_dc_val[JPGD_MAXCOMPONENTS];
  482.   Phuff_tables_t dc_huff_seg[JPGD_MAXBLOCKSPERMCU];
  483.   Phuff_tables_t ac_huff_seg[JPGD_MAXBLOCKSPERMCU];
  484.   BLOCK_TYPE *block_seg[JPGD_MAXBLOCKSPERROW];
  485.   int   block_max_zag_set[JPGD_MAXBLOCKSPERROW];
  486.   uchar *Psample_buf;
  487.   //int   block_num[JPGD_MAXBLOCKSPERROW];
  488.   int   crr[256];
  489.   int   cbb[256];
  490.   int   padd;
  491.   long  crg[256];
  492.   long  cbg[256];
  493.   uchar *scan_line_0;
  494.   uchar *scan_line_1;
  495.   BLOCK_TYPE temp_block[64];
  496.   bool use_mmx;
  497.   bool use_mmx_idct;
  498.   bool mmx_active;
  499.   int error_code;
  500.   bool ready_flag;
  501.   jmp_buf jmp_state;
  502.   int total_bytes_read;
  503. public:
  504.   // If SUPPORT_MMX is not defined, the use_mmx flag is ignored.
  505.   jpeg_decoder(Pjpeg_decoder_stream Pstream,
  506.                bool use_mmx);
  507.   int begin(void);
  508.   int decode(void * *Pscan_line_ofs, uint *Pscan_line_len);
  509.   ~jpeg_decoder();
  510.   int get_error_code(void)
  511.   {
  512.     return (error_code);
  513.   }
  514.   int get_width(void)
  515.   {
  516.     return (image_x_size);
  517.   }
  518.   int get_height(void)
  519.   {
  520.     return (image_y_size);
  521.   }
  522.   int get_num_components(void)
  523.   {
  524.     return (comps_in_frame);
  525.   }
  526.   int get_bytes_per_pixel(void)
  527.   {
  528.     return (dest_bytes_per_pixel);
  529.   }
  530.   int get_bytes_per_scan_line(void)
  531.   {
  532.     return (image_x_size * get_bytes_per_pixel());
  533.   }
  534.   int get_total_bytes_read(void)
  535.   {
  536.     return (total_bytes_read);
  537.   }
  538. };
  539. //------------------------------------------------------------------------------
  540. #include "jpegdecoder.inl"
  541. //------------------------------------------------------------------------------
  542. #pragma warning(pop)
  543. //------------------------------------------------------------------------------
  544. typedef jpeg_decoder *Pjpeg_decoder;
  545. //------------------------------------------------------------------------------
  546. // idct.cpp
  547. void idct(BLOCK_TYPE *data, uchar *Pdst_ptr);
  548. //------------------------------------------------------------------------------
  549. // fidctfst.cpp
  550. void jpeg_idct_ifast (
  551.   BLOCK_TYPE* inptr,
  552.   short *quantptr,
  553.   uchar * *outptr,
  554.   int output_col);
  555. void jpeg_idct_ifast_deinit(void);
  556. bool jpeg_idct_ifast_avail(void);
  557. //------------------------------------------------------------------------------
  558. #endif
  559. //------------------------------------------------------------------------------