bool TSDocument::ParseDocument() { if (!DetermineChunkSize()) { FATAL("Unable to determine chunk size"); return false; } if (!_mediaFile.SeekTo(_chunkSizeDetectionCount)) { FATAL("Unable to seek at %"PRIu32, _chunkSizeDetectionCount); return false; } _pParser->SetChunkSize(_chunkSize); IOBuffer buffer; uint32_t defaultBlockSize = ((1024 * 1024 * 4) / _chunkSize) * _chunkSize; while (!_chunkSizeErrors) { uint32_t available = (uint32_t) (_mediaFile.Size() - _mediaFile.Cursor()); if (available < _chunkSize) { break; } if (GETAVAILABLEBYTESCOUNT(buffer) != 0) { WARN("Leftovers detected"); break; } uint32_t blockSize = defaultBlockSize < available ? defaultBlockSize : available; buffer.MoveData(); if (!buffer.ReadFromFs(_mediaFile, blockSize)) { WARN("Unable to read %"PRIu32" bytes from file", blockSize); break; } if (!_pParser->ProcessBuffer(buffer, false)) { WARN("Unable to process block of data"); break; } } return true; }