`

ffdshow 源代码分析 9: 编解码器有关类的总结

 
阅读更多

 

注:写了一系列的有关ffdshow对解码器的封装的代码,列表如下:
ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)
ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)
ffdshow 源代码分析 9: 编解码器有关类的总结

==========

 

前几篇文章已经完成了ffdshow解码器封装的大部分代码的分析:

ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)

ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)

ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)

 

本文再做最后一点的分析。在ffdshow中有如下继承关系:

 

前文已经分析过TvideoCodecLibavcodec,TvideoCodecDec,在这里我们看一下他们的父类:TvideoCodec,TcodecDec,以及前两个类的父类Tcodec。

其实本文介绍的这3个类充当了接口的作用,TvideoCodecDec继承TvideoCodec,TcodecDec,以及这两个类继承Tcodec,都使用了virtual的方式。

 

先来看看TvideoCodec。注意这个类强调的是【视频】:

//编解码器的父类
class TvideoCodec : virtual public Tcodec
{
public:
    TvideoCodec(IffdshowBase *Ideci);
    virtual ~TvideoCodec();
    bool ok;
    int connectedSplitter;
    bool isInterlacedRawVideo;
    Rational containerSar;

    struct CAPS {
        enum {
            NONE = 0,
            VIS_MV = 1,
            VIS_QUANTS = 2
        };
    };

    virtual void end(void) {}
};

 

可以看出TvideoCodec定义非常的简单,只包含了视频编解码器会用到的一些变量。注意,是编解码器,不仅仅是解码器。

再来看看TcodecDec。注意这个类强调的是【解码】:

//实现了解码器的祖父类
class TcodecDec : virtual public Tcodec
{
private:
    IdecSink *sink;
protected:
    comptrQ<IffdshowDec> deciD;
    TcodecDec(IffdshowBase *Ideci, IdecSink *Isink);
    virtual ~TcodecDec();
    virtual HRESULT flushDec(void) {
        return S_OK;
    }
public:
    virtual HRESULT flush(void);
};

 

可以看出TcodecDec定义非常简单,只包含了解码器需要的一些变量,注意不限于视频解码器,还包含音频解码器。有两个变量比较重要:

IdecSink *sink;
comptrQ<IffdshowDec> deciD;

 

最后来看一下Tcodec。这个类不再继承任何类:

//编解码器的祖父类,都是虚函数
class Tcodec
{
protected:
    const Tconfig *config;
    comptr<IffdshowBase> deci;
    Tcodec(IffdshowBase *Ideci);
    virtual ~Tcodec();
public:
    AVCodecID codecId;
    virtual int getType(void) const = 0;
    virtual const char_t* getName(void) const {
        return getMovieSourceName(getType());
    }
    virtual void getEncoderInfo(char_t *buf, size_t buflen) const {
        ff_strncpy(buf, _l("unknown"), buflen);
        buf[buflen - 1] = '\0';
    }
    static const char_t* getMovieSourceName(int source);

    virtual HRESULT flush() {
        return S_OK;
    }
    virtual HRESULT BeginFlush() {
        return S_OK;
    }
    virtual HRESULT EndFlush() {
        return S_OK;
    }
    virtual bool onSeek(REFERENCE_TIME segmentStart) {
        return false;
    }
};

 

可以看出,该类定义了一些编解码器会用到的公共函数。有几个变量还是比较重要的:

const Tconfig *config;
comptr<IffdshowBase> deci;
Tcodec(IffdshowBase *Ideci);
AVCodecID codecId

 

自此,我们可以总结出ffdshow编解码器这部分继承关系如下(图太大了,截成两张):

从TcodecDec继承下来的如下图所示。包含视频解码器以及音频解码器。

 

从TvideoCodec继承下来的如下图所示。包含了解码器类和编码器类。

 

总算大体上完成了,关于ffdshow解码器封装的内容就先告一段落吧。

 

分享到:
评论

相关推荐

    开源的ffdshow源代码

    ffdshow的源代码是学习视频解码和处理技术的宝贵资源,对于开发者来说,深入研究它的实现细节有助于提升在多媒体领域的专业技能。 首先,让我们来看看ffdshow的核心功能: 1. **视频解码**:ffdshow能够解码多种...

    ffmpeg基础开发资料自总结

    ffdshow 源代码分析 9: 编解码器有关类的总结 335 9.2 LAV filters 340 LAV Filter 源代码分析 1: 总体结构 340 LAV Filter 源代码分析 2: LAV Splitter 341 LAV Filter 源代码分析 3: LAV Video (1) 364 LAV ...

    ffdshow的源代码(2012)

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

    FFmpeg基础库编程开发

    ffdshow 源代码分析 9: 编解码器有关类的总结 352 9.2 LAV filters 357 LAV Filter 源代码分析 1: 总体结构 357 LAV Filter 源代码分析 2: LAV Splitter 358 LAV Filter 源代码分析 3: LAV Video (1) 382 LAV ...

    FFDSHOW 源代码

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

    ffdshow源代码

    在获取到的ffdshow源代码中,包含了用于Visual Studio 2003的项目文件,这意味着开发者可以利用这个版本的IDE来编译和调试代码。Visual Studio 2003是一个较老但仍然功能强大的开发环境,对于学习和理解ffdshow的...

    ffdshow的源代码

    FFDShow是一个开源的视频解码过滤器,主要用于在Windows平台上播放各种编码格式的视频文件。它是基于FFmpeg项目的一部分,而FFmpeg则是一个全面的多媒体处理框架,涵盖了音视频编码、解码、转码、流媒体等多个领域。...

    ffdshow sdk

    FFDShow最初是一个DirectShow的解码器过滤器,广泛应用于Windows平台,支持众多视频和音频编码格式,如H.264, MPEG-4 ASP, DivX, XviD, WMV, RealVideo等。通过SDK,开发者可以访问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-4534

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

    ffdshow.EXE

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

    FF解码器

    FF解码器的优势在于其开放源代码的特性,这意味着开发者可以根据需要对其进行修改和优化,以适应新的编码格式和技术发展。此外,由于FFmpeg的跨平台性,FF解码器不仅限于Windows系统,还可以在Linux和macOS等其他...

    X264最新源代码(20100501)

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

    ffdshow源码开发包及手册

    这个压缩包包含了ffdshow的源代码、SDK以及相关的开发手册,对于想要深入理解ffdshow工作原理或基于它进行二次开发的IT从业者来说是宝贵的资源。 首先,让我们来看看FFmpeg SDK开发手册。FFmpeg是一个跨平台的开源...

    ffdshow摄像头录像 拍照

    例如,你可以创建一个`GraphBuilder`对象来构建过滤图,使用`CaptureGraphBuilder2`来控制录像过程,通过`ICaptureGraphBuilder2.RenderStream`方法添加摄像头源和FFDShow解码器。同时,你需要使用ffmpeg的命令行...

    多种文件播放器源代码

    FFmpeg提供了广泛的编解码器支持,可以处理音频、视频以及字幕流。开发者需要集成FFmpeg库,调用其API来解码不同格式的数据,并将其转换为计算机可以处理的原始样本或像素。 然后,是音频和视频的同步问题。播放器...

    视频播放源代码directshow开发

    对于不支持的格式,可能需要引入第三方解码器(如ffdshow或LAV Filters)。 9. **调试工具**:如GraphEdit,这是一个可视化的过滤图编辑工具,可以帮助开发者调试过滤图的连接和配置。 在项目提供的"新建 ...

    DirectX.Capture ffdshow摄像头录制视频拍照源码

    6. **WinFormCameraDemo**:这个文件可能是演示程序的源代码,展示了如何在Windows Forms环境下利用DirectX.Capture和ffdshow实现摄像头操作。开发者可以通过分析和运行这个示例代码,学习如何在实际项目中集成这些...

    商业编程-源码-《在VC6.0下自制多媒体播放器》配套源代码.zip

    这涉及到文件容器解析和解码器的使用,比如使用ffdshow或ffdshow tryout进行第三方解码。 4. **图形设备接口(GDI)**:虽然DirectX负责大部分的图形处理,但在一些简单任务如绘制用户界面元素时,GDI可能会被用到。 ...

    第7章 ffmpeg实现H.264视频解码

    libavcodec 库是 FFmpeg 的核心库,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow、Mplayer 等所包含或应用。 libavdevice 库操作计算机中常用的音视频捕获或输出设备,包括 ...

Global site tag (gtag.js) - Google Analytics