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

📄 sw_jpeg_decoder.h

📁 image codec gemini0816
💻 H
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   sw_jpeg_decoder.h
 *
 *
 * Description:
 * ------------
 *   header file of software jpeg decoder code
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *
 * removed!
 * removed!
 *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 *****************************************************************************/
#if(defined __SW_JPEG_CODEC_SUPPORT__ || !defined(__MTK_TARGET__))

#ifndef __SW_JPEG_DECODER_H__
#define __SW_JPEG_DECODER_H__

#define JPEG_SUPPORT_TIMEOUT_FUNC

#define RESIZER_SCALE_BITS 20

/*
#define JPEG_FORMAT_444 0
#define JPEG_FORMAT_422 1
#define JPEG_FORMAT_420 2
#define JPEG_FORMAT_GRAY 3
*/


#define JPEG_SW_RESIZE_IP_UPPER_BOUND  176

#define JPEG_SW_DECODER_HIGH_QUALITY 0
#define JPEG_SW_DECODER_FINE_QUALITY 1
#define JPEG_SW_DECODER_FAIR_QUALITY 2
#define JPEG_SW_DECODER_POOR_QUALITY 3

typedef struct
{
   kal_uint8 bits[17];     /* bits[k] = # of symbols with codes of */
   kal_uint8 huffman_value[256];    /* The symbols, in order of incr code length */
   kal_uint8 huffman_table_count;
} huffman_table_struct;

typedef struct
{
   kal_int16 component_id;
   kal_int16 component_index;
   kal_int16 h_samp_factor;
   kal_int16 v_samp_factor;
   kal_int16 quant_table_num;
   kal_int16 dc_table_num;
   kal_int16 ac_table_num;
   kal_bool component_needed;
   kal_uint8 idct_loop_counter;
   kal_uint8 idct_h_increase;
   kal_uint8 idct_v_increase;
} component_info;

#define HUFF_LOOKAHEAD  8
#define HUFF_MASK       ((1<<HUFF_LOOKAHEAD)-1)


typedef struct
{
   kal_int32 maxcode[18];
   kal_int32 valoffset[17];
   huffman_table_struct *pub;
   kal_uint8 look_nbits[1 << HUFF_LOOKAHEAD];
   kal_uint8 look_sym[1 << HUFF_LOOKAHEAD];
} d_derived_table;



#define BIT_BUF_SIZE  32   /* size of buffer in bits */


#define MIN_GET_BITS  (BIT_BUF_SIZE - 7)


#define HUFF_EXTEND(x, s)  ((x) < (1 << ((s) - 1)) ? (x) + (((-1) << (s)) + 1) : (x))


#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#else

#define FILL_BIT_BUFFER(vld_buffer_reg, bits_left_reg, nbits)                    \
{                                                                                \
   if (0 == unread_marker)                                                       \
   {                                                                             \
      while (bits_left_reg < MIN_GET_BITS)                                       \
      {                                                                          \
         register kal_uint32 c;                                                  \
         if (_jpeg_file_ptr >= _jpeg_file_ptr_end)                               \
         {                                                                       \
            jpeg_sw_read_file();                                                 \
         }                                                                       \
         c = *_jpeg_file_ptr++;                                                  \
                                                                                 \
         if (0xFF == c)                                                          \
         {                                                                       \
            do                                                                   \
            {                                                                    \
               if (_jpeg_file_ptr >= _jpeg_file_ptr_end)                         \
               {                                                                 \
                  jpeg_sw_read_file();                                           \
               }                                                                 \
               c = *_jpeg_file_ptr++;                                            \
            } while (0xFF == c);                                                 \
                                                                                 \
            if (0 == c)                                                          \
            {                                                                    \
               c = 0xFF;                                                         \
            }                                                                    \
            else                                                                 \
            {                                                                    \
               unread_marker = c;                                                \
               if (nbits > bits_left_reg)                                        \
               {                                                                 \
                  THROW(5);                                                      \
               }                                                                 \
               vld_buffer_reg <<= (MIN_GET_BITS - bits_left_reg);                \
               bits_left_reg = MIN_GET_BITS;                                     \
               break;                                                            \
            }                                                                    \
         }                                                                       \
         vld_buffer_reg = (vld_buffer_reg << 8) | c;                             \
         bits_left_reg += 8;                                                     \
      }                                                                          \
   }                                                                             \
   else                                                                          \
   {                                                                             \
      if (nbits > bits_left_reg)                                                 \
      {                                                                          \
         THROW(5);                                                               \
      }                                                                          \
      vld_buffer_reg <<= (MIN_GET_BITS - bits_left_reg);                         \
      bits_left_reg = MIN_GET_BITS;                                              \
   }                                                                             \
}
#endif



#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#else


#define HUFF_SLOW_DECODE(result, vld_buffer_reg, bits_left_reg, htbl, nb)        \
{                                                                                \
   register kal_int32 code;                                                      \
   register kal_int32 *maxcode = htbl->maxcode;                                  \
   if (bits_left_reg < nb)                                                       \
   {                                                                             \
      FILL_BIT_BUFFER(vld_buffer_reg, bits_left_reg, nb);                        \
   }                                                                             \
   bits_left_reg -= nb;                                                          \
   code = (vld_buffer_reg >> bits_left_reg) & ((1 << nb) - 1);                   \
   while (code > maxcode[nb])                                                    \
   {                                                                             \
      code <<= 1;                                                                \
      if (bits_left_reg < 1)                                                     \
      {                                                                          \
         FILL_BIT_BUFFER(vld_buffer_reg, bits_left_reg, 1);                      \
      }                                                                          \
      (bits_left_reg)--;                                                           \
      code |= ((vld_buffer_reg >> bits_left_reg) & 1);                           \
      nb++;                                                                      \
   }                                                                             \
   if (nb > 16)                                                                  \
   {                                                                             \
      THROW(6);                                                                  \
   }                                                                             \
   result = htbl->pub->huffman_value[code + htbl->valoffset[nb]];                \
}



#define HUFF_DECODE(result, vld_buffer_reg, bits_left_reg, htbl, slowlabel)      \
{                                                                                \
   register kal_uint32 nb, look;                                                 \
   if (bits_left_reg < HUFF_LOOKAHEAD)                                           \
   {                                                                             \
      FILL_BIT_BUFFER(vld_buffer_reg, bits_left_reg, 0);                         \
      if (bits_left_reg < HUFF_LOOKAHEAD)                                        \
      {                                                                          \
         nb = 1;                                                                 \
         goto slowlabel;                                                         \
      }                                                                          \
   }                                                                             \
                                                                                 \
   look = (vld_buffer_reg >> (bits_left_reg - HUFF_LOOKAHEAD)) & HUFF_MASK;      \
   if ((nb = htbl->look_nbits[look]) != 0)                                       \
   {                                                                             \
      DROP_BITS(vld_buffer_reg, bits_left_reg, nb);                              \
      result = htbl->look_sym[look];                                             \
   }                                                                             \
   else                                                                          \
   {                                                                             \
      nb = HUFF_LOOKAHEAD + 1;                                                   \
slowlabel:                                                                       \
      HUFF_SLOW_DECODE(result, vld_buffer_reg, bits_left_reg, htbl, nb);         \
   }                                                                             \
}
#endif



#define GET_BITS(vld_buffer, bits_left, min_bits) \
   (((kal_int16) (vld_buffer >> (bits_left -= (min_bits)))) & ((1 << (min_bits)) - 1))


#define PEEK_BITS(vld_buffer, bits_left, min_bits) \
   (((unsigned char) (vld_buffer >> (bits_left - (min_bits)))))


#define DROP_BITS(vld_buffer, bits_left, min_bits) \
   ((bits_left) -= (min_bits))


#define CHECK_BIT_BUFFER(vld_buffer_reg, bits_left_reg, nbits) \
{                                                              \
   if (bits_left_reg < (nbits))                                \
   {                                                           \
      FILL_BIT_BUFFER(vld_buffer_reg, bits_left_reg,nbits);    \
   }                                                           \
}


typedef struct
{
   kal_uint16 EOBRUN;            /* remaining EOBs in EOBRUN */
   kal_int32 last_dc_val[4];     /* last DC coef for each component */
} savable_state;


⌨️ 快捷键说明

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