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

📄 dsp_vlc.h

📁 基于DM642平台的H.264编码器优化代码
💻 H
字号:
/*****************************************************
   各种编码所对应的参考表
*****************************************************/
#ifndef _DSP_SVP_VLC_H_
#define _DSP_SVP_VLC_H_

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}
};

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}
};

/* Normal zigzag 通用Z扫描表*/
static char zigzag[64] = {
  0, 1, 5, 6,14,15,27,28,
  2, 4, 7,13,16,26,29,42,
  3, 8,12,17,25,30,41,43,
  9,11,18,24,31,40,44,53,
  10,19,23,32,39,45,52,54,
  20,22,33,38,46,51,55,60,
  21,34,37,47,50,56,59,61,
  35,36,48,49,57,58,62,63
};
/* Horizontal zigzag 水平Z扫描表*/
static char zigzag_h[64] = {
     0, 1, 2, 3,10,11,12,13,
     4, 5, 8, 9,17,16,15,14,
     6, 7,19,18,26,27,28,29,
    20,21,24,25,30,31,32,33,
    22,23,34,35,42,43,44,45,
    36,37,40,41,46,47,48,49,
    38,39,50,51,56,57,58,59,
    52,53,54,55,60,61,62,63
};
/* Vertical zigzag 垂直Z扫描表*/
static char zigzag_v[64] = {
     0, 4, 6,20,22,36,38,52,
     1, 5, 7,21,23,37,39,53,
     2, 8,19,24,34,40,50,54,
     3, 9,18,25,35,41,51,55,
    10,17,26,30,42,46,56,60,
    11,16,27,31,43,47,57,61,
    12,15,28,32,44,48,58,62,
    13,14,29,33,45,49,59,63
};

UChar PutMCBPC_Intra (char cbpc, char mode);
UChar PutMCBPC_Inter (char cbpc, char mode);
UChar PutCBPY (char cbpy, char intra);
UChar PutDCsize_lum (char size);
UChar PutDCsize_chrom (char size);
//DC系数编码表
 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}
}; 
UChar PutCoeff_Inter(char run, short level, char last);
UChar PutCoeff_Intra(char run, short level, char last);
//AC系数编码表
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}
};

/* 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}
};


//inter
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}               
};

static char intra_max_level[2][64] = 
{
	{
		27, 10,  5,  4,  3,  3,  3,  3, 
		2,  2,  1,  1,  1,  1,  1,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
	},

	{
		8,  3,  2,  2,  2,  2,  2,  1, 
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  1,  1,  1,  1,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0
	}
};

static char inter_max_level[2][64] = 
{
	{
		12,  6,  4,  3,  3,  3,  3,  2, 
		2,  2,  2,  1,  1,  1,  1,  1,
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  1,  1,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0
	},

	{
		3,  2,  1,  1,  1,  1,  1,  1, 
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  1,  1,  1,  1,  1,  1,  1,
		1,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0,
		0,  0,  0,  0,  0,  0,  0,  0
	}
};

UChar PutLevelCoeff_Inter(char run, short level, char last);
UChar PutLevelCoeff_Intra(char run, short level, char last);


UChar PutRunCoeff_Inter(short run, short level, char last);
UChar PutRunCoeff_Intra(short run, short level, char last);

static short intra_max_run0[28] = 
{ 
	999, 14,  9,  7,  3,  2,  1,   
	1,  1,  1,  1,  0,  0,  0, 
	0,  0,  0,  0,  0,  0,  0,
	0,  0,  0,  0,  0,  0,  0
};
static short intra_max_run1[9] = 
{
	999, 20,  6,  
	1,  0,  0,  
	0,  0,  0
};


static short inter_max_run0[13] = 
{
	999, 
	26, 10,  6,  2,  1,  1,   
    0,  0,  0,  0,  0,  0
};


static short inter_max_run1[4] = 
{
	999, 40,  1,  0
};
//运动矢量编码表 
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}
};
#endif //_DSP_SVP_VLC_H_

⌨️ 快捷键说明

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