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 + -
显示快捷键?