3. 使不同数据包兼容
union的用法如下:
struct _my_struct
{
unsigned int struct_id
{
unsigned int struct_id
typedef union _my_union
{
struct my_struct_1;
struct my_struct_2;
struct my_struct_3;
{
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填充 */
* \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填充 */
* \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;
} TABufferInfoToCodec;
} buffer_info;
} TFrameBufferInfo;
int send_to(void* stream)
{
/*省略*/
}
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);
* \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;
* \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;
* \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);
}