第一章、 Sourcefilter
DirectShow 提供一个标准的File Source (Async)(它的GUID为CLSID_AsyncReader,作为媒体文件播放的Source Filter,DXSDK/Samples/C++/DirectShow/Filters/Async/Filter 这个例子实现类似功能。
Asynbase 主要的类CAsyncIO 控制输出输出,包括同步和异步模式。
CAsyncOutPutpin 输出pin 实现IAsyncReader接口。
Filter CAsyncReader。
Async 类CAsyncFilter 继承CAsyncReader,实现IFilteSourceFilter。
下一级的spliter filter 通过pin的IAsyncReader 的函数SyncRead 或者Request从Filte Source Filter 来读取数据的。
Mpc的reader空间 (拉模式)
1、 CAsyncreader 拉模式的sourcefilter
2、 CCDDAReader继承CAsyncReader拉模式的sourcefilter
Audio cd
3、 CVTSReader继承CAsyncReader拉模式的sourcefilter
DVD Video Title Set
4、 CUDPReader继承CAsyncReader拉模式的sourcefilter
Udp协议
5、 CCDXAReader继承CAsyncReader拉模式的sourcefilter
Vcd/svcd/xcd
Mpc 的Source 解决空间 (推模式)
1、 BaseSource 继承CSourceStream 推模式的SourceFilter。
2、 Flicsource 继承CSourceStream 推模式的SourceFilter。
FLI/FLC
3、 ShoutCast继承CSourceStream 推模式的SourceFilter。
http的SourceFilter。
4、 Subtitle继承CSourceStream 推模式的SourceFilter。
字幕
5、 DTSAC3继承BaseSource推模式的SourceFilter。
DTS/AC3
6、 D2V继承BaseSource推模式的SourceFilter。
DVD2AVI Project File
第一章、 Spliter
2.1、 Audio Switcher 音频切换器用来切换多路音频的?
Audioswitch 为CBaseFilter filter
Filter结构CStreamSwitcherFilter 继承CBaseFilter
Pin CStreamSwitcherInputPin CStreamSwitcherOutputPin 输入输出pin
CAudioSwitcherFilter 继承CStreamSwitcherFilter
链接的时候得到pin的函数为虚函数Getpin GetpinCount 输入输出pin都通过这个来获取的。
2.2 、Parser spliter
、基类BaseSpliter
Filter结构CBaseSplitterFilter继承CBaseFilter 实现CAMThread接口
Pin CBaseSplitterInputPinCBaseSplitterOutputPin输入输出pin
CBaseSplitterFile读文件的类
CBaseSplitterFileEx 继承CBaseSplitterFile
输入pin 类型:
HRESULT CBaseSplitterInputPin::CheckMediaType(const CMediaType* pmt)
{
return S_OK;
}
给子类来实现。
输入pin的CompleteConnect调用Spliter的CompleteConnect 来生成输出pin
输出pin 获取输出pin的媒体类型
数据拉的过程:Output pin实现接口CAMThread,就是每个Outputpin 都有一个线程负责拉数据的。线程函数DWORD ThreadProc();
然后填充好sample ,将数据通过Deliver往下级送。
数据输入线程 DWORD CBaseSplitterFilter::ThreadProc() 这个线程负责读取数据,重上面的filter拉数据过来的。
然后函数DemuxLoop 指向实际的spliter ,然后DemuxLoop里面调用
DeliverPacket 将demux的数据放到m_queue队列里面去。
数据读取。
在CompleteConnect时候,将AsyncReader赋给真正的parser filter
采用同步获取数据的。
HRESULT CBaseSplitterFile::Read(BYTE* pData, __int64 len)
里面调用
m_pAsyncReader->SyncRead
2.2.1、单纯视频的spliter filter
2.2.1.1 CDiracSplitterFilter
2.2.2 、单独的音频 spliter filter
2.2.2.1 、mpa spliter
MPEG Audio
2.2.2.2 COggSplitterFilter
2.2.3 音视频的spliter
2.2.3.1 DSM
DirectShow Media
2.2.3.2 Avi
2.2.3.3 Flv
2.2.3.4 Matroska
2.2.3.5 mp4 QuickTime
2.2.3.6 mpeg
MPEG PS/TS/PVA
2.2.3.7 RealMedia
2.2.3.8 ROQ
一种动画视频文件
2.2.4 其它
2.2.4.1 SSF spliter
mt.majortype = MEDIATYPE_Subtitle;
mt.subtype = MEDIASUBTYPE_SSF;
mt.formattype = FORMAT_SubtitleInfo;
估计为一种字幕文件??
第一章、 Transform
3.1 Mpadecoder filter
继承自class CMpaDecFilter : public CTransformFilter 负责解码音频
在HRESULT CMpaDecFilter::Receive(IMediaSample* pIn)里面处理解码,采用缓存,然后要重新给音频打时间戳,然后调用Outpin的Deliver往下级传输。
注意因为要从新打时间戳,然后一个Receive可能多个Deliver 所以不要在Transfer 函数里面解码。
{_T("AAC"), 1, TRA_AAC, IDS_TRA_AAC, CreateInstance<CMpaDecFilter>},
{_T("AC3"), 1, TRA_AC3, IDS_TRA_AC3, CreateInstance<CMpaDecFilter>},
{_T("DTS"), 1, TRA_DTS, IDS_TRA_DTS, CreateInstance<CMpaDecFilter>},
{_T("LPCM"), 1, TRA_LPCM, IDS_TRA_LPCM, CreateInstance<CMpaDecFilter>},
{_T("PS2 Audio (PCM/ADPCM)"), 1, TRA_PS2AUD, IDS_TRA_PS2AUD, CreateInstance<CMpaDecFilter>},
{_T("Vorbis"), 1, TRA_VORBIS, 0, NULL /* TODO: CreateInstance<CMpaDecFilter>*/},
3.2 mpeg2dec
{_T("MPEG-1 Video"), 1, TRA_MPEG1, IDS_TRA_MPEG1, CreateInstance<CMpeg2DecFilter>},
{_T("MPEG-2 Video"), 1, TRA_MPEG2, IDS_TRA_MPEG2, CreateInstance<CMpeg2DecFilter>},
3.3 、realmedia
{_T("RealVideo"), 1, TRA_RV, IDS_TRA_RV, NULL},
{_T("RealAudio"), 1, TRA_RA, IDS_TRA_RA, NULL},