注:写了一系列的文章,都是关于ffdshow中的位图覆盖滤镜的源代码分析的,在此列一个列表:
ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)
ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)
ffdshow 源代码分析 5: 位图覆盖滤镜(总结)
第一篇文章介绍了ffdshow的位图覆盖滤镜的对话框(Dialog)部分:ffdshow 源代码分析2 : 位图覆盖滤镜(对话框部分Dialog)
第二篇文章介绍了ffdshow的位图覆盖滤镜的设置(Settings)部分:ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
此外还有一个滤镜部分(Filter)。这三个部分就可以组成一个ffdshow的滤镜功能了。本文就来简介一下ffdshow的滤镜部分。
滤镜部分(Filter)
ffdshow的滤镜的滤镜部分(怎么感觉名字有点重复 = =,算了先这么叫吧)的功能主要用于完成具体的图像处理功能。具体到位图覆盖滤镜的话,就是用于把图片覆盖到视频上面,他是ffdshow滤镜的核心。
与位图覆盖(Bitmap)滤镜的滤镜处理有关的类位于imgFilters目录下的TimgFilterBitmap.h和TimgFilterBitmap.cpp文件中。
先来看看TimgFilterBitmap.h
这里要注意一下,该类的名字叫TimgFilterBitmap。它的声明方式确实比较奇怪:DECLARE_FILTER(TimgFilterBitmap, public, TimgFilter)
可以看出DECLARE_FILTER是一个宏,具体这个宏的内部代码就先不查看了,否则会感觉很混乱,暂且留下一个小小的谜团。在这里只要知道这是声明了一个滤镜类就可以了。
其实TimgFilterBitmap的核心函数不多,就一个,那就是process(),具体的处理功能都是在这个函数里面实现的。
/* *雷霄骅 *leixiaohua1020@126.com *中国传媒大学/数字电视技术 */ #ifndef _TIMGFILTERBITMAP_H_ #define _TIMGFILTERBITMAP_H_ //叠加一张位图 #include "TimgFilter.h" #include "Tfont.h" struct TffPict; struct TbitmapSettings; //特别的声明方式 = = DECLARE_FILTER(TimgFilterBitmap, public, TimgFilter) private: //图像 TffPict *bitmap; //内存 Tbuffer bitmapbuf; char_t oldflnm[MAX_PATH]; typedef void (*Tblendplane)(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); //注意 这个类有一个实例,名字叫w class TrenderedSubtitleLineBitmap : public TrenderedSubtitleWordBase { public: TrenderedSubtitleLineBitmap(void): TrenderedSubtitleWordBase(false) {} TffPict *pict; const TbitmapSettings *cfg; //叠加 Tblendplane blend; //打印 virtual void print(int startx, int starty /* not used */, unsigned int dx[3], int dy1[3], unsigned char *dstLn[3], const stride_t stride[3], const unsigned char *bmp[3], const unsigned char *msk[3], REFERENCE_TIME rtStart = REFTIME_INVALID) const; } w; TrenderedSubtitleLine l; //是TrenderedSubtitleLine的一个vector TrenderedSubtitleLines ls; int oldmode; //几种叠加方式 template<class _mm> static void blend(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); template<class _mm> static void add(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); template<class _mm> static void darken(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); template<class _mm> static void lighten(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); template<class _mm> static void softlight(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); template<class _mm> static void exclusion(const TcspInfo &cspInfo, const unsigned int dx[3], const unsigned int dy[3], unsigned char *dst[3], const stride_t dststride[3], const unsigned char *src[3], const stride_t srcstride[3], int strength, int invstrength); //获取叠加方式 template<class _mm> static Tblendplane getBlend(int mode); protected: virtual bool is(const TffPictBase &pict, const TfilterSettingsVideo *cfg); virtual uint64_t getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const { return FF_CSPS_MASK_YUV_PLANAR; } public: TimgFilterBitmap(IffdshowBase *Ideci, Tfilters *Iparent); virtual ~TimgFilterBitmap(); //核心函数(Filter配置信息队列,图像,配置信息) virtual HRESULT process(TfilterQueue::iterator it, TffPict &pict, const TfilterSettingsVideo *cfg0); }; #endif
再来看看TimgFilterBitmap.cpp
这个文件本身代码量是比较大的,只是其他部分我都还没有仔细分析,确实没那没多时间。。。在这里仅简要分析一下最核心的函数process()。正是这个函数真正实现了滤镜的功能。在这个位图叠加滤镜中,process()实现了位图在视频上面的叠加功能。
//核心函数(Filter配置信息队列,图像,配置信息) HRESULT TimgFilterBitmap::process(TfilterQueue::iterator it, TffPict &pict, const TfilterSettingsVideo *cfg0) { //都有这一句= = if (is(pict, cfg0)) { //Bitmap的配置信息 const TbitmapSettings *cfg = (const TbitmapSettings*)cfg0; init(pict, cfg->full, cfg->half); unsigned char *dst[4]; bool cspChanged = getCurNext(FF_CSPS_MASK_YUV_PLANAR, pict, cfg->full, COPYMODE_DEF, dst); //处理 if (!bitmap || cspChanged || stricmp(oldflnm, cfg->flnm) != 0) { ff_strncpy(oldflnm, cfg->flnm, countof(oldflnm)); if (bitmap) { delete bitmap; } //新建一张图 //通过cfg->flnm路径 //载入bitmapbuf bitmap = new TffPict(csp2, cfg->flnm, bitmapbuf, deci); //3个颜色分量? for (int i = 0; i < 3; i++) { w.dx[i] = bitmap->rectFull.dx >> bitmap->cspInfo.shiftX[i]; w.dy[i] = bitmap->rectFull.dy >> bitmap->cspInfo.shiftY[i]; w.bmp[i] = bitmap->data[i]; w.bmpmskstride[i] = bitmap->stride[i]; } w.dxChar = w.dx[0]; w.dyChar = w.dy[0]; } if (bitmap->rectFull.dx != 0) { if (oldmode != cfg->mode) if (Tconfig::cpu_flags & FF_CPU_SSE2) { //获取叠加方式(SSE2) //在cfg的mode里 w.blend = getBlend<Tsse2>(oldmode = cfg->mode); } else { //获取叠加方式(MMX) w.blend = getBlend<Tmmx>(oldmode = cfg->mode); } //输出到屏幕上的设置 TprintPrefs prefs(deci, NULL); //各种参数 prefs.dx = dx2[0]; prefs.dy = dy2[0]; prefs.xpos = cfg->posx; prefs.ypos = cfg->posy; //模式不同的话 if (cfg->posmode == 1) { prefs.xpos *= -1; prefs.ypos *= -1; } prefs.align = cfg->align; prefs.linespacing = 100; prefs.csp = pict.csp; w.pict = &pict; w.cfg = cfg; //打印,需要用到TprintPrefs ls.print(prefs, dst, stride2); } } //最后都是这一句? return parent->processSample(++it, pict); }
相关推荐
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 301 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 306 ffdshow 源代码分析 6: 对解码器的 dll 的封装(libavcodec) 306 ffdshow 源代码分析 8: 视频解码...
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 317 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 322 ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) 322 ffdshow 源代码分析 8: 视频解码器...
进入`trunk`目录,我们可以看到源代码的组织结构,通常包括以下部分: - **Source**:包含核心解码和处理的源代码。 - **Include**:头文件,定义了接口和数据结构。 - **Config**:配置文件,用于设置编译选项和...
5. **滤波器开发**:ffdshow源代码提供了一个很好的实例,展示了如何编写DirectShow滤波器,包括注册滤镜、实现滤镜接口、处理媒体样本等。 6. **编译与调试**:获取源代码后,开发者可以尝试在Visual Studio等环境...
开发者可以通过分析和修改FFDSHOW源代码,学习到以下知识点: - **视频和音频解码原理**:了解各种编码标准的内部工作方式,例如H.264的宏块解码、熵解码等。 - **DirectShow编程**:学习如何创建和使用...
通过分析ffdshow的源代码,开发者可以深入理解视频解码的底层原理,学习如何在DirectShow架构下实现自定义的滤镜和解码器。此外,源代码还提供了丰富的配置选项,允许用户自定义解码行为,例如改变视频质量、添加...
在本压缩包中,你将找到FFDShow在directshow下的源代码,这对于深入理解DirectShow架构以及H.264等现代视频编码技术具有重要的学习价值。 首先,我们来探讨一下FFDShow的主要功能。FFDShow主要负责在DirectShow播放...
- 学习FFDShow的源代码,了解如何高效地处理视频解码和编码。 - 创建自定义的解码器和编码器,以适应特定的需求或优化性能。 - 将FFDShow的功能集成到多媒体播放器、视频编辑软件或其他多媒体应用中。 - 开发新的...
总的来说,ffdshow代码是一个涵盖视频解码、画质优化和用户自定义功能的综合性工具。通过学习它的源码,开发者可以提升在视频处理领域的专业技能,同时也可以为自己的项目引入类似的功能。无论是对个人学习还是商业...
提到“ffdshow源代码中移植过来的”,这表明X264的某些部分或全部代码可能已经整合到了ffdshow项目中。ffdshow是一款著名的DirectShow滤镜,用于解码多种视频和音频格式,包括H.264。将X264集成到ffdshow中,可以...
FFDShow支持多种编码格式,如H.264、MPEG-4 ASP、DivX、Xvid等,并且提供了丰富的自定义选项,比如视频滤镜、后处理效果等。对于开发者来说,理解并研究FFDShow的源代码可以帮助他们学习如何实现高效的视频解码,也...
这个压缩包"ffdshow_source_2011_12_28 ffdshow源码(2011-12-28)"包含了2011年12月28日版本的ffdshow的源代码,对于开发者来说,这是一个宝贵的资源,可以深入了解其内部工作原理并进行二次开发或定制。 1. **...
首先,FFDSHOW消耗CPU功率比原来...- 哈克,以防止与H.264 4:4:4的崩溃。色彩尚不支持。 - 更新黑名单 重要注意事项: - 一些杀毒软件一样的AVG“检测”在FFDSHOW木马之上。这是一个假阳性,有FFDSHOW建立无木马!
ffdshow和FFmpeg的部分模块就可能包含这样的优化代码。使用NASM,开发者可以更直接地控制处理器的行为,实现高效的编码和解码算法。 总的来说,这个压缩包提供了一个完整的ffdshow开发环境,包括了源码、SDK、开发...
ffdshow的源码分析可以帮助开发者深入理解视频解码的过程,包括如何解析视频流、提取帧数据、进行颜色空间转换以及如何应用各种解码优化技术。对于想要自定义解码器功能或实现特定视频处理算法的开发者来说,这是一...
1. 源滤镜(Source Filter):提供原始数据流,如从文件、网络或摄像头中读取媒体内容。 2. 解码滤镜(Decoder Filter):将编码后的媒体数据转换回原始格式。 3. 转换滤镜(Transformer Filter):处理格式转换,...
ffdshow的源代码采用C++编写,遵循LGPL许可协议,这意味着其他开发者可以自由地使用、修改和分发这个软件。由于其开源性质,ffdshow获得了社区的持续维护和支持,不断更新以适应新的编码标准和技术进步。此外,...
FFDShow可以称得上是全能的解码、编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远远超出了mepg4的范围,包括indeo video,WMV,mpeg2等等.同时,它也提供了丰富的加工...
ffdshow作为一款开源且免费的解码滤镜,它支持多种编码格式,如H.264、MPEG-4 ASP、DivX、Xvid等,极大地拓宽了用户可播放的视频类型。 ffdshow的工作原理是接收已编码的视频数据,然后将其转化为计算机可以理解和...
FFDShow MPEG-4 Video Decoder 2008 03.20