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

📄 putvlc.c

📁 VC++视频开发实例集锦(包括“远程视频监控”"语音识别系统"等13个经典例子)
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "momusys.h"
#include "vlc.h"
#include "putvlc.h"
#include "bitstream.h"
Int
PutDCsize_lum (Int size, Image *bitstream)
{
	MOMCHECK(size >= 0 && size < 13);
	BitstreamPutBits (bitstream, DCtab_lum[size].code, DCtab_lum[size].len);
	return DCtab_lum[size].len;
}
Int
PutDCsize_chrom (Int size, Image *bitstream)
{
	MOMCHECK (size >= 0 && size < 13);
	BitstreamPutBits (bitstream, DCtab_chrom[size].code, DCtab_chrom[size].len);
	return DCtab_chrom[size].len;
}
Int
PutMV (Int mvint, Image *bitstream)
{
	Int sign = 0;
	Int absmv;
	if (mvint > 32)
	{
		absmv = -mvint + 65;
		sign = 1;
	}
	else
		absmv = mvint;
	BitstreamPutBits (bitstream, mvtab[absmv].code, mvtab[absmv].len);
	if (mvint != 0)
	{
		BitstreamPutBits (bitstream, sign, 1);
		return mvtab[absmv].len + 1;
	}
	else
		return mvtab[absmv].len;
}
Int
PutMCBPC_Intra (Int cbpc, Int mode, Image *bitstream)
{
	Int ind;
	ind = ((mode >> 1) & 3) | ((cbpc & 3) << 2);
	BitstreamPutBits (bitstream, mcbpc_intra_tab[ind].code, mcbpc_intra_tab[ind].len);
	return mcbpc_intra_tab[ind].len;
}
Int
PutMCBPC_Inter (Int cbpc, Int mode, Image *bitstream)
{
	Int ind;
	ind = (mode & 7) | ((cbpc & 3) << 3);
	BitstreamPutBits (bitstream, mcbpc_inter_tab[ind].code,
		mcbpc_inter_tab[ind].len);
	return mcbpc_inter_tab[ind].len;
}
Int
PutMCBPC_Sprite (Int cbpc, Int mode, Image *bitstream)
{
	Int ind;
	ind = (mode & 7) | ((cbpc & 3) << 3);
	BitstreamPutBits (bitstream, mcbpc_sprite_tab[ind].code,
		mcbpc_sprite_tab[ind].len);
	return mcbpc_sprite_tab[ind].len;
}
Int
PutCBPY (Int cbpy, Char intra, Int *MB_transp_pattern, Image *bitstream)
{
	Int ind;
	Int index=0;
	
	
	if (intra == 0) cbpy = 15 - cbpy;
	ind = cbpy;
	BitstreamPutBits (bitstream, cbpy_tab[ind].code, cbpy_tab[ind].len);
	return cbpy_tab[ind].len;
}
Int
PutCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
{
	Int 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 (bitstream, (LInt)coeff_tab0[run][level-1].code,
				(LInt)coeff_tab0[run][level-1].len);
			length = coeff_tab0[run][level-1].len;
		}
		else if (run > 1 && run < 27 && level < 5)
		{
			BitstreamPutBits (bitstream, (LInt)coeff_tab1[run-2][level-1].code,
				(LInt)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 (bitstream, (LInt)coeff_tab2[run][level-1].code,
				(LInt)coeff_tab2[run][level-1].len);
			length = coeff_tab2[run][level-1].len;
		}
		else if (run > 1 && run < 42 && level == 1)
		{
			BitstreamPutBits (bitstream, (LInt)coeff_tab3[run-2].code,
				(LInt)coeff_tab3[run-2].len);
			length = coeff_tab3[run-2].len;
		}
	}
	return length;
}
Int
PutCoeff_Intra(Int run, Int level, Int last, Image *bitstream)
{
	Int 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(bitstream, (LInt)coeff_tab4[level-1].code,
				(LInt)coeff_tab4[level-1].len);
			length = coeff_tab4[level-1].len;
		}
		else if (run == 1 && level < 11)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab5[level-1].code,
				(LInt)coeff_tab5[level-1].len);
			length = coeff_tab5[level-1].len;
		}
		else if (run > 1 && run < 10 && level < 6)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab6[run-2][level-1].code,
				(LInt)coeff_tab6[run-2][level-1].len);
			length = coeff_tab6[run-2][level-1].len;
		}
		else if (run > 9 && run < 15 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab7[run-10].code,
				(LInt)coeff_tab7[run-10].len);
			length = coeff_tab7[run-10].len;
		}
	}
	else if (last == 1)
	{
		if (run == 0 && level < 9)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab8[level-1].code,
				(LInt)coeff_tab8[level-1].len);
			length = coeff_tab8[level-1].len;
		}
		else if (run > 0 && run < 7 && level < 4)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab9[run-1][level-1].code,
				(LInt)coeff_tab9[run-1][level-1].len);
			length = coeff_tab9[run-1][level-1].len;
		}
		else if (run > 6 && run < 21 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_tab10[run-7].code,
				(LInt)coeff_tab10[run-7].len);
			length = coeff_tab10[run-7].len;
		}
	}
	return length;
}
Int
PutCoeff_Inter_RVLC(Int run, Int level, Int last, Image *bitstream)
{
	Int length = 0;
	MOMCHECK (last >= 0 && last < 2);
	MOMCHECK (run >= 0 && run < 64);
	MOMCHECK (level > 0 && level < 128);
	if (last == 0)
	{
		if (run == 0 && level < 20 )
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab14[level-1].code,
				(LInt)coeff_RVLCtab14[level-1].len);
			length = coeff_RVLCtab14[level-1].len;
		}
		else if (run == 1 && level < 11)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab15[level-1].code,
				(LInt)coeff_RVLCtab15[level-1].len);
			length = coeff_RVLCtab15[level-1].len;
		}
		else if (run > 1 && run < 4 && level < 8)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab16[run-2][level-1].code,
				(LInt)coeff_RVLCtab16[run-2][level-1].len);
			length = coeff_RVLCtab16[run-2][level-1].len;
		}
		else if (run == 4 && level < 6)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab17[level-1].code,
				(LInt)coeff_RVLCtab17[level-1].len);
			length = coeff_RVLCtab17[level-1].len;
		}
		else if (run > 4 && run < 8 && level < 5)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab18[run-5][level-1].code,
				(LInt)coeff_RVLCtab18[run-5][level-1].len);
			length = coeff_RVLCtab18[run-5][level-1].len;
		}
		else if (run > 7 && run < 10 && level < 4)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab19[run-8][level-1].code,
				(LInt)coeff_RVLCtab19[run-8][level-1].len);
			length = coeff_RVLCtab19[run-8][level-1].len;
		}
		else if (run > 9 && run < 18 && level < 3)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab20[run-10][level-1].code,
				(LInt)coeff_RVLCtab20[run-10][level-1].len);
			length = coeff_RVLCtab20[run-10][level-1].len;
		}
		else if (run > 17 && run < 39 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab21[run-18].code,
				(LInt)coeff_RVLCtab21[run-18].len);
			length = coeff_RVLCtab21[run-18].len;
		}
	}
	else if (last == 1)
	{
		if (run >= 0 && run < 2 && level < 6)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab22[run][level-1].code,
				(LInt)coeff_RVLCtab22[run][level-1].len);
			length = coeff_RVLCtab22[run][level-1].len;
		}
		else if (run == 2 && level < 4)
		{
			BitstreamPutBits (bitstream, (LInt)coeff_RVLCtab23[level-1].code,
				(LInt)coeff_RVLCtab23[level-1].len);
			length = coeff_RVLCtab23[level-1].len;
		}
		else if (run > 2 && run < 14 && level < 3)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab24[run-3][level-1].code,
				(LInt)coeff_RVLCtab24[run-3][level-1].len);
			length = coeff_RVLCtab24[run-3][level-1].len;
		}
		else if (run > 13 && run < 46 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab25[run-14].code,
				(LInt)coeff_RVLCtab25[run-14].len);
			length = coeff_RVLCtab25[run-14].len;
		}
	}
	return length;
}
Int
PutCoeff_Intra_RVLC(Int run, Int level, Int last, Image *bitstream)
{
	Int 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(bitstream, (LInt)coeff_RVLCtab1[level-1].code,
				(LInt)coeff_RVLCtab1[level-1].len);
			length = coeff_RVLCtab1[level-1].len;
		}
		else if (run == 1 && level < 14)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab2[level-1].code,
				(LInt)coeff_RVLCtab2[level-1].len);
			length = coeff_RVLCtab2[level-1].len;
		}
		else if (run == 2 && level < 12)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab3[level-1].code,
				(LInt)coeff_RVLCtab3[level-1].len);
			length = coeff_RVLCtab3[level-1].len;
		}
		else if (run == 3 && level < 10)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab4[level-1].code,
				(LInt)coeff_RVLCtab4[level-1].len);
			length = coeff_RVLCtab4[level-1].len;
		}
		else if (run > 3 && run < 6 && level < 7)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab5[run-4][level-1].code,
				(LInt)coeff_RVLCtab5[run-4][level-1].len);
			length = coeff_RVLCtab5[run-4][level-1].len;
		}
		else if (run > 5 && run < 8 && level < 6)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab6[run-6][level-1].code,
				(LInt)coeff_RVLCtab6[run-6][level-1].len);
			length = coeff_RVLCtab6[run-6][level-1].len;
		}
		else if (run > 7 && run < 10 && level < 5)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab7[run-8][level-1].code,
				(LInt)coeff_RVLCtab7[run-8][level-1].len);
			length = coeff_RVLCtab7[run-8][level-1].len;
		}
		else if (run > 9 && run < 13 && level < 3)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab8[run-10][level-1].code,
				(LInt)coeff_RVLCtab8[run-10][level-1].len);
			length = coeff_RVLCtab8[run-10][level-1].len;
		}
		else if (run > 12 && run < 20 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab9[run-13].code,
				(LInt)coeff_RVLCtab9[run-13].len);
			length = coeff_RVLCtab9[run-13].len;
		}
	}
	else if (last == 1)
	{
		if (run >= 0 && run < 2 && level < 6)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab10[run][level-1].code,
				(LInt)coeff_RVLCtab10[run][level-1].len);
			length = coeff_RVLCtab10[run][level-1].len;
		}
		else if (run == 2 && level < 4)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab11[level-1].code,
				(LInt)coeff_RVLCtab11[level-1].len);
			length = coeff_RVLCtab11[level-1].len;
		}
		else if (run > 2 && run < 14 && level < 3)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab12[run-3][level-1].code,
				(LInt)coeff_RVLCtab12[run-3][level-1].len);
			length = coeff_RVLCtab12[run-3][level-1].len;
		}
		else if (run > 13 && run < 46 && level == 1)
		{
			BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab13[run-14].code,
				(LInt)coeff_RVLCtab13[run-14].len);
			length = coeff_RVLCtab13[run-14].len;
		}
	}
	return length;
}
Int
PutRunCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
{

⌨️ 快捷键说明

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