时间:8:23 2011-1-8

8:30 --- 9:00
总结与计划

完善[ FILTER 必须实现的三个接口分析]

[ PIN 必然实现基本接口]
IPin
IQualityControl

从两个接口方面谈起:
1.APP用户
2. FILTER 用户

APP用户
    其几乎是不要关心FILTER的PIN的.其更多地还是与DSHOW所封装地操作接口通信.

FILTER 用户
    整个FILTER GRAPH其是通过PIN来连接的.
PIN所充当的角色:
    连接:  连接当中所需要考虑的问题
    数据的发送
    数据的接收
    数据的管理

IPin Interface
This interface is exposed by all input and output pins.
// 其说明所有的FILTER其均要实现此接口,下面讲了原因.

The filter graph manager uses this interface to connect pins and perform flushing operations.
// 这是说明DSHOW( 具体表现为: filter graph manager) 其使用此接口做什么, 使用此接口来连接其他FILTER的PIN,与执行一些操作
// 并且这些操作,其只是局限于flushing 操作. flush : 数据的发送,接收,
// 而其是否接收,则是由二方面的因素所决定的: FILTER 的状态( RUN ,STOP,PAUSE), PIN是否已经连接(connect,Disconnent)
// 而对于数据进行怎么样的处理,其既不是PIN处理,也不是FILTER处理,而是由COM类处理.

Applications can use this interface to query the pin for information. Applications should never call IPin methods that change a pin's state, such as Connect, Disconnect, BeginFlush, or EndFlush. To connect pins, an application must use the methods in IGraphBuilder.
// APP其使用此接口能做什么,不能做什么,不能做那由谁来做.
// APP其只能查询FILTER的状态信息.而不能改变PIN的状态, 那么其由谁来调用: DSHOW(FILTER GRAPH MANAGER),
// 但其的实现是由FILTER 当中的PIN实现

// APP其要求连接PINS,其是通过 IGraphBuilder ,可以得到两种信息
// 1. APP用户其对于FILTER,PIN的操作其均是通过 DSHOW的封装接口来完成的(如:IGraphBuilder,其是管理PIN连接,IMediaControl 其是管理FILTER 状态,,,)
// 2. FILTER,PIN的调用 其是通过DSHOW来完成的

Filter developers: The CBasePin, CBaseInputPin, and CBaseOutputPin classes implement this interface. Other base classes derive from these three classes.
// 其是说明了 对于开发人员,其可以使用已经实现IPin,IQualityControl 接口的类: CBasePin, CBaseInputPin,CBaseOutputPin,或其的子类

只有 IPin 其还是不足的,因为 IPin 其只是关注了:connect pins and perform flushing operations

IQualityControl
其有什么作用,为什么每一个PIN其都要实现此接口呢.

[ 对于 发送PIN与接收 PIN的思考 ]
    发送,接收PIN其本质还是PIN,所以其要实现PIN的基本接口:IPin, IQualityControl这是相同点的.
发送,接收PIN其所产生的背景是:
    PIN其的最基本功能已经在IPIN 当中体现了: 连接FILTER.
    PIN其还能为FILTER 接收与发送数据.
    接收到数据
    数据的处理
    发送数据
    ==> 接收与发送数据由DSHOW框架管理,FILTE 开发人员只要管理数据的处理, 思考业务逻辑与框架之间的关系

receive and send PIN 其之间的数据传递是方式是什么呢: 是SEND PIN 主动将数据放送给RECEIVE,还是RECEIVE 主动到SEND PIN当中取数据
    在整个FILTER GRAPH 当中,我们所需要去管理的部分: 数据.
什么样FILTER 状态,PIN连接,数据的放送什么.业务流程,这些均是神马浮云.
    其均是为了得到数据,然后处理数据.

所以关键是得到数据,然后其是怎么样调用业务逻辑来处理

在DSHOW当中得到数据的得到,数据所在内存管理(创建与释放)这些均是由DSHOW框架来管理的.
    FILTER DEVELOP其只要知道从哪个方法当中得到数据.然后使用数据,只管理使用,而不要去管理释放.
    所以我们只是关注:数据的组合形式与数据的访问形式.
    数据的背景:内存管理,数据的格式,其均是由:IMemAllocator, IMediaSample

[ 对于 IMemInputPin 的思考]
    其使用发送PIN通过此接口来向接收PIN发送数据.

[ 对于 IMediaPosition 的思考]
    我们在播放影片的时候,都有一个进度条,其显示了:总时间,当前时间.
在DSHOW当中定位其是通过时间来实现的.那其以哪一个时间为准呢.这一点在IMediaPosition当中无法体现,但在IMediaPosition的替代接口IMediaSeeking当中有实现
    IMediaPosition 其就是这样的一个功能行为接口.使用DSHOW能通过此接口来控制PIN,
其通过一个PIN的IMediaPosition就能定位吗,当前进度吗.
    得到当前进度,设置当前进度(在FILTER GRAPH当中,其要对于哪一个设置才有效呢)
// dshow( filter graph Manager) 其已经封装了同样的一份接口,以方便APP用户其能够控制整个FILTER GRAPH .

This interface is exposed by the Filter Graph Manager as well as by individual filters. Applications should obtain an IMediaPosition interface pointer from the Filter Graph Manager, not from a filter.
// 说明: PIN的此个接口其是由 FILTER GRAPH MANAGER来调用的.

The Filter Graph Manager distributes method calls to all of the renderer filters. The renderer filters propagate the calls upstream to the source filters. This sequence of events ensures that all streams remain synchronized.
// 说明: FILTER GRAPH MANAGER其是怎么样管理FILTER GRAPH当中的FILTER的.其是从RENDER( 注意是all of the render filters,一个Filter graph MANAGER 其是可以有多个 FIILTER GRAPH ,但可以肯定的是: 一个FILTER GRAPH当中其是可以有多个RENDER的

[ IMediaPosition 需要去注意的地方]
The IMediaPosition interface contains methods for seeking to a position within a stream. The IMediaSeeking interface improves on this interface. Applications written in C/C++ should use IMediaSeeking instead of IMediaPosition. However, IMediaSeeking is not compatible with Automation, so applications written in Microsoft® Visual Basic® must use IMediaPosition instead.

IMediaPosition可以被IMediaSeeking所代替.但其两者的原理是差不多的,只是功能强大些.

[ 按创建PIN来分接口的种类]
    功能行为接口
        类其实现了这种接口,其就具有这种行为,别人就可以通过这样接口来(操作)访问此对象.
        如:IPin 接口,   
        我们通过IPin接口来使用PIN之间的连接.
        如:IMemInputPin 接口
        其就是使用发送PIN其通过得到接收PIN的IMemInputPin接口来给接收PIN发送数据.
    总结:
    FILTE 对象,PIN对象,其各自之间的通过就是通过接口.所以FILTER, PIN其之所以要继承接口,就是为了提供通信方式
以这种功能为主导方向,其他的接口均是为了实现以任务而准备的

其还要实现
IMediaPosition ,IMediaSeeking

其还要实现
IMediaPosition
IMediaSeeking

接收PIN其还要实现
IMemInputPin

接口其是: 其是要求这个对象有这种能力
类: 其是使用这个对象有这种性质
==> 编写FILTER的时候,一般是直接地继承类,而使用的时候通过 接口

小知识:
CBasePin 其使用了装饰者模式,刚刚又看一下其他类,感觉装饰者模式使用的场合很广. 

时间:9:01 2011-1-10

[ 对于FILTER GRAPH当中的数据源,数据流动,数据终止的思考]
    时间: 9:01 --- 9:15
以播放一下影片为例:
    DSHOW其是通过SOURCE FILTER来从本地存储当中读取数据, [ 从外存到内存 再到DSHOW当中]
    数据其在DSHOW当中从SOURCE FIFLTER向RENDER FILTER的流动.
     个人感得此过程有种猜想:
        1. 所有FILTER其均是对于DSHOW当中的同一份内存的操作,数据并没有真正地流,
        但这样不方便且效率跟不上.
        因为SOURCE 其只是读取数据,然后填充内存, TRANSLATE 其对于数据解码( 且过程费时间),RENDER其要等待,
        DSHOW其只有一个BUFFER是不行,其应该是,每一个SOURCE ,TRANSLATE ,RENDER其均是有多个BUFFER,而且
        SOURCE ,TRANSLATE,RENDER其是否是三个线程,且还要使用同步信号, 类似于" 生产者与消费者模型"
    那DSHOW当中的数据其到底是怎么样一回事呢.

属于SOURCE 性质的FILTE的PIN其还要实现
IAsyncReader
注意: 不是所有SOURCE FILTER其要实现,而只是File Source (Async) Filter 要实现此接口

SOURCE 其要实现IAsyncReader接口, 此接口其有什么用呢,其是由谁来调用呢.
这涉及到SOURCE FILTER与TRANSLATE FILTER其之间的通信方式, 是SOURCE FILTER其主动地将数据发送到TRANSLATE FILTER BUFFER当中,还是TRANSLATE FILTER其从SOURCE FILTER当中的读取数据.
    在FILTE SOURCE (Async) FILTER 其应该是TRANSLATE FILTER 从SOURCE FILTER当中读取数据. SOURCE OUTPIN 其是由下游程的INPUTPIN来查询与调用的,
    下游的INPUTPIN 其只要向SOURCE PIN发送命令与提供信息: 内存地址,数据大小. 就可以了. SOURCE PIN其完成了其怎么样通知下游的PIN呢.

[ DirectShow 上关于IAsyncReader 文档]

IAsyncReader Interface
The IAsyncReader interface is exposed by output pins that perform asynchronous read operations. The interface is used by the input pin on the downstream filter. Applications do not use this interface.
// 这是FILTER当中的PIN之间细节信息,其对于APP用户来讲是应该隐藏的, 其只是对于FILTER DEVELOPERS来知道,其对于DSHOW框架也// 是隐藏的吗?

The Async File Source filter exposes this interface on its output pin.
// 说明了由哪一种PIN其要实现此接口

Filter developers: Implement this interface if your output pin delivers data in the form of a byte stream (MEDIATYPE_Stream) and supports the pull model.
// 对于实现了此接口的PIN的要求:
// 1. 传递数据的格式为: byte stream( MEDIATYPE_Stream)
// 2. 支持PULL MODEL(拉模式)

During the connection process, check whether the downstream pin queries for the IAsyncReader interface. If it does not, your pin should either fail the connection or establish some other transport. (If your pin derives from CBasePin, perform this check in the CBasePin::CheckConnect method.)

For more information about using this interface, see the following topics:

Negotiating Allocators
Data Flow for Filter Developers
CPullPin Class

Negotiating Allocators
    10:28 --- 10: 35

1. 如果是按着DSHOW数据流的猜想,
    1. 每一个BUFFER其大小的确定.BUFFER的管理(创建与释放)

2. PIN之间的数据传递,不管是PULL还是PUSH,其之间的数据是:共享同一份,还是COPY一份.
    其要分情况讨论:   
    首先要确定:内存当中的数据管理方式.
    这对于APP用户而言是隐藏的.这是FILTER DEVELOPER所需要关心的,其是怎么样让DSHOW 框架所知道呢.
    不管是PULL, PUSH,其最终还是将数据发送给了下游的 INPUT PIN,
    此过程的当中的问题:
    1. 是以INPUT PIN还是OUTPUT PIN的大小为主,在DSHOW当中其是没有规定BUFFER的大小的呢.这一点很灵活.
    2. 

==> 我想的接口:
    COM类其只要使用一个方法:得到数据,然后进行数据处理,然后发送,
    而得到与发送的具体细节,其由PIN来管理呢,这也是DSHOW框架的职责.

PIN其也只是设置一些必要参数,然后其就可以得到数据,然后通知COM类来处理数据,

1. PUSH模式(INPUT PIN其将数据发送给OUTPUT PIN)
        实现 : INPUT PIN其使用OUTPUT PIN的IMemInputPin

Data Flow for Filter Developers
    FILTER其是负责 PIN的控制
    PIN其是负责DATA的接收
    COM类A其是负责数据加工处理

两个PIN之间连接,难道是真正地像实际世界当中的,手拉着手吗,
    就像是手拉着手,DSHOW当中的手拉手是怎么样表达的呢,其通过PIN,PIN其就是手,
    PIN之间其是通过通过另一个对象连接一起,此对象其记录:是些PIN,PIN之间的类型,ALLOCATOR

FILTER与PIN之间的关系

FILTE,PIN其之间的通信,其与FILTER GRAPH MANAGER之间的通信

Data is held in buffers, which are simply arrays of bytes. Each buffer is wrapped by a COM object called a media sample, which implements the IMediaSample interface
// 说明:each buffer 其是由一个对象管理,用户其是通过 IMediaSample接口来使用 BUFFER.

对象其实现接口,其就是为让其它对象来使用此接口

Samples are created by another type of object, called an allocator, which implements the IMemAllocator interface
// allocator 其是用来创建SAMPLE POOL , 其因为不是用户直接地创建SAMPLE呢,而要于ALLOCATOR来负责管理呢,
// 分析:如果是用户直接地创建SAMPLE, 用户其除了使用SAMPLE,其还要额外地做哪些事件呢,
// 因为 PIN之间地连接其是通过SAMPLE来连接的,对于SAMPLE的引用计数,
// 更为重要的是: PIN之间其不一定只有一个SAMPLE,其有很多的SAMPLE, 形成了一个SAMPLE POOL,类似于线程池.
// 一个SAMPLE其用完成了,其最好是能够回收循环地使用.
// 如果这些事件,来样FILTER DEVELOPER来做,很显然是麻烦且重复的,
// 其由DSHOW框架来完成,DSHOW其提供了ALLOCATOR来管理这一部分.
// DSHOW框架其给用户地接口是:用户其只要管理使用SAMPLE就可以了,

An allocator is assigned for every pin connection, although two or more pin connections might share the same allocator.

// 说明:  allocator 其作用于PIN的连接,在DSHOW当中其有可能是:一个FILTER GRAPH当中所有PIN其均是连接同一个 allocator.
// allocator其应该是使用生产者消息者模型来管理SAMPLE POOL

Each allocator creates a pool of media samples and allocates the buffers for each sample. Whenever a filter needs to fill a buffer with data, it requests a sample from the allocator by calling IMemAllocator::GetBuffer.
// 说明: sample 其是管理数据,而SAMPLE其是由ALLOCATOR来管理,用户要得到数据其通过ALLOCATOR的IMemAllocator接口
// FILTER其要得到数据,其具体是FILTER的PIN得到,COM类对于得到数据进行加工.
// filter 需要去填充SAMPLE,其应该是OUTPIN向INPUTPIN 发送数据.OUTPUT其通过 ALLOCATOR来得到SAMPLE,
// OUTPUT其是得到的ALLOCATOR是哪一个的呢.
// translate filter 其是有INPUT PIN ,OUTPUT PIN, 连接其的INPUT 与OUTPUT PIN其之间是一种什么,其是否也已经连接了

If the allocator has any samples that are not currently in use by another filter, the GetBuffer method returns immediately with a pointer to the sample. If all of the allocator's samples are in use, the method blocks until a sample becomes available.
// 说明:IMemAllocator::GetBuffer其是会BLOCK.

When the method does return a sample, the filter puts data into the buffer, sets the appropriate flags on the sample (typically including a time stamp), and delivers the sample downstream.
// 说明:input pin 其要实现IMemAllocator,PIN 其是提供SAMPLE,COM其负责对于SAMPLE进行处理,处理之后,其要对于SAMPLE
// 进行SET FLAGS, 时间标志是很关键的.
// 其是怎么样发送到下游INPUT PIN的,其也得到INPUT PIN的IMemAllocator接口的,
// 在具体地编写过程,此步骤其应该由基本类来完成.

When a renderer filter receives a sample, it checks the time stamp and holds onto the sample until the filter graph's reference clock indicates that the data should be rendered. After the filter renders the data, it releases the sample. The sample does not go back into the allocator's pool of samples until the sample's reference count is zero, meaning that every filter has released the sample.
// 说明:sample 其是有引用计数的,难道SOURCE, TRANSLATE, RENDER其均是使用同一个SAMPLE只是添加了一个引用,
// 类似于递归似添加与删除吗.

PIN之间要建立连接的业务流程:
    1.

PIN其传递数据的业务流程:
    1. PIN之间要建立连接:

2. 确定PIN之间的

属于RENDER性质的FILTER的PIN其还要实现
IPinConnection

IPinConnection Interface
This interface provides methods for reconnecting an input pin while the filter is still running. The Filter Graph Manager calls methods on this interface when it performs dynamic reconnections (see the IGraphConfig interface). Applications might also use this interface to perform dynamic pin reconnections.

Filter developers: Implement this interface on any input pin that allows dynamic reconnection or dynamic changes in format.

// 说明:不是所有的RENDER FILTER的PIN其要实现此接口,而是那些 allows dynamic reconnection or dynamic changes in format

[FILTER GRAPH MANAGER当中的数据类型]
1. 其是有MEDIA DATA
2. 其是有CONTROL DATA

FILTER ,PIN其均是调用COM类实现自己的业务逻辑

参考PAGE
[1]实现file writer filter
http://blog.csdn.net/wolf_baby/archive/2006/04/21/671312.aspx
[2]掌握 dump filter 的用法:采集MPG,AVI和ASF的程序代码
http://blog.csdn.net/markman101/archive/2010/07/19/5746312.aspx

转载于:https://www.cnblogs.com/pengxinglove/archive/2011/01/11/1932506.html

学习写DSHOW框架下的FILTER之四相关推荐

  1. 学习写DSHOW 框架下的FILTER 之一

    时间:8:30 2011-1-4 8:30 --- 9:00 总结与计划 学习怎么样来编写FILTER. 要从全局的角度思考,以业务流程为具体的执行纲要. [ DSHOW与FILETR 之间的关系] ...

  2. QT学习之视图框架下的简单的碰撞检测

    由于最近要写一个东西,所以跳过了一些内容,学到了视图框架和一些简单 的碰撞检测. 对于视图框架,我的理解还是不够深,等以后做项目深入了解后,我会回来更新. 我是写了一个自己的场景和两个图形项.先看ma ...

  3. Keras框架下的保存模型和加载模型

    在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...

  4. 【flask整合深度学习】ubuntu系统下显示深度学习视觉检测结果图片并可在web端访问,配置允许手机浏览器打开

    介绍 flask文件 前端代码 输入命令 介绍 之前有一篇flask和mongodb交互的记录文: https://blog.csdn.net/qq_41358574/article/details/ ...

  5. 【原创】如何写一个框架:步骤(下)

    [原创]如何写一个框架:步骤(上) 说明:写本文的时候作者完全是把脑子里的东西写了出来,没有参考任何的资料,所以对于每一项内容可能都是不完整的,不能作为一个完整的参考.有一些方法学的东西每个人都有自己 ...

  6. HaaS学习笔记 | HaaS框架环境下基于MicroPython的LED跑马灯实现及比较

    [1]题目要求 [案例]:在HaaS框架下用原生MicroPython实现LED跑马灯.       蓝蜻蜓ESP32开发板的LED灯电路连接如下:          D3灯----GPIO14,高电 ...

  7. keras框架下的深度学习(一)手写体数字识别

    文章目录 前言 一.keras的介绍及其操作使用 二.手写题数字识别 1.介绍 2.对数据的预处理 3.搭建网络框架 4.编译 5.循环训练 6.测试训练的网络模 7.总代码 三.附:梯度下降算法 1 ...

  8. 【深度学习】如何更好的Fit一个深度神经网络框架下的模型

    [深度学习]如何更好的Fit一个深度神经网络框架下的模型 文章目录 1 随机梯度下降1.1 什么是梯度下降1.2 随机梯度算法 2 Momentum 3 自适应学习率算法3.1 AdaGrad3.2 ...

  9. 深入学习SAP UI5框架代码系列之四:SAP UI5控件的元数据实现

    这是Jerry 2021年的第5篇文章,也是汪子熙公众号总共第276篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) UI5 module懒加载机制 (2) ...

  10. 深度学习——残差神经网络ResNet在分别在Keras和tensorflow框架下的应用案例

    原文链接:https://blog.csdn.net/loveliuzz/article/details/79117397 一.残差神经网络--ResNet的综述 深度学习网络的深度对最后的分类和识别 ...

最新文章

  1. 史上最大规模,天猫新零售如何爆改100家大润发?
  2. HDU - 2973威尔逊定理
  3. 划分用户故事(user-story)的原则
  4. linux的终端下的命令行管道|的简单实现
  5. linux root 设置中文,ubuntu 8.04 root用户下的中文环境配置-Linux频道-中国IT实验室
  6. 试验一下纯手写blog
  7. 二叉查找树--插入、删除、查找
  8. 应该怎样读TAOCP
  9. java 考勤_java,添加一个类,显示考勤信息的。
  10. css3 微信聊天小尖角,用CSS制作聊天框小尖角、气泡效果
  11. 提示:请安装TCP/IP协议.error=10106。解决方案
  12. addon游戏_MOD Simple Shader addon
  13. RSCP RSRP RSRQ
  14. Quick #UE4 Tip (第1周 2020.12.5)
  15. 基于django+html+flask的英语词汇量估算工具设计与实现 文档+项目源码
  16. drill apache_大数据SQL:Apache Drill查询执行功能概述–白板演练
  17. ERROR: Failed building wheel for box2d-py
  18. 一行代码完成Java的Excel读写
  19. 63名研究生的微信群被解散,导师发声:和你们没感情,江湖不见
  20. 宏达其中X S720e采用了Beats Audio锁定的GSM Android智能手机

热门文章

  1. slf4j log4j logback关系详解和相关用法
  2. 重新复习数据结构-------ArrayList
  3. 6个感人的亲情小故事,足以映照以后的人生
  4. 【翻译】BCGControlBar Professional Edition for MFC v 29.0重大更新
  5. 【MHA】--MHA 介绍(1)
  6. OA打造企业“最强大脑”
  7. 使用 jQuery 修改 css 中带有 !important 的样式属性
  8. 安装Sublime Text 3插件的方法
  9. 【JAVA笔记——道】Hadoop设计模式--抽象类
  10. Visual Studio 2005中的Windows Mobile模拟器