📄 packetprocessing.cpp
字号:
if (line <= last_line)
{
m_PageBuffer[line].m_bTransmitted = true;
if (line == 0)
{
memcpy(&m_PageBuffer[line].m_Line, data + 8, 32);
}
else
{
memcpy(&m_PageBuffer[line].m_Line, data, 40);
}
}
if (line >= 0)
{
m_nValidLines++;
}
}
return updated;
}
void
SMagazinePage::AddSubPage(SMagazineSubPage& sub_page, int sub_page_number)
{
SMagazineSubPageInstances& instances = m_SubPages[sub_page_number];
if (!sub_page.HasValidLines())
{
if (instances.size() != 0)
{
instances.begin()->m_EndMilliseconds = sub_page.m_StartMilliseconds;
}
}
else
{
if ((instances.size() != 0) && (instances.begin()->m_EndMilliseconds == 0))
{
instances.begin()->m_EndMilliseconds = sub_page.m_StartMilliseconds;
}
instances.push_front(sub_page);
}
}
void
SMagazinePage::Clear(void)
{
m_SubPages.clear();
}
int
SMagazinePage::GetPage(void)
{
std::map<int, SMagazineSubPageInstances>::iterator it;
for (it = m_SubPages.begin(); it != m_SubPages.end(); it++)
{
SMagazineSubPageInstances& instances = it->second;
if (instances.size() != 0)
{
for
(
std::list<SMagazineSubPage>::iterator instance_iterator = instances.begin();
instance_iterator != instances.end();
instance_iterator++
)
{
if (instance_iterator->m_Valid && (instance_iterator->m_nPage != 0xFF))
{
return instance_iterator->m_nPage;
}
}
}
}
return -1;
}
bool
SMagazinePage::HasValidSubPages(void)
{
std::map<int, SMagazineSubPageInstances>::iterator it;
for (it = m_SubPages.begin(); it != m_SubPages.end(); it++)
{
SMagazineSubPageInstances& instances = it->second;
if (instances.size() != 0)
{
for
(
std::list<SMagazineSubPage>::iterator instance_iterator = instances.begin();
instance_iterator != instances.end();
instance_iterator++
)
{
if (instance_iterator->m_nValidLines != 0)
{
return true;
}
}
}
}
return false;
}
SMagazine::SMagazine(void)
{
}
SMagazine::SMagazine(const SMagazine& copy)
:
m_SubPageUnderConstruction(copy.m_SubPageUnderConstruction)
{
for (int page = 0; page < 256; page++)
{
m_Pages = copy.m_Pages;
}
}
void
SMagazine::AddPageUnderConstruction(void)
{
if (!m_SubPageUnderConstruction.HasValidLines())
{
// ATLTRACE("*************** new epoch (0x%x)***************\r\n", m_SubPageUnderConstruction.m_nPage);
// a NULL page without valid lines is an indication to set the end pts for all other pages
// in the magazine
for (std::map<int, SMagazinePage>::iterator mag_it = m_Pages.begin(); mag_it != m_Pages.end(); mag_it++)
{
std::map<int, SMagazineSubPageInstances>::iterator it;
SMagazinePage& magazine_page = mag_it->second;
for (it = magazine_page.m_SubPages.begin(); it != magazine_page.m_SubPages.end(); it++)
{
SMagazineSubPageInstances& instances = it->second;
SMagazineSubPageInstances::iterator instance_it;
SMagazineSubPage& most_recently_added_page = instances.front();
if (most_recently_added_page.m_EndMilliseconds == 0)
{
most_recently_added_page.m_EndMilliseconds = m_SubPageUnderConstruction.m_StartMilliseconds;
}
/*
for (SMagazineSubPageInstances::reverse_iterator instance_it = instances.rbegin(); instance_it != instances.rend(); instance_it++)
{
unsigned int sh = (unsigned int)(instance_it->m_StartMilliseconds/(1000*60*60));
unsigned int sm = (unsigned int)((instance_it->m_StartMilliseconds/(1000*60))-(sh*60));
unsigned int ss = (unsigned int)((instance_it->m_StartMilliseconds/1000)-(sh*3600)-(sm*60));
unsigned int su = (unsigned int)(instance_it->m_StartMilliseconds-(sh*1000*60*60)-(sm*1000*60)-(ss*1000));
unsigned int eh = (unsigned int)(instance_it->m_EndMilliseconds/(1000*60*60));
unsigned int em = (unsigned int)((instance_it->m_EndMilliseconds/(1000*60))-(eh*60));
unsigned int es = (unsigned int)((instance_it->m_EndMilliseconds/1000)-(eh*3600)-(em*60));
unsigned int eu = (unsigned int)(instance_it->m_EndMilliseconds-(eh*1000*60*60)-(em*1000*60)-(es*1000));
vector<STeletextSubtitleLine> texts;
instance_it->GenerateIsoTextLines
(
texts,
FALSE,
23
);
char* text = "";
if (texts.size() != 0)
{
text = texts.front().text;
}
char buff[512];
sprintf(buff, "Page(0x%x) SubPage(0x%x) %d:%02d:%02d.%03d end=%d:%02d:%02d.%03d (%s)\r\n", instance_it->m_nPage, instance_it->m_nSubPage, sh, sm, ss, su, eh, em, es, eu, text);
ATLTRACE(buff);
}
*/
}
}
}
else
{
int page_in_magazine = m_SubPageUnderConstruction.m_nPage & 0xFF;
int sub_page_number = m_SubPageUnderConstruction.m_nSubPage;
m_Pages[page_in_magazine].AddSubPage(m_SubPageUnderConstruction, sub_page_number); // add the page, it is ready
}
}
bool CDVBTeletextSubtitles::ProcessPesPacket(void)
{
int stream_id = m_PesPacketBuffer[3];
int PES_packet_length = (m_PesPacketBuffer[4] << 8) | m_PesPacketBuffer[5];
if ( (stream_id == 0xbd) && ( (m_PesPacketBuffer[m_PesPacketBuffer[8] + 9] >= 0x10) && (m_PesPacketBuffer[m_PesPacketBuffer[8] + 9] <= 0x1f) ) )
{
int PTS_DTS_flags = (m_PesPacketBuffer[7] & 0xb0) >> 6;
unsigned __int64 program_time_ms = 0;
if (PTS_DTS_flags == 0x02)
{
// program_time_ms is in bytes 9,10,11,12,13
unsigned __int64 p0 = (m_PesPacketBuffer[13] & 0xfe) >> 1 | ((m_PesPacketBuffer[12] & 1) << 7);
unsigned __int64 p1 = (m_PesPacketBuffer[12] & 0xfe) >> 1 | ((m_PesPacketBuffer[11] & 2) << 6);
unsigned __int64 p2 = (m_PesPacketBuffer[11] & 0xfc) >> 2 | ((m_PesPacketBuffer[10] & 3) << 6);
unsigned __int64 p3 = (m_PesPacketBuffer[10] & 0xfc) >> 2 | ((m_PesPacketBuffer[9] & 6) << 5);
unsigned __int64 p4 = (m_PesPacketBuffer[9] & 0x08) >> 3;
program_time_ms = (p0 | (p1 << 8) | (p2 << 16) | (p3 << 24) | (p4 << 32)) / 90;
if (m_FirstEventMilliseconds == 0)
{
m_FirstEventMilliseconds = program_time_ms;
}
program_time_ms -= m_FirstEventMilliseconds;
}
int k = m_PesPacketBuffer[8] + 10;
while (k < m_PesPacketLength)
{
int data_unit_id = m_PesPacketBuffer[k++];
int data_len = m_PesPacketBuffer[k++];
if (data_len != 0x2c)
{
data_len = 0x2c;
}
for (int j = k; j < k + data_len; j++)
{
m_PesPacketBuffer[j] = invtab[m_PesPacketBuffer[j]];
}
unsigned char mpag = unham(m_PesPacketBuffer[k + 2], m_PesPacketBuffer[k + 3]);
unsigned char mag = mpag & 7;
unsigned char line = (mpag >> 3) & 0x1f;
// mag == 0 means page is 8nn
if (mag == 0)
mag = 8;
if
(
m_Magazines[mag].m_SubPageUnderConstruction.SetLine
(
line,
&m_PesPacketBuffer[k + 4],
mag,
m_nLastLine,
&m_Magazines[mag],
program_time_ms
)
)
{
RefreshDisplay();
}
k += data_len;
}
return true;
}
else
{
// "This is not a private data type 1 stream - are you sure you specified the correct PID?
return false;
}
}
bool CDVBTeletextSubtitles::CheckPesPacket(void)
{
int i = 0;
int stream_id;
int PES_packet_length;
if ( (m_PesPacketBuffer[0] != 0) || (m_PesPacketBuffer[1] != 0) || (m_PesPacketBuffer[2] != 1))
{
// PES ERROR: does not start with 0x000001
return false;
}
i = 3;
// stream_id: e0=video, c0=audio, bd=DVB subtitles, AC3 etc
stream_id = m_PesPacketBuffer[i++];
PES_packet_length = (m_PesPacketBuffer[i] << 8) | m_PesPacketBuffer[i + 1];
i += 2;
if ( (stream_id & 0xe0) == 0xe0)
{
// Video stream - PES_packet_length must be equal to zero
if (PES_packet_length!=0)
{
// ERROR IN VIDEO PES STREAM: PES_packet_length=%d (must be zero)\n",PES_packet_length);
return false;
}
}
else
{
if (PES_packet_length + 6 != m_PesPacketLength)
{
// ERROR IN NON-VIDEO PES: n=%d,PES_packet_length=%d\n",n,PES_packet_length
return false;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -