📄 vld.c
字号:
//********************************************
//File name: vld.c
//Author: Anna
//Date:
//********************************************
#define ESCAPE 7167
#define NULL 0
extern unsigned int showbits (int n);
extern void flushbits (int n);
extern unsigned int getbits (int n);
extern int last;
extern int run;
extern int level;
extern int val;
extern int len;
int vldTableB16(int code);
int vldTableB19(int last, int run);
int vldTableB20(int last, int run);
int vldTableB21(int last, int level);
int vldTableB22(int last, int level);
extern int tableB16_1_val[112];
extern int tableB16_1_len[112];
extern int tableB16_2_val[96];
extern int tableB16_2_len[96];
extern int tableB16_3_val[120];
extern int tableB16_3_len[120];
typedef struct {
int last;
int run;
int level;
} event_t;
typedef struct {
int val, len;
} tab_type;
tab_type *vldTableB17(int code);
extern tab_type tableB17_1[112];
extern tab_type tableB17_2[96];
extern tab_type tableB17_3[120];
void vld_intra_dct()
{
int lmax,rmax;
int tab_val;
int x;
x=showbits(12);
// tab_val = vldTableB16(showbits(12));
tab_val = vldTableB16(x);
if (tab_val != ESCAPE) {
run = (val >> 6) & 63;
level = val & 63;
last = (val >> 12) & 1;
level = getbits(1) ? -level : level;
} else {
int mode =showbits(2);
switch (mode){
case 0x0:
case 0x1: //type 1
flushbits(1);
tab_val = vldTableB16(showbits(12)); /* use table B-16 */
run = (val >> 6) & 63;
level = val & 63;
last = (val >> 12) & 1;
lmax = vldTableB19(last, run); /* use table B-19 */
level += lmax;
level = getbits(1) ? -level : level;
break;
case 0x2: //type 2
flushbits(2);
tab_val = vldTableB16(showbits(12)); /* use table B-16 */
run = (val >> 6) & 63;
level = val & 63;
last = (val >> 12) & 1;
rmax = vldTableB21(last, level); /* use table B-21 */
run = run + rmax + 1;
level = getbits(1) ? -level : level;
break;
case 0x3: //type 3
flushbits(2);
last = getbits(1);
run = getbits(6); /* table B-18 */
getbits(1); /* marker bit */
level = getbits(12); /* table B-18 */
/* sign extend level... */
level = (level & 0x800) ? (level | (-1 ^ 0xfff)) : level;
getbits(1); /* marker bit */
break;
}//switch
}//else
}
/***/
event_t vld_inter_dct()
{
event_t event;
tab_type *tab = (tab_type *) NULL;
int lmax, rmax;
tab = vldTableB17(showbits(12));
if (tab->val != ESCAPE) {
event.run = (tab->val >> 4) & 255;
event.level = tab->val & 15;
event.last = (tab->val >> 12) & 1;
event.level = getbits(1) ? -event.level : event.level;
} else {
/* this value is escaped - see para 7.4.1.3 */
/* assuming short_video_header == 0 */
int mode = showbits(2);
switch (mode) {
case 0x0 : /* Type 1 */
case 0x1 : /* Type 1 */
flushbits(1);
tab = vldTableB17(showbits(12)); /* use table B-17 */
if (!tab) { /* bad code */
event.run =
event.level =
event.last = -1;
return event;
}
event.run = (tab->val >> 4) & 255;
event.level = tab->val & 15;
event.last = (tab->val >> 12) & 1;
lmax = vldTableB20(event.last, event.run); /* use table B-20 */
event.level += lmax;
event.level = getbits(1) ? -event.level : event.level;
break;
case 0x2 : /* Type 2 */
flushbits(2);
tab = vldTableB17(showbits(12)); /* use table B-16 */
if (!tab) { /* bad code */
event.run =
event.level =
event.last = -1;
break;
}
event.run = (tab->val >> 4) & 255;
event.level = tab->val & 15;
event.last = (tab->val >> 12) & 1;
rmax = vldTableB22(event.last, event.level); /* use table B-22 */
event.run = event.run + rmax + 1;
event.level = getbits(1) ? -event.level : event.level;
break;
case 0x3 : /* Type 3 - fixed length codes */
flushbits(2);
event.last = getbits(1);
event.run = getbits(6); /* table B-18 */
getbits(1); /* marker bit */
event.level = getbits(12); /* table B-18 */
/* sign extend level... */
event.level = (event.level & 0x800) ? (event.level | (-1 ^ 0xfff)) : event.level;
getbits(1); /* marker bit */
break;
}//switch
}//else
return event;
}
/* Table B-19 -- ESCL(a), LMAX values of intra macroblocks */
int vldTableB19(int last, int run) {
if (!last){ /* LAST == 0 */
if (run == 0) {
return 27;
} else if (run == 1) {
return 10;
} else if (run == 2) {
return 5;
} else if (run == 3) {
return 4;
} else if (run <= 7) {
return 3;
} else if (run <= 9) {
return 2;
} else if (run <= 14) {
return 1;
} else { /* illegal? */
return 0;
}
} else { /* LAST == 1 */
if (run == 0) {
return 8;
} else if (run == 1) {
return 3;
} else if (run <= 6) {
return 2;
} else if (run <= 20) {
return 1;
} else { /* illegal? */
return 0;
}
}
}
/* Table B-20 -- ESCL(b), LMAX values of inter macroblocks */
int vldTableB20(int last, int run) {
if (!last){ /* LAST == 0 */
if (run == 0) {
return 12;
} else if (run == 1) {
return 6;
} else if (run == 2) {
return 4;
} else if (run <= 6) {
return 3;
} else if (run <= 10) {
return 2;
} else if (run <= 26) {
return 1;
} else { /* illegal? */
return 0;
}
} else { /* LAST == 1 */
if (run == 0) {
return 3;
} else if (run == 1) {
return 2;
} else if (run <= 40) {
return 1;
} else { /* illegal? */
return 0;
}
}
}
/* Table B-21 -- ESCR(a), RMAX values of intra macroblocks */
int vldTableB21(int last, int level) {
if (!last){ /* LAST == 0 */
if (level == 1) {
return 14;
} else if (level == 2) {
return 9;
} else if (level == 3) {
return 7;
} else if (level == 4) {
return 3;
} else if (level == 5) {
return 2;
} else if (level <= 10) {
return 1;
} else if (level <= 27) {
return 0;
} else { /* illegal? */
return 0;
}
} else { /* LAST == 1 */
if (level == 1) {
return 20;
} else if (level == 2) {
return 6;
} else if (level == 3) {
return 1;
} else if (level <= 8) {
return 0;
} else { /* illegal? */
return 0;
}
}
}
/* Table B-22 -- ESCR(b), RMAX values of inter macroblocks */
int vldTableB22(int last, int level) {
if (!last){ /* LAST == 0 */
if (level == 1) {
return 26;
} else if (level == 2) {
return 10;
} else if (level == 3) {
return 6;
} else if (level == 4) {
return 2;
} else if (level <= 6) {
return 1;
} else if (level <= 12) {
return 0;
} else { /* illegal? */
return 0;
}
} else { /* LAST == 1 */
if (level == 1) {
return 40;
} else if (level == 2) {
return 1;
} else if (level == 3) {
return 0;
} else { /* illegal? */
return 0;
}
}
}
/***/
int vldTableB16(int code) {
if (code >= 512) {
val = tableB16_1_val[(code >> 5) - 16];
len = tableB16_1_len[(code >> 5) - 16];
} else if (code >= 128) {
val = tableB16_2_val[(code >> 2) - 32];
len = tableB16_2_len[(code >> 2) - 32];
} else if (code >= 8) {
val = tableB16_3_val[(code >> 0) - 8];
len = tableB16_3_len[(code >> 0) - 8];
}
flushbits(len);
return val;
}
/***/
tab_type *vldTableB17(int code) {
tab_type *tab;
int m=0;
if (code >= 512) {
tab = &(tableB17_1[(code >> 5) - 16]);
} else if (code >= 128) {
tab = &(tableB17_2[(code >> 2) - 32]);
} else if (code >= 8) {
tab = &(tableB17_3[(code >> 0) - 8]);
} else {
/* invalid Huffman code */
return (tab_type *) NULL;
}
flushbits(tab->len);
return tab;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -