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

📄 putvlc.h

📁 经典的MP4编解码核心库
💻 H
字号:
/**************************************************************************
 *                                                                        *
 * This code is developed by Adam Li.  This software is an                *
 * implementation of a part of one or more MPEG-4 Video tools as          *
 * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
 * software module in hardware or software products are advised that its  *
 * use may infringe existing patents or copyrights, and any such use      *
 * would be at such party's own risk.  The original developer of this     *
 * software module and his/her company, and subsequent editors and their  *
 * companies (including Project Mayo), will have no liability for use of  *
 * this software or modifications or derivatives thereof.                 *
 *                                                                        *
 * Project Mayo gives users of the Codec a license to this software       *
 * module or modifications thereof for use in hardware or software        *
 * products claiming conformance to the MPEG-4 Video Standard as          *
 * described in the Open DivX license.                                    *
 *                                                                        *
 * The complete Open DivX license can be found at                         *
 * http://www.projectmayo.com/opendivx/license.php .                      *
 *                                                                        *
 **************************************************************************/

/***********************************************************HeaderBegin*******

 *                                                                         

 * File:	putvlc.h

 *

 * Description: Header file to include prototypes for vlc functions

 *

 ***********************************************************HeaderEnd*********/



#ifndef _ENCORE_PUTVLC_H

#define _ENCORE_PUTVLC_H

#include "bitwriter.h"

// stuff from max_level.h
#define MARKER_BIT 1

/* type definitions for variable length code table entries */
typedef struct
{
    uint16_t code;              /* right justified */
    uint16_t len;
} VLCtable;

/**

    Public interface of VLC coding module

    Methods defined in putvlc.c

    Referenced from block.c

**/

int PutCoeff(BitWriter * bitstream, int run, int level, int last, int Mode);

int PutIntraDC(BitWriter * bitstream, int val, bool lum);

int PutMV(BitWriter * bitstream, int mvint);

int PutMCBPC_intra(BitWriter * bitstream, int cbpc, int mode);

int PutMCBPC_inter(BitWriter * bitstream, int cbpc, int mode);

int PutCBPY(BitWriter * bitstream, int cbpy, bool intra);



/**

    Internal vlc methods, defined in putvlc.c 

**/

__inline static int PutDCsize4lum(BitWriter * bitstream, int size);

__inline static int PutDCsize4chrom(BitWriter * bitstream, int size);

__inline static int PutCoeff4inter(BitWriter * bitstream, int run, int level, int last);

__inline static int PutCoeff4intra(BitWriter * bitstream, int run, int level, int last);

__inline static int PutRunCoeff4inter(BitWriter * bitstream, int run, int level, int last);

__inline static int PutRunCoeff4intra(BitWriter * bitstream, int run, int level, int last);

__inline static int PutLevelCoeff4inter(BitWriter * bitstream, int run, int level, int last);

__inline static int PutLevelCoeff4intra(BitWriter * bitstream, int run, int level, int last);


// Added by David, 2002
// for BVOP encoding
/* MODB table, MW 18-MAY-1998 */

static VLCtable modb_tab[3] =
{
  {1,1}, {1,2}, {0,2}
}; 
// ~added


 /*
    Motion vectors 
  */

static VLCtable mvtab[33] = {
    {1, 1}, {1, 2}, {1, 3}, {1, 4}, {3, 6}, {5, 7}, {4, 7}, {3, 7},
    {11, 9}, {10, 9}, {9, 9}, {17, 10}, {16, 10}, {15, 10}, {14, 10}, {13, 10},
    {12, 10}, {11, 10}, {10, 10}, {9, 10}, {8, 10}, {7, 10}, {6, 10}, {5, 10},
    {4, 10}, {7, 11}, {6, 11}, {5, 11}, {4, 11}, {3, 11}, {2, 11}, {3, 12},
    {2, 12}
};



/* MCBPC Indexing by cbpc in first two bits, mode in last two.
 CBPC as in table 4/H.263, MB type (mode): 3 = 01, 4 = 10.
 Example: cbpc = 01 and mode = 4 gives index = 0110 = 6. */

static VLCtable mcbpc_intra_tab[15] = {
    {0x01, 9}, {0x01, 1}, {0x01, 4}, {0x00, 0},
    {0x00, 0}, {0x01, 3}, {0x01, 6}, {0x00, 0},
    {0x00, 0}, {0x02, 3}, {0x02, 6}, {0x00, 0},
    {0x00, 0}, {0x03, 3}, {0x03, 6}
};


/* MCBPC inter.
   Addressing: 5 bit ccmmm (cc = CBPC, mmm = mode (1-4 binary)) */

static VLCtable mcbpc_inter_tab[29] = {
    {1, 1}, {3, 3}, {2, 3}, {3, 5}, {4, 6}, {1, 9}, {0, 0}, {0, 0},
    {3, 4}, {7, 7}, {5, 7}, {4, 8}, {4, 9}, {0, 0}, {0, 0}, {0, 0},
    {2, 4}, {6, 7}, {4, 7}, {3, 8}, {3, 9}, {0, 0}, {0, 0}, {0, 0},
    {5, 6}, {5, 9}, {5, 8}, {3, 7}, {2, 9}
};


/* CBPY. Straightforward indexing */

static VLCtable cbpy_tab[16] = {
    {3, 4}, {5, 5}, {4, 5}, {9, 4}, {3, 5}, {7, 4}, {2, 6}, {11, 4},
    {2, 5}, {3, 6}, {5, 4}, {10, 4}, {4, 4}, {8, 4}, {6, 4}, {3, 2}
};

/* DC prediction sizes */

static VLCtable DCtab_lum[13] = {
    {3, 3}, {3, 2}, {2, 2}, {2, 3}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7},
    {1, 8}, {1, 9}, {1, 10}, {1, 11}
};

static VLCtable DCtab_chrom[13] = {
    {3, 2}, {2, 2}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8},
    {1, 9}, {1, 10}, {1, 11}, {1, 12}
};



/* Coeffs for last = 0, run = 1. Indexed by [level-1] */

static VLCtable coeff_tab5[10] = {
    {0x0e, 4}, {0x14, 6}, {0x16, 7}, {0x1c, 8},
    {0x20, 9}, {0x1f, 9}, {0x0d, 10}, {0x22, 11},
    {0x53, 12}, {0x55, 12}
};

/* Coeffs for last = 0, run = 2 -> 9. Indexed by [run-2][level-1] */

static VLCtable coeff_tab6[8][5] = {
    /*
       run = 2 
     */
    {
     {0x0b, 5}, {0x15, 7}, {0x1e, 9}, {0x0c, 10},
     {0x56, 12}
     },
    /*
       run = 3 
     */
    {
     {0x11, 6}, {0x1b, 8}, {0x1d, 9}, {0x0b, 10},
     {0x00, 0}
     },
    /*
       run = 4 
     */
    {
     {0x10, 6}, {0x22, 9}, {0x0a, 10}, {0x00, 0},
     {0x00, 0}
     },
    /*
       run = 5 
     */
    {
     {0x0d, 6}, {0x1c, 9}, {0x08, 10}, {0x00, 0},
     {0x00, 0}
     },
    /*
       run = 6 
     */
    {
     {0x12, 7}, {0x1b, 9}, {0x54, 12}, {0x00, 0},
     {0x00, 0}
     },
    /*
       run = 7 
     */
    {
     {0x14, 7}, {0x1a, 9}, {0x57, 12}, {0x00, 0},
     {0x00, 0}
     },
    /*
       run = 8 
     */
    {
     {0x19, 8}, {0x09, 10}, {0x00, 0}, {0x00, 0},
     {0x00, 0}
     },
    /*
       run = 9 
     */
    {
     {0x18, 8}, {0x23, 11}, {0x00, 0}, {0x00, 0},
     {0x00, 0}
     }
};

/* Coeffs for last = 0, run = 10 -> 14. Indexed by [run-10] */

static VLCtable coeff_tab7[5] = {
    {0x17, 8}, {0x19, 9}, {0x18, 9}, {0x07, 10},
    {0x58, 12}
};

/* Coeffs for last = 1, run = 0. Indexed by [level-1] */

static VLCtable coeff_tab8[8] = {
    {0x07, 4}, {0x0c, 6}, {0x16, 8}, {0x17, 9},
    {0x06, 10}, {0x05, 11}, {0x04, 11}, {0x59, 12}
};


/* Coeffs for last = 1, run = 1 -> 6. Indexed by [run-1][level-1] */

static VLCtable coeff_tab9[6][3] = {
    /*
       run = 1 
     */
    {
     {0x0f, 6}, {0x16, 9}, {0x05, 10}
     },
    /*
       run = 2 
     */
    {
     {0x0e, 6}, {0x04, 10}, {0x00, 0}
     },
    /*
       run = 3 
     */
    {
     {0x11, 7}, {0x24, 11}, {0x00, 0}
     },
    /*
       run = 4 
     */
    {
     {0x10, 7}, {0x25, 11}, {0x00, 0}
     },
    /*
       run = 5 
     */
    {
     {0x13, 7}, {0x5a, 12}, {0x00, 0}
     },
    /*
       run = 6 
     */
    {
     {0x15, 8}, {0x5b, 12}, {0x00, 0}
     }
};

/* Coeffs for last = 1, run = 7 -> 20. Indexed by [run-7] */

static VLCtable coeff_tab10[14] = {
    {0x14, 8}, {0x13, 8}, {0x1a, 8}, {0x15, 9},
    {0x14, 9}, {0x13, 9}, {0x12, 9}, {0x11, 9},
    {0x26, 11}, {0x27, 11}, {0x5c, 12}, {0x5d, 12},
    {0x5e, 12}, {0x5f, 12}
};


/* DCT coefficients. Four tables, two for last = 0, two for last = 1.
   the sign bit must be added afterwards. */

/* first part of coeffs for last = 0. Indexed by [run][level-1] */

static VLCtable coeff_tab0[2][12] = {
    /*
       run = 0 
     */
    {
     {0x02, 2}, {0x0f, 4}, {0x15, 6}, {0x17, 7},
     {0x1f, 8}, {0x25, 9}, {0x24, 9}, {0x21, 10},
     {0x20, 10}, {0x07, 11}, {0x06, 11}, {0x20, 11}
     },
    /*
       run = 1 
     */
    {
     {0x06, 3}, {0x14, 6}, {0x1e, 8}, {0x0f, 10},
     {0x21, 11}, {0x50, 12}, {0x00, 0}, {0x00, 0},
     {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     }
};

/* rest of coeffs for last = 0. indexing by [run-2][level-1] */

static VLCtable coeff_tab1[25][4] = {
    /*
       run = 2 
     */
    {
     {0x0e, 4}, {0x1d, 8}, {0x0e, 10}, {0x51, 12}
     },
    /*
       run = 3 
     */
    {
     {0x0d, 5}, {0x23, 9}, {0x0d, 10}, {0x00, 0}
     },
    /*
       run = 4-26 
     */
    {
     {0x0c, 5}, {0x22, 9}, {0x52, 12}, {0x00, 0}
     },
    {
     {0x0b, 5}, {0x0c, 10}, {0x53, 12}, {0x00, 0}
     },
    {
     {0x13, 6}, {0x0b, 10}, {0x54, 12}, {0x00, 0}
     },
    {
     {0x12, 6}, {0x0a, 10}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x11, 6}, {0x09, 10}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x10, 6}, {0x08, 10}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x16, 7}, {0x55, 12}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x15, 7}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x14, 7}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1c, 8}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1b, 8}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x21, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x20, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1f, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1e, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1d, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1c, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1b, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x1a, 9}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x22, 11}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x23, 11}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x56, 12}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     },
    {
     {0x57, 12}, {0x00, 0}, {0x00, 0}, {0x00, 0}
     }
};

/* first coeffs of last = 1. indexing by [run][level-1] */

static VLCtable coeff_tab2[2][3] = {
    /*
       run = 0 
     */
    {
     {0x07, 4}, {0x19, 9}, {0x05, 11}
     },
    /*
       run = 1 
     */
    {
     {0x0f, 6}, {0x04, 11}, {0x00, 0}
     }
};

/* rest of coeffs for last = 1. indexing by [run-2] */

static VLCtable coeff_tab3[40] = {
    {0x0e, 6}, {0x0d, 6}, {0x0c, 6},
    {0x13, 7}, {0x12, 7}, {0x11, 7}, {0x10, 7},
    {0x1a, 8}, {0x19, 8}, {0x18, 8}, {0x17, 8},
    {0x16, 8}, {0x15, 8}, {0x14, 8}, {0x13, 8},
    {0x18, 9}, {0x17, 9}, {0x16, 9}, {0x15, 9},
    {0x14, 9}, {0x13, 9}, {0x12, 9}, {0x11, 9},
    {0x07, 10}, {0x06, 10}, {0x05, 10}, {0x04, 10},
    {0x24, 11}, {0x25, 11}, {0x26, 11}, {0x27, 11},
    {0x58, 12}, {0x59, 12}, {0x5a, 12}, {0x5b, 12},
    {0x5c, 12}, {0x5d, 12}, {0x5e, 12}, {0x5f, 12},
    {0x00, 0}
};

/* New tables for Intra luminance coefficients. Same codewords,
   different meaning */

/* Coeffs for last = 0, run = 0. Indexed by [level-1] */

static VLCtable coeff_tab4[27] = {
    /*
       run = 0 
     */
    {0x02, 2}, {0x06, 3}, {0x0f, 4}, {0x0d, 5},
    {0x0c, 5}, {0x15, 6}, {0x13, 6}, {0x12, 6},
    {0x17, 7}, {0x1f, 8}, {0x1e, 8}, {0x1d, 8},
    {0x25, 9}, {0x24, 9}, {0x23, 9}, {0x21, 9},
    {0x21, 10}, {0x20, 10}, {0x0f, 10}, {0x0e, 10},
    {0x07, 11}, {0x06, 11}, {0x20, 11}, {0x21, 11},
    {0x50, 12}, {0x51, 12}, {0x52, 12}
};

#endif

⌨️ 快捷键说明

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