?? putmpg.c
字號:
/* putmpg.c,
*塊和運動向量編碼程序
* */
#include <stdio.h>#include "global.h"/* 為幀內編碼塊產生變長編碼 */void putintrablk(blk,cc)short *blk;int cc;{ int n, dct_diff, run, signed_level; /* DC 系數 */ dct_diff = blk[0] - dc_dct_pred[cc]; /* 與前一塊的差值 */ dc_dct_pred[cc] = blk[0]; if (cc==0) putDClum(dct_diff); else putDCchrom(dct_diff); /* AC 系數 */ run = 0; for (n=1; n<64; n++) { /* 使用一個合適的熵編碼掃描方式*/ signed_level = blk[(altscan ? alternate_scan : zig_zag_scan)[n]]; if (signed_level!=0) { putAC(run,signed_level,intravlc); run = 0; } else run++; /* 對0系數計數 */ } /* 結束一個塊,并加上標準的終結碼字*/ if (intravlc) putbits(6,4); /* 0110 (表 B-15) */ else putbits(2,2); /* 10 10 (表 B-14) */}/* 為非幀內編碼塊產生變長編碼 */void putnonintrablk(blk)short *blk;{ int n, run, signed_level, first; run = 0; first = 1; for (n=0; n<64; n++) { /* 使用一個合適的熵編碼掃描方式*/ signed_level = blk[(altscan ? alternate_scan : zig_zag_scan)[n]]; if (signed_level!=0) { if (first) { /* 非幀內塊的第一個系數 */ putACfirst(run,signed_level); first = 0; } else putAC(run,signed_level,0); run = 0; } else run++; /* 對0系數計數 */ } /* 結束一個塊,并加上標準的終結碼字*/ putbits(2,2);}/* 為運動向量產生變長編碼 */void putmv(dmv,f_code)int dmv,f_code;{ int r_size, f, vmin, vmax, dv, temp, motion_code, motion_residual; r_size = f_code - 1; /* 固定長度編碼的比特數 */ f = 1<<r_size; vmin = -16*f; /* 下限 */ vmax = 16*f - 1; /* 上限*/ dv = 32*f; if (dmv>vmax) dmv-= dv; else if (dmv<vmin) dmv+= dv; /* 檢測值是否正確 */ if (dmv<vmin || dmv>vmax) if (!quiet) fprintf(stderr,"invalid motion vector\n"); /* 將dmv分成dmvmotion_code和motion_residual */ temp = ((dmv<0) ? -dmv : dmv) + f - 1; motion_code = temp>>r_size; if (dmv<0) motion_code = -motion_code; motion_residual = temp & (f-1); putmotioncode(motion_code); /* 變長編碼 */ if (r_size!=0 && motion_code!=0) putbits(motion_residual,r_size); /* 定長編碼 */}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -