📄 ogg_page_reader.cpp
字号:
return HXR_OK;}STDMETHODIMP COggPageReader::CloseDone(THIS_ HX_RESULT status){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::CloseDone(0x%08x)\n", status)); return HXR_OK;}STDMETHODIMP COggPageReader::ReadDone(THIS_ HX_RESULT status, IHXBuffer* pBuffer){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ReadDone(0x%08x, %u)\n", status, (pBuffer) ? pBuffer->GetSize() : 0)); // Check for HXR_CANCELLED status. This can happen if a Seek() is // issued while a Read() is pending. This case only seems to happen // with HTTP if ((HXR_CANCELLED == status) && (rsReadPending == m_state)) { ChangeState(rsSeekPending); return HXR_OK; } switch(m_state) { case rsReadPending: { if (HXR_OK == status) { /* Handle data */ UINT32 ulBytes = pBuffer->GetSize(); m_ulFileObjectOffset += ulBytes; // We are at the end of the file if we get a short // read OR we have a seekable file and the current // file object offset is >= the file size. BOOL bEOF = ((pBuffer->GetSize() < DefaultReadSize) || (m_bSeekable && (m_ulFileObjectOffset >= m_ulFileSize))); char* buffer = ogg_sync_buffer(m_pOy, ulBytes); memcpy(buffer, pBuffer->GetBuffer(), ulBytes); ogg_sync_wrote(m_pOy, ulBytes); status = DoReadNextPage(bEOF); } else if (m_bEndOfFile) { // Dispatch an end of file error status = DispatchPage(HXR_AT_END, 0, 0, NULL); } else { status = DispatchPage(status, 0, 0, NULL); } } break; case rsSeekDuringPending: status = DoSeek(m_ulPendingSeekOffset); break; default: status = DispatchPage(HXR_UNEXPECTED, 0, 0, NULL); }; if ((HXR_OK == status) && (rsSeekDuringPending == m_state)) { status = DoSeek(m_ulPendingSeekOffset); } DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ReadDone() : done\n")); return HXR_OK;}STDMETHODIMP COggPageReader::WriteDone(THIS_ HX_RESULT status){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::WriteDone(0x%08x)\n", status)); return HXR_UNEXPECTED;}STDMETHODIMP COggPageReader::SeekDone(THIS_ HX_RESULT status){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::SeekDone(0x%08x)\n", status)); BOOL bDone = FALSE; BOOL bDispatchedError = FALSE; while(!bDone) { bDone = TRUE; if (HXR_OK == status) { switch(m_state) { case rsSeekPending: status = DoRead(); break; case rsSeekDuringPending: status = DoSeek(m_ulPendingSeekOffset); break; default : status = HXR_UNEXPECTED; break; }; } if (HXR_OK != status) { DispatchPage(status, 0, 0, NULL); status = HXR_OK; bDone = FALSE; } } DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::SeekDone() : done\n")); return HXR_OK;}/* * IHXFileStat methods */STDMETHODIMP COggPageReader::StatDone(THIS_ HX_RESULT status, UINT32 ulSize, UINT32 ulCreationTime, UINT32 ulAccessTime, UINT32 ulModificationTime, UINT32 ulMode){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::StatDone(0x%08x, %lu)\n", status, ulSize)); if (HXR_OK == status) { m_ulFileSize = ulSize; HX_RESULT tmpRes = m_pFile->Advise(HX_FILEADVISE_RANDOMACCESS); if (m_ulFileSize && (HXR_ADVISE_PREFER_LINEAR != tmpRes)) { m_bSeekable = TRUE; } ChangeState(rsReady); } else { ChangeState(rsStart); } if (m_pResponse) { m_pResponse->PageReaderInitDone(status); } DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::StatDone() : done\n")); return HXR_OK;}#ifdef _DEBUGstatic const char* z_pStateNames[] = { "rsStart", "rsInitPending", "rsStatPending", "rsReady", "rsSeekPending", "rsSeekDuringPending", "rsReadPending", "rsDispatchReadPageDone", "rsReadDuringDispatch"};#endifvoid COggPageReader::ChangeState(ReaderState newState){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::ChangeState() : %s -> %s\n", z_pStateNames[m_state], z_pStateNames[newState])); m_state = newState;}HX_RESULT COggPageReader::DoReadNextPage(BOOL bEOF){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage()\n")); HX_RESULT res = HXR_FAILED; BOOL bDone = FALSE; while(!bDone) { BOOL bRecalcDone = TRUE; if (m_bEndOfFile) { res = DispatchPage(HXR_AT_END, 0, 0, NULL); } else { ogg_page og; int err = ogg_sync_pageseek(m_pOy, &og); if (err < 0) { /* resyncing */ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : resyncing %d skipped\n", -err)); m_ulCurrentFileOffset += -err; DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset)); if (m_bSeekable && (m_ulCurrentFileOffset >= m_ulFileSize)) { m_bEndOfFile = TRUE; } bRecalcDone = FALSE; } else if (err == 0) { DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : Need more data\n")); if (!bEOF) { // Read more data from the file res = DoRead(); } else { m_bEndOfFile = TRUE; bRecalcDone = FALSE; } } else { DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : synced on %d byte page\n", err)); ULONG32 ulOffset = m_ulCurrentFileOffset; m_ulCurrentFileOffset += err; DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : 2 m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset)); if (m_bSeekable && (m_ulCurrentFileOffset >= m_ulFileSize)) { m_bEndOfFile = TRUE; } res = DispatchPage(HXR_OK, ulOffset, err, &og); } } if (bRecalcDone) { bDone = (rsReadDuringDispatch != m_state); } } DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoReadNextPage() : done\n")); return res;}HX_RESULT COggPageReader::DoSeek(ULONG32 ulFileOffset){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoSeek(%lu)\n", ulFileOffset)); ChangeState(rsSeekPending); m_ulCurrentFileOffset = ulFileOffset; m_ulFileObjectOffset = ulFileOffset; DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DoSeek() : m_ulCurrentFileOffset = %u\n", m_ulCurrentFileOffset)); m_bEndOfFile = FALSE; ogg_sync_reset(m_pOy); return m_pFile->Seek(ulFileOffset, FALSE);}HX_RESULT COggPageReader::DoRead(){ ChangeState(rsReadPending); return m_pFile->Read(DefaultReadSize);}HX_RESULT COggPageReader::DispatchPage(HX_RESULT status, ULONG32 ulFileOffset, UINT32 ulPageSize, ogg_page* pOg){ DPRINTF(D_OGG_PAGE_READER, ("COggPageReader::DispatchPage(%lu, %u)\n", ulFileOffset, ulPageSize)); ChangeState(rsDispatchReadPageDone); if (m_pResponse) { m_pResponse->ReadNextPageDone(status, ulFileOffset, ulPageSize, pOg); } if (rsDispatchReadPageDone == m_state) { ChangeState(rsReady); } return HXR_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -