⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frarray.c

📁 魔兽2Linux版
💻 C
📖 第 1 页 / 共 2 页
字号:
	case 16:        // Bit 7 clear		if ( !(pbi->bit_pattern & 0x0080) )		{			ret_val = TRUE;			*run_value += (pbi->bit_pattern & 0x007F) + 129;                             		}		break;     default:    	ret_val = FALSE;		break;	}    return ret_val;}/**************************************************************************** *  *  ROUTINE       :     FrArrayCodeSBRun * *  INPUTS        :     UINT8 bit_value * *  OUTPUTS       :     UINT8 run_value * *  RETURNS       :     TRUE when a value has been fully decoded. * *  FUNCTION      :     Decodes a SB run value * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/BOOL FrArrayDeCodeSBRun(  PB_INSTANCE *pbi, UINT32 bit_value, INT32 * run_value ){    BOOL ret_val = FALSE;    // Add in the new bit value.    pbi->bits_so_far++;    pbi->bit_pattern = (pbi->bit_pattern << 1) + (bit_value & 1);            // Coding scheme:	//	Codeword				RunLength    //  0                       1	//	10x					    2-3	//	110x					4-5	//	1110xx				    6-9    //  11110xxx                10-17    //  111110xxxx              18-33    //  111111xxxxxxxxxxxx      34-4129	switch ( pbi->bits_so_far )	{	case 1:  		if ( pbi->bit_pattern == 0 )		{			ret_val = TRUE;			*run_value = 1;                             		}		break; 	case 3:        // Bit 1 clear		if ( !(pbi->bit_pattern & 0x0002) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0001) + 2;                             		}		break;         	case 4:        // Bit 1 clear		if ( !(pbi->bit_pattern & 0x0002) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0001) + 4;                             		}		break;              	case 6:        // Bit 2 clear		if ( !(pbi->bit_pattern & 0x0004) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0003) + 6;                             		}		break;         	case 8:        // Bit 3 clear		if ( !(pbi->bit_pattern & 0x0008) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0007) + 10;                             		}		break;           	case 10:        // Bit 4 clear		if ( !(pbi->bit_pattern & 0x0010) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x000F) + 18;                             		}		break;     case 18:		ret_val = TRUE;		*run_value = (pbi->bit_pattern & 0x0FFF) + 34;                             		break;     default:    	ret_val = FALSE;		break;	}    return ret_val;}/**************************************************************************** *  *  ROUTINE       :     FrArrayDeCodeBlockRun * *  INPUTS        :     UINT8 bit_value * *  OUTPUTS       :     UINT8 run_value * *  RETURNS       :     TRUE when a value has been fully decoded. * *  FUNCTION      :     Decodes a block run value * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/BOOL FrArrayDeCodeBlockRun(  PB_INSTANCE *pbi, UINT32 bit_value, INT32 * run_value ){    BOOL ret_val = FALSE;    // Add in the new bit value.    pbi->bits_so_far++;    pbi->bit_pattern = (pbi->bit_pattern << 1) + (bit_value & 1);            // Coding scheme:	//	Codeword				RunLength	//	0x						1-2	//	10x						3-4	//	110x					5-6	//	1110xx					7-10	//	11110xx					11-14	//	11111xxxx				15-30 		switch ( pbi->bits_so_far )	{	case 2:         // If bit 1 is clear		if ( !(pbi->bit_pattern & 0x0002) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0001) + 1;		}           		break;      	case 3:          // If bit 1 is clear		if ( !(pbi->bit_pattern & 0x0002) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0001) + 3;		}           		break;                  	case 4:        // If bit 1 is clear		if ( !(pbi->bit_pattern & 0x0002) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0001) + 5;		}           		break;                   	case 6:        // If bit 2 is clear		if ( !(pbi->bit_pattern & 0x0004) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0003) + 7;		}           		break;              	case 7:        // If bit 2 is clear		if ( !(pbi->bit_pattern & 0x0004) )		{			ret_val = TRUE;			*run_value = (pbi->bit_pattern & 0x0003) + 11;		}           		break;                 	case 9:		ret_val = TRUE;		*run_value = (pbi->bit_pattern & 0x000F) + 15;		break;      	}    return ret_val;}/**************************************************************************** *  *  ROUTINE       :     FrArrayUnpackMode * *  INPUTS        :     None * *  OUTPUTS       :     None * *  RETURNS       :     A decoded mode token * *  FUNCTION      :     Unpacks a mode token * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/CODING_MODE FrArrayUnpackMode(PB_INSTANCE *pbi){    // Coding scheme:	//	Token                       Codeword	    Bits	//	Entry   0 (most frequent)   0               1	//	Entry   1       	        10 			    2	//	Entry   2       	        110 		    3	//	Entry   3       	        1110 		    4	//	Entry   4       	        11110 		    5	//	Entry   5       	        111110 	        6	//	Entry   6       	        1111110 	    7	//	Entry   7       	        1111111 	    7    // Initialise the decoding.    pbi->bit_pattern = 0;    pbi->bits_so_far = 0; 	pbi->bit_pattern = bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0 )		return (CODING_MODE)0;    // Get the next bit	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x0002 )		return (CODING_MODE)1;	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x0006 )		return (CODING_MODE)2;	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x000E )		return (CODING_MODE)3;	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x001E )		return (CODING_MODE)4;	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x003E )		return (CODING_MODE)5;	pbi->bit_pattern = (pbi->bit_pattern << 1) | bitread1(&pbi->br);    // Do we have a match     if ( pbi->bit_pattern == 0x007E )		return (CODING_MODE)6;    else		return (CODING_MODE)7;}/**************************************************************************** *  *  ROUTINE       :     GetNextBInitSb * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     None * *  FUNCTION      :     Initialises decode process for a Block RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void GetNextBInit(PB_INSTANCE *pbi){	pbi->NextBit = bitread1(&pbi->br);	// Read run length	FrArrayDeCodeInit(pbi);               	while ( FrArrayDeCodeBlockRun( pbi, bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );}/**************************************************************************** *  *  ROUTINE       :     GetNextSbBit * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     Value of next bit in stream. * *  FUNCTION      :     Returns next available bit value from  a Block RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/UINT8 GetNextBBit (PB_INSTANCE *pbi){	if ( !pbi->BitsLeft )	{		// Toggle the value.  		pbi->NextBit = ( pbi->NextBit == 1 ) ? 0 : 1;        // Read next run		FrArrayDeCodeInit(pbi);    	while ( FrArrayDeCodeBlockRun( pbi,bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );	}	// Have  read a bit	pbi->BitsLeft--;		// Return next bit value	return pbi->NextBit;}/**************************************************************************** *  *  ROUTINE       :     GetNextSbInitSb * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     None * *  FUNCTION      :     Initialises decode process for an SB RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void GetNextSbInit(PB_INSTANCE *pbi){	pbi->NextBit = bitread1(&pbi->br);	// Read run length	FrArrayDeCodeInit(pbi);               	while ( FrArrayDeCodeSBRun( pbi,bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );}/**************************************************************************** *  *  ROUTINE       :     GetNextSbBit * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     Value of next bit in stream. * *  FUNCTION      :     Returns next available bit value from an SB RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/UINT8 GetNextSbBit (PB_INSTANCE *pbi){	if ( !pbi->BitsLeft )	{		// Toggle the value.  		pbi->NextBit = ( pbi->NextBit == 1 ) ? 0 : 1;        // Read next run		FrArrayDeCodeInit(pbi);                   	while ( FrArrayDeCodeSBRun( pbi, bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );	}	// Have  read a bit	pbi->BitsLeft--;		// Return next bit value	return pbi->NextBit;}/**************************************************************************** *  *  ROUTINE       :     GetNextMbInitSb * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     None * *  FUNCTION      :     Initialises decode process for a MB RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void GetNextMbInit(PB_INSTANCE *pbi){	pbi->NextBit = bitread1(&pbi->br);	pbi->BitsLeft = 0;	// Read run length	FrArrayDeCodeInit(pbi);               	while ( FrArrayDeCodeMBRun( pbi,bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );}/**************************************************************************** *  *  ROUTINE       :     GetNextSbBit * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     Value of next bit in stream. * *  FUNCTION      :     Returns next available bit value from a MB RLC stream. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/UINT8 GetNextMbBit (PB_INSTANCE *pbi){	if ( !pbi->BitsLeft )	{		// Toggle the value.  		pbi->NextBit = ( pbi->NextBit == 1 ) ? 0 : 1;        // Read next run		FrArrayDeCodeInit(pbi);           	while ( FrArrayDeCodeMBRun( pbi, bitread1(&pbi->br), &pbi->BitsLeft ) == FALSE );	}	// Decrement bits left in run counter	pbi->BitsLeft--;		// Return next bit value	return pbi->NextBit;}/**************************************************************************** *  *  ROUTINE       :     ReadBlockPatternInit * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     None * *  FUNCTION      :     Initialises the block pattern reader * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/void ReadBlockPatternInit (PB_INSTANCE *pbi){	pbi->BlockPatternPredictor = 0;}/**************************************************************************** *  *  ROUTINE       :     ReadNextBlockPattern * *  INPUTS        :     None.  *                       *  OUTPUTS       :     None. * *  RETURNS       :     A pattern of coded or uncoded blocks for a macro block. * *  FUNCTION      :     Returns the block pattern for the next macro block. * *  SPECIAL NOTES :     None.  * * *  ERRORS        :     None. * ****************************************************************************/UINT8 ReadNextBlockPattern (PB_INSTANCE *pbi){	UINT8 BlockPattern = 0;	UINT8 Bitpattern = 0;	UINT32 BitCount = 3;	// Read three bits and test to see if we have a valid token.	Bitpattern = bitread(&pbi->br, 3);	// Test pattern to see if is a valid token.	BlockPattern = BlockDecode1[pbi->BlockPatternPredictor][Bitpattern];	// if pattern was not a valid token	if ( !BlockPattern )	{		BitCount++;		Bitpattern = (Bitpattern << 1) + bitread1(&pbi->br);		// Test pattern to see if is a valid token.		BlockPattern = BlockDecode2[pbi->BlockPatternPredictor][Bitpattern];		if ( !BlockPattern )		{			BitCount++;			Bitpattern = (Bitpattern << 1) + bitread1(&pbi->br);			BlockPattern = BlockDecode3[pbi->BlockPatternPredictor][Bitpattern];		}	}	// Update the entropy predictor for next time.	pbi->BlockPatternPredictor = BPPredictor[BlockPattern];	return BlockPattern;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -