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

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include <atlbase.h>
  23. #include <atlcoll.h>
  24. #include <afxtempl.h>
  25. #include "OggFile.h"
  26. #include "..BaseSplitterBaseSplitter.h"
  27. class OggPacket : public Packet
  28. {
  29. public:
  30. OggPacket() {fSkip = false;}
  31. bool fSkip;
  32. };
  33. class COggSplitterOutputPin : public CBaseSplitterOutputPin
  34. {
  35. class CComment
  36. {
  37. public: 
  38. CStringW m_key, m_value; 
  39. CComment(CStringW key, CStringW value) : m_key(key), m_value(value) {m_key.MakeUpper();}
  40. };
  41. CAutoPtrList<CComment> m_pComments;
  42. protected:
  43. CCritSec m_csPackets;
  44. CAutoPtrList<OggPacket> m_packets;
  45. CAutoPtr<OggPacket> m_lastpacket;
  46. int m_lastseqnum;
  47. REFERENCE_TIME m_rtLast;
  48. bool m_fSkip;
  49. void ResetState(DWORD seqnum = -1);
  50. public:
  51. COggSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  52. void AddComment(BYTE* p, int len);
  53. CStringW GetComment(CStringW key);
  54. HRESULT UnpackPage(OggPage& page);
  55. virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len) = 0;
  56. virtual REFERENCE_TIME GetRefTime(__int64 granule_position) = 0;
  57. CAutoPtr<OggPacket> GetPacket();
  58.     
  59. HRESULT DeliverEndFlush();
  60.     HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  61. };
  62. class COggVorbisOutputPin : public COggSplitterOutputPin
  63. {
  64. CAutoPtrList<OggPacket> m_initpackets;
  65. DWORD m_audio_sample_rate;
  66. DWORD m_blocksize[2], m_lastblocksize;
  67. CArray<bool> m_blockflags;
  68. virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
  69. virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
  70. HRESULT DeliverPacket(CAutoPtr<OggPacket> p);
  71.     HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  72. public:
  73. COggVorbisOutputPin(OggVorbisIdHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  74. HRESULT UnpackInitPage(OggPage& page);
  75. bool IsInitialized() {return m_initpackets.GetCount() >= 3;}
  76. };
  77. class COggDirectShowOutputPin : public COggSplitterOutputPin
  78. {
  79. virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
  80. virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
  81. public:
  82. COggDirectShowOutputPin(AM_MEDIA_TYPE* pmt, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  83. };
  84. class COggStreamOutputPin : public COggSplitterOutputPin
  85. {
  86. __int64 m_time_unit, m_samples_per_unit;
  87. DWORD m_default_len;
  88. virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
  89. virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
  90. public:
  91. COggStreamOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  92. };
  93. class COggVideoOutputPin : public COggStreamOutputPin
  94. {
  95. public:
  96. COggVideoOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  97. };
  98. class COggAudioOutputPin : public COggStreamOutputPin
  99. {
  100. public:
  101. COggAudioOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  102. };
  103. class COggTextOutputPin : public COggStreamOutputPin
  104. {
  105. public:
  106. COggTextOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  107. };
  108. [uuid("9FF48807-E133-40AA-826F-9B2959E5232D")]
  109. class COggSplitterFilter : public CBaseSplitterFilter
  110. {
  111. protected:
  112. CAutoPtr<COggFile> m_pFile;
  113. HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
  114. bool DemuxInit();
  115. void DemuxSeek(REFERENCE_TIME rt);
  116. bool DemuxLoop();
  117. public:
  118. COggSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
  119. virtual ~COggSplitterFilter();
  120. };
  121. [uuid("6D3688CE-3E9D-42F4-92CA-8A11119D25CD")]
  122. class COggSourceFilter : public COggSplitterFilter
  123. {
  124. public:
  125. COggSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
  126. };