⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sw_jpeg_decoder.h

📁 image codec gemini0816
💻 H
📖 第 1 页 / 共 3 页
字号:
typedef struct
{
   kal_bool insufficient_data;   /* set TRUE after emitting warning */
   kal_int32 vld_buffer;         /* current bit-extraction buffer */
   kal_uint16 bits_left;         /* # of unused bits in it */
   savable_state saved;          /* Other state at start of MCU */
   kal_uint16 restarts_to_go;    /* MCUs left in this restart interval */

#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
#else
   d_derived_table dc_derived_tables[2];
   d_derived_table ac_derived_tables[2];
#endif

   d_derived_table *dc_cur_tables[10];
   d_derived_table *ac_cur_tables[10];
   d_derived_table *ac_derived_table;  /* active table during an AC scan */
   kal_bool dc_needed[10];
   kal_bool ac_needed[10];
} huff_entropy_decoder;

typedef huff_entropy_decoder *huff_entropy_ptr;

#if defined(__SW_JPEG_USING_DCM__)
void sw_jpeg_dec_set_dcm_flag(kal_bool flag);
#endif

kal_uint8 sw_jpeg_decode(kal_uint32 file_handle);
void jpeg_dec_intmem_init(void *start_ptr,kal_uint32 length);
void jpeg_dec_intmem_deinit(void);

#define JPEG_SW_DECODER_INTMEM_OVERFLOW  0xff

/* IDCT Functions */
typedef enum
{
   IDCT_COL_NONE=0x00,
   IDCT_COL_0=0x01,
   IDCT_COL_1=0x02,
   IDCT_COL_2=0x04,
   IDCT_COL_3=0x08,
   IDCT_COL_4=0x10,
   IDCT_COL_5=0x20,
   IDCT_COL_6=0x40,
   IDCT_COL_7=0x80,
   IDCT_COL_0_7=0x81,
   IDCT_COL_1_6=0x42,
   IDCT_COL_2_5=0x24,
   IDCT_COL_3_4=0x18,
   IDCT_COL_0_3_4_7=0x99,
   IDCT_COL_1_2_5_6=0x66,
   IDCT_COL_ALL=0xff
}IDCT_COL;

#define jpeg_decoder_1st_idct_col_0_7(inptr,quantptr,wsptr,blk_zero_tbl)\
   for (ctr = 0; ctr < 8; ctr++)\
   {\
      switch(blk_zero_tbl[ctr])\
      {\
      case 0:\
         while(ctr<8){\
            wsptr[0]=0;\
            wsptr[7]=0;\
            wsptr+= 8;\
            ctr++;}\
         goto _1st_idct_end;\
      case 1:\
         x1 =  (inptr[0] * quantptr[0]);\
         wsptr[0] = x1;\
         wsptr[7] = x1;\
         break;\
      case 2:\
         x1 =  (inptr[1] * quantptr[1]);\
         d12 =  (x1 * 615)>>10;\
         x1 = (x1 * 1204) >> 10;\
         c7 = (x1 * 25)>>6;\
         x3 = x1 - c7;\
         x1 =  (inptr[0] * quantptr[0]);\
         x2=d12+x3;\
         wsptr[0] = (x1 + x2);\
         wsptr[7] = (x1 - x2);\
         break;\
      case 3:\
         x1 =  (inptr[1] * quantptr[1]);\
         c4 = ((x1 ) * 922)>>10;\
         b12 = (x1 * 1537)>>10;\
         d12 = b12 - c4;\
         x4 = ((x1) * 1204) >> 10;\
         c7 = (x1 * 25)>>6;\
         x3 = x4 - c7;\
         b3 =  (inptr[0] * quantptr[0]);\
         d0 =  (inptr[2] * quantptr[2]);\
         x5 = (d0 * 784)>>10;\
         x1 = ((d0) * 554)>>10;\
         d1 = x1 + x5;\
         x2=d12+x3;\
         x1=b3+d1;\
         wsptr[0] = (x1 + x2);\
         wsptr[7] = (x1 - x2);\
         break;\
      default:\
      x1 =  (inptr[1] * quantptr[1]);\
      x2 =  (inptr[3] * quantptr[3]);\
      x3 =  (inptr[5] * quantptr[5]);\
      x4 =  (inptr[7] * quantptr[7]);\
      c4 = ((x1 + x4) * 922)>>10;\
      b12 = (x1 * 1537)>>10;\
      d12 = b12 - c4;\
      x4 = x2 + x4;\
      x3 = x1 + x3;\
      x1 = ((x4+x3) * 1204) >> 10;\
      c7 = (x3 * 25)>>6;\
      x3 = x1 - c7;\
      x1 =  (inptr[0] * quantptr[0]);\
      x2 =  (inptr[4] * quantptr[4]);\
      b3 = (x1 + x2);\
      x1 =  (inptr[2] * quantptr[2]);\
      x2 =  (inptr[6] * quantptr[6]);\
      x5 = (x1 * 784)>>10;\
      x1 = ((x1 + x2) * 554)>>10;\
      d1 = x1 + x5;\
      x2=d12+x3;\
      x1=b3+d1;\
      wsptr[0] = (x1 + x2);\
      wsptr[7] = (x1 - x2);\
         break;\
      }\
      inptr+=8;\
      quantptr+= 8;\
      wsptr+= 8;\
  }

#define jpeg_decoder_1st_idct_col_2_5(inptr,quantptr,wsptr,blk_zero_tbl)\
   for (ctr = 0; ctr < 8; ctr++)\
   {\
      switch(blk_zero_tbl[ctr])\
   {\
       case 0:\
         while(ctr<8){\
            wsptr[2]=0;\
            wsptr[5]=0;\
            wsptr+= 8;\
            ctr++;}\
         goto _1st_idct_end;\
       case 1:\
         x1 =  (inptr[1] * quantptr[1]);\
         wsptr[2] = x1;\
         wsptr[5] = x1;\
         break;\
       case 2:\
         x1 =  (inptr[1] * quantptr[1]);\
         c7 = (x1 * 25)>>6;\
         x3 = x1 - c7;\
         x1 =  (inptr[0] * quantptr[0]);\
         wsptr[2] = (x1 + x3);\
         wsptr[5] = (x1 - x3);\
         break;\
      case 3:\
         x1 =  (inptr[1] * quantptr[1]);\
         x4 = ((x1) * 1204) >> 10;\
         c7 = (x1 * 25)>>6;\
         x3 = x4 - c7;\
         b3 =  (inptr[0] * quantptr[0]);\
         d0 =  (inptr[2] * quantptr[2]);\
         x1 = b3 - d0;\
         wsptr[2] = (x1 + x3);\
         wsptr[5] = (x1 - x3);\
         break;\
       default:\
      x1 =  (inptr[1] * quantptr[1]);\
      x2 =  (inptr[3] * quantptr[3]);\
      x3 =  (inptr[5] * quantptr[5]);\
      x4 =  (inptr[7] * quantptr[7]);\
      b10 = (x3 * 2102)>>10;\
      c5 = ((x2 + x3) * 2624)>>10;\
      d5 = b10 - c5;\
      x4 = x2 + x4;\
      x3 = x1 + x3;\
      x1 = ((x4+x3) * 1204) >> 10;\
      c7 = (x3 * 25)>>6;\
      x3 = x1 - c7;\
      x1 =  (inptr[0] * quantptr[0]);\
      x2 =  (inptr[4] * quantptr[4]);\
      b4 = (x1 - x2);\
      x1 =  (inptr[2] * quantptr[2]);\
      x2 =  (inptr[6] * quantptr[6]);\
      x6 = (x2 * 1892)>>10;\
      x1 = ((x1 + x2) * 554)>>10;\
      d0 = x1 - x6;\
      x1 = b4 - d0;\
      x2 = d5 + x3;\
      wsptr[2] = (x1 + x2);\
      wsptr[5] = (x1 - x2);\
         break;\
      }\
      inptr+=8;\
      quantptr+= 8;\
      wsptr+= 8;\
  }

#define jpeg_decoder_1st_idct_col_3_4(inptr,quantptr,wsptr,blk_zero_tbl)\
   for (ctr = 0; ctr < 8; ctr++)\
   {\
      switch(blk_zero_tbl[ctr])\
   {\
       case 0:\
         while(ctr<8){\
            wsptr[3]=0;\
            wsptr[4]=0;\
            wsptr+= 8;\
            ctr++;}\
         goto _1st_idct_end;\
       case 1:\
         x1 =  (inptr[0] * quantptr[0]);\
         wsptr[3] = x1;\
         wsptr[4] = x1;\
         break;\
       case 2:\
         x4 =  (inptr[1] * quantptr[1]);\
         c4 = (x4 * 922)>>10;\
         x4 = ((x4) * 1204) >> 10;\
         x1 =  (inptr[0] * quantptr[0]);\
         x2 = x4-c4;\
         wsptr[3] = (x1 + x2);\
         wsptr[4] = (x1 - x2);\
         break;\
      case 3:\
         x1 =  (inptr[1] * quantptr[1]);\
         x4 = ((x1) * 1204) >> 10;\
         b3 =  (inptr[0] * quantptr[0]);\
         d0 =  (inptr[2] * quantptr[2]);\
         x5 = (d0 * 784)>>10;\
         x1 = ((d0) * 554)>>10;\
         d1 = x1 + x5;\
         x1 = b3 - d1;\
         wsptr[3] = (x1 + x4);\
         wsptr[4] = (x1 - x4);\
         break;\
       default:\
      x1 =  (inptr[1] * quantptr[1]);\
      x2 =  (inptr[3] * quantptr[3]);\
      x3 =  (inptr[5] * quantptr[5]);\
      x4 =  (inptr[7] * quantptr[7]);\
      b9 = (x4 * 306)>>10;\
      c4 = ((x1 + x4) * 922)>>10;\
      d4 = b9 - c4;\
      x4 = x2 + x4;\
      x3 = x1 + x3;\
      x1 = ((x4+x3) * 1204) >> 10;\
      c6 = (x4 * 2009)>>10;\
      x4 = x1 - c6;\
      x1 =  (inptr[0] * quantptr[0]);\
      x2 =  (inptr[4] * quantptr[4]);\
      b3 = (x1 + x2);\
      x1 =  (inptr[2] * quantptr[2]);\
      x2 =  (inptr[6] * quantptr[6]);\
      x5 = (x1 * 784)>>10;\
      x1 = ((x1 + x2) * 554)>>10;\
      d1 = x1 + x5;\
      x1 = b3 - d1;\
      x2 = d4 + x4;\
      wsptr[3] = (x1 + x2);\
      wsptr[4] = (x1 - x2);\
         break;\
      }\
      inptr+=8;\
      quantptr+= 8;\
      wsptr+= 8;\
  }

#define jpeg_decoder_1st_idct_col_1_6(inptr,quantptr,wsptr,blk_zero_tbl)\
   for (ctr = 0; ctr < 8; ctr++)\
   {\
      switch(blk_zero_tbl[ctr])\
      {\
       case 0:\
         while(ctr<8){\
            wsptr[1]=0;\
            wsptr[6]=0;\
            wsptr+= 8;\
            ctr++;}\
          goto _1st_idct_end;\
       case 1:\
         x1 =  (inptr[0] * quantptr[0]);\
         wsptr[1] = x1;\
         wsptr[6] = x1;\
         break;\
       case 2:\
         x3 =  (inptr[1] * quantptr[1]);\
         x2 = ((x3) * 1204) >> 10;\
         x1 =  (inptr[0] * quantptr[0]);\
         wsptr[1] = (x1 + x2);\
         wsptr[6] = (x1 - x2);\
         break;\
      case 3:\
         x1 =  (inptr[1] * quantptr[1]);\
         c4 = ((x1) * 922)>>10;\
         b12 = (x1 * 1537)>>10;\
         d12 = b12 - c4;\
         x4 = ((x1) * 1204) >> 10;\
         c7 = (x1 * 25)>>6;\
         x3 = x4 - c7;\
         b3 =  (inptr[0] * quantptr[0]);\
         d0 =  (inptr[2] * quantptr[2]);\
         x1 = ((d0) * 554)>>10;\
         x2=d12+x3;\
         x1 = b3 + d0;\
         wsptr[1] = (x1 + x2);\
         wsptr[6] = (x1 - x2);\
         break;\
       default:\
      x1 =  (inptr[1] * quantptr[1]);\
      x2 =  (inptr[3] * quantptr[3]);\
      x3 =  (inptr[5] * quantptr[5]);\
      x4 =  (inptr[7] * quantptr[7]);\
      c5 = ((x2 + x3) * 2624)>>10;\
      b11 = (x2 * 3146)>>10;\
      d11 = b11 - c5;\
      x4 = x2 + x4;\
      x3 = x1 + x3;\
      x1 = ((x4+x3) * 1204) >> 10;\
      c6 = (x4 * 2009)>>10;\
      x4 = x1 - c6;\
      x1 =  (inptr[0] * quantptr[0]);\
      x2 =  (inptr[4] * quantptr[4]);\
      b4 = (x1 - x2);\
      x1 =  (inptr[2] * quantptr[2]);\
      x2 =  (inptr[6] * quantptr[6]);\
      x6 = (x2 * 1892)>>10;\
      d0 = x1 - x6;\
      x2 = d11 + x4;\
      x1 = b4 + d0;\
      wsptr[1] = (x1 + x2);\
      wsptr[6] = (x1 - x2);\

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -