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

📄 demux.cpp

📁 自己在wince的环境下做的一移动数字电视驱动
💻 CPP
字号:
/////////////////
//Author: Wenson Chen.
//Company: Innofidei.com
//Date: 2007/09/26-
//Licesence Notes:
//

/*++ Demux Base Core Code for CMMB, which provided the demuxing service

Copyright (C) 2007-2008 Innofidei, Inc.

Module Name: Demux.cpp

History: 
--*/

#include "Demux.h"
#include "string.h"
#include "stdio.h"
/** Just comment the print out in the Demux Module
*/
//#define printf(...)  //

void GetDate(int& y, int & m, int & d, WORD mjd)
{
	y = (int)((mjd - 15078.2)/365.25);
	m = (int)((mjd - 14956.1 - y*365.25)/30.6001);
	d = (int)(mjd - 14956 - y*365.25 - m*30.6001);
	int k = 0;
	if((m == 14) || (m == 15))
	{
		k = 1;
	}
	y += k;
	m -= 1 + 12*k;
}

int CDemuxer::Demultiplex(LPBYTE lpIn, DWORD frameLen)
{
	DWORD dwRet		= ParseHeader(lpIn);

	if(DEMUX_NO_ERROR != dwRet)
	{
		RecoverMode2Fragment(lpIn, frameLen);
		return DEMUX_CRC_ERROR;
	}

	lpIn += getHeaderLen();

	if(nMfID == 0)
	{
		for(unsigned i = 0; i < nSubFrameNum; i++ )
		{
			switch(*lpIn)
			{
			case TABLE_SN_NIT://这个解析nit的函数设置了伪nit表
				m_Nit.Parse(lpIn, dwSubFrameLen[i]);
				OnNitParsed();
				break;
			case TABLE_SN_CMCT:
				m_Cmct.Parse(lpIn, dwSubFrameLen[i]);
				if(OnCmctParsed() == false)
				{
					ParseCMct();
				}
				break;
#ifdef USE_SCT
			case TABLE_SN_CSCT:
				m_Sct.Parse(lpIn, dwSubFrameLen[i]);
				break;
			case TABLE_SN_SSCT:
				m_stSct.Parse(lpIn, dwSubFrameLen[i]);
				break;
#endif
			case TABLE_SN_SMCT:
				m_Smct.Parse(lpIn, dwSubFrameLen[i]);
				if(OnSmctParsed()==false)
				{
					ParseSMct();
				}
				break;
			case TABLE_SN_ESG: // ESG Basic Description Table
				m_Esg.Parse(lpIn, dwSubFrameLen[i]);
				OnEsgParsed();
				break;
			case TABLE_SN_CA://CA
				m_ca.Parse(lpIn, dwSubFrameLen[i]);
				OnCaParsed();
				break;
			case TABLE_SN_EMERGENCY:
				m_eb.Parse(lpIn, dwSubFrameLen[i]);
				OnEbParsed();
				break;
			default:
				printf("Unsupport control table!id:%u, len=%d\n",*lpIn, dwSubFrameLen[i]);
				break;
			}
			/* 解析下一个子帧中的控制表 */
			lpIn += dwSubFrameLen[i];
		}
		OnTS0Parsed();
		return 0;
	}

	OnFrameHeaderInfo(lastFrameHeader);
	lastFrameHeader = *(CFrameHeader*)this;

	for(unsigned i = 0; i < nSubFrameNum; i++) 
	{
		if (DEMUX_NO_ERROR == ParseSubframe(i, lpIn))
			lpIn += dwSubFrameLen[i];
	}

	return 0;
}

#define MEMSET(x) {LPBYTE p = (LPBYTE)&x;for(int i=0;i<sizeof(x);i++) p[i] = 0;}

extern void BuildCrcTable(void);

CDemuxer::CDemuxer(WORD videoPort, WORD audioPort)
{
	serviceMode = false;
	MEMSET(m_Nit);
	MEMSET(m_Cmct);

#ifdef USE_SCT
	MEMSET(m_Sct);
	MEMSET(m_stSct);
#endif
	MEMSET(m_Smct);
	MEMSET(m_Esg);
	MEMSET(m_eb);

	BuildCrcTable();

#ifdef RTP_OUTPUT_SUPPORT
	m_videoSeq	= 0;
	m_audioSeq	= 0;
	m_VideoPort = videoPort;
	m_AudioPort = audioPort;
#endif
	XPE_pos			= 0;
	XPE_total_len	= 0;
	XPE_State		= false;
}

void CDemuxer::OnFrameHeaderInfo(CFrameHeader& last/*The header of last second*/)
{
}

⌨️ 快捷键说明

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