mpc学习[转]

http://blog.csdn.net/hdh4638/article/details/5529066
http://blog.csdn.net/hdh4638/article/details/5523754

第一章、        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 },

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},

 

第四章 播放器

4.1 CwndApp 文件mplayerc.h

BOOL CMPlayerCApp::InitInstance()

使用Detour库进行函数截获。使用指定函数替换目标函数。

//命令行参数处理

CAtlList<CString> m_cmdln;格式化命令行参数。

//配置类

class Settings

//配置类分析命令行参数

m_s.ParseCommandLine(m_cmdln);

//根据命令行做相应的处理

//互斥量,只运行一个实例

m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);

//创建主窗口

CMainFrame* pFrame = new CMainFrame;

//菜单消息的处理:
BEGIN_MESSAGE_MAP(CMPlayerCApp, CWinApp)

       //{{AFX_MSG_MAP(CMPlayerCApp)

       ON_COMMAND(ID_HELP_ABOUT, OnAppAbout)

       ON_COMMAND(ID_FILE_EXIT, OnFileExit)

       //}}AFX_MSG_MAP

       ON_COMMAND(ID_HELP_SHOWCOMMANDLINESWITCHES, OnHelpShowcommandlineswitches)

END_MESSAGE_MAP()

4.2   MainWnd 文件MainFrame.Cpp

class CMainFrame : public CFrameWnd, public CDropTarget

事件处理函数:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

//弹出菜单

m_popup.LoadMenu(IDR_POPUP);

m_popupmain.LoadMenu(IDR_POPUPMAIN);

//主菜单

GetMenu()->ModifyMenu(ID_FAVORITES, MF_BYCOMMAND|MF_STRING, IDR_MAINFRAME, ResStr(IDS_FAVORITES_POPUP));

//创建视图窗口

if(!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

              CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))

       {

              TRACE0("Failed to create view window/n");

              return -1;

       }

///创建状态条 static bars

m_bars

// 进度条

m_wndSeekBar.Enable(false);

// dockable bars

m_dockingbars

//创建线程

CGraphThread

BEGIN_MESSAGE_MAP(CGraphThread, CWinThread)

ON_THREAD_MESSAGE(TM_EXIT, OnExit)

ON_THREAD_MESSAGE(TM_OPEN, OnOpen)

ON_THREAD_MESSAGE(TM_CLOSE, OnClose)

END_MESSAGE_MAP()

异步处理这三个事情

消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_COMMAND(ID_FAVORITES_ADD, OnFavoritesAdd)

ON_UPDATE_COMMAND_UI(ID_FAVORITES_ADD, OnUpdateFavoritesAdd)

END_MESSAGE_MAP()

 

//菜单响应:

打开媒体文件
void CMainFrame::OnFileOpenmedia()

发消息给线程:

m_pGraphThread->PostThreadMessage(CGraphThread::TM_OPEN, 0, (LPARAM)pOMD.Detach());

调用:

bool CMainFrame::OpenMediaPrivate(CAutoPtr<OpenMediaData> pOMD)

调用:

void CMainFrame::OpenFile(OpenFileData* pOFD)

调用:

STDMETHODIMP CFGManager::RenderFile(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrPlayList)

实现智能链接的过程的。

 

4.3  文件FGManager.cpp 实现IGraphBuilder2的过程

 

STDMETHODIMP CFGManager::RenderFile(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrPlayList)

A、 查找SourceFilter

EnumSourceFilters

B、 STDMETHODIMP CFGManager::ConnectFilter(IBaseFilter* pBF, IPin* pPinIn)

CSTDMETHODIMP CFGManager::Connect(IPin* pPinOut, IPin* pPinIn)

 

总之就是很复杂的过程

4.4   option 属性项 ppagesheet

 

4.4 、其它

SetupFiltersSubMenu 创建Filter信息

获取filter的属性页显示

int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值