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

多媒体编程

开发平台:

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 "MatroskaFile.h"
  26. #include "..BaseSplitterBaseSplitter.h"
  27. #include "........includeITrackInfo.h"
  28. class MatroskaPacket : public Packet
  29. {
  30. protected:
  31. int GetSize()
  32. {
  33. int size = 0;
  34. POSITION pos = bg->Block.BlockData.GetHeadPosition();
  35. while(pos) {size += bg->Block.BlockData.GetNext(pos)->GetSize();}
  36. return size;
  37. }
  38. public:
  39. CAutoPtr<MatroskaReader::BlockGroup> bg;
  40. };
  41. class CMatroskaSplitterOutputPin : public CBaseSplitterOutputPin
  42. {
  43. HRESULT DeliverBlock(MatroskaPacket* p);
  44. int m_nMinCache;
  45. REFERENCE_TIME m_rtDefaultDuration;
  46. CCritSec m_csQueue;
  47. CAutoPtrList<MatroskaPacket> m_packets;
  48. CList<MatroskaPacket*> m_rob;
  49. typedef struct {REFERENCE_TIME rtStart, rtStop;} timeoverride;
  50. CList<timeoverride> m_tos;
  51. protected:
  52. HRESULT DeliverPacket(CAutoPtr<Packet> p);
  53. public:
  54. CMatroskaSplitterOutputPin(
  55. int nMinCache, REFERENCE_TIME rtDefaultDuration, 
  56. CArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
  57. virtual ~CMatroskaSplitterOutputPin();
  58. HRESULT DeliverEndFlush();
  59. HRESULT DeliverEndOfStream();
  60. };
  61. [uuid("149D2E01-C32E-4939-80F6-C07B81015A7A")]
  62. class CMatroskaSplitterFilter : public CBaseSplitterFilter, public ITrackInfo
  63. {
  64. void SendVorbisHeaderSample();
  65. void InstallFonts();
  66. CAutoPtr<MatroskaReader::CMatroskaNode> m_pSegment, m_pCluster, m_pBlock;
  67. protected:
  68. CAutoPtr<MatroskaReader::CMatroskaFile> m_pFile;
  69. HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
  70. CMap<DWORD, DWORD, MatroskaReader::TrackEntry*, MatroskaReader::TrackEntry*> m_pTrackEntryMap;
  71. CArray<MatroskaReader::TrackEntry* > m_pOrderedTrackArray;
  72. MatroskaReader::TrackEntry* GetTrackEntryAt(UINT aTrackIdx);
  73. bool DemuxInit();
  74. void DemuxSeek(REFERENCE_TIME rt);
  75. bool DemuxLoop();
  76. public:
  77. CMatroskaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
  78. virtual ~CMatroskaSplitterFilter();
  79. DECLARE_IUNKNOWN;
  80.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  81. // IMediaSeeking
  82. STDMETHODIMP GetDuration(LONGLONG* pDuration);
  83. // IKeyFrameInfo
  84. STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
  85. STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
  86. // ITrackInfo
  87. STDMETHODIMP_(UINT) GetTrackCount();
  88. STDMETHODIMP_(BOOL) GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill);
  89. STDMETHODIMP_(BOOL) GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill);
  90. STDMETHODIMP_(BSTR) GetTrackName(UINT aTrackIdx);
  91. STDMETHODIMP_(BSTR) GetTrackCodecID(UINT aTrackIdx);
  92. STDMETHODIMP_(BSTR) GetTrackCodecName(UINT aTrackIdx);
  93. STDMETHODIMP_(BSTR) GetTrackCodecInfoURL(UINT aTrackIdx);
  94. STDMETHODIMP_(BSTR) GetTrackCodecDownloadURL(UINT aTrackIdx);
  95. };
  96. [uuid("0A68C3B5-9164-4a54-AFAF-995B2FF0E0D4")]
  97. class CMatroskaSourceFilter : public CMatroskaSplitterFilter
  98. {
  99. public:
  100. CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
  101. };