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

📄 bitwriter.h

📁 1. 8623L平台
💻 H
字号:
/************************************************************	Copyright (C) 2002	Sigma Designs, Inc. All Rights Reserved	Proprietary and Confidential    Author: David Weiguo Zheng			<david_zheng@sdesigns.com>    File Name: bitWrite.h	Purpose: All functions to handle bit writing**************************************************************/#ifndef _BITWRITE_H_#define _BITWRITE_H_typedef struct{	RMint32 pos;	RMuint32 reg;	RMuint32 * buf;	RMuint32 * ptr;	RMuint32 * tmp;} BitWriter;static void __inline bw_init(BitWriter * const bw, void * const pointer, const RMuint32 start_byte, const RMuint32 start_bit);static void __inline bw_reset(BitWriter * const bw);static RMuint32 __inline bw_byte_length(BitWriter * const bw);static RMuint32 __inline bw_bit_length(BitWriter * const bw);static void __inline bw_put1(BitWriter * const bw, const RMuint32 bit);static void __inline bw_put(BitWriter * const bw, const RMuint32 value, const RMint32 size);static void __inline bw_byte_align(BitWriter * const bw);static void __inline bw_dword_align(BitWriter * const bw);/*   initialize bitstream structure   data in buffer need to be byte_aligned already*/static void __inline bw_init(BitWriter * const bw, void * const pointer, const RMuint32 start_byte, const RMuint32 start_bit){	RMuint32 aligned = start_byte & 3;	//printf("Aligned in bw_init = %lu, start_bit = %lu\n", aligned, start_bit);		if(aligned)	{	  RMuint32 i;	  RMuint8  *ptr;	  bw->buf = (RMuint32 *)pointer;	  bw->ptr = bw->buf + (start_byte >> 2);	  ptr = (RMuint8 *)bw->ptr;	  		  bw->reg = 0;	  bw->pos = 0;	  for(i=0; i<aligned; i++)	  {		  bw->reg <<= 8;		  bw->reg |= *ptr++;		  bw->pos += 8;	  }	  	  bw->reg <<= (32 - bw->pos);	  if(start_bit)	  {		  i = *ptr;		  bw->reg |= i << ((32 - bw->pos) - 8);		  bw->pos += start_bit;		  			  bw->reg &= (0xffffffff << (32 - bw->pos));	  }	}	else	{	  bw->reg = bw->pos = 0;	  bw->buf = (RMuint32 *)pointer;	  bw->ptr = bw->buf + (start_byte >> 2);	  if(start_bit)	  {	    RMuint32 i;	    RMuint8  *ptr;	    ptr = (RMuint8 *)bw->ptr;		i = *ptr;	    bw->reg |= i << 24;				bw->pos += start_bit;			    bw->reg &= (0xffffffff << (32 - bw->pos));	  }	}}static void __inline bw_reset(BitWriter * const bw){    bw->reg = bw->pos = 0;		bw->ptr = bw->buf;}/* bitstream length (unit bits) */static RMuint32 __inline bw_byte_length(BitWriter * const bw){	RMuint32 len = (RMuint32) bw->ptr - (RMuint32) bw->buf;    if (bw->pos)    {		RMuint32 ui32 = bw->reg;                RMuint32ToBeBuf(ui32, (RMuint8 *) &ui32);		*bw->ptr = ui32;		len += ((bw->pos + 7) >> 3);    }	return len;}static RMuint32 __inline bw_bit_length(BitWriter * const bw){	RMuint32 len = ((RMuint32) bw->ptr - (RMuint32) bw->buf)<<3;    len += bw->pos;	return len;}/* write single bit to bitstream */static void __inline bw_put1(BitWriter * const bw, const RMuint32 bit){    if (bit)		bw->reg |= (0x80000000 >> bw->pos);    bw->pos ++;    if (bw->pos > 31)    {		RMuint32 ui32 = bw->reg;		bw->reg = 0;                RMuint32ToBeBuf(ui32, (RMuint8 *) &ui32);		*bw->ptr++ = ui32;		bw->pos -= 32;    }}/* put n bits to bitwriter */static void __inline bw_put(BitWriter * const bw, const RMuint32 value, const RMint32 size){  if(size)  {	RMint32 shift = 32 - bw->pos - size;	if (shift>0) {		// there is more than enough bits available to insert the data		bw->reg |= (value << shift);		bw->pos += size;		return;	} 	else	{	   if(shift)    // no enough bits to insert data		   {		// 32bit cache buffer full, need to flush the cache and update again		RMint32 room = 32-bw->pos;		RMint32 first_shift = size-room;		RMuint32 ui32 = bw->reg | (value >> first_shift);				room = 32-first_shift;                RMuint32ToBeBuf(ui32, (RMuint8 *) &ui32);		*bw->ptr++ = ui32;		bw->reg = (value << room);				bw->pos = first_shift;		return;	   }	   else//	if(shift == 0)	   {		RMuint32 ui32 = bw->reg | (value << shift);                RMuint32ToBeBuf(ui32, (RMuint8 *) &ui32);		*bw->ptr++ = ui32;		bw->pos = 0;		bw->reg = 0;		return;	   }	}  }}/* pad bitwriter bitstream to align byte boundary */static void __inline bw_byte_align(BitWriter * const bw){	RMint32 remainder = bw->pos & 7;    if (remainder)    {				if(remainder < 8)		{		bw_put1(bw, 0);		remainder ++;		}		// still needs padding		if(remainder < 8)		{		  RMuint32 padding_bits = 0xff >> remainder;		  bw_put(bw, padding_bits, 8-remainder);		}    }}/* pad bitwriter bitstream to align 32bit (dword) boundary */static void __inline bw_dword_align(BitWriter * const bw){	RMint32 remainder = bw->pos & 31;    if (remainder)    {				//padding		  RMuint32 padding_bits = 0xffffffff >> remainder;		  bw_put(bw, padding_bits, 32-remainder);    }}#endif /* _BITWRITE_H_ */

⌨️ 快捷键说明

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