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

ffdshow源代码分析系列文章列表:

ffdshow 源代码分析 1: 整体结构

ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

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

ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)

ffdshow 源代码分析 5: 位图覆盖滤镜(总结)

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 源代码分析 9: 编解码器有关类的总结相关推荐

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

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

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

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  3. ffdshow 源代码分析 5: 位图覆盖滤镜(总结)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  4. ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  5. ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  6. ffdshow 源代码分析1 : 整体结构

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

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

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  8. Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  9. Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

最新文章

  1. lombok常用注解整理
  2. 在MacOS下使用Fiddler抓包
  3. 如何查询高考2021普体成绩,中考体育成绩对照表2020
  4. 腾讯移动分析+html5,FAQ · 腾讯移动分析 文档
  5. Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离
  6. Java操作MySQL
  7. java中bmi的制作_Axure教程:在线BMI计算器制作
  8. 二叉树 平衡二叉树 红黑树_迅捷树,二叉树
  9. php换行替换,php怎么替换回车换行
  10. 计算机休眠下睡眠的不同点是什么,电脑休眠和睡眠的区别
  11. freecodecamp小练习——Falsy Bouncer过滤数组假值
  12. 测试额外任务而撒旦法 速度速度发撒旦法
  13. html页面整体偏移了怎么办,html2canvas生成的图片偏移不完整的解决方法
  14. 教育孩子,是从小的润雨细无声。纯属个人文学闷骚型。。。
  15. 界面美化 —— 布局
  16. RealView Development Suite 4.0 Professional安装
  17. 转:『诡异的』VL10B创建外向交货单出错解决全过程
  18. linux下主目录和根目录的区别
  19. 白鹭引擎的微信分享接口
  20. 华为云-文字识别OCR-身份证识别

热门文章

  1. 在Sql Server 2008上安装SDE 9.3
  2. C# 如何处理抛出的异常,或者已知的错误
  3. Bailian3175 验证极限【数学】
  4. HDU2098 分拆素数和【筛选法】
  5. 朴素贝叶斯与垃圾邮件分类
  6. 解决复杂问题的思路 —— 从简单到复杂
  7. Python 进阶——重访 list (二)
  8. hadoop 2.6 伪分布式的安装
  9. dr. unarchiver_1F 新店开业男士一生仅能定制一枚的钻戒,DR 教你用一生爱一人
  10. JAVA处理模型的步骤,java-处理模型中条件字段的最佳方法