OggFile.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".oggfile.h"
  3. COggFile::COggFile(IAsyncReader* pAsyncReader, HRESULT& hr)
  4. : CBaseSplitterFile(pAsyncReader, hr)
  5. {
  6. if(FAILED(hr)) return;
  7. hr = Init();
  8. }
  9. HRESULT COggFile::Init()
  10. {
  11. Seek(0);
  12. if(!Sync()) return E_FAIL;
  13. return S_OK;
  14. }
  15. bool COggFile::Sync(HANDLE hBreak)
  16. {
  17. __int64 start = GetPos();
  18. DWORD dw;
  19. for(__int64 i = 0, j = hBreak ? GetLength() - start : 65536;
  20. i < j && S_OK == Read((BYTE*)&dw, sizeof(dw)) 
  21. && ((i&0xffff) || !hBreak || WaitForSingleObject(hBreak, 0) != WAIT_OBJECT_0); 
  22. i++, Seek(start + i))
  23. {
  24. if(dw == 'SggO')
  25. {
  26. Seek(start + i);
  27. return(true);
  28. }
  29. }
  30. Seek(start);
  31. return(false);
  32. }
  33. bool COggFile::Read(OggPageHeader& hdr, HANDLE hBreak)
  34. {
  35. return Sync(hBreak) && S_OK == Read((BYTE*)&hdr, sizeof(hdr)) && hdr.capture_pattern == 'SggO';
  36. }
  37. bool COggFile::Read(OggPage& page, bool fFull, HANDLE hBreak)
  38. {
  39. memset(&page.m_hdr, 0, sizeof(page.m_hdr));
  40. page.m_lens.RemoveAll();
  41. page.SetSize(0);
  42. if(!Read(page.m_hdr, hBreak))
  43. return(false);
  44. int pagelen = 0, packetlen = 0;
  45. for(BYTE i = 0; i < page.m_hdr.number_page_segments; i++)
  46. {
  47. BYTE b;
  48.         if(S_OK != Read(&b, 1)) return(false);
  49. packetlen += b;
  50. if(1/*b < 0xff*/) {page.m_lens.AddTail(packetlen); pagelen += packetlen; packetlen = 0;}
  51. }
  52. if(fFull)
  53. {
  54. page.SetSize(pagelen);
  55. if(S_OK != Read(page.GetData(), page.GetSize())) 
  56. return(false);
  57. }
  58. else
  59. {
  60. Seek(GetPos()+pagelen);
  61. page.m_lens.RemoveAll();
  62. }
  63. return(true);
  64. }