📄 ov518_decomp.c
字号:
depth = tree[node].depth; /* Is it a leaf? If not, branch downward */ if (depth != -1) { *coeffbits = tree[node].coeffbits; *skip = tree[node].skip; return depth; } in <<= 1; ++i; } while (i <= 15); return -1;}/* If no node is found, coeffbits will not be modified *//* Return: Depth of node found, or -1 if invalid input code */static int getNodeDC(unsigned int in, signed char *coeffbits, const struct tree_node *tree){ int node = 0; int i = 0; int depth; do { if ((in & 0x80000000) == 0) node = tree[node].left; else node = tree[node].right; if (node == -1) break; depth = tree[node].depth; /* Is it a leaf? If not, branch downward */ if (depth != -1) { *coeffbits = tree[node].coeffbits; return depth; } in <<= 1; ++i; } while (i <= 15); return -1;}static inline unsigned int getBytes(int *rawData, struct comp_info *cinfo){ int bufLen = cinfo->rawLen; int bits = cinfo->bits; int bytes = cinfo->bytes; unsigned char *in = bytes + (unsigned char *) rawData; unsigned char b1, b2, b3, b4, b5; unsigned int packedIn; /* Pull 5 bytes out of raw data */ if (bytes < bufLen - 4) { b1 = in[0]; b2 = in[1]; b3 = in[2]; b4 = in[3]; b5 = in[4]; } else { if (bytes < bufLen - 3) { b1 = in[0]; b2 = in[1]; b3 = in[2]; b4 = in[3]; } else { if (bytes < bufLen - 2) { b1 = in[0]; b2 = in[1]; b3 = in[2]; } else { if (bytes < bufLen - 1) { b1 = in[0]; b2 = in[1]; } else { if (bytes <= bufLen) { b1 = in[0]; } else { b1 = 0; } b2 = 0; } b3 = 0; } b4 = 0; } b5 = 0; } /* Pack the bytes */ packedIn = b1 << 24; packedIn += b2 << 16; packedIn += b3 << 8; packedIn += b4; if (bits != 0) { packedIn = packedIn << bits; packedIn += b5 >> (8 - bits); } return packedIn;}static int getACCoefficient(int *rawData, int *coeff, struct comp_info *cinfo, const struct tree_node *tree){ int input, bits, bytes, tmp_c; signed char coeffbits = 0; signed char skip = 0; input = getBytes(rawData, cinfo); bits = getNodeAC(input, &coeffbits, &skip, tree); if (coeffbits) { input = input << (bits - 1); input &= 0x7fffffff; if (! (input & 0x40000000)) input |= 0x80000000; tmp_c = input >> (31 - coeffbits); if (tmp_c < 0) tmp_c++; *coeff = tmp_c; bits += coeffbits; } bytes = (bits + cinfo->bits) >> 3; cinfo->bytes += bytes; cinfo->bits += bits - (bytes << 3); return skip;}static void getDCCoefficient(int *rawData, int *coeff, struct comp_info *cinfo, const struct tree_node *tree){ int input, bits, bytes, tmp_c; signed char coeffbits = 0; input = getBytes(rawData, cinfo); bits = getNodeDC(input, &coeffbits, tree); if (bits == -1) { bits = 1; /* Try to re-sync at the next bit */ *coeff = 0; /* Indicates no change from last DC */ } else { input = input << (bits - 1); input &= 0x7fffffff; if (! (input & 0x40000000)) input |= 0x80000000; tmp_c = input >> (31 - coeffbits); if (tmp_c < 0) tmp_c++; *coeff = tmp_c; bits += coeffbits; } bytes = (bits + cinfo->bits) >> 3; cinfo->bytes += bytes; cinfo->bits += bits - (bytes << 3);}/* For AC coefficients, here is what the "skip" value means: * -1: Either the 8x4 block has ended, or the decoding failed. * 0: Use the returned coeff. Don't skip anything. * 1-15: The next <skip> coeffs are zero. The returned coeff is used. * 16: The next 16 coeffs are zero. The returned coeff is ignored. * * You must ensure that the C[] array not be overrun, or stack corruption will * result. */static void huffmanDecoderY(int *C, int *pIn, struct comp_info *cinfo){ int coeff = 0; int i = 1; int k, skip; getDCCoefficient(pIn, C, cinfo, treeYDC); i = 1; do { skip = getACCoefficient(pIn, &coeff, cinfo, treeYAC); if (skip == -1) { break; } else if (skip == 0) { C[i++] = coeff; } else if (skip == 16) { k = 16; if (i > 16) k = 32 - i; while (k--) C[i++] = 0; } else { k = skip; if (skip > 31 - i) k = 31 - i; while (k--) C[i++] = 0; C[i++] = coeff; } } while (i <= 31); if (skip == -1) while (i <= 31) C[i++] = 0; else getACCoefficient(pIn, &coeff, cinfo, treeYAC);}/* Same as huffmanDecoderY, except for the tables used */static void huffmanDecoderUV(int *C, int *pIn, struct comp_info *cinfo){ int coeff = 0; int i = 1; int k, skip; getDCCoefficient(pIn, C, cinfo, treeUVDC); i = 1; do { skip = getACCoefficient(pIn, &coeff, cinfo, treeUVAC); if (skip == -1) { break; } else if (skip == 0) { C[i++] = coeff; } else if (skip == 16) { k = 16; if (i > 16) k = 32 - i; while (k--) C[i++] = 0; } else { k = skip; if (skip > 31 - i) k = 31 - i; while (k--) C[i++] = 0; C[i++] = coeff; } } while (i <= 31); if (skip == -1) while (i <= 31) C[i++] = 0; else getACCoefficient(pIn, &coeff, cinfo, treeUVAC);}/****************************************************************************** * iDCT Functions ******************************************************************************/#ifndef APPROXIMATE_MUL_BY_SHIFT#define IDCT_MESSAGE "iDCT with multiply"#define TIMES_16382(u) ((u)? 16382 * (u):0)#define TIMES_23168(u) ((u)? 23168 * (u):0)#define TIMES_30270(u) ((u)? 30270 * (u):0)#define TIMES_41986(u) ((u)? 41986 * (u):0)#define TIMES_35594(u) ((u)? 35594 * (u):0)#define TIMES_23783(u) ((u)? 23783 * (u):0)#define TIMES_8351(u) ((u)? 8351 * (u):0)#define TIMES_17391(u) ((u)? 17391 * (u):0)#define TIMES_14743(u) ((u)? 14743 * (u):0)#define TIMES_9851(u) ((u)? 9851 * (u):0)#define TIMES_3459(u) ((u)? 3459 * (u):0)#define TIMES_32134(u) ((u)? 32134 * (u):0)#define TIMES_27242(u) ((u)? 27242 * (u):0)#define TIMES_18202(u) ((u)? 18202 * (u):0)#define TIMES_6392(u) ((u)? 6392 * (u):0)#define TIMES_39550(u) ((u)? 39550 * (u):0)#define TIMES_6785(u) ((u)? 6785 * (u):0)#define TIMES_12538(u) ((u)? 12538 * (u):0)#else#define IDCT_MESSAGE "iDCT with shift"#define TIMES_16382(u) ( (u)? x=(u) , (x<<14) - (x<<1) :0 )#define TIMES_23168(u) ( (u)? x=(u) , (x<<14) + (x<<12) + (x<<11) + (x<<9) :0 )#define TIMES_30270(u) ( (u)? x=(u) , (x<<15) - (x<<11) :0 )#define TIMES_41986(u) ( (u)? x=(u) , (x<<15) + (x<<13) + (x<<10) :0 )#define TIMES_35594(u) ( (u)? x=(u) , (x<<15) + (x<<11) + (x<<9) + (x<<8) :0 )#define TIMES_23783(u) ( (u)? x=(u) , (x<<14) + (x<<13) - (x<<9) - (x<<8) :0 )#define TIMES_8351(u) ( (u)? x=(u) , (x<<13) :0 )#define TIMES_17391(u) ( (u)? x=(u) , (x<<14) + (x<<10) :0 )#define TIMES_14743(u) ( (u)? x=(u) , (x<<14) - (x<<10) - (x<<9) :0 )#define TIMES_9851(u) ( (u)? x=(u) , (x<<13) + (x<<10) + (x<<9) :0 )#define TIMES_3459(u) ( (u)? x=(u) , (x<<12) - (x<<9) :0 )#define TIMES_32134(u) ( (u)? x=(u) , (x<<15) - (x<<9) :0 )#define TIMES_27242(u) ( (u)? x=(u) , (x<<14) + (x<<13) + (x<<11) + (x<<9) :0 )#define TIMES_18202(u) ( (u)? x=(u) , (x<<14) + (x<<11) - (x<<8) :0 )#define TIMES_6392(u) ( (u)? x=(u) , (x<<13) - (x<<11) + (x<<8) :0 )#define TIMES_39550(u) ( (u)? x=(u) , (x<<15) + (x<<12) + (x<<11) + (x<<9) :0 )#define TIMES_6785(u) ( (u)? x=(u) , (x<<12) + (x<<11) + (x<<9) :0 )#define TIMES_12538(u) ( (u)? x=(u) , (x<<13) + (x<<12) + (x<<8) :0 )/* * The variables C0, C4, C16 and C20 can also be removed from the algorithm * if APPROXIMATE_MUL_BY_SHIFTS is defined. They store correction values * and can be considered insignificant. */#endifstatic void DCT_8x4(int *coeff, unsigned char *out)/* pre: coeff == coefficients post: coeff != coefficients ** DO NOT ASSUME coeff TO BE THE SAME BEFORE AND AFTER CALLING THIS FUNCTION!*/{ register int base,val1,val2,val3; int tmp1,tmp2; int C0,C4,C16,C20; int C2_18,C6_22,C1_17,C3_19,C5_21,C7_23; register int t;#ifdef APPROXIMATE_MUL_BY_SHIFT register int x;#endif C0=coeff[0]; C4=coeff[4]; C16=coeff[16]; C20=coeff[20]; coeff[0]=TIMES_23168(coeff[0]); coeff[4]=TIMES_23168(coeff[4]); coeff[16]=TIMES_23168(coeff[16]); coeff[20]=TIMES_23168(coeff[20]); C2_18 = coeff[2]+coeff[18]; C6_22 = coeff[6]+coeff[22]; C1_17 = coeff[1]+coeff[17]; C3_19 = coeff[3]+coeff[19]; C5_21 = coeff[5]+coeff[21]; C7_23 = coeff[7]+coeff[23];// 0,7,25,32 base = 0x1000000; base += coeff[0]+coeff[4]+coeff[16]+coeff[20]; base += TIMES_30270(C2_18); base += TIMES_12538(C6_22); val1 = TIMES_41986(coeff[9]); val1 += TIMES_35594(coeff[11]); val1 += TIMES_23783(coeff[13]); val1 += TIMES_8351(coeff[15]); val1 += TIMES_17391(coeff[25]); val1 += TIMES_14743(coeff[27]); val1 += TIMES_9851(coeff[29]); val1 += TIMES_3459(coeff[31]); val2 = TIMES_32134(C1_17); val2 += TIMES_27242(C3_19); val2 += TIMES_18202(C5_21); val2 += TIMES_6392(C7_23); val3 = TIMES_39550(coeff[10]); val3 += TIMES_16382(coeff[14]+coeff[26]); val3 += TIMES_6785(coeff[30]); val3 += TIMES_30270(coeff[8]+coeff[12]); val3 += TIMES_12538(coeff[24]+coeff[28]); t=(base + val1 + val2 + val3) >> 17; out[0]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 - val2 + val3 - C4 - C20) >> 17; out[7]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 + val2 - val3 - C16- C20) >> 17; out[24]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base + val1 - val2 - val3 - C4 - C16 - C20) >> 17; out[31]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;//1,6,25,30 base = 0x1000000; base += coeff[0]-coeff[4]+coeff[16]-coeff[20]; base += TIMES_12538(C2_18); base -= TIMES_30270(C6_22); val1 = TIMES_35594(coeff[9]); val1 -= TIMES_8351(coeff[11]); val1 -= TIMES_41986(coeff[13]); val1 -= TIMES_23783(coeff[15]); val1 -= TIMES_14743(coeff[25]); val1 -= TIMES_3459(coeff[27]); val1 -= TIMES_17391(coeff[29]); val1 -= TIMES_9851(coeff[31]); val2 = TIMES_27242(C1_17); val2 -= TIMES_6392(C3_19); val2 -= TIMES_32134(C5_21); val2 -= TIMES_18202(C7_23); val3 = TIMES_16382(coeff[10]-coeff[30]); val3 -= TIMES_39550(coeff[14]); val3 += TIMES_6785(coeff[26]); val3 += TIMES_12538(coeff[24]-coeff[28]); val3 += TIMES_30270(coeff[8]-coeff[12]); t=(base + val1 + val2 + val3 + C4 + C20) >> 17; out[1]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 - val2 + val3) >> 17; out[6]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 + val2 - val3 + C4 - C16 + C20) >> 17; out[25]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base + val1 - val2 - val3 + C20) >> 17; out[30]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;//2,5,26,29 base = 0x1000000; base += coeff[0] - coeff[4] + coeff[16] - coeff[20]; base -= TIMES_12538(C2_18); base += TIMES_30270(C6_22); val1 = TIMES_23783(coeff[9]); val1 -= TIMES_41986(coeff[11]); val1 += TIMES_8351(coeff[13]); val1 += TIMES_35594(coeff[15]); val1 += TIMES_9851(coeff[25]); val1 -= TIMES_17391(coeff[27]); val1 += TIMES_3459(coeff[29]); val1 += TIMES_14743(coeff[31]); val2 = TIMES_18202(C1_17); val2 -= TIMES_32134(C3_19); val2 += TIMES_6392(C5_21); val2 += TIMES_27242(C7_23); val3 = -TIMES_16382(coeff[10] - coeff[30]); val3 += TIMES_39550(coeff[14]); val3 -= TIMES_6785(coeff[26]); val3 += TIMES_12538(coeff[24] - coeff[28]); val3 += TIMES_30270(coeff[8] - coeff[12]); t=(base + val1 + val2 + val3) >> 17; out[2]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 - val2 + val3) >> 17; out[5]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 + val2 - val3 - C16) >> 17; out[26]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base + val1 - val2 - val3 + C4 - C16 + C20) >> 17; out[29]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t;//3,4,27,28 base = 0x1000000; base += coeff[0] + coeff[4] + coeff[16] + coeff[20]; base -= TIMES_30270(C2_18); base -= TIMES_12538(C6_22); val1 = TIMES_8351(coeff[9]); val1 -= TIMES_23783(coeff[11]); val1 += TIMES_35594(coeff[13]); val1 += TIMES_3459(coeff[25]); val1 -= TIMES_9851(coeff[27]); val1 += TIMES_14743(coeff[29]); val2 = TIMES_6392(C1_17); val2 -= TIMES_18202(C3_19); val2 += TIMES_27242(C5_21); val3 = -TIMES_39550(coeff[10]); val3 += TIMES_16382(coeff[14] + coeff[26]); val3 -= TIMES_6785(coeff[30]); val3 += TIMES_30270(coeff[8] + coeff[12]); val3 += TIMES_12538(coeff[24] + coeff[28]); tmp1 = TIMES_32134(C7_23); tmp2 = TIMES_41986(coeff[15]) + TIMES_17391(coeff[31]); t=(base + val1 + val2 + val3 - tmp1 - tmp2 - C4 - C20) >> 17; out[3]= t&0xFFFFFF00? t<0?0:255 : (unsigned char)t; t=(base - val1 - val2 + val3) >> 17;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -