text_bits.c
来自「实现在linux下的mpeg4编解码」· C语言 代码 · 共 892 行 · 第 1/2 页
C
892 行
} else { length = PutLevelCoeff_Inter(prev_run, level_minus_max, 0, bitstream); } } else length = 0; } else length = 0; } /* Second escape mode. Run offset */ if (length == 0) { if ( ((prev_level < 13) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q)) || ((prev_level < 28) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) ) { /* subtraction of Max Run, last = 0 */ int run_minus_max; if (prev_level == 0) { fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %d\n", prev_level); exit(-1); } if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) run_minus_max = prev_run - (intra_max_run0[prev_level]+1); else run_minus_max = prev_run - (inter_max_run0[prev_level]+1); /* boon 120697 */ if (run_minus_max < 64) { /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutRunCoeff_Intra(run_minus_max, prev_level, 0, bitstream); } else { length = PutRunCoeff_Inter(run_minus_max, prev_level, 0, bitstream); } } else length = 0; } else length = 0; } /* Third escape mode. FLC */ if (length == 0) { /* Escape coding */ if (prev_s == 1) { /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */ /* prev_level = (prev_level^0xff)+1; */ prev_level = (prev_level^0xfff)+1; } BitstreamPutBits(bitstream, 3L, 7L); /* boon */ BitstreamPutBits(bitstream, 3L, 2L); /* last */ BitstreamPutBits(bitstream, 0L, 1L); /* run */ BitstreamPutBits(bitstream, (long)(prev_run), 6L); /* 11.08.98 Sven Brandau: "insert marker_bit" due to N2339, Clause 2.1.21 */ BitstreamPutBits(bitstream, MARKER_BIT, 1); /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */ /* BitstreamPutBits(bitstream, (long)(prev_level), 8L); */ /* bits += 24; */ /* level */ BitstreamPutBits(bitstream, (long)(prev_level), 12L); /* 11.08.98 Sven Brandau: "insert marker_bit" due to N2339, Clause 2.1.21 */ BitstreamPutBits(bitstream, MARKER_BIT, 1); /*bits += 28;*/ bits += 30; } else { BitstreamPutBits(bitstream, (long)(prev_s), 1L); bits += length + 1; } } prev_run = run; prev_s = s; prev_level = level; prev_ind = ind; run = first = 0; } } } /* Encode the last coeff */ if (!first) { prev_ind = prev_ind | 1<<12; /* last coeff */ if ((prev_run < 64) && (((prev_level < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q)) || ((prev_level < 9) && ((Mode == MODE_INTRA) || (Mode == MODE_INTRA_Q))))) { /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutCoeff_Intra(prev_run, prev_level, 1, bitstream); } else { length = PutCoeff_Inter(prev_run, prev_level, 1, bitstream); } } else length = 0; /* First escape mode. Level offset */ if (length == 0) { if ( prev_run < 64 ) { /* subtraction of Max level, last = 0 */ int level_minus_max; if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) level_minus_max = prev_level - intra_max_level[1][prev_run]; else level_minus_max = prev_level - inter_max_level[1][prev_run]; if ( ( (level_minus_max < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q) ) || ( (level_minus_max < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) ) ) { /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutLevelCoeff_Intra(prev_run, level_minus_max, 1, bitstream); } else { length = PutLevelCoeff_Inter(prev_run, level_minus_max, 1, bitstream); } } else length = 0; } else length = 0; } /* Second escape mode. Run offset */ if (length == 0) { if (((prev_level < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q))|| ((prev_level < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) ) { /* subtraction of Max Run, last = 1 */ int run_minus_max; if (prev_level == 0) { fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %d\n", prev_level); exit(-1); } if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) run_minus_max = prev_run - (intra_max_run1[prev_level]+1); else run_minus_max = prev_run - (inter_max_run1[prev_level]+1); if (run_minus_max < 64) /* boon 120697 */ { /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutRunCoeff_Intra(run_minus_max, prev_level, 1, bitstream); } else { length = PutRunCoeff_Inter(run_minus_max, prev_level, 1, bitstream); } } else length = 0; } else length = 0; } /* Third escape mode. FLC */ if (length == 0) { /* Escape coding */ if (prev_s == 1) { /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */ /* prev_level = (prev_level^0xff)+1; */ prev_level = (prev_level^0xfff)+1; } BitstreamPutBits(bitstream, 3L, 7L); BitstreamPutBits(bitstream, 3L, 2L); /* boon */ BitstreamPutBits(bitstream, 1L, 1L); /* last */ BitstreamPutBits(bitstream, (long)(prev_run), 6L); /* 11.08.98 Sven Brandau: "insert marker_bit" due to N2339, Clause 2.1.21 */ BitstreamPutBits(bitstream, MARKER_BIT, 1); /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */ /* BitstreamPutBits(bitstream, (long)(prev_level), 8L); */ /* bits += 24; */ /* level */ BitstreamPutBits(bitstream, (long)(prev_level), 12L); /* 11.08.98 Sven Brandau: "insert marker_bit" due to N2339, Clause 2.1.21 */ BitstreamPutBits(bitstream, MARKER_BIT, 1); /*bits += 28;*/ bits += 30; } else { BitstreamPutBits(bitstream, (long)(prev_s), 1L); bits += length + 1; } } return bits;}/***********************************************************CommentBegin****** * * -- CodeCoeff_RVLC -- RVLC encoding of quantized DCT coefficients * * Purpose : * RVLC encoding of quantized DCT coefficients, except for * INTRADC in case of Intra macroblocks * * Arguments in : * Int Mode : encoding mode * Int *qcoeff: pointer to quantized dct coefficients * Int block : number of the block in the macroblock (0-5) * Int ncoeffs : the number of coefficients per block * * Arguments out : * Image *bitstream : pointer to the output bitstream * * Return values : * Int bits : number of bits added to the bitstream (?) * ***********************************************************CommentEnd********/Int CodeCoeff_RVLC(Int j_start, Int Mode, Int qcoeff[], Int block, Int ncoeffs, Image *bitstream){ Int j, bits; Int prev_run, run, prev_level, level, first; Int prev_ind, ind, prev_s, s, length; run = bits = 0; first = 1; prev_run = prev_level = prev_ind = level = s = prev_s = ind = 0; for (j = j_start; j< ncoeffs; j++) { /* The INTRADC encoding for INTRA Macroblocks is done in Bits_CountCoeff */ { /* do not enter this part for INTRADC coding for INTRA macro- blocks */ /* encode AC coeff */ s = 0; /* Increment run if coeff is zero */ if ((level = qcoeff[j]) == 0) { run++; } else { /* code run & level and count bits */ if (level < 0) { s = 1; level = -level; } ind = level | run<<4; ind = ind | 0<<12; /* Not last coeff */ if (!first) { /* Encode the previous ind */ if (prev_level < 28 && prev_run < 39) /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutCoeff_Intra_RVLC(prev_run, prev_level, 0, bitstream); } else { length = PutCoeff_Inter_RVLC(prev_run, prev_level, 0, bitstream); } else length = 0; if (length == 0) { /* Escape coding */ /* ESCAPE */ BitstreamPutBits(bitstream, 1L, 5L); /* LAST */ BitstreamPutBits(bitstream, 0L, 1L); BitstreamPutBits(bitstream, (long)(prev_run), 6L);/* RUN */ /* 11.08.98 Sven Brandau: "changed length for LEVEL (11 bit)" due to N2339, Clause 2.1.21 */ /* 11.08.98 Sven Brandau: "insert marker_bit befor and after LEVEL" due to N2339, Clause 2.1.21 */ /* BitstreamPutBits(bitstream, (long)(prev_level), 7L);*/ /* LEVEL */ BitstreamPutBits( bitstream, MARKER_BIT, 1 ); /* LEVEL */ BitstreamPutBits( bitstream, (long)(prev_level), 11L); BitstreamPutBits( bitstream, MARKER_BIT, 1 ); /* ESCAPE */ BitstreamPutBits(bitstream, 0L, 4L); /* ESCAPE's */ BitstreamPutBits(bitstream, (long)(prev_s),1L); bits += 5 + 1 + 6 + 1 + 11 + 1 + 4 + 1; /* bits += 24; */ } else { BitstreamPutBits(bitstream, (long)(prev_s), 1L); bits += length + 1; } } prev_run = run; prev_s = s; prev_level = level; prev_ind = ind; run = first = 0; } } } /* Encode the last coeff */ if (!first) { prev_ind = prev_ind | 1<<12; /* last coeff */ if (prev_level < 5 && prev_run < 45) /* Separate tables for Intra luminance blocks */ if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { length = PutCoeff_Intra_RVLC(prev_run, prev_level, 1, bitstream); } else { length = PutCoeff_Inter_RVLC(prev_run, prev_level, 1, bitstream); } else length = 0; if (length == 0) { /* Escape coding */ BitstreamPutBits(bitstream, 1L, 5L); /* ESCAPE */ BitstreamPutBits(bitstream, 1L, 1L); /* LAST */ /* RUN */ BitstreamPutBits(bitstream, (long)(prev_run), 6L); /* 11.08.98 Sven Brandau: "changed length for LEVEL (11 bit)" due to N2339, Clause 2.1.21 */ /* 11.08.98 Sven Brandau: "insert marker_bit befor and after LEVEL" due to N2339, Clause 2.1.21 */ /* BitstreamPutBits(bitstream, (long)(prev_level), 7L);*/ BitstreamPutBits( bitstream, MARKER_BIT, 1 ); /* LEVEL */ BitstreamPutBits( bitstream, (long)(prev_level), 11L); BitstreamPutBits( bitstream, MARKER_BIT, 1 ); BitstreamPutBits(bitstream, 0L, 4L); /* ESCAPE */ /* ESCAPE's */ BitstreamPutBits(bitstream, (long)(prev_s), 1L); bits += 24; } else { BitstreamPutBits(bitstream, (long)(prev_s), 1L); bits += length + 1; } } return bits;}/***********************************************************CommentBegin****** * * -- Bits_Reset -- To reset the structure bits * * Purpose : * To reset the structure bits, used for counting the number * of texture bits * * Arguments in : * Bits* bits : a pointer to the struct Bits * ***********************************************************CommentEnd********/voidBits_Reset (Bits *bits){ memset(bits, 0, sizeof(Bits));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?