?? putvlc.c
字號:
/* putvlc.c, 產生變長編碼的程序 */
#include <stdio.h>#include "global.h"#include "vlc.h"/* 私有函數 */static void putDC(sVLCtable *tab, int val);//* 對亮度DC系數進行可變長編碼*/void putDClum(val)int val;{ putDC(DClumtab,val);}/* 對色度DC系數進行可變長編碼*/void putDCchrom(val)int val;{ putDC(DCchromtab,val);}/* 可變長編碼的具體函數*/static void putDC(tab,val)sVLCtable *tab;int val;{ int absval, size; absval = (val<0) ? -val : val; /* abs(val) */ if (absval>255) { /* 這種情況應該保證永遠不要發生*/ sprintf(errortext,"DC value out of range (%d)\n",val); error(errortext); } /* 計算DC系數DCT表的大小*/ size = 0; while (absval) { absval >>= 1; size++; } /* 為dct_dc_size 產生變長編碼 */ putbits(tab[size].code,tab[size].len); /* 附加定長編碼 */ if (size!=0) { if (val>=0) absval = val; else absval = val + (1<<size) - 1; /* val + (2 ^ size) - 1 */ putbits(absval,size); }}/* 對非幀內塊的AC的第一個系數進行變長編碼*/void putACfirst(run,val)int run,val;{ if (run==0 && (val==1 || val==-1)) putbits(2|(val<0),2); /* 產生 '1s' (s=sign), (Table B-14, line 2) */ else putAC(run,val,0); /* 對其他系數則與AC的變長編碼一樣 */}/* 對DCT表的其他值進行編碼*/void putAC(run,signed_level,vlcformat)int run,signed_level,vlcformat;{ int level, len; VLCtable *ptab; level = (signed_level<0) ? -signed_level : signed_level; /* 要確保游程有效*/ if (run<0 || run>63 || level==0 || level>255) { sprintf(errortext,"AC value out of range (run=%d, signed_level=%d)\n", run,signed_level); error(errortext); } len = 0; if (run<2 && level<41) { /* vlc的格式采用表Table B-14 或 B-15 */ if (vlcformat) ptab = &dct_code_tab1a[run][level-1]; else ptab = &dct_code_tab1[run][level-1]; len = ptab->len; } else if (run<32 && level<6) { if (vlcformat) ptab = &dct_code_tab2a[run-2][level-1]; else ptab = &dct_code_tab2[run-2][level-1]; len = ptab->len; } if (len!=0) /* 表示已經存在變長編碼了*/ { putbits(ptab->code,len); putbits(signed_level<0,1); } else { /* 對這個(run, level)的組合,沒有合適的VLC,則采用escape方式 */ putbits(1l,6); /* Escape 字段*/ putbits(run,6); /* ISO/IEC 11172-2 采用的是8 或 16 bit 的編碼*/
if (signed_level>127) putbits(0,8); if (signed_level<-127) putbits(128,8); putbits(signed_level,8); }}/* 對macroblock_address_increment進行變長編碼*/void putaddrinc(addrinc)int addrinc;{ while (addrinc>33) { putbits(0x08,11); addrinc-= 33; } putbits(addrinctab[addrinc-1].code,addrinctab[addrinc-1].len);}/* 對macroblock_type 進行變長編碼 */void putmbtype(pict_type,mb_type)int pict_type,mb_type;{ putbits(mbtypetab[pict_type-1][mb_type].code, mbtypetab[pict_type-1][mb_type].len);}/* 對motion_code 進行變長編碼 */void putmotioncode(motion_code)int motion_code;{ int abscode; abscode = (motion_code>=0) ? motion_code : -motion_code; putbits(motionvectab[abscode].code,motionvectab[abscode].len); if (motion_code!=0) putbits(motion_code<0,1); }/* 對dmvector[t] 進行變長編碼 */void putdmv(dmv)int dmv;{ if (dmv==0) putbits(0,1); else if (dmv>0) putbits(2,2); else putbits(3,2);}/* 對coded_block_pattern 進行變長編碼,沒有實現4:2:2和4:4:4 * */void putcbp(cbp)int cbp;{ putbits(cbptable[cbp].code,cbptable[cbp].len);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -