您的位置:控制工程论坛网论坛 » 嵌入式系统 » union在嵌入式编程中的3个妙用(下)

junhong07

junhong07   |   当前状态:在线

总积分:7915  2024年可用积分:1

注册时间: 2008-01-15

最后登录时间: 2019-06-23

空间 发短消息加为好友

union在嵌入式编程中的3个妙用(下)

junhong07  发表于 2009/10/21 20:56:32      1118 查看 0 回复  [上一主题]  [下一主题]

手机阅读

3. 使不同数据包兼容
 
union的用法如下:
struct _my_struct
{
 unsigned int struct_id
 
 typedef union _my_union
 {
   struct my_struct_1;
   struct my_struct_2;
   struct my_struct_3;
 
 }my_union;
 
}my_struct;
 
我们公司在处理音频视频数据流方面,为了区分音频和视频数据以及来自网络和编解码的数据并减少内存占用使用了下面的数据结构。这种union使用方法在网络应用中特别常见。在数据结构TFrameBufferInfo中,用bufferType标识数据来源。
 
/** \struct TABufferInfoFromCodec
 * \brief  来自编码器的音频数据的缓冲区信息
 */
typedef struct
{
 int  codecId;          /**< codec ID */
 int  packetNum;        /**< 该帧数据一共有多少个包 */
 int  actualNum;        /**< 当前已存入的包数 */
 int  packetLen;        /**< 正常数据包最大长度,包括包头 */ 
 int  leftPacketLen;    /**< 最后一个数据包大小,包括包头 */
 int  frameSample;      /**< 0x00表示8kHz,0x01表示11kHz*/
 int  timeStamp;        /**< 表示该帧的编码时间 */
 int  dataLen;          /**< 数据长度,包括包头 */
 int  ready;            /**< 该帧数据的数据包是否都已经写入*/
 unsigned char* buffer; /**< 数据指针 */
 int  reserve1;         /**< 保留位,用0填充 */

} TABufferInfoFromCodec;
 
/** \struct TVBufferInfoFromCodec
 * \brief  来自编码器的视频数据的缓冲区信息
 */
typedef struct
{
 int  codecId;          /**< codec ID */
 int  bKeyFrame;        /**< TRUE:关键帧 */
 int  packetNum;        /**< 该帧数据一共有多少个包 */
 int  actualNum;        /**< 当前已存入的包数 */
 int  packetLen;        /**< 正常数据包最大长度,包括包头 */ 
 int  leftPacketLen;    /**< 最后一个数据包大小,包括包头 */
 int  timeStamp;        /**< 表示该帧的编码时间 */
 int  dataLen;          /**< 数据长度,包括包头 */
 int  ready;            /**< 该帧数据的数据包是否都已经写入*/
 unsigned char* buffer; /**< 数据指针 */
 int reserve1;          /**< 保留位,用0填充 */

} TVBufferInfoFromCodec;
 
 
/** \struct TVBufferInfoToCodec
 * \brief  来自网络的视频数据的缓冲区信息
 */
typedef struct
{
 int  codecId;          
 int  bKeyFrame;       
 int  packetNum;       
 int  actualNum;       
 int  packetLen;       
 int  leftPacketLen;    
 int  rtpLen;           
 int  timeStamp;        
 int  firstSquence;     
 int  dataLen;          
 int  ready;           
 unsigned char* buffer;

} TVBufferInfoToCodec;
 
/** \struct TABufferInfoToCodec
 * \brief  来自网络的音频数据的缓冲区信息
 */
typedef struct
{
 int  codecId;          
 int  packetNum;        
 int  actualNum;        
 int  packetLen;        
 int  leftPacketLen;    
 int  rtpLen;           
 int  timeStamp;        
 int  firstSquence;     
 int  dataLen;          
 int  ready;            
 unsigned char* buffer; 
 int reserve1;         

} TABufferInfoToCodec;
 
 
/** \struct TABufferInfoToCodec
 * \brief  数据缓冲区信息结构
 */
typedef struct
{
 int bufferType;
 
 union
 { 
  TVBufferInfoFromCodec bufferInfoFromVCoder; 
  TABufferInfoFromCodec bufferInfoFromACoder; 
  TVBufferInfoToCodec bufferInfoFromVNetWork;
  TABufferInfoToCodec bufferInfoFromANetWork; 

 } buffer_info;
 
} TFrameBufferInfo; 
 
int send_to(void* stream);

int send_to(void* stream)
{
 /*省略*/
}
 
int main(int argc, char *argv[])
{
  TFrameBufferInfo tFrameBufferInfo;
  TVBufferInfoFromCodec* pVBufferInfoFromCodec;
  unsigned char buffer[1200*5];/*最大存放5个数据包*/
    
  /*假设你要向网络发送一段视频数据,音频接收为1,
  视频接收为2,*音频发送为3,视频发送为4*/
  tFrameBufferInfo.bufferType=4;
  
  pVBufferInfoFromCodec
   =&tFrameBufferInfo.buffer_info.bufferInfoFromVCoder;
  
  pVBufferInfoFromCodec->bKeyFrame     = 1;
  pVBufferInfoFromCodec->packetNum     = 2;  
  pVBufferInfoFromCodec->actualNum     = 2;
  pVBufferInfoFromCodec->leftPacketLen = 123;
  pVBufferInfoFromCodec->dataLen       = 1323;  
  pVBufferInfoFromCodec->ready         = 1;  
  pVBufferInfoFromCodec->buffer        = buffer;
  
  send_to((void*)&tFrameBufferInfo);
}
1楼 0 0 回复