directshow学习笔记.doc_第1页
directshow学习笔记.doc_第2页
directshow学习笔记.doc_第3页
directshow学习笔记.doc_第4页
directshow学习笔记.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

定义自己的filter,实现编码和解码。1 字符叠加Filter之功能分析 总体需求:在视频流指定的一个时间段内叠加一段字符,要求能够做到实时叠加。字符的内容、字体类型、大小、颜色、叠加的位置、存在的时间都能够定制,普遍支持RGB各种格式输入。另外,除了支持静态字符叠加外,还要求支持其他效果的字符(包括滚动字幕,系统时间等)叠加,并且系统设计的扩展性良好。 功能单一化:字符叠加可以在一个filter中实现。 选择一种filter模型:这个filter同时有输入和输出(即在输入的视频帧上叠加完字符后再输出到下一级filter),因此我们的filter是一个Transform Filter。由于输入和输出的媒体类型一致,而且输入和输出sample的数据大小不会变化,所以我们可以采用“就地”处理的transform Filter。 定义输入和输出 我们的filter需要一个输入Pin和一个输出Pin,输入Pin支持的媒体类型有RGB32、RGB24、RGB565、RGB555等,并且输出Pin上的媒体类型与输入Pin保持一致。 接口定义 接口方法应该包括设置字符的内容,设置字体的各种属性,选择字体的叠加效果,设置叠加位置,设置字符存在的时间段等。 其他一些特殊要求 Filter处理的sample是一一对应的,而且内部不需要另外的使用线程。这是一个标准的Transform Filter。当我们要写一个source Filter,并且要将产生的数据“推”出去时,我们一般选择Csource,我们的Filter接收输入数据,经过一定的处理后要再输出数据,我们一般选择CtransformFilter(如果可以“就地”处理就选择CtransInPlaceFilter)。如果我们的Filter同时有输入和输出,而且它的输入Pin上需要自己“拉”数据,则我们选择CbaseFilter,而在输入Pin上使用工具类CpullPin;当我们的Filter接收输入数据后不再需要输出,我们一般选择CbaseFilter。Filter的父类确定了,一般Pin的父类也就相应地确定了,Directshow SDK提供的这些具体应用的Filter子类都提供了相应的Pin类。我们可以从特殊的Pin类中派生出我们自己的Pin类。“字符叠加Filter”选择CtransInPlaceFilter作为我们Filter的父类,而且我们不用重新实现自己的Pin类。Filter只是一个应用框架,一个能够支持“输入-内部处理-输出”的典型过程框架的应用框架,最重要的是“内部处理”部分。将应用框架和应用逻辑分离,以设计一个结构清晰,扩展性良好的Filter项目。Filter框架是指完成Filter功能的一个必要的操作函数集。Filter类的使用方法,包括实现一些必须的纯虚函数,可选实现的虚函数等,以完成输入和输出Pin上的媒体类型检查,决定Sample内存大小等。另外,我们在Filter上可能还要将一些状态信息设置给应用逻辑控制对象,在Filter的状态转换的同时调用控制对象相应的函数(用于初始化或反初始化),以及在数据处理时调用控制对象的数据处理函数等。应用逻辑是指对输入数据进行处理的一套控制策略。至于数据是如何输入的,处理完后又是如何输出的,这些问题都由Filter框架负责。应用逻辑需要关心的,更多的是数据处理的算法实现,效率优化等问题。应用逻辑控制对象一般以Filter的一个复合成员对象的形式出现。以“字符叠加Filter”为例,我们定义一个Filter类为CfilterTitleOverlay,它从CtransInPlaceFilter类派生而来,再定义一个应用逻辑控制类为CoverlayController,作为Filter的一个成员对象(指针)。代码如下:Class CfilterTitleOverlay:public CtransInPlaceFilterPrivate:OVERLAY_TYPE mOverlayType;CoverlayController * mOverlayController;/.CoverlayController是最基本的控制类,为了支持多种效果的字符叠加,我们可以从这个类派生更多的子类。其中,CscrollController用于滚动字幕叠加控制;CsysTimeOverlayController用于系统时间的叠加控制。另外,我们还看到Filter类中定义了一个枚举类型OVERLAY_TYPE的成员变量mOverlayType,它指示了当前Filter使用的叠加方式。OVERLAY_TYPE的定义如下:Typedef enumOT_NONE,OT_STATIC,/静态字符叠加OT_SYSTIME,/系统时间叠加OT_SCROLL_TOP,/滚动字幕叠加(在视频帧的顶上)OT_SCROLL_BOTTOM/滚动字幕叠加(在视频帧的底边)OVERLAY_TYPE;根据mOverlayType的不同取值,我们可以创建不同的控制类对象实例。编码实现Filter的编码实现包括Filter的注册信息,Filter上的框架函数实现,逻辑控制类实现,自定义接口实现,属性页实现,产权保护等。Filter注册信息:首先为Filter生成一个新的CLSID。如果Filter上还实现了属性页,自定义接口,则还需要分别为它们生成一个CLSID。方法为允许系统中的GuidGen.exe程序,出现界面。/ 79A69932-ACAC-4609-9C06-3C0406BC2380DEFINE_GUID(, 0x79a69932, 0xacac, 0x4609, 0x9c, 0x6, 0x3c, 0x4, 0x6, 0xbc, 0x23, 0x80);在name中替换成自己设置的名字。在GUID字符串之前,需要加入#include,将其转化为GUID常量。Filter注册信息的填写。框架函数的实现:CreateInstance函数的实现实现CreateInstance函数可以创建Filter对象实例,代码如下:Cunknown * WINAPI CfilterTitleOverlay:CreateInstance(LPUNKNOWN punk,HRESULT *phr)CfilterTitleOverlay *pNewObject=new CfilterTItleOverlay(NAME(“TitleOverlay”),punk,phr);If(pNewObject=NULL)*phr=E_OUTOFMEMORY;return pNewObject;CheckInputType函数的实现实现CheckInputType函数可以完成输入Pin上的媒体类型的检查,代码如下:HRESULT CfilterTitleOverlay:CheckInputType(const CmediaType* mtIn)If(IsStopped()&*mtIn-Type()=MEDIATYPE_Video)If(*mtIn-Subtype()=MEDIASUBTYPE_RGB32|*mtIn-Subtype()=MEDIASUBTYPE_RGB24|*mtIn-subtype()=MEDIASUBTYPE_RGB555|*mtIn-subtype()=MEDIASUBTYPE_RGB565)Return NOERROR:Return E_INVALIDARG;Transform函数的实现实现Transform函数可以完成字符叠加函数的调用,代码如下:HRESULT CfilterTitleOverlay:Transform(ImediaSample *pSample)/如果我们不能从输入Pin的媒体类型中获得帧率参数信息则根据第一个Sample上的时间戳/来计算If(mNeedEstimateFrameRate)mNeedEstimateFrameRate=FALSE;REFERENCE_TIME startTime=0;REFERENCE_TIME endTime=0;Double estimated=25;If(SUCCEED(pSample-GetTime(&startTime,&endTime)Estimated=1.0*UNITS/(endTime-startTime);mOverlayController-SetEstimatedFrameRate(estimated);If(mOverlayType!=OT_NONE)PBYTE pData=NULL;pSample-GetPointer(&pData);mOverlayController-DoTitleOverlay(pData);Retrun NOERROR:其中mOverlayController-DoTitleOverlay(pData)是真正实现字符叠加的函数调用。NonDelegatingQueryInterface函数可以“暴露”Filter支持的接口,代码如下:STDMETHODIMP CfilterTitleOverlay:NonDelegatingQueryInterface(REFIID riid,void *ppv)CheckPointer(ppv,E_POINTER);If(riid=IID_ISpecifyPropertyPages)/属性页接口 Return GetInterface(IspecifyPropertyPages *)this,ppv); Else if(riid=IID_ITitleOverlay)Return GetInterface(ItitleOverlay *)this,ppv);ElseReturn CtransInPlaceFilter:NonDelegatingQueryInterface(riid,ppv);CompleteConnect函数的实现实现CompleteConnect函数,可以在输入Pin成功连接后取得媒体类型描述,代码如下:HRESULT CfilterTitleOverlay:CompleteConnect(PIN_DIRECTION direction,Ipin *pReceivePin)HRESULT hr=CtransInPlaceFilter:CompleteConnect(direction,pReceivePin);If(SUCCEED(hr)&direction=PINDIR_INPUT)Hr=setInputVideoInfoToController();Return hr;其中,SetInputVideoInfoToController函数将输入数据的格式设置给应用逻辑控制对象,该函数实现代码如下:HRESULT CfilterTitleOverlay:SetInputVideoInfoToController(void)If(mOverlayController&m_pInput&m_pInput-IsConnected()/.StartStreaming和StopStreaming函数的实现实现StartStreaming和StopStreaming函数,可以分别调用应用逻辑控制对象的相应函数,进行初始化和反初始化,代码如下:HRESULT CfilterTitleOverlay:StartStraming()BOOL pass=mOverlayController-StartTitleOverlay();Return pass?S_OK:E_FAIL;HRESULT CfilterTitleOverlay:StopStreaming()mOVerlayController-StopTitleOverlay();return NOERROR;逻辑控制类实现逻辑控制类才是字符叠加应该真正实现的地方。字符叠加原理:一般输入的每个视频Sample(非压缩格式)都带有一帧图像数据,字符叠加实际上就是将指定位置的图像像素值替换为字符图像的像素值。直观的想法是:将图像帧

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论