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

📄 packetprocessing.cpp

📁 Teletext module usually used in the DVB area.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -