文档章节

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

雷霄骅
 雷霄骅
发布于 2014/08/16 13:58
字数 743
阅读 71
收藏 0

精选30+云产品,助力企业轻松上云!>>>

注:写了一系列的有关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解码器封装的内容就先告一段落吧。


雷霄骅

雷霄骅

粉丝 219
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
加载中
请先登录后再评论。
ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)

注:写了一系列的有关ffdshow对解码器的封装的代码,列表如下: ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLi...

雷霄骅
2014/08/16
123
0
ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)

注:写了一系列的有关ffdshow对解码器的封装的代码,列表如下: ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLi...

雷霄骅
2014/08/16
34
0
ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)

注:写了一系列的有关ffdshow对解码器的封装的代码,列表如下: ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLi...

雷霄骅
2014/08/16
46
0
ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

注:写了一系列的文章,都是关于ffdshow中的位图覆盖滤镜的源代码分析的,在此列一个列表: ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog) ffdshow 源代码分析 3: 位图覆盖滤镜...

雷霄骅
2014/08/16
37
0
[总结]FFMPEG视音频编解码零基础学习方法

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一...

雷霄骅
2014/08/16
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

4.17. HTTP 请求走私

文章目录 4.17. HTTP 请求走私 4.17.1. 简介 4.17.2. 成因 4.17.3. 分类 4.17.4. 攻击 4.17.4.1. CL不为0的GET请求 4.17.4.2. CL-CL 4.17.4.3. CL-TE 4.17.4.4. TE-CL 4.17.4.5. TE-TE 4.17......

osc_2wq8ft8d
16分钟前
11
0
2020年蓝桥杯B组个人题解(热的,不知道对错)

文章目录 A B C D E F G H I J 总结 现在是蓝桥杯刚结束,趁着有记忆,写下这篇博客,不知道对错,如果我错了,请指出。 A 因为是到0就结束了,那么每次看看-600是否结束,如果没有结束就+30...

osc_1m04dwae
16分钟前
0
0
AXI4_full协议详解

AXI4-full协议介绍 AXI4.0-full包含突发控制信号,所以可以进行突发传输,在只指定一次地址后,可以一次传输多达256个数据(数据的宽度取决于带宽)。主要用于往DDR或者OCM中写入大量数据时使用...

whoisliang
17分钟前
8
0
【VMWare虚拟机Centos7安装配置redis及Redis常用命令合集】

前置依赖 1.Redis依赖gcc和tcl环境,所以要先安装gcc和tcl 执行下面语句安装gcc: yum install gcc-c++ 若提示是否继续,输入y继续安装 执行下面语句安装tcl: yum install -y tcl 下载red...

osc_s4durjz5
17分钟前
0
0
LeetCode 323. 无向图中连通分量的数目(并查集)

文章目录 1. 题目 2. 解题 1. 题目 给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。 示例 1:输入: n = 5 和 edge...

osc_lk0wespa
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部