📄 cdemultiplex.cpp
字号:
//CDemultiplex.cpp
//begin of CDemultiplex
#include "stdafx.h"
#include <afxmt.h>
#include <afxtempl.h>
#include "CPacker.h"
#include "CChannel.h"
#include "CDemultiplex.h"
CDemultiplex::CDemultiplex(int nMaxFrameLength)
{
m_nMaxFrameLength=nMaxFrameLength;
m_pbyFrame=new BYTE[nMaxFrameLength];
m_nTotalChannel=6;
m_bFindFrameHeader=FALSE;
m_nValidLength=0;
for(int i=0;i<16;i++)
m_pChannelArray[i]=NULL;
}
CDemultiplex::~CDemultiplex()
{
if(m_pbyFrame)
delete m_pbyFrame;
}
BOOL CDemultiplex::AddAChannel(CReceiveChannel* pReceiveChannel)
{
if(pReceiveChannel==NULL)return FALSE;
int nNumber=pReceiveChannel->GetChannelNumber();
if(nNumber>=0&&nNumber<=15)
{
m_pChannelArray[nNumber]=pReceiveChannel;
return TRUE;
}
return FALSE;
}
BOOL CDemultiplex::DeleteAChannel(int nChannelNumber)
{
if(nChannelNumber>=0&&nChannelNumber<=15)
{
m_pChannelArray[nChannelNumber]=NULL;
return TRUE;
}
return FALSE;
}
int CDemultiplex::FindFrameFlag(BYTE* pbyStream,int nLength)
{
for(int i=0;i<nLength;i++)
{
if(pbyStream[i]==FRAME_FLAG)
return i;
}
return -1;
}
int CDemultiplex::FindFrameFlagByBit(BYTE *pbyStream, int nLength)
{
BYTE a, k1, k2, k3;
int k;
k = 8;//every byte have 8 bit
for(int i=0; i<nLength; i++)
{
for(int j=0; j<8; j++)
{
a = pbyStream[i] >> j;
k1 = 0xff >> (8 - j);
k2 = 0xff & k1;
k3 = pbyStream[i+1] & k2;
k3 = k3 << (8-j);
a = a | k3;
if((a & FRAME_FLAG) == FRAME_FLAG)
return (k/8 - 1);
else
k += 1;
}
}
return -1;
}
BOOL CDemultiplex::ProcessFindFrameFlag(BYTE* pbyStream,int nLength,int nFlagPos)
{
//this frame have frame flag
if(nFlagPos+m_nValidLength<=m_nMaxFrameLength)
{
//have get a complete frame
CopyMemory(m_pbyFrame+m_nValidLength,pbyStream,nFlagPos);
m_nValidLength+=nFlagPos;
ProcessAFrame();
m_nValidLength=0;
return TRUE;
}
//have an error occur
//discard all data that stored in frame buffer
m_bFindFrameHeader=FALSE;
m_nValidLength=0;
return FALSE;
}
BOOL CDemultiplex::ProcessNoFindFrameFlag(BYTE* pbyStream,int nLength)
{
if(nLength+m_nValidLength<=m_nMaxFrameLength)
{
CopyMemory(m_pbyFrame+m_nValidLength,pbyStream,nLength);
m_nValidLength+=nLength;
return TRUE;
}
//have a error occur
//the max frame length is too small
//discard all data that have stored in frame buffer
m_bFindFrameHeader=FALSE;
m_nValidLength=0;
return FALSE;
}
void CDemultiplex::ProcessAFrame()
{
int nPacketLength;
CPacker Packer;
int nPM=Packer.Unpack(m_pbyFrame,m_nValidLength,&nPacketLength);//去掉填充码和转义码
int nMT=nPM&MT_MASK;//media type,媒体类型
//packet type,包类型,将一个packet拆成几个frame,前几个frame的
//PT_MASK为PT_CONTINUE,最后一个为PT_END,以便于重新组装成packet
int nPT=nPM&PT_MASK;
if(m_pChannelArray[nMT]!=NULL)
{
if(nPT==PT_END)//一个packet的最后一个frame,packet组装完成
m_pChannelArray[nMT]->InputPacket(m_pbyFrame,nPacketLength,TRUE);
else
m_pChannelArray[nMT]->InputPacket(m_pbyFrame,nPacketLength,FALSE);
}
}
//////////////////////////////////////////////////////////////////////////////
//pbyStream--从硬件读入的数据
//nLength----数据的长度
//功能-------将读入的数据重新组装成packet,并送入相应的解码器中
void CDemultiplex::InputStream(BYTE* pbyStream,int nLength)
{
if(pbyStream==NULL)return;
if(nLength<1)return;
if(m_bFindFrameHeader)
{//have find frame header
int nPos=FindFrameFlag(pbyStream,nLength);//1999.12.21
if(nPos==-1)
{//this frame do not contain frame flag
ProcessNoFindFrameFlag(pbyStream,nLength);
return;
}
//nPos!=-1
//this frame have frame flag
ProcessFindFrameFlag(pbyStream,nLength,nPos);
//find next frame flag:
InputStream(pbyStream+nPos+1,nLength-nPos-1);
}
else
{
m_bFindFrameHeader=FALSE;
m_nValidLength=0;
int nPos=FindFrameFlag(pbyStream,nLength);//1999.12.21
if(nPos==-1)
return;
m_bFindFrameHeader=TRUE;
InputStream(pbyStream+nPos+1,nLength-nPos-1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -