http://blog.csdn.net/hdh4638/article/details/5523754
第一章、
DirectShow
Asynbase
Async
下一级的spliter filter
Mpc的reader空间
1、
2、
Audio cd
3、
DVD Video Title Set
4、
5、
Vcd/svcd/xcd
Mpc
1、
2、
3、
4、
字幕
5、
6、
DVD2AVI Project File
第一章、
2.1、
Audioswitch
Filter结构CStreamSwitcherFilter
Pin
CAudioSwitcherFilter
链接的时候得到pin的函数为虚函数Getpin GetpinCount
2.2
、基类BaseSpliter
Filter结构CBaseSplitterFilter继承CBaseFilter
Pin
CBaseSplitterFile读文件的类
CBaseSplitterFileEx
输入pin
HRESULT CBaseSplitterInputPin::CheckMediaType(const CMediaType* pmt)
{
}
给子类来实现。
输入pin的CompleteConnect调用Spliter的CompleteConnect
输出pin
数据拉的过程:Output pin实现接口CAMThread,就是每个Outputpin
然后填充好sample
数据输入线程
然后函数DemuxLoop
DeliverPacket
数据读取。
在CompleteConnect时候,将AsyncReader赋给真正的parser filter
HRESULT CBaseSplitterFile::Read(BYTE* pData, __int64 len)
里面调用
m_pAsyncReader->SyncRead
2.2.1、单纯视频的spliter filter
2.2.1.1
2.2.2
2.2.2.1
MPEG Audio
2.2.2.2
2.2.3
2.2.3.1
DirectShow Media
2.2.3.2
2.2.3.3
2.2.3.4
2.2.3.5
2.2.3.6 mpeg
2.2.3.7 RealMedia
2.2.3.8 ROQ
一种动画视频文件
2.2.4
2.2.4.1 SSF spliter
估计为一种字幕文件??
第一章、
3.1 Mpadecoder filter
继承自class CMpaDecFilter : public CTransformFilter
在HRESULT CMpaDecFilter::Receive(IMediaSample* pIn)里面处理解码,采用缓存,然后要重新给音频打时间戳,然后调用Outpin的Deliver往下级传输。
注意因为要从新打时间戳,然后一个Receive可能多个Deliver
{_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
3.3
{_T("RealVideo"), 1, TRA_RV, IDS_TRA_RV, NULL},
第四章
4.1
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)
END_MESSAGE_MAP()
4.2
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,
///创建状态条
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
STDMETHODIMP CFGManager::RenderFile(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrPlayList)
A、
EnumSourceFilters
B、
C、STDMETHODIMP CFGManager::Connect(IPin* pPinOut, IPin* pPinIn)
总之就是很复杂的过程
4.4
4.4
SetupFiltersSubMenu
获取filter的属性页显示
int CComPropertySheet::AddPages(CComPtr<ISpecifyPropertyPages> pSPP)