HRESULT CDVBSub::ParsePage(CGolombBuffer& gb, WORD wSegLength, CAutoPtr<DVB_PAGE>& pPage) { HRESULT hr = S_OK; WORD wEnd = (WORD)gb.GetPos() + wSegLength; int nPos = 0; pPage.Attach (DNew DVB_PAGE()); pPage->PageTimeOut = gb.ReadByte(); pPage->PageVersionNumber = (BYTE)gb.BitRead(4); pPage->PageState = (BYTE)gb.BitRead(2); pPage->RegionCount = 0; gb.BitRead(2); // Reserved while (gb.GetPos() < wEnd) { if (nPos < MAX_REGIONS) { pPage->Regions[nPos].Id = gb.ReadByte(); gb.ReadByte(); // Reserved pPage->Regions[nPos].HorizAddr = gb.ReadShort(); pPage->Regions[nPos].VertAddr = gb.ReadShort(); pPage->RegionCount++; } nPos++; } return S_OK; }
HRESULT CDVBSub::ParsePage(CGolombBuffer& gb, WORD wSegLength, CAutoPtr<DVB_PAGE>& pPage) { size_t nExpectedSize = 2; size_t nEnd = gb.GetPos() + wSegLength; pPage = CAutoPtr<DVB_PAGE>(DEBUG_NEW DVB_PAGE()); pPage->pageTimeOut = gb.ReadByte(); pPage->pageVersionNumber = (BYTE)gb.BitRead(4); pPage->pageState = (BYTE)gb.BitRead(2); gb.BitRead(2); // Reserved while (gb.GetPos() < nEnd) { nExpectedSize += 6; DVB_REGION_POS regionPos; regionPos.id = gb.ReadByte(); gb.ReadByte(); // Reserved regionPos.horizAddr = gb.ReadShort(); regionPos.vertAddr = gb.ReadShort(); pPage->regionsPos.AddTail(regionPos); } return (wSegLength == nExpectedSize) ? S_OK : E_UNEXPECTED; }