`

ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)

 
阅读更多

 

注:写了一系列的文章,都是关于ffdshow中的位图覆盖滤镜的源代码分析的,在此列一个列表:

ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)
ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)
ffdshow 源代码分析 5: 位图覆盖滤镜(总结)

上一篇文章介绍了ffdshow的位图覆盖滤镜的对话框(Dialog)部分:ffdshow 源代码分析2 : 位图覆盖滤镜(对话框部分Dialog)

在这里再介绍一下设置部分(Settings),此外还有一个滤镜部分(Filter)。这三个部分就可以组成一个ffdshow的滤镜功能了。

设置部分(Settings)

在ffdshow中滤镜的设置部分(Settings)主要用于存储滤镜运行过程中需要用到的各种变量。一般情况下通过读取注册表变量并赋值给该类当中的变量从而达到操作相应滤镜的功能。

与位图覆盖(Bitmap)滤镜的设置有关的类位于settings->filters->video目录下(隐藏的很深啊)的TbitmapSettings.cpp和TbitmapSettings.h文件中。

先来看看TbitmapSettings.h

该类的名字叫TbitmapSettings,从类的定义我们可以看出,

flnm[]存储了打开的位图的路径

posx,posy存储了位图在屏幕上显示的位置

mode存储了显示的方式

等等,所有跟该滤镜(Filter)相关的数据都存储在该类之中。

该类包含一个TfilterIDFF类型的结构体idffs,用于存储该滤镜的一些属性信息(名称,ID,属性对话框ID等等)

此外,有两个函数至关重要。createFilters()用于创建滤镜(Filter)。createPages()用于创建滤镜的配置对话框(Dialog)。

 

#ifndef _TBITMAPSETTINGS_H_
#define _TBITMAPSETTINGS_H_
//各个Filter预设值
#include "TfilterSettings.h"
#include "Tfont.h"
//Bitmap的配置信息
struct TbitmapSettings : TfilterSettingsVideo {
private:
    static const TfilterIDFF idffs;
protected:
    virtual const int *getResets(unsigned int pageId);
public:
    TbitmapSettings(TintStrColl *Icoll = NULL, TfilterIDFFs *filters = NULL);
    //Bitmap文件路径
	char_t flnm[MAX_PATH];
	//x,y坐标,以及坐标的模式
    int posx, posy, posmode;
    int align;
	//叠加方式
    enum {
        MODE_BLEND = 0,
        MODE_DARKEN = 1,
        MODE_LIGHTEN = 2,
        MODE_ADD = 3,
        MODE_SOFTLIGHT = 4,
        MODE_EXCLUSION = 5
    };
    int mode;
    static const char_t *modes[];
    int strength;
	//创建Filter
    virtual void createFilters(size_t filtersorder, Tfilters *filters, TfilterQueue &queue) const;
	//创建属性页面
    virtual void createPages(TffdshowPageDec *parent) const;
    virtual bool getTip(unsigned int pageId, char_t *buf, size_t buflen);
};

#endif



 

再来看看TbitmapSettings.cpp

该类包含了TbitmapSettings类中函数方法的具体实现。首先看一下构造函数TbitmapSettings()。从构造函数中可以看出,绑定了类中的变量和注册表变量,使它们形成一一对应的关系。其他的函数就不再细说了,比较简单,理解起来比较容易。

 

/*
 * Copyright (c) 2004-2006 Milan Cutka
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "stdafx.h"
#include "TbitmapSettings.h"
#include "TimgFilterBitmap.h"
#include "Cbitmap.h"
#include "TffdshowPageDec.h"
#include "TsubtitlesSettings.h"
//几种叠加方式
const char_t* TbitmapSettings::modes[] = {
    _l("blend"),
    _l("darken"),
    _l("lighten"),
    _l("add"),
    _l("softlight"),
    _l("exclusion"),
    NULL
};
//Filter属性
const TfilterIDFF TbitmapSettings::idffs = {
    /*name*/      _l("Bitmap overlay"),
    /*id*/        IDFF_filterBitmap,
    /*is*/        IDFF_isBitmap,
    /*order*/     IDFF_orderBitmap,
    /*show*/      IDFF_showBitmap,
    /*full*/      IDFF_fullBitmap,
    /*half*/      0,
    /*dlgId*/     IDD_BITMAP,
};
//构造函数
TbitmapSettings::TbitmapSettings(TintStrColl *Icoll, TfilterIDFFs *filters): TfilterSettingsVideo(sizeof(*this), Icoll, filters, &idffs)
{
    half = 0;
    memset(flnm, 0, sizeof(flnm));
	//绑定变量
    static const TintOptionT<TbitmapSettings> iopts[] = {
        IDFF_isBitmap       , &TbitmapSettings::is        , 0, 0, _l(""), 1,
        _l("isBitmap"), 0,
        IDFF_showBitmap     , &TbitmapSettings::show      , 0, 0, _l(""), 1,
        _l("showBitmap"), 1,
        IDFF_orderBitmap    , &TbitmapSettings::order     , 1, 1, _l(""), 1,
        _l("orderBitmap"), 0,
        IDFF_fullBitmap     , &TbitmapSettings::full      , 0, 0, _l(""), 1,
        _l("fullBitmap"), 0,
        IDFF_bitmapPosx     , &TbitmapSettings::posx      , -4096, 4096, _l(""), 1,
        _l("bitmapPosX"), 50,
        IDFF_bitmapPosy     , &TbitmapSettings::posy      , -4096, 4096, _l(""), 1,
        _l("bitmapPosY"), 50,
        IDFF_bitmapPosmode  , &TbitmapSettings::posmode   , 0, 1, _l(""), 1,
        _l("bitmapPosMode"), 0,
        IDFF_bitmapAlign    , &TbitmapSettings::align     , 0, 3, _l(""), 1,
        _l("bitmapAlign"), ALIGN_CENTER,
        IDFF_bitmapMode     , &TbitmapSettings::mode      , 0, 5, _l(""), 1,
        _l("bitmapMode"), 0,
        IDFF_bitmapStrength , &TbitmapSettings::strength  , 0, 256, _l(""), 1,
        _l("bitmapStrength"), 128,
        0
    };
    addOptions(iopts);
    static const TstrOption sopts[] = {
        IDFF_bitmapFlnm     , (TstrVal)&TbitmapSettings::flnm  , MAX_PATH, 0, _l(""), 1,
        _l("bitmapFlnm"), _l(""),
        0
    };
    addOptions(sopts);

    static const TcreateParamList1 listMode(modes);
    setParamList(IDFF_bitmapMode, &listMode);
    static const TcreateParamList1 listAlign(TsubtitlesSettings::alignments);
    setParamList(IDFF_bitmapAlign, &listAlign);
}
//创建Filter
void TbitmapSettings::createFilters(size_t filtersorder, Tfilters *filters, TfilterQueue &queue) const
{
    idffOnChange(idffs, filters, queue.temporary);
    if (is && show) {
        queueFilter<TimgFilterBitmap>(filtersorder, filters, queue);
    }
}
//创建属性页面
void TbitmapSettings::createPages(TffdshowPageDec *parent) const
{
    parent->addFilterPage<TbitmapPage>(&idffs);
}

const int* TbitmapSettings::getResets(unsigned int pageId)
{
    static const int idResets[] = {
        IDFF_bitmapPosx, IDFF_bitmapPosy, IDFF_bitmapPosmode, IDFF_bitmapAlign, IDFF_bitmapMode, IDFF_bitmapStrength,
        0
    };
    return idResets;
}

bool TbitmapSettings::getTip(unsigned int pageId, char_t *tipS, size_t len)
{
    if (flnm[0]) {
        tsnprintf_s(tipS, len, _TRUNCATE, _l("%s %s"), modes[mode], flnm);
        tipS[len - 1] = '\0';
    } else {
        tipS[0] = '\0';
    }
    return true;
}



 

 

 

分享到:
评论

相关推荐

    ffmpeg基础开发资料自总结

    ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings) 297 ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 301 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 306 ffdshow 源代码分析 6: 对解码器的 ...

    FFmpeg基础库编程开发

    ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings) 312 ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 317 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 322 ffdshow 源代码分析 6: 对解码器的...

    开源的ffdshow源代码

    进入`trunk`目录,我们可以看到源代码的组织结构,通常包括以下部分: - **Source**:包含核心解码和处理的源代码。 - **Include**:头文件,定义了接口和数据结构。 - **Config**:配置文件,用于设置编译选项和...

    ffdshow的源代码(2012)

    5. **滤波器开发**:ffdshow源代码提供了一个很好的实例,展示了如何编写DirectShow滤波器,包括注册滤镜、实现滤镜接口、处理媒体样本等。 6. **编译与调试**:获取源代码后,开发者可以尝试在Visual Studio等环境...

    FFDSHOW 源代码

    开发者可以通过分析和修改FFDSHOW源代码,学习到以下知识点: - **视频和音频解码原理**:了解各种编码标准的内部工作方式,例如H.264的宏块解码、熵解码等。 - **DirectShow编程**:学习如何创建和使用...

    ffdshow源代码

    通过分析ffdshow的源代码,开发者可以深入理解视频解码的底层原理,学习如何在DirectShow架构下实现自定义的滤镜和解码器。此外,源代码还提供了丰富的配置选项,允许用户自定义解码行为,例如改变视频质量、添加...

    ffdshow的源代码

    在本压缩包中,你将找到FFDShow在directshow下的源代码,这对于深入理解DirectShow架构以及H.264等现代视频编码技术具有重要的学习价值。 首先,我们来探讨一下FFDShow的主要功能。FFDShow主要负责在DirectShow播放...

    ffdshow sdk

    3. `ffdshow.dsp`:这是一个Visual Studio项目文件,包含了FFDShow SDK的工程设置和编译选项。 4. `ffdshow_all.dsp`:可能是一个包含所有相关组件的大型项目文件,可能包括FFDShow的所有模块和插件。 5. `ffdshow...

    ffdshow代码

    总的来说,ffdshow代码是一个涵盖视频解码、画质优化和用户自定义功能的综合性工具。通过学习它的源码,开发者可以提升在视频处理领域的专业技能,同时也可以为自己的项目引入类似的功能。无论是对个人学习还是商业...

    X264最新源代码(20100501)

    提到“ffdshow源代码中移植过来的”,这表明X264的某些部分或全部代码可能已经整合到了ffdshow项目中。ffdshow是一款著名的DirectShow滤镜,用于解码多种视频和音频格式,包括H.264。将X264集成到ffdshow中,可以...

    ffdshow-4534

    描述中提到的“完整的FFDSHOW代码”意味着这个压缩包包含了FFDShow解码器的所有源代码,开发者可以通过这些源代码了解FFDShow的工作原理,甚至对其进行修改或扩展以适应特定需求。源代码通常对开发者来说是极其宝贵...

    ffdshow_source_2011_12_28 ffdshow源码(2011-12-28)

    这个压缩包"ffdshow_source_2011_12_28 ffdshow源码(2011-12-28)"包含了2011年12月28日版本的ffdshow的源代码,对于开发者来说,这是一个宝贵的资源,可以深入了解其内部工作原理并进行二次开发或定制。 1. **...

    ffdshow源码开发包及手册

    ffdshow和FFmpeg的部分模块就可能包含这样的优化代码。使用NASM,开发者可以更直接地控制处理器的行为,实现高效的编码和解码算法。 总的来说,这个压缩包提供了一个完整的ffdshow开发环境,包括了源码、SDK、开发...

    VC写的MP3播放器源代码

    本文将详细探讨一款使用VC++编写的MP3播放器的源代码,该程序已经在VC6.0环境下通过编译,并且具有独特的界面设计和位图贴图功能。为了更好地理解这个项目,我们将从以下几个方面进行深入分析: 1. **VC++编程基础*...

    ffdshow.EXE

    ffdshow的源代码采用C++编写,遵循LGPL许可协议,这意味着其他开发者可以自由地使用、修改和分发这个软件。由于其开源性质,ffdshow获得了社区的持续维护和支持,不断更新以适应新的编码标准和技术进步。此外,...

    多种文件播放器源代码

    在IT领域,开发一个能播放多种文件格式的播放器是一项技术性强且实用的任务。这个"多种文件播放器源代码"项目显然...通过学习和分析这个源代码,开发者不仅可以提升C++编程技能,还能了解多媒体处理领域的核心技术。

    ffdshow(20070210)源码

    ffdshow的源码分析可以帮助开发者深入理解视频解码的过程,包括如何解析视频流、提取帧数据、进行颜色空间转换以及如何应用各种解码优化技术。对于想要自定义解码器功能或实现特定视频处理算法的开发者来说,这是一...

    ffdshow解码器2012.3.22官方中文版.rar

    可自定义选择安装以下组件:ffdshow DirectShow 滤镜DXVA video decoderVFW 接口AviSynth 脚本服务应用程序插件:AviSynthVirtualDubDScaler扬声器设置:1.0 (单声道扬声器)2.0 (耳机)2.0 (双声道扬声器)...

    ffdshow20130525x64解码器

    ffdshow作为一款开源且免费的解码滤镜,它支持多种编码格式,如H.264、MPEG-4 ASP、DivX、Xvid等,极大地拓宽了用户可播放的视频类型。 ffdshow的工作原理是接收已编码的视频数据,然后将其转化为计算机可以理解和...

    MP3播放器vc++源代码

    在源代码中,MP3播放器的核心部分是文件读取和解码逻辑。开发者需要实现读取MP3文件的二进制数据,然后传递给解码器进行解码。解码后的PCM(脉冲编码调制)数据会被转换为音频波形,再通过WinMM接口发送到声卡进行...

Global site tag (gtag.js) - Google Analytics