?? dsp_vlc.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 + -