📄 dct_coefficient.c
字号:
return table_f[code].flag;
case 11:
/* escape */
code >>= 5;
code &= 0x3f;
vs_erase_bits(in, 12);
*run = code;
*level = get_dct_coefficient_escape_level_mpeg2(in);
return 1;
case 12:
code >>= 9;
code -= 0x08;
vs_erase_bits(in, table_g[code].size);
*run = table_g[code].run;
*level = table_g[code].level;
return table_g[code].flag;
case 13:
code >>= 10;
code -= 0x08;
vs_erase_bits(in, table_h[code].size);
*run = table_h[code].run;
*level = table_h[code].level;
return table_h[code].flag;
case 14:
code >>= 8;
code -= 0x40;
vs_erase_bits(in, table_i[code].size);
*run = table_i[code].run;
*level = table_i[code].level;
return table_i[code].flag;
case 15:
code >>= 12;
code -= 0x08;
vs_erase_bits(in, table_j[code].size);
*run = table_j[code].run;
*level = table_j[code].level;
return table_j[code].flag;
case 16:
code >>= 8;
code -= 0x100;
vs_erase_bits(in, table_k[code].size);
*run = table_k[code].run;
*level = table_k[code].level;
return table_k[code].flag;
}
*run = 0;
*level = 0;
return -1;
}
int read_dct_ac_coefficient_mpeg1(VIDEO_STREAM *in, int *run, int *level)
{
int n;
int code;
static const DCT_COEFFICIENT_VLC_ELEMENT table_a[] = {
{1,1,18,17},{1,1,-18,17},{1,1,17,17},{1,1,-17,17}, /* 0000 0000 0001 000x x */
{1,1,16,17},{1,1,-16,17},{1,1,15,17},{1,1,-15,17}, /* 0000 0000 0001 001x x */
{1,6,3,17},{1,6,-3,17},{1,16,2,17},{1,16,-2,17}, /* 0000 0000 0001 010x x */
{1,15,2,17},{1,15,-2,17},{1,14,2,17},{1,14,-2,17}, /* 0000 0000 0001 011x x */
{1,13,2,17},{1,13,-2,17},{1,12,2,17},{1,12,-2,17}, /* 0000 0000 0001 100x x */
{1,11,2,17},{1,11,-2,17},{1,31,1,17},{1,31,-1,17}, /* 0000 0000 0001 101x x */
{1,30,1,17},{1,30,-1,17},{1,29,1,17},{1,29,-1,17}, /* 0000 0000 0001 110x x */
{1,28,1,17},{1,28,-1,17},{1,27,1,17},{1,27,-1,17}, /* 0000 0000 0001 111x x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_b[] = {
{1,0,40,16},{1,0,-40,16},{1,0,39,16},{1,0,-39,16}, /* 0000 0000 0010 00xx x */
{1,0,38,16},{1,0,-38,16},{1,0,37,16},{1,0,-37,16}, /* 0000 0000 0010 01xx x */
{1,0,36,16},{1,0,-36,16},{1,0,35,16},{1,0,-35,16}, /* 0000 0000 0010 10xx x */
{1,0,34,16},{1,0,-34,16},{1,0,33,16},{1,0,-33,16}, /* 0000 0000 0010 11xx x */
{1,0,32,16},{1,0,-32,16},{1,1,14,16},{1,1,-14,16}, /* 0000 0000 0011 00xx x */
{1,1,13,16},{1,1,-13,16},{1,1,12,16},{1,1,-12,16}, /* 0000 0000 0011 01xx x */
{1,1,11,16},{1,1,-11,16},{1,1,10,16},{1,1,-10,16}, /* 0000 0000 0011 10xx x */
{1,1,9,16},{1,1,-9,16},{1,1,8,16},{1,1,-8,16}, /* 0000 0000 0011 11xx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_c[] = {
{1,0,31,15},{1,0,-31,15},{1,0,30,15},{1,0,-30,15}, /* 0000 0000 0100 0xxx x */
{1,0,29,15},{1,0,-29,15},{1,0,28,15},{1,0,-28,15}, /* 0000 0000 0100 1xxx x */
{1,0,27,15},{1,0,-27,15},{1,0,26,15},{1,0,-26,15}, /* 0000 0000 0101 0xxx x */
{1,0,25,15},{1,0,-25,15},{1,0,24,15},{1,0,-24,15}, /* 0000 0000 0101 0xxx x */
{1,0,23,15},{1,0,-23,15},{1,0,22,15},{1,0,-22,15}, /* 0000 0000 0110 0xxx x */
{1,0,21,15},{1,0,-21,15},{1,0,20,15},{1,0,-20,15}, /* 0000 0000 0110 1xxx x */
{1,0,19,15},{1,0,-19,15},{1,0,18,15},{1,0,-18,15}, /* 0000 0000 0111 0xxx x */
{1,0,17,15},{1,0,-17,15},{1,0,16,15},{1,0,-16,15}, /* 0000 0000 0111 0xxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_d[] = {
{1,10,2,14},{1,10,-2,14},{1,9,2,14},{1,9,-2,14}, /* 0000 0000 1000 xxxx x */
{1,5,3,14},{1,5,-3,14},{1,3,4,14},{1,3,-4,14}, /* 0000 0000 1001 xxxx x */
{1,2,5,14},{1,2,-5,14},{1,1,7,14},{1,1,-7,14}, /* 0000 0000 1010 xxxx x */
{1,1,6,14},{1,1,-6,14},{1,0,15,14},{1,0,-15,14}, /* 0000 0000 1011 xxxx x */
{1,0,14,14},{1,0,-14,14},{1,0,13,14},{1,0,-13,14}, /* 0000 0000 1100 xxxx x */
{1,0,12,14},{1,0,-12,14},{1,26,1,14},{1,26,-1,14}, /* 0000 0000 1101 xxxx x */
{1,25,1,14},{1,25,-1,14},{1,24,1,14},{1,24,-1,14}, /* 0000 0000 1110 xxxx x */
{1,23,1,14},{1,23,-1,14},{1,22,1,14},{1,22,-1,14}, /* 0000 0000 1110 xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_e[] = {
{1,0,11,13},{1,0,-11,13},{1,8,2,13},{1,8,-2,13}, /* 0000 0001 000x xxxx x */
{1,4,3,13},{1,4,-3,13},{1,0,10,13},{1,0,-10,13}, /* 0000 0001 001x xxxx x */
{1,2,4,13},{1,2,-4,13},{1,7,2,13},{1,7,-2,13}, /* 0000 0001 010x xxxx x */
{1,21,1,13},{1,21,-1,13},{1,20,1,13},{1,20,-1,13}, /* 0000 0001 011x xxxx x */
{1,0,9,13},{1,0,-9,13},{1,19,1,13},{1,19,-1,13}, /* 0000 0001 100x xxxx x */
{1,18,1,13},{1,18,-1,13},{1,1,5,13},{1,1,-5,13}, /* 0000 0001 101x xxxx x */
{1,3,3,13},{1,3,-3,13},{1,0,8,13},{1,0,-8,13}, /* 0000 0001 110x xxxx x */
{1,6,2,13},{1,6,-2,13},{1,17,1,13},{1,17,-1,13}, /* 0000 0001 111x xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_f[] = {
{1,16,1,11},{1,16,-1,11},{1,5,2,11},{1,5,-2,11}, /* 0000 0010 0xxx xxxx x */
{1,0,7,11},{1,0,-7,11},{1,2,3,11},{1,2,-3,11}, /* 0000 0010 1xxx xxxx x */
{1,1,4,11},{1,1,-4,11},{1,15,1,11},{1,15,-1,11}, /* 0000 0011 0xxx xxxx x */
{1,14,1,11},{1,14,-1,11},{1,4,2,11},{1,4,-2,11}, /* 0000 0011 1xxx xxxx x */
};
/* escape */ /* 0000 01xx xxxx xxxx x */
static const DCT_COEFFICIENT_VLC_ELEMENT table_g[] = {
{1,2,2,8},{1,2,-2,8},{1,9,1,8},{1,9,-1,8}, /* 0000 10xx xxxx xxxx x */
{1,0,4,8},{1,0,-4,8},{1,8,1,8},{1,8,-1,8}, /* 0000 11xx xxxx xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_h[] = {
{1,7,1,7},{1,7,-1,7},{1,6,1,7},{1,6,-1,7}, /* 0001 0xxx xxxx xxxx x */
{1,1,2,7},{1,1,-2,7},{1,5,1,7},{1,5,-1,7}, /* 0001 1xxx xxxx xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_i[] = {
{1,13,1,9},{1,13,-1,9},{1,0,6,9},{1,0,-6,9}, /* 0010 000x xxxx xxxx x */
{1,12,1,9},{1,12,-1,9},{1,11,1,9},{1,11,-1,9}, /* 0010 001x xxxx xxxx x */
{1,3,2,9},{1,3,-2,9},{1,1,3,9},{1,1,-3,9}, /* 0010 010x xxxx xxxx x */
{1,0,5,9},{1,0,-5,9},{1,10,1,9},{1,10,-1,9}, /* 0010 011x xxxx xxxx x */
{1,0,3,6},{1,0,3,6},{1,0,3,6},{1,0,3,6}, /* 0010 100x xxxx xxxx x */
{1,0,3,6},{1,0,3,6},{1,0,3,6},{1,0,3,6}, /* 0010 101x xxxx xxxx x */
{1,0,-3,6},{1,0,-3,6},{1,0,-3,6},{1,0,-3,6}, /* 0010 110x xxxx xxxx x */
{1,0,-3,6},{1,0,-3,6},{1,0,-3,6},{1,0,-3,6}, /* 0010 111x xxxx xxxx x */
{1,4,1,6},{1,4,1,6},{1,4,1,6},{1,4,1,6}, /* 0011 000x xxxx xxxx x */
{1,4,1,6},{1,4,1,6},{1,4,1,6},{1,4,1,6}, /* 0011 001x xxxx xxxx x */
{1,4,-1,6},{1,4,-1,6},{1,4,-1,6},{1,4,-1,6}, /* 0011 010x xxxx xxxx x */
{1,4,-1,6},{1,4,-1,6},{1,4,-1,6},{1,4,-1,6}, /* 0011 011x xxxx xxxx x */
{1,3,1,6},{1,3,1,6},{1,3,1,6},{1,3,1,6}, /* 0011 100x xxxx xxxx x */
{1,3,1,6},{1,3,1,6},{1,3,1,6},{1,3,1,6}, /* 0011 101x xxxx xxxx x */
{1,3,-1,6},{1,3,-1,6},{1,3,-1,6},{1,3,-1,6}, /* 0011 110x xxxx xxxx x */
{1,3,-1,6},{1,3,-1,6},{1,3,-1,6},{1,3,-1,6}, /* 0011 111x xxxx xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_j[] = {
{1,0,2,5},{1,0,-2,5},{1,2,1,5},{1,2,-1,5}, /* 010x xxxx xxxx xxxx x */
{1,1,1,4},{1,1,1,4},{1,1,-1,4},{1,1,-1,4}, /* 011x xxxx xxxx xxxx x */
};
static const DCT_COEFFICIENT_VLC_ELEMENT table_k[] = {
{0,0,0,2},{0,0,0,2},{1,0,1,3},{1,0,-1,3}, /* 1xxx xxxx xxxx xxxx x */
};
code = vs_read_bits(in, 17);
n = log2(code);
switch(n){
case 0:
case 1:
case 2:
case 3:
case 4:
*run = 0;
*level = 0;
return -1;
case 5:
code -= 0x20;
vs_erase_bits(in, table_a[code].size);
*run = table_a[code].run;
*level = table_a[code].level;
return table_a[code].flag;
case 6:
code >>= 1;
code -= 0x20;
vs_erase_bits(in, table_b[code].size);
*run = table_b[code].run;
*level = table_b[code].level;
return table_b[code].flag;
case 7:
code >>= 2;
code -= 0x20;
vs_erase_bits(in, table_c[code].size);
*run = table_c[code].run;
*level = table_c[code].level;
return table_c[code].flag;
case 8:
code >>= 3;
code -= 0x20;
vs_erase_bits(in, table_d[code].size);
*run = table_d[code].run;
*level = table_d[code].level;
return table_d[code].flag;
case 9:
code >>= 4;
code -= 0x20;
vs_erase_bits(in, table_e[code].size);
*run = table_e[code].run;
*level = table_e[code].level;
return table_e[code].flag;
case 10:
code >>= 6;
code -= 0x10;
vs_erase_bits(in, table_f[code].size);
*run = table_f[code].run;
*level = table_f[code].level;
return table_e[code].flag;
case 11:
/* escape */
code >>= 5;
code &= 0x3f;
vs_erase_bits(in, 12);
*run = code;
*level = get_dct_coefficient_escape_level_mpeg1(in);
return 1;
case 12:
code >>= 9;
code -= 0x08;
vs_erase_bits(in, table_g[code].size);
*run = table_g[code].run;
*level = table_g[code].level;
return table_g[code].flag;
case 13:
code >>= 10;
code -= 0x08;
vs_erase_bits(in, table_h[code].size);
*run = table_h[code].run;
*level = table_h[code].level;
return table_h[code].flag;
case 14:
code >>= 8;
code -= 0x40;
vs_erase_bits(in, table_i[code].size);
*run = table_i[code].run;
*level = table_i[code].level;
return table_i[code].flag;
case 15:
code >>= 12;
code -= 0x08;
vs_erase_bits(in, table_j[code].size);
*run = table_j[code].run;
*level = table_j[code].level;
return table_j[code].flag;
case 16:
code >>= 14;
code -= 0x4;
vs_erase_bits(in, table_k[code].size);
*run = table_k[code].run;
*level = table_k[code].level;
return table_k[code].flag;
}
*run = 0;
*level = 0;
return -1;
}
static int get_dct_coefficient_escape_level_mpeg2(VIDEO_STREAM *in)
{
int n;
int code;
static const unsigned int sign[] = {
0, 0xFFFFF000,
};
code = vs_get_bits(in, 12);
n = code >> 11;
code |= sign[n];
return code;
}
static int get_dct_coefficient_escape_level_mpeg1(VIDEO_STREAM *in)
{
int code;
code = vs_get_bits(in, 8);
if(code == 0){
code = vs_get_bits(in, 8);
}else if(code==128){
code = vs_get_bits(in, 8) - 256;
}else if(code>128){
code -= 256;
}
return code;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -