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

📄 cdemultiplex.cpp

📁 这是G.723和G.729的音频编解码的源代码
💻 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 + -