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

📄 dsp_vlc.c

📁 基于DM642平台的H.264编码器优化代码
💻 C
字号:
/***********************************************
  变长编码函数列表
************************************************/
#include <stdio.h>
#include "dsp_type.h"
//#include "dsp_global.h"
#include "dsp_stream.h"
#include "dsp_vlc.h"

UChar
PutMCBPC_Intra (char cbpc, char mode)
{
	short ind;
	ind = ((mode >> 1) & 3) | ((cbpc & 3) << 2);
	BitstreamPutBits ( mcbpc_intra_tab[ind].code, mcbpc_intra_tab[ind].len);
	return mcbpc_intra_tab[ind].len;
}

UChar
PutMCBPC_Inter (char cbpc, char mode)
{
	short ind;
	ind = (mode & 7) | ((cbpc & 3) << 3);
	BitstreamPutBits (mcbpc_inter_tab[ind].code,mcbpc_inter_tab[ind].len);
	return mcbpc_inter_tab[ind].len;
}

UChar PutCBPY (char cbpy, char intra)
{
	char ind;//,i,ptr;
	/* if ((intra==0)&&(index!=3)) cbpy = 15 - cbpy;  */
	if (intra == 0) cbpy = 15 - cbpy;

	ind = cbpy;
	BitstreamPutBits ( cbpy_tab[ind].code, cbpy_tab[ind].len);
	return cbpy_tab[ind].len;
}
UChar PutDCsize_lum (char size)//DC亮度编码
{
//	MOMCHECK(size >= 0 && size < 13);
	BitstreamPutBits (DCtab_lum[size].code, DCtab_lum[size].len);

	return DCtab_lum[size].len;
}
UChar PutDCsize_chrom (char size)//DC色度编码
{
//	MOMCHECK (size >= 0 && size < 13);
	BitstreamPutBits (DCtab_chrom[size].code, DCtab_chrom[size].len);

	return DCtab_chrom[size].len;
}
//帧内AC系数编码
UChar PutCoeff_Intra(char run, short level, char last)//run是0的长度。level为量化以后值
{
	UChar length = 0;

//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);

	if (last == 0)
	{
		if (run == 0 && level < 28 )
		{
			BitstreamPutBits( coeff_tab4[level-1].code,	coeff_tab4[level-1].len);
			length = coeff_tab4[level-1].len;
		}
		else if (run == 1 && level < 11)
		{
			BitstreamPutBits(coeff_tab5[level-1].code, coeff_tab5[level-1].len);
			length = coeff_tab5[level-1].len;
		}
		else if (run > 1 && run < 10 && level < 6)
		{
			BitstreamPutBits(coeff_tab6[run-2][level-1].code,coeff_tab6[run-2][level-1].len);
			length = coeff_tab6[run-2][level-1].len;
		}
		else if (run > 9 && run < 15 && level == 1)
		{
			BitstreamPutBits(coeff_tab7[run-10].code, coeff_tab7[run-10].len);
			length = coeff_tab7[run-10].len;
		}
	}
	else if (last == 1)
	{
		if (run == 0 && level < 9)
		{
			BitstreamPutBits(coeff_tab8[level-1].code,coeff_tab8[level-1].len);
			length = coeff_tab8[level-1].len;
		}
		else if (run > 0 && run < 7 && level < 4)
		{
			BitstreamPutBits(coeff_tab9[run-1][level-1].code, coeff_tab9[run-1][level-1].len);
			length = coeff_tab9[run-1][level-1].len;
		}
		else if (run > 6 && run < 21 && level == 1)
		{
			BitstreamPutBits(coeff_tab10[run-7].code, coeff_tab10[run-7].len);
			length = coeff_tab10[run-7].len;
		}
	}
	return length;
}
//帧间AC系数编码
UChar PutCoeff_Inter(char run, short level, char last)
{
	UChar length = 0;
//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);
	if (last == 0)
	{
		if (run < 2 && level < 13 )
		{
			BitstreamPutBits (coeff_tab0[run][level-1].code,coeff_tab0[run][level-1].len);
			length = coeff_tab0[run][level-1].len;
		}
		else if (run > 1 && run < 27 && level < 5)
		{
			BitstreamPutBits (coeff_tab1[run-2][level-1].code, coeff_tab1[run-2][level-1].len);
			length = coeff_tab1[run-2][level-1].len;
		}
	}
	else if (last == 1)
	{
		if (run < 2 && level < 4)
		{
			BitstreamPutBits (coeff_tab2[run][level-1].code, coeff_tab2[run][level-1].len);
			length = coeff_tab2[run][level-1].len;
		}
		else if (run > 1 && run < 42 && level == 1)
		{
			BitstreamPutBits (coeff_tab3[run-2].code, coeff_tab3[run-2].len);
			length = coeff_tab3[run-2].len;
		}
	}
	return length;
}
//对帧内量化后像素值编码
UChar PutLevelCoeff_Intra(char run, short level, char last)
{
	UChar length = 0;
//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);

	if (last == 0)
	{
		if (run == 0 && level < 28 )
		{
			length = coeff_tab4[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits(3L, 7L);
				BitstreamPutBits(0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab4[level-1].code,coeff_tab4[level-1].len);
			}
		}
		else if (run == 1 && level < 11)
		{
			length = coeff_tab5[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits(3L, 7L);
				BitstreamPutBits(0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab5[level-1].code,coeff_tab5[level-1].len);
			}
		}
		else if (run > 1 && run < 10 && level < 6)
		{
			length = coeff_tab6[run-2][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits(3L, 7L);
				BitstreamPutBits(0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab6[run-2][level-1].code, coeff_tab6[run-2][level-1].len);
			}
		}
		else if (run > 9 && run < 15 && level == 1)
		{
			length = coeff_tab7[run-10].len;
			if (length != 0)
			{
				BitstreamPutBits(3L, 7L);
				BitstreamPutBits(0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab7[run-10].code, coeff_tab7[run-10].len);
			}
		}
	}
	else if (last == 1)
	{
		if (run == 0 && level < 9)
		{
			length = coeff_tab8[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab8[level-1].code,coeff_tab8[level-1].len);
			}
		}
		else if (run > 0 && run < 7 && level < 4)
		{
			length = coeff_tab9[run-1][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab9[run-1][level-1].code,coeff_tab9[run-1][level-1].len);
			}
		}
		else if (run > 6 && run < 21 && level == 1)
		{
			length = coeff_tab10[run-7].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits(coeff_tab10[run-7].code, coeff_tab10[run-7].len);
			}
		}
	}
	return length;
}
//对帧间量化后的像素值编码
UChar PutLevelCoeff_Inter(char run, short level, char last)
{
	UChar length = 0;
//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);
	if (last == 0)
	{
		if (run < 2 && level < 13 )
		{
			length = coeff_tab0[run][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits (coeff_tab0[run][level-1].code,coeff_tab0[run][level-1].len);
			}
		}
		else if (run > 1 && run < 27 && level < 5)
		{
			length = coeff_tab1[run-2][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits (coeff_tab1[run-2][level-1].code,coeff_tab1[run-2][level-1].len);
			}
		}
	}
	else if (last == 1)
	{
		if (run < 2 && level < 4)
		{
			length = coeff_tab2[run][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits (coeff_tab2[run][level-1].code,coeff_tab2[run][level-1].len);
			}
		}
		else if (run > 1 && run < 42 && level == 1)
		{
			length = coeff_tab3[run-2].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 0L, 1L);
				length += 8;					  /* boon */
				BitstreamPutBits (coeff_tab3[run-2].code,coeff_tab3[run-2].len);
			}
		}
	}
	return length;
}
//对帧内行程编码
UChar PutRunCoeff_Intra(short run, short level, char last)
{
	UChar length = 0;
//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);

	if (last == 0)
	{
		if (run == 0 && level < 28 )
		{
			length = coeff_tab4[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab4[level-1].code,coeff_tab4[level-1].len);
			}
		}
		else if (run == 1 && level < 11)
		{
			length = coeff_tab5[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab5[level-1].code,coeff_tab5[level-1].len);
			}
		}
		else if (run > 1 && run < 10 && level < 6)
		{
			length = coeff_tab6[run-2][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab6[run-2][level-1].code,coeff_tab6[run-2][level-1].len);
			}
		}
		else if (run > 9 && run < 15 && level == 1)
		{
			length = coeff_tab7[run-10].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab7[run-10].code,coeff_tab7[run-10].len);
			}
		}
	}
	else if (last == 1)
	{
		if (run == 0 && level < 9)
		{
			length = coeff_tab8[level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab8[level-1].code,coeff_tab8[level-1].len);
			}
		}
		else if (run > 0 && run < 7 && level < 4)
		{
			length = coeff_tab9[run-1][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab9[run-1][level-1].code,coeff_tab9[run-1][level-1].len);
			}
		}
		else if (run > 6 && run < 21 && level == 1)
		{
			length = coeff_tab10[run-7].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits(coeff_tab10[run-7].code,coeff_tab10[run-7].len);
			}
		}
	}
	return length;
}
//对帧间行程编码
UChar PutRunCoeff_Inter(short run, short level, char last)
{
	UChar length = 0;

//	MOMCHECK (last >= 0 && last < 2);
//	MOMCHECK (run >= 0 && run < 64);
//	MOMCHECK (level > 0 && level < 128);

	if (last == 0)
	{
		if (run < 2 && level < 13 )
		{
			length = coeff_tab0[run][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits (coeff_tab0[run][level-1].code,coeff_tab0[run][level-1].len);
			}
		}
		else if (run > 1 && run < 27 && level < 5)
		{
			length = coeff_tab1[run-2][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits (coeff_tab1[run-2][level-1].code,	coeff_tab1[run-2][level-1].len);
			}
		}
	}
	else if (last == 1)
	{
		if (run < 2 && level < 4)
		{
			length = coeff_tab2[run][level-1].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits (coeff_tab2[run][level-1].code,coeff_tab2[run][level-1].len);
			}
		}
		else if (run > 1 && run < 42 && level == 1)
		{
			length = coeff_tab3[run-2].len;
			if (length != 0)
			{
				BitstreamPutBits( 3L, 7L);
				BitstreamPutBits( 2L, 2L);
				length += 9;					  /* boon */
				BitstreamPutBits (coeff_tab3[run-2].code,coeff_tab3[run-2].len);
			}
		}
	}
	return length;
}

⌨️ 快捷键说明

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