mpc 学习2

第一章、        Sourcefilter

DirectShow 提供一个标准的File Source Async)(它的GUIDCLSID_AsyncReader,作为媒体文件播放的Source FilterDXSDK/Samples/C++/DirectShow/Filters/Async/Filter 这个例子实现类似功能。

Asynbase 主要的类CAsyncIO 控制输出输出,包括同步和异步模式。

         CAsyncOutPutpin 输出pin 实现IAsyncReader接口。

          Filter CAsyncReader

Async CAsyncFilter 继承CAsyncReader,实现IFilteSourceFilter

 

下一级的spliter filter 通过pinIAsyncReader  的函数SyncRead 或者RequestFilte Source Filter 来读取数据的。

 

Mpcreader空间 (拉模式)

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

    httpSourceFilter

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;

}

给子类来实现。

输入pinCompleteConnect调用SpliterCompleteConnect 来生成输出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)里面处理解码,采用缓存,然后要重新给音频打时间戳,然后调用OutpinDeliver往下级传输。

注意因为要从新打时间戳,然后一个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},

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值