【视频采集 源码】【毕业季源码】【烈焰源码修改】filter源码设计

2024-11-26 14:53:05 来源:55D源码 分类:休闲

1.如何设计自定义的DIrectShow transform filter
2.Shiro源码分析---FilterChain创建过程
3.filter的源码中文意思是什么?
4.filter过滤器配置如何不过滤一些页面

filter源码设计

如何设计自定义的DIrectShow transform filter

       å¯¹äºŽDIrectShow的初学者而言,最大的困难莫过于尝试设计自定义的filter。

       è®¾è®¡è‡ªå®šä¹‰çš„transform filter是困难的

       å› ä¸º 首先filter是一种dll (后缀名为.ax)而编写dll工程需要一定的VC基础 所以建议先补充一点dll的知识

       å…¶æ¬¡ dll的注册,GUID的生成和工程的配置都很麻烦。

       å†æ¬¡ 网上缺乏现成的transform filter的例子。DirectShow给的源码比如NULLINPLACE 和CONTRAST都太复杂,都带有对话框和属性页,不适合初学者,而且这些例子 没有一个涉及到图像格式的转换,而transform filter最大的公用就是媒体类型的转换,因此这些例子不适用

       ä½œä¸ºä¸€ä¸ªåˆå­¦è€…,我深深受到这些问题的困扰,经过刻苦钻研终于走出了这个泥潭,豁然开朗。于是把它记录下来,希望可以对其他人有帮助,也作为对年的一个小结。

       æˆ‘的例子是 设计一个 transform filter 把 YUY2 bit 的媒体转化为RGB bit的类型。

       åŽŸå› æ˜¯æˆ‘的摄像头只支持YUY2 bit这种格式, 我想得到位图。。顺便学习一下Filter的设计

       ä»¥ä¸‹ä¸ºå…·ä½“步骤:

       ä¸€ 配置开发环境

        1. VC中在Tools->Options->Directories 设置好DirectX SDK的头文件和库文件路径

        2. 编译了基类源码,生成strmbasd.lib (debug版), strmbase.lib(release版)

        3. VC向导新建一个win DLL(empty)工程

        4. Setting->Link->Output file name: YUV2RGBfilter.ax

        5. Setting->Link加入strmbasd.lib winmm.lib quartz.lib vfw.lib (注意路径)

        6. 定义一个同名.def文件,加入到工程,内容如下:

        LIBRARY YUV2RGBfilter.ax

        EXPORTS

        DllMain PRIVATE

        DllGetClassObject PRIVATE

        DllCanUnloadNow PRIVATE

        DllRegisterServer PRIVATE

        DllUnregisterServer PRIVATE

        7.建立一个类 YUV2RGBfilter 建立他的cpp文件和h文件

        8. 在YUV2RGBfilter.cpp中定义DLL的入口函数及注册 放在cpp文件的最后

       //

       // DllEntryPoint

       //

       extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

       BOOL APIENTRY DllMain(HANDLE hModule,

        DWORD dwReason,

        LPVOID lpReserved)

       {

       return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);

       }

       ////////////////////////////////////////////////////////////////////////

       //

       // Exported entry points for registration and unregistration

       // (in this case they only call through to default implementations).

       //

       ////////////////////////////////////////////////////////////////////////

       STDAPI DllRegisterServer()

       {

        return AMovieDllRegisterServer2( TRUE );

       }

       STDAPI DllUnregisterServer()

       {

        return AMovieDllRegisterServer2( FALSE );

       }

        9. cpp文件中要包含的头文件

       #include <streams.h>

       #include <windows.h>

       #include <initguid.h>

       #include <olectl.h>

       #if ( > _MSC_VER)

       #include <olectlid.h>

       #endif

       #include "Y2Ruids.h" // our own public guids

       #include "YUV2RGBfilter.h"

       äºŒ 开发Filter

        1. 生成GUID( 命令行模式下运行guidgen工具) 为他建立一个文件Y2Ruids.h 单独引用

       #include <initguid.h>

       // YUV2toRGB Filter Object

       // { FFC8FD-B1A6-b0-A-D6EDEAFDA}

       DEFINE_GUID(CLSID_YUV2toRGB,

       0xffc8fd, 0xb1a6, 0xb0, 0xa3, 0x8, 0xd6, 0xed, 0xea, 0xf4, 0x5, 0xda);

        2. 构造CYUV2RGBfilterç±» 继承自CTransformFilter 写在TransformFilter.h中

       // ----------------------------------------------------------------------------

       // Class definitions of CYUV2RGBfilter

       // ----------------------------------------------------------------------------

       //

       //

       class CYUV2RGBfilter : public CTransformFilter

       {

        public:

        static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);

        STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);

        DECLARE_IUNKNOWN;

       // override pure virtual function

        HRESULT CheckInputType(const CMediaType *mtIn);

        HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut);

        HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProp);

        HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);

        HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);

        private:

        //Constructor

        CYUV2RGBfilter(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr);

        // member function

        VOID ChangeFormat(AM_MEDIA_TYPE* pAdjustedType);

        DWORD ConvertYUV2toRGB(BYTE* yuv, BYTE* rgb, DWORD dsize);

        // member variable

        const long m_lBufferRequest;

        CCritSec m_Y2RLock; // To serialise access.

       };

        3. 按格式改写构造函数

        //

       // CNullInPlace::Constructor

       //

       CYUV2RGBfilter::CYUV2RGBfilter(TCHAR *tszName,LPUNKNOWN punk,HRESULT *phr) :

        CTransformFilter(tszName, punk, CLSID_YUV2toRGB),

        m_lBufferRequest(1)

       {

       ASSERT(tszName);

        ASSERT(phr);

       } // CYUV2RGBfilter

        4. 改写CTransformFilter五个纯虚函数(最重要的地方)

        HRESULT CheckInputType(const CMediaType *mtIn);

        HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut);

        HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProp);

        HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);

        HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);

        5. 设计自己的私有函数 完成一定的功能

        6. 注册Filter信息

       // 注册信息

       //setup data

       const AMOVIESETUP_MEDIATYPE

       sudPinTypes = { &MEDIATYPE_Video // clsMajorType

        , &MEDIASUBTYPE_NULL } ; // clsMinorType

       const AMOVIESETUP_PIN

       psudPins[] = { { L"Input" // strName

        , FALSE // bRendered

        , FALSE // bOutput

        , FALSE // bZero

        , FALSE // bMany

        , &CLSID_NULL // clsConnectsToFilter

        , L"Output" // strConnectsToPin

        , 1 // nTypes

        , &sudPinTypes } // lpTypes

        , { L"Output" // strName

        , FALSE // bRendered

        , TRUE // bOutput

        , FALSE // bZero

        , FALSE // bMany

        , &CLSID_NULL // clsConnectsToFilter

        , L"Input" // strConnectsToPin

        , 1 // nTypes

        , &sudPinTypes } }; // lpTypes

Shiro源码分析---FilterChain创建过程

       在Shiro框架中,无论是设计进行认证还是权限控制,都依赖于过滤器的源码配置与应用。在实际开发中,设计可能需要配置多个过滤器,源码但每个请求所经过的设计视频采集 源码过滤器组合却因请求不同而异。因此,源码理解一个请求会通过哪些过滤器,设计对于熟练使用Shiro至关重要。源码本文将详细解析请求通过的设计过滤器创建过程。

       Shiro框架通过`org.apache.shiro.web.filter.mgt.FilterChainResolver`接口定义了如何确定一个请求应经过哪些过滤器。源码接口中的设计唯一方法`getChain`负责查找并组装一个过滤器链(FilterChain),该链包含了请求处理过程中所应用的源码所有过滤器。`FilterChain`是设计一个熟知的概念,尤其是源码对于Servlet开发人员来说,它在日常工作中常见。而`FilterChainResolver`仅是毕业季源码一个接口,Shiro提供了默认实现类`org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver`,该实现类利用请求路径来匹配相应的过滤器。

       在深入理解PathMatchingFilterChainResolver的源码前,先来看看FilterChainManager是如何管理和创建FilterChain的。Shiro提供了一个默认的FilterChainManager实现类`org.apache.shiro.web.filter.mgt.DefaultFilterChainManager`。其关键方法`createChain`在系统启动时被调用,用于创建各个FilterChain。以配置示例`/static/**、烈焰源码修改/formfilterlogin,/role`为例,`chainName`与`chainDefinition`分别代表了需要管理的FilterChain名称与定义。

       了解了FilterChainManager的创建与管理机制后,接下来关注FilterChainResolver如何确定请求所需过滤器链。在`DefaultFilterChainManager.proxy`方法中,`NamedFilterList`的实现类`org.apache.shiro.web.filter.mgt.SimpleNamedFilterList`被调用,此步骤是jfinal源码解读确定过滤器链的关键环节。

       至此,Shiro框架中FilterChain创建过程已全面解析完成。如有任何错误或需要进一步讨论的问题,欢迎指正。感谢阅读,期待更多的技术交流。

filter的中文意思是什么?

       Filter 技术是servlet 2.3 新增加的功能。servlet2.3是mrp计算源码sun公司于年月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。

       在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。

扩展资料

       Filter实际上只是一些函数,在编写函数之前,要确定这个Filter属于哪一类,不同类的Filter,所需要的参数是不一样的,缺省情况下,参数个数为一个。

       在WordPress中,Filter的类名是通过Tag来指定的,每个Tag下可以定义很多Filter,每个Filter又可以有自己的优先级。Filter是通过Tag来调用的,每次调用,注册在该Tag下的所有的Filter都会被运行,

       这些Filter的调用顺序是根据注册时定义的优先级来确定的,优先级数值低的先执行,优先级数值高的后执行。

       要知道具体某一类Filter的参数是什么,需要先知道该类Filter的Tag名,不同的Tag在不同的时候会被调用,通过查阅WordPress文档找到添加Filter的适当地方。

       然后在WordPress的源码中搜索该Tag的名字,查找某个已加入该Tag的函数或者说是Filter,确定函数参数以后就可以编写自己的实现函数了。注意要在函数中返回处理过后的内容以供其他的Filter继续处理。

百度百科-Filter

filter过滤器配置如何不过滤一些页面

       一般我的方法是

       判断uri的是不是这三个

       如果是这三个,不做处理,直接直接 下一步

       =================

       唉,直接给你看源码吧

       在doFilter方法里写上

       String contextPath = InitObjects.getContextPath();

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;

       //获得用户请求的uri

        String uri = httpServletRequest.getRequestURI();

       //eccludedPages是个List,存放着比如index.jsp,error.jsp等不需要过滤的页面

        if (!excludedPages.contains(uri)) {

        }

        }

        filterChain.doFilter(request, response);

本文地址:http://0553.net.cn/html/5b775392241.html 欢迎转发