MatroskaSplitter.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:4k
- /*
- * Copyright (C) 2003-2005 Gabest
- * http://www.gabest.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Make; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- */
- #pragma once
- #include <atlbase.h>
- #include <atlcoll.h>
- #include <afxtempl.h>
- #include "MatroskaFile.h"
- #include "..BaseSplitterBaseSplitter.h"
- #include "........includeITrackInfo.h"
- class MatroskaPacket : public Packet
- {
- protected:
- int GetSize()
- {
- int size = 0;
- POSITION pos = bg->Block.BlockData.GetHeadPosition();
- while(pos) {size += bg->Block.BlockData.GetNext(pos)->GetSize();}
- return size;
- }
- public:
- CAutoPtr<MatroskaReader::BlockGroup> bg;
- };
- class CMatroskaSplitterOutputPin : public CBaseSplitterOutputPin
- {
- HRESULT DeliverBlock(MatroskaPacket* p);
- int m_nMinCache;
- REFERENCE_TIME m_rtDefaultDuration;
- CCritSec m_csQueue;
- CAutoPtrList<MatroskaPacket> m_packets;
- CList<MatroskaPacket*> m_rob;
- typedef struct {REFERENCE_TIME rtStart, rtStop;} timeoverride;
- CList<timeoverride> m_tos;
- protected:
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
- public:
- CMatroskaSplitterOutputPin(
- int nMinCache, REFERENCE_TIME rtDefaultDuration,
- CArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CMatroskaSplitterOutputPin();
- HRESULT DeliverEndFlush();
- HRESULT DeliverEndOfStream();
- };
- [uuid("149D2E01-C32E-4939-80F6-C07B81015A7A")]
- class CMatroskaSplitterFilter : public CBaseSplitterFilter, public ITrackInfo
- {
- void SendVorbisHeaderSample();
- void InstallFonts();
- CAutoPtr<MatroskaReader::CMatroskaNode> m_pSegment, m_pCluster, m_pBlock;
- protected:
- CAutoPtr<MatroskaReader::CMatroskaFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- CMap<DWORD, DWORD, MatroskaReader::TrackEntry*, MatroskaReader::TrackEntry*> m_pTrackEntryMap;
- CArray<MatroskaReader::TrackEntry* > m_pOrderedTrackArray;
- MatroskaReader::TrackEntry* GetTrackEntryAt(UINT aTrackIdx);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
- public:
- CMatroskaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CMatroskaSplitterFilter();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IMediaSeeking
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- // IKeyFrameInfo
- STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
- // ITrackInfo
- STDMETHODIMP_(UINT) GetTrackCount();
- STDMETHODIMP_(BOOL) GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill);
- STDMETHODIMP_(BOOL) GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill);
- STDMETHODIMP_(BSTR) GetTrackName(UINT aTrackIdx);
- STDMETHODIMP_(BSTR) GetTrackCodecID(UINT aTrackIdx);
- STDMETHODIMP_(BSTR) GetTrackCodecName(UINT aTrackIdx);
- STDMETHODIMP_(BSTR) GetTrackCodecInfoURL(UINT aTrackIdx);
- STDMETHODIMP_(BSTR) GetTrackCodecDownloadURL(UINT aTrackIdx);
- };
- [uuid("0A68C3B5-9164-4a54-AFAF-995B2FF0E0D4")]
- class CMatroskaSourceFilter : public CMatroskaSplitterFilter
- {
- public:
- CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
- };