/*
* (C) 2003-2006 Gabest
* (C) 2006-2013 see Authors.txt
*
* This file is part of MPC-HC.
*
* MPC-HC 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 3 of the License, or
* (at your option) any later version.
*
* MPC-HC 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 this program. If not, see .
*
*/
#pragma once
#include "../BaseSplitter/BaseSplitter.h"
#include "MpegSplitterFile.h"
#include "MpegSplitterSettingsWnd.h"
#include "ITrackInfo.h"
#define MpegSplitterName L"MPC MPEG Splitter"
#define MpegSourceName L"MPC MPEG Source"
class __declspec(uuid("DC257063-045F-4BE2-BD5B-E12279C464F0"))
CMpegSplitterFilter
: public CBaseSplitterFilter
, public IAMStreamSelect
, public ISpecifyPropertyPages2
, public IMpegSplitterFilter
{
REFERENCE_TIME m_rtStartOffset;
bool m_pPipoBimbo;
CHdmvClipInfo m_ClipInfo;
protected:
CAutoPtr m_pFile;
CComQIPtr pTI;
HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
void ReadClipInfo(LPCOLESTR pszFileName);
bool DemuxInit();
void DemuxSeek(REFERENCE_TIME rt);
bool DemuxLoop();
bool BuildPlaylist(LPCTSTR pszFileName, CAtlList& files);
bool BuildChapters(LPCTSTR pszFileName, CAtlList& PlaylistItems, CAtlList& Items);
HRESULT DemuxNextPacket(REFERENCE_TIME rtStartOffset);
REFERENCE_TIME m_rtPlaylistDuration;
private:
CString m_csAudioLanguageOrder, m_csSubtitlesLanguageOrder;
bool m_useFastStreamChange, m_ForcedSub, m_AlternativeDuration;
int m_nVC1_GuidFlag, m_AC3CoreOnly;
CCritSec m_csProps;
public:
CMpegSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSplitterFilter));
void SetPipo(bool bPipo) { m_pPipoBimbo = bPipo; };
bool StreamIsTrueHD(const WORD pid);
DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
STDMETHODIMP GetClassID(CLSID* pClsID);
STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
// CBaseFilter
STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
// IAMStreamSelect
STDMETHODIMP Count(DWORD* pcStreams);
STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid,
DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
// ISpecifyPropertyPages2
STDMETHODIMP GetPages(CAUUID* pPages);
STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
// IMpegSplitterFilter
STDMETHODIMP Apply();
STDMETHODIMP SetFastStreamChange(BOOL nValue);
STDMETHODIMP_(BOOL) GetFastStreamChange();
STDMETHODIMP SetForcedSub(BOOL nValue);
STDMETHODIMP_(BOOL) GetForcedSub();
STDMETHODIMP SetAudioLanguageOrder(WCHAR* nValue);
STDMETHODIMP_(WCHAR*) GetAudioLanguageOrder();
STDMETHODIMP SetSubtitlesLanguageOrder(WCHAR* nValue);
STDMETHODIMP_(WCHAR*) GetSubtitlesLanguageOrder();
STDMETHODIMP SetVC1_GuidFlag(int nValue);
STDMETHODIMP_(int) GetVC1_GuidFlag();
STDMETHODIMP SetTrueHD(int nValue);
STDMETHODIMP_(int) GetTrueHD();
STDMETHODIMP SetAlternativeDuration(BOOL nValue);
STDMETHODIMP_(BOOL) GetAlternativeDuration();
STDMETHODIMP_(int) GetMPEGType();
};
class __declspec(uuid("1365BE7A-C86A-473C-9A41-C0A6E82C9FA3"))
CMpegSourceFilter : public CMpegSplitterFilter
{
public:
CMpegSourceFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSourceFilter));
};
class CMpegSplitterOutputPin : public CBaseSplitterOutputPin, protected CCritSec
{
CAutoPtr m_p;
CAutoPtrList m_pl;
REFERENCE_TIME m_rtPrev, m_rtOffset, m_rtMaxShift;
bool m_fHasAccessUnitDelimiters;
bool m_bFilterDTSMA;
bool DD_reset;
bool m_bFlushed;
int m_type;
protected:
HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
HRESULT DeliverPacket(CAutoPtr p);
HRESULT DeliverEndFlush();
public:
CMpegSplitterOutputPin(CAtlArray& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int type);
virtual ~CMpegSplitterOutputPin();
STDMETHODIMP Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt);
void SetMaxShift(REFERENCE_TIME rtMaxShift) { m_rtMaxShift = rtMaxShift; };
};