HRESULT CMpeg2DataParser::ParsePAT() { HRESULT hr; CComPtr<ISectionList> pSectionList; DWORD dwLength; PSECTION data; WORD wTSID; WORD wSectionLength; CheckNoLog (m_pData->GetSection (PID_PAT, SI_PAT, &m_Filter, 5000, &pSectionList)); CheckNoLog (pSectionList->GetSectionData (0, &dwLength, &data)); CGolombBuffer gb ((BYTE*)data, dwLength); // program_association_section() CheckNoLog (ParseSIHeader (gb, SI_PAT, wSectionLength, wTSID)); while (gb.GetSize() - gb.GetPos() > 4) { WORD program_number = gb.BitRead(16); // program_number gb.BitRead(3); // reserved if (program_number==0) { gb.BitRead(13); // network_PID } else { WORD program_map_PID = gb.BitRead(13); // program_map_PID if (Channels.Lookup(program_number)) { Channels [program_number].SetPMT (program_map_PID); ParsePMT (Channels [program_number]); } } } return S_OK; }
HRESULT CMpeg2DataParser::ParsePMT(CDVBChannel& Channel) { HRESULT hr; CComPtr<ISectionList> pSectionList; DWORD dwLength; PSECTION data; WORD wTSID; WORD wSectionLength; Channel.SetVideoFps(DVB_FPS_NONE); Channel.SetVideoChroma(DVB_Chroma_NONE); CheckNoLog(m_pData->GetSection((PID)Channel.GetPMT(), SI_PMT, &m_Filter, 15000, &pSectionList)); CheckNoLog(pSectionList->GetSectionData(0, &dwLength, &data)); CGolombBuffer gb((BYTE*)data, dwLength); // TS_program_map_section() CheckNoLog(ParseSIHeader(gb, SI_PMT, wSectionLength, wTSID)); gb.BitRead(3); // reserved Channel.SetPCR((ULONG)gb.BitRead(13)); // PCR_PID gb.BitRead(4); // reserved BeginEnumDescriptors(gb, nType, nLength) { // for (i=0;i<N;i++) { SkipDescriptor(gb, nType, nLength); // descriptor() }
HRESULT CMpeg2DataParser::ParseSDT(ULONG ulFreq) { HRESULT hr; CComPtr<ISectionList> pSectionList; DWORD dwLength; PSECTION data; WORD wTSID; WORD wONID; WORD wSectionLength; CheckNoLog (m_pData->GetSection (PID_SDT, SI_SDT, &m_Filter, 5000, &pSectionList)); CheckNoLog (pSectionList->GetSectionData (0, &dwLength, &data)); CGolombBuffer gb ((BYTE*)data, dwLength); // service_description_section() CheckNoLog (ParseSIHeader (gb, SI_SDT, wSectionLength, wTSID)); wONID = gb.BitRead(16); // original_network_id gb.BitRead(8); // reserved_future_use while (gb.GetSize() - gb.GetPos() > 4) { CDVBChannel Channel; Channel.SetFrequency (ulFreq); Channel.SetTSID (wTSID); Channel.SetONID (wONID); Channel.SetSID (gb.BitRead(16)); // service_id uimsbf gb.BitRead(6); // reserved_future_use bslbf gb.BitRead(1); // EIT_schedule_flag bslbf Channel.SetNowNextFlag(!!gb.BitRead(1)); // EIT_present_following_flag bslbf gb.BitRead(3); // running_status uimsbf Channel.SetEncrypted (!!gb.BitRead(1)); // free_CA_mode bslbf // Descriptors: BeginEnumDescriptors(gb, nType, nLength) { switch (nType) { case DT_SERVICE : gb.BitRead(8); // service_type nLength = gb.BitRead(8); // service_provider_name_length gb.ReadBuffer (DescBuffer, nLength); // service_provider_name nLength = gb.BitRead(8); // service_name_length gb.ReadBuffer (DescBuffer, nLength); // service_name DescBuffer[nLength] = 0; Channel.SetName (ConvertString (DescBuffer, nLength)); TRACE ("%15S %d\n", Channel.GetName(), Channel.GetSID()); break; default : SkipDescriptor (gb, nType, nLength); // descriptor() break; } } EndEnumDescriptors if (!Channels.Lookup(Channel.GetSID())) { Channels [Channel.GetSID()] = Channel; } } return S_OK; }