📄 demux.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 + -