Pipeline层是直接产生和处理媒体数据的层,它由“Media Sources”、“MFTs”和“Media Sinks”组成。大多数应用程序不需要直接调用Pipeline层对象的方法,而只需要使用如“Media Session”、“Source Reader”和“SinkWriter”这些上层的对象。
Media Sources产生媒体数据,典型的如:读文件、捕获设备或者网络流。
一个Media Source必须实现2个对象:一个Presentation描述符(描述了source中流的数目和各个流的媒体类型)和一个或者多个媒体流。
接口:
必须暴露的接口(通过queryinterface获取):IMFMediaSource、IMFMediaEventGenerator(IMFMediaSource的父接口)。
可选的接口(通过IMFGetSrevcie获取):IMFRateControl、IMFRateSupport、IMFQualityAdvise、IMFMetadataProvider。其中,如果要实现倍速播放,则必须暴露IMFRateControl和IMFRateSupport接口。
必须实现的媒体流接口:IMFMediaStream、IMFMediaEventGenarator(IMFMediaStream的父接口)。
一个Presentation是一组共享Presentation时间的相关的媒体流的集合。每一个Presentation描述符包含一个列表,列表项是流描述符。流有可以被选中,也可以不被选中,不被选中的流不会激活也不会产生数据。每个流描述符拥有一个媒体类型句柄。
Presentation描述符主要接口是IMFPresentationDescriptor;
流描述符主要接口是IMFStreamDescriptor;
媒体类型句柄主要接口是IMFMediaTypeHandler。
每个Media Source都提供一个Presentation描述符,Presentation描述符描述了Media Source的默认配置。默认配置中,至少有一个流没选中,而每个被选中的流都有一个媒体类型。
获取Presentation描述符:IMFMediaSource::CreatePresentationDescriptor,返回一个IMFPresentationDescriptor;
如果要修改Presentation描述符,只能在IMFMediaSource::Start之前;
获取流的数目:IMFPresentationDescriptor::GetStreamDescriptorCount;
获取流描述符:IMFPresentationDescriptor::GetStreamDescriptorByIndex,Index从0开始,返回一个IMFStreamDescriptor,并且也返回一个Boolean值标示该流是否被选中;
选中流和不选中流:IMFPresentationDescriptor::SelectStream、IMFPresentationDescriptor::DeselectStream。
获取流的媒体类型句柄:IMFStreamDescriptor::GetMediaTypeHandler,返回一个IMFMediaTypeHandler;
获取流当前的媒体类型:IMFMediaTypeHandler::GetCurrentMediaType,返回一个IMFMediaType;
设置流当前的媒体类型:IMFMediaTypeHandler::SetCurrentMediaType;
获取流支持的媒体类型:IMFMediaTypeHandler::GetMediaTypeCount、IMFMediaTypeHandler::GetMediaTypeByIndex,注意,GetMediaTypeCount可能没有包含流支持的每一类型,所以还可以使用IMFMediaTypeHandler::IsMediaTypeSupported检测是否支持某种特殊的媒体类型;
Media Sources可以发送预定义Events,可可以发送自定义Events。
Media Source的预定义Events:MEEndOfPresentationEvent、MENewStream Event等等;
Media Stream的预定义Events:MEEndOfStream Event、MEError Event等等。
Media Foundataion Tranforms类似于DShow中的Transform Filters,用于编/解码器、数字信号处理。
类似于Transform Filters,MFTs的Stream数目也可以是1个或者多个,如下图:
接口:IMFTransform。
获取输入输出端口支持的类型:IMFTransform::GetInputAvailableType、IMFTransform::GetOutputAvailableType,一般要设置了输入类型后,MFTs才能提供支持的输出类型。
设置输入输出类型:IMFTransform::SetInputType、IMFTransform::SetOutputType。
输入数据:IMFTransform::ProcessInput,应用要提供Media Sample的指针。
输出数据:IMFTransform::ProcessOutput,有2中内存分配模式,一种是由MTFs提供分配,一种是由应用分配,有的MFT同时支持这2种模式,可以通过IMFTransform::GetOutputStreamInfo获取MFT支持的模式。
创建MTF对象三种方法:MFTEnum、MFTEnumEx,CoCreateInstance。另外,某些MFTs可能提供了其它特殊的创建函数。
MFTs有一个或者多个流,流用标识符来识别,MFTs用流的标识符作为参数。
一些MFTs支持添加和移除输入流,在运行时,支持添加和移除输出流。
Media Sinks是媒体流的目的地。它们将将数据通过显卡、声卡呈现出来、将数据成有固定格式的文件、或者将数据发布到网络上等。
Renderer类型的Media Sink和其他类型的Media Sink的区别是它是按一个固定的速率消费数据。
Media Sink暴露IMFMediaSink接口,每个Media Sink都包含一个或者多个stream sink,stream sink暴露IMFStreamSink接口。