bool CEpgDataLoader::LoadFromFile(LPCTSTR pszFileName) { if (pszFileName==NULL) return false; static const DWORD MAX_READ_SIZE=0x1000000UL; // 16MiB static const DWORD BUFFER_SIZE=188*4096; HANDLE hFile; LARGE_INTEGER FileSize; DWORD ReadSize,RemainSize; BYTE *pBuffer; DWORD Size,Read; CTsPacket Packet; hFile=::CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL); if (hFile==INVALID_HANDLE_VALUE) return false; if (!::GetFileSizeEx(hFile,&FileSize) || FileSize.QuadPart<188*10) { ::CloseHandle(hFile); return false; } if (FileSize.QuadPart<=(LONGLONG)MAX_READ_SIZE) { ReadSize=FileSize.LowPart; } else { ReadSize=MAX_READ_SIZE; LARGE_INTEGER Offset; Offset.QuadPart=(FileSize.QuadPart-MAX_READ_SIZE)/188*188; ::SetFilePointerEx(hFile,Offset,NULL,FILE_BEGIN); } try { pBuffer=new BYTE[min(BUFFER_SIZE,ReadSize)]; } catch (...) { ::CloseHandle(hFile); return false; } m_EventManager.Reset(); for (RemainSize=ReadSize;RemainSize>=188;RemainSize-=Size) { Size=min(RemainSize,BUFFER_SIZE); if (!::ReadFile(hFile,pBuffer,Size,&Read,NULL)) break; BYTE *p=pBuffer,*pEnd=pBuffer+Read/188*188; while (p<pEnd) { const WORD PID=((WORD)(p[1]&0x1F)<<8) | (WORD)p[2]; // H-EIT / TOT / M-EIT / L-EIT if (PID==0x0012 || PID==0x0014 /*|| PID==0x0026*/ || PID==0x0027) { Packet.SetData(p,188); if (Packet.ParsePacket()==CTsPacket::EC_VALID) m_EventManager.InputMedia(&Packet); } p+=188; } if (Read<Size) break; } delete [] pBuffer; ::CloseHandle(hFile); TRACE(TEXT("EPG data loaded %s\n"),pszFileName); return true; }
STDMETHODIMP CTSProcessor::OutputPacket(Interface::ITSPacket *pPacket) { if (pPacket == nullptr) return E_POINTER; ITsMediaData *pTsMediaData; if (SUCCEEDED(pPacket->QueryInterface(IID_PPV_ARGS(&pTsMediaData)))) { CMediaData *pMediaData = pTsMediaData->GetMediaData(); if (!m_fSourceProcessor && pPacket->GetModified() == S_OK) { #ifndef _DEBUG CTsPacket *pTsPacket = static_cast<CTsPacket*>(pMediaData); pTsPacket->ReparsePacket(); #else CTsPacket *pTsPacket = dynamic_cast<CTsPacket*>(pMediaData); _ASSERT(pTsPacket != nullptr); if (pTsPacket->ParsePacket() != CTsPacket::EC_VALID) { pTsMediaData->Release(); return E_FAIL; } #endif } OutputMedia(pMediaData); pTsMediaData->Release(); } else { HRESULT hr; ULONG Size = 0; hr = pPacket->GetSize(&Size); if (FAILED(hr)) return hr; BYTE *pData = nullptr; hr = pPacket->GetData(&pData); if (FAILED(hr)) return hr; if (Size == 0 || pData == nullptr) return E_FAIL; if (m_fSourceProcessor) { if (m_OutputPacket.SetData(pData, Size) != Size) return E_OUTOFMEMORY; } else { if (Size != TS_PACKETSIZE) return E_FAIL; if (m_OutputPacket.SetData(pData, TS_PACKETSIZE) != TS_PACKETSIZE) return E_OUTOFMEMORY; if (m_OutputPacket.ParsePacket() != CTsPacket::EC_VALID) return E_FAIL; } OutputMedia(&m_OutputPacket); } return S_OK; }