CN101390397B - 加速视频编码 - Google Patents

加速视频编码 Download PDF

Info

Publication number
CN101390397B
CN101390397B CN2007800065644A CN200780006564A CN101390397B CN 101390397 B CN101390397 B CN 101390397B CN 2007800065644 A CN2007800065644 A CN 2007800065644A CN 200780006564 A CN200780006564 A CN 200780006564A CN 101390397 B CN101390397 B CN 101390397B
Authority
CN
China
Prior art keywords
video
coding
encode
data
encoder
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN2007800065644A
Other languages
English (en)
Other versions
CN101390397A (zh
Inventor
A·甘纳什
D·J·穆瑟尔
G·J·沙利文
G·F·伊万斯
S·萨德瓦尼
S·J·埃斯特罗普
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of CN101390397A publication Critical patent/CN101390397A/zh
Application granted granted Critical
Publication of CN101390397B publication Critical patent/CN101390397B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/42Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/5044Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering hardware capabilities
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/12Selection from among a plurality of transforms or standards, e.g. selection between discrete cosine transform [DCT] and sub-band transform or selection between H.263 and H.264
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/124Quantisation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/127Prioritisation of hardware or computational resources
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/134Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or criterion affecting or controlling the adaptive coding
    • H04N19/154Measured or subjectively estimated visual quality after decoding, e.g. measurement of distortion
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/134Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or criterion affecting or controlling the adaptive coding
    • H04N19/156Availability of hardware or computational resources, e.g. encoding based on power-saving criteria
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/60Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using transform coding
    • H04N19/61Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using transform coding in combination with predictive coding
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/20Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
    • H04N21/23Processing of content or additional data; Elementary server operations; Server middleware
    • H04N21/242Synchronization processes, e.g. processing of PCR [Program Clock References]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/4302Content synchronisation processes, e.g. decoder synchronisation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/60Network structure or processes for video distribution between server and client or between remote clients; Control signalling between clients, server and network components; Transmission of management data between server and client, e.g. sending from server to client commands for recording incoming content stream; Communication details between server and client 
    • H04N21/63Control signaling related to video distribution between client, server and network components; Network processes for video distribution between server and clients or between remote clients, e.g. transmitting basic layer and enhancement layers over different transmission paths, setting up a peer-to-peer communication via Internet between remote STB's; Communication protocols; Addressing
    • H04N21/647Control signaling between network components and server or clients; Network processes for video distribution between server and clients, e.g. controlling the quality of the video stream, by dropping packets, protecting content from unauthorised alteration within the network, monitoring of network load, bridging between two different networks, e.g. between IP and wireless
    • H04N21/64784Data processing by the network

Abstract

描述了一种提高视频编码的速度和质量中的一个或多个的视频编码加速服务。该服务用作任意视频编码器计算机程序应用程序和任意视频加速硬件之间的中介。该服务从视频编码器接收一个或多个查询以标识视频加速硬件的实现细节。该服务与视频加速硬件接口以获得实现细节。该服务将实现细节传送到视频编码器。实现细节使得视频编码器能够:(a)确定与视频编码器相关联的软件编码操作的速度和质量中的一个或多个是否能用一个或多个支持的编码流水线配置和能力的流水线的实现来提高;以及(b)通过与该服务接口来实现该流水线。

Description

加速视频编码
相关申请
本申请是2006年2月24日提交的题为“Accelerated Video Encoding(加速视频编码)”的共同待审的美国专利申请第11/276,336号的部分延续,并且该申请通过引用结合于此。
背景
多媒体内容产生和分发操作通常包括视频编码。视频编码过程通常是非常数据和计算密集型的。结果,视频编码过程可能是非常耗时的。例如,软件编码器编码一高质量高清电影可能要花费数十小时。由于视频编码过程的质量和速度对于成功的多媒体内容产生和分发流水线而言是重要因素,因此提高能编码高质量视频内容的速度的系统和技术将是有用的。
概述
提供本概述是为了用简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
鉴于以上原因,描述了一种提高视频编码的速度和质量中的一个或多个的视频编码加速服务。该服务担当任意视频编码器计算机程序应用程序和任意视频加速硬件之间的中介。该服务从视频编码器接收一个或多个查询以标识视频加速硬件的实现细节。该服务与视频加速硬件接口以获得该实现细节。该服务将该实现细节传送到视频编码器。该实现细节使得视频编码器能够:(a)确定与视频编码器相关联的软件编码操作的速度和质量中的一个或多个是否能用一个或多个支持的编码流水线配置和能力的流水线的实现来提高,以及(b)通过与该服务交互来实现该流水线。
附图简述
在附图中,组件参考标号最左边的数字标识了该组件首次出现的特定附图。
图1示出根据一个实施例的用于加速视频编码的示例性系统。
图2示出了视频编码流水线配置的一个示例性实施例,其中某些编码过程在硬件中加速。
图3示出根据一个实施例的用于加速视频编码的示例性过程。
附录中的图4示出了根据一个实施例的示例性视频编码器应用程序,其示出了可以利用该视频编码器加速应用程序编程接口的方式。
附录中的图5示出了根据一个实施例的一个示例性视频编码流水线配置,其中加速硬件加速了运动估计、变换、量化和反过程以产生已编码图像。
附录中的图6示出了根据一个实施例的示例性视频编码流水线配置,其中硬件仅加速运动估计。
附录中的图7示出了根据一个实施例的若干示例性运动估计参数。
附录中的图8示出了根据一个实施例的储存在显示三维(D3D)表面中的示例性运动矢量数据。
附录中的图9示出了根据一个实施例的指示亮度表面的宽度匹配原始YCbCr图像的示例性图示。
附录中的图10示出了根据一个实施例的指示视频的每行残差值的数量是原始视频图像的宽度的1/2的示例性图示。
附录中的图11示出了根据一个实施例的指示残差表面的宽度是原始逐行帧的宽度的1/4的示例性图示。
详细描述
概览
用于加速视频编码的系统和方法提供了一种视频编码加速服务。该服务允许任意视频编码器应用程序以设备无关的方式与任意视频加速硬件接口以定义并实现基本上最优的视频编码流水线。为此,该服务展示了视频加速(VA)应用程序接口(API)。这些API封装了视频编码过程的模型。为定义编码流水线,该视频编码器应用程序使用VA API来查询可用视频(图形)加速硬件的实现细节(例如能力等)。该视频编码器鉴于应用程序的特定视频编码体系结构(软件实现的)来评估这些细节以标识可从在硬件中加速而获益(例如,速度和/或质量上获益)的任何编码操作。这些操作包括,例如运动估计、变换和量化操作,以及诸如运动补偿、反变换和反量化等反操作。该API还允许视频编码器设计基本上最小化了与主机计算设备和加速硬件相关联的总线和处理器上的数据流转移的编码流水线,并且因此进一步提高了编码速度。该API还允许加速硬件影响数据的定位以改善本地高速缓存(例如,视频加速硬件可在对视频硬件本地的存储器上更高效地运作)。
基于这些评估,该视频编码器设计了一种在软件中执行部分编码操作并使用加速硬件执行部分编码操作(即,可从硬件加速中获益的操作的至少一个子集)的定制视频编码流水线。该编码器应用程序然后使用该API来创建该流水线并编码视频内容。该定制流水线与完全软件实现的流水线相比基本得到优化,因为某些编码操作被加速,并且主机和加速硬件之间的数据转移被最小化。另外,通过加速编码过程的某些方面并最小化数据转移而释放的处理时间允许主机处理器以被释放的处理周期来执行更高质量的编码操作。该API还被设计成允许组件并行地操作以使计算资源使用能被最大化。
用于加速视频编码的系统和方法的这些和其它方面现将更详细地讨论。
示例性系统
尽管并非所需,但用于加速视频编码的系统和方法在由诸如个人计算机和图形(视频)编码加速硬件等计算设备执行的计算机可执行指令(程序模块)的一般上下文中描述。程序模块一般包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。
图1示出了根据一个实施例的用于加速视频编码的示例性系统100。系统100包括主机计算设备102。主机计算设备102表示任何类型的计算设备,诸如个人计算机、膝上型计算机、服务器、手持式或移动计算设备等等。主机计算设备102包括通过总线103耦合到存储器106的一个或多个处理单元104。系统存储器106包括计算机程序模块(“程序模块”)108和程序数据110。处理器104从程序模块108中相应的模块中取出并执行计算机程序指令。程序模块108包括用于处理视频内容的视频处理模块112,以及诸如操作系统、设备驱动程序(例如,用于接口到视频编码加速硬件等)和/或其它等的其它程序模块114。视频处理模块112包括,例如视频编码器116、视频编码加速服务118、以及其它处理模块120,例如视频解码器、视频过滤器和视频呈现器等等。
在此实现中,视频编码器116是任意视频编码器。这意味着由视频编码器116实现和/或利用的特定体系结构、操作、数据格式等是任意的。例如,视频编码器116可以通过第三方、OEM等来分发。另外,尽管图1示出了独立于操作系统的“其它程序模块”114部分的视频编码加速服务118,但是在一个实现中,视频编码加速服务118是操作系统的一部分。
视频处理模块112接收压缩的或未压缩的输入视频数据122。当输入视频数据122是压缩(已编码)的时候,视频处理模块112解码该输入视频数据122以产生已解码源视频数据。这一解码操作由解码器模块来执行。在另一实现中,也可保留部分解码的数据以便进一步协助编码过程。出于示例性说明的目的,这一解码器模块被示为“其它视频处理模块”120的相应部分。由此,已解码源视频数据或者由在已解码状态下接收到的输入视频数据122来表示,或者用对在已编码状态下接收到的输入视频数据122进行解码的结果来表示。已解码源视频数据被示为“其它程序数据”124的相应部分。
为设计并实现能用于将已解码源视频数据编码成已编码视频数据126的定制视频编码流水线,视频编码器116经由视频加速(VA)API 128与视频编码加速服务118接口。VA API 128的多种可能实现的一个示例性实现在附录中描述。为定义编码流水线,视频编码器应用程序使用VA API 128中相应的几个(例如,参见附录§3.4,IVideoEncoderService)以获得可用加速硬件130的实现细节。这些实现细节包括,例如:
·标识加速硬件130的支持的视频编码流水线配置的枚举阵列(例如,经由在附录§3.4.1中描述的GetCapabilities接口获得);
·支持的视频格式的指示(例如,MPEG、WMV等等;参见附录的GetSupportedFormats,§3.4.2);
·用于运动估计(ME)操作的支持的搜索度量(参见附录的GetDistanceMetrics,§3.4.3);
·用于处理时间与质量之间的折衷判定的支持的搜索简档(参见附录的GetSearchProfiles,§3.4.4);和/或
·支持的ME能力,例如图像大小信息、最大搜索窗大小、可变宏块支持指示等(参见附录的GetMECapabilities,§3.4.5)
响应于从视频编码器116接收到这些请求,视频编码加速服务118向视频加速硬件130查询所请求的实现细节并从加速硬件130向视频编码器116返回与对应的响应相关联的信息。视频编码加速服务118使用对应的设备驱动程序与视频加速硬件130接口。这一设备驱动程序被示为“其它程序模块”114的相应部分。
视频编码器116鉴于应用程序的特定视频编码体系结构(软件实现的)来评估加速硬件130所支持的实现细节以标识能从在硬件中加速而获益(例如,速度和/或质量上获益)的任何编码操作、选择一搜索简档以封装视频编码质量和速度之间的折衷、最小化总线上和处理器之间的数据转移等等。可从硬件加速获益的示例性操作可包括,例如运动估计、变换和量化。例如,在硬件中执行量化的一个原因是最小化流水线各阶段之间的数据流。
图2示出了视频编码流水线配置的一个示例性实施例,其中某些编码过程在硬件中加速。出于示例性说明和描述的目的,与图2相关联的操作和数据流参考图1的组件中的特定几个组件来描述。在该描述中,一参考标号最左边的数字指示其中首次引入该组件/数据路径/引用的项目的特定附图。例如,流水线200的最左边的数字是“2”,指示它是在图2中首次引入的。在此示例中,编码流水线200是由与视频编码服务118接口的视频编码器116(图1)来配置/定制的,使得由主机102中的相应几个实现的处理操作在硬件130中加速。出于说明的目的,在图2中的加粗虚线的右侧所示的处理操作由硬件(例如,图1的加速硬件130)来加速,而该图的左侧所示的处理操作由主机计算设备102(图1)来执行。在编码流水线200中,以未加粗的虚线示出了可任选地配置的数据访问通路。椭圆204和212表示相应的原始和已编码图像记忆存储。
在该示例实现中,视频编码器116(图1)取某一形式的已压缩或未压缩视频数据202(还请参见图1的输入视频数据122)作为输入。请注意,如果源202不是源自主机102且如果主机决策制定引擎(例如,视频编码器116)不使用源视频,则图2的示例性流水线配置并不将输入源视频202(“原始视频源”)复制到主机计算设备102。例如,如果量化决策不要求主机接触视频数据,则将不传输该数据。在此示例中,流水线200被配置成使用块206、208和214到218中的相应操作将输入数据202转换成另一压缩形式。
这些操作可包括将未压缩(YUV)视频数据转换成压缩的MPEG-2,或者它可包括将视频数据从MPEG-2数据格式译码成WMV数据格式。出于示例性说明的目的,假设译码操作包括完全或部分解压阶段后跟一编码阶段(存在绕过解压并完全在变换(DCT)空间中工作的更高效的模型)。多个视频压缩格式利用了运动估计、变换和量化来实现压缩。在压缩阶段中,运动估计通常是最慢的步骤,包括其中编码器(例如,视频编码器116)试图为给定图像中的宏块找到最接近的匹配参考宏块的大量搜索操作。
一旦对每一宏块确定(例如,经由框206)了最优运动矢量,编码器116就基于先前编码的图像和最优运动矢量来计算差分残差(例如,经由框208)。运动矢量连同差分残差一起是当前图像的紧凑表示。运动矢量数据被进一步差分地表示。主机编码器可任选地请求视频加速硬件重新评估运动矢量以找出具有更小的组合运动矢量和/或残差的宏块。所得的差分运动矢量数据和残差数据例如使用如行程长度编码(RLE)和差分编码(例如,哈夫曼和算术编码)等技术来压缩(例如,经由块218),以生成最终的已编码比特流(已编码视频数据126)以便传送到目的地(框218)来向用户呈现。在此示例中,框206、208和214到218的操作(例如,诸如运动估计(206)、模式判定、运动矢量(MV)选择和速率控制(208)、预测形成(210)、变换和量化操作(214)、反量化器和变换及版本(216)以及熵编码(218)等操作)在本领域中是公知的,因此此处不再描述。
再次参考图1,在一个实现中,视频编码器116是为完全利用加速硬件130而提供的多线程应用程序。在此实现中,当确定哪些视频编码操作要在硬件中加速时,视频编码器116可以结构化特定流水线配置,使得处理器104和加速硬件130两者都得到完全利用。例如,当对于视频数据的一特定帧,视频编码流水线运动估计操作是由硬件来执行的时候,该流水线可被配置成由主机对该视频数据的一不同帧在软件中执行熵(或算术或哈夫曼)编码操作。表示所选/结构化的特定流水线配置的一个示例性单运动矢量流水线以下在附录的5.1.1节中描述。其中视频编码器116向加速硬件130请求多个运动矢量并基于各参数来选择一个运动矢量流水线的示例性多运动矢量(相对复杂的)流水线在以下附录的5.1.2节中描述。
关于选择搜索简档,运动矢量的质量指的是通过使用运动矢量生成的流的比特率。高质量运动矢量与低比特率流相关联。质量由块搜索的完整性、算法的质量、使用的距离度量等来确定。高质量运动矢量应用于执行高质量视频编码操作。为此,视频编码加速服务118提供一称为搜索简档(search profile)的通用构造以封装质量和时间之间的折衷。该搜索简档还包括标识加速硬件130使用的搜索算法等的元数据。视频编码器116基于编码器实现的特定要求选择一特定的搜索简档。
关于最小化总线上和处理器之间的数据转移,由视频编码流水线配置实现的编码过程通常包括若干处理阶段,每一处理阶段可以经由或不经由加速硬件130来加速。在其中视频编码器116确定在编码流水线的连续阶段中利用硬件加速的情况下,可能不必将数据从基于加速硬件130的存储器132移至与主机计算设备102相关联的系统存储器106,然后移回基于加速硬件的存储器132以便执行下一阶段,依此类推。
更具体地,尽管指向各种类型的视频和运动矢量数据的指针可以在主机计算设备102和加速硬件130之间来回传输,但是在一个实现中,实际数据仅在数据指针(D3D9表面指针)使用例如IDirect3DSurface9::LockRect明确地锁定时才被复制到系统存储器106。用于锁定表面的示例性接口是已知的(例如,公知的IDirect3DSurface9::LockRect接口)。由此,在两个编码流水线阶段彼此紧跟,并且主机计算设备102不需要执行任何中间处理的情况下,主机计算设备102可决定不“锁定”在处理阶段之间已分配的缓冲区。这将防止对数据的冗余的存储器复制,并且因此避免了不必要的数据移动/传输。以此方式,视频编码器116设计了基本上最小化了总线上以及处理器之间的数据传输,且因此进一步提高视频编码速度的视频编码流水线。
此时,视频编码器116已经鉴于应用程序的特定视频编码体系结构(软件实现的)评估了加速硬件130所支持的实现细节以标识能从在硬件中加速获益的任何编码操作、选择了搜索简档、最小化了总线上以及处理器之间的数据转移、和/或其它等等。基于这些判定,视频编码器116选择一特定流水线配置来编码已加码的源视频数据,并因此生成已编码视频数据126。接着,视频编码器116与视频编码加速服务118接口以创建一编码器对象来实现所选的流水线(参见附录中的CreateVideoEncoder API,§3.4.6)。在此实现中,编码器对象(例如,常规的COM对象)是通过标识所选流水线配置以及以下的一个或多个来创建的:输出的已编码比特流的格式、与流水线配置相关联的输入和输出数据流的数量、静态配置特性、基于所选流水线配置用于与不同I/O流相关联的建议的缓冲区(表面)数量、以及基于图形驱动程序能够收集的资源的驱动程序指定的分配符队列大小、以及其它参数。(队列大小和数据缓冲区的数量本质上指的是相同的东西:一个是“建议的”,另一个是“实际的”)。
接着,视频编码器116使用所创建的编码器对象来与视频编码加速服务118接口以对已解码的源视频数据进行编码。为此,编码器对象向加速硬件130提交执行请求(参见附录中的IVideoEncode:Execute API,§3.2.3)。
鉴于以上原因,系统100允许视频编码器应用程序116的任意实现在运行时定义并创建视频编码流水线配置以完全利用可用的视频编码加速硬件来提高编码速度和质量。作为这些运行时配置操作的一部分,视频编码器116可使用VA API 128来指定编码流水线要实现交互式有向搜索(细化递增的多遍搜索)、定义并使用一般可选择的搜索策略(例如,基于独立于关于所采用的实际算法的任何细节知识的质量度量来选择搜索算法)、利用格式无关方法(例如,其中视频编码器116不知道输入视频数据122的特定图像格式,且加速硬件130不知道已编码视频数据126的压缩的输出格式)来控制搜索、自适应数据大小(例如,其中视频编码器116基于搜索算法来选择宏块大小)等等。
示例性过程
图3示出根据一个实施例的用于加速视频编码的示例性过程300。出于示例性描述的目的,参考图1的系统100的各组件描述该过程的操作。一组件参考标号最左边的标号指示首次描述该组件的特定附图。
在框302处,视频编码器116(图1)接收输入视频数据122。如果输入视频数据122是未压缩的,则该输入视频数据表示已解码的源视频数据。在框304处,如果输入视频数据122是压缩的,则视频编码器116解压该输入视频数据以生成已解压的源视频数据。在框306处,视频编码器116与VA API 128接口以向加速硬件130查询能力以及视频编码流水线配置实现细节。在框308处,视频编码器116在视频编码器116的实现的上下文内评估支持的能力和实现细节,以标识与可从硬件加速获益的视频编码器116的特定实现相关联的视频编码操作、作出编码速度和/或质量决策、最小化总线上以及处理器之间的数据转移和/或其它等等。
在框310处,视频编码器116创建实现被配置成执行所标识的可从在加速硬件130中的硬件加速获益的视频编码操作的编码流水线的编码对象、实现速度/质量折衷(例如,经由所选的搜索简档)、并最小化数据流转移。在框312处,视频编码器使用所创建的编码器对象来根据由在框310处生成的定制视频编码流水线描绘的操作序列和编码体系结构对已解码源视频数据进行编码。框312的这些编码操作生成已编码视频数据126(图1)。
结论
尽管以对结构特征和/或方法操作或动作专用的语言描述了用于加速视频编码的系统和方法,但是可以理解,所附权利要求书中定义的实现不一定要限于所描述的具体特征或动作。
例如,尽管图1的API 128是在编码视频数据的上下文中描述的,但是API 128可在编码上下文之外用于诸如边缘检测、基于运动矢量的降噪、图像稳定、锐化、帧速率转换、计算机视觉应用程序的速率计算等其它功能的硬件加速。例如,关于降噪,在一个实现中,视频编码器116(图1)对已解码的源图像数据的所有宏块计算运动矢量。然后,视频编码器116利用运动幅值、方向和与周围宏块的运动矢量的相关来确定在输入图像中是否有局部对象运动。在此实现中,视频编码器116然后利用矢量的幅值来指导特定对象的对象跟踪/过滤侵略性或平均移位以减少统计随机噪声。
在关于图像稳定的另一示例中,在一个实现中,视频编码器116对所有宏块和已解码源数据计算运动矢量。视频编码器116然后确定图像中是否有全局运动。这通过将所有运动矢量值相关并确定相关的矢量值是否相似来实现。如果是,则视频编码器116得出存在全局运动的结论。或者,视频编码器116利用大的宏块大小并确定是否存在大宏块的总体运动。在确定是否存在全局运动之后,如果视频编码器116还发现全局运动矢量趋向于跨帧急动,则视频编码器116得出存在照相机急动的结论并在开始噪声过滤和编码操作之前补偿这一急动。
因此,系统100的具体特征和操作是作为实现所要求保护的主题的示例性形式而公开的。
附录A
示例性视频编码加速API
视频编码
本附录描述了用于加速视频编码(也称为VA编码)的视频编码加速API128(图1)的一个示例性实现的各方面。在此实现中,API 128被设计成使得编码和视频处理应用程序(例如,视频编码器模块116)能够利用加速硬件130(例如,GPU)对加速运动估计、残差计算、运动补偿和变换的支持。
1目录
视频编码........................................................11
1  目录.........................................................11
2  示例性设计...................................................14
   2.1  编码器布局..............................................14
   2.2  流水线或模式配置........................................14
      2.2.1 VA2_EncodePipe_Full.................................14
      2.2.2 VA2_EncodePipe_MotionEstimation. ...................15
3  示例性API....................................................16
   3.1  接口定义................................................16
      3.1.1 IVideoEncoder.......................................16
      3.1.2 IVideoEncoderService................................16
   3.2  方法:IVideoEncoder.....................................17
      3.2.1 GetBuffer...........................................17
      3.2.2 ReleaseBuffer.......................................19
      3.2.3 Execute.............................................19
   3.3  数据结构:Execute.......................................21
      3.1.1 VA2_Encode_ExecuteDataParameter.....................22
      3.3.2 VA2_Encode_ExecuteConfigurationParameter............22
      3.3.3 DataParameter_MotionVectors.........................23
      3.3.4 DataParameter_Residues..............................23
      3.3.5 DataParameter_InputImage............................24
      3.3.6 DataParameter_ReferenceImages.......................24
     3.3.7 DataParameter_DecodedImage...................................25
     3.3.8 VA2_Encode_ImageInfo.........................................26
     3.3.9 ConfigurationParameter_MotionEstimation......................26
     3.3.10 VA2_Encode_SearchResolution.................................27
     3.3.11 VA2_Encode_SearchProfile....................................27
     3.3.12 VA2_Encode_MBDescription....................................28
     3.3.13 VA2_Encode_SearchBounds.....................................29
     3.3.14 VA2_Encode_ModeType.........................................29
     3.3.15 ConfigurationParameter_Quantization.........................30
3.4  方法:IVideoEncoderService.........................................31
     3.4.1 GetPipelineConfigurations....................................31
     3.4.2 GetFormats...................................................31
     3.4.3 GetDistanceMetrics...........................................32
     3.4.4 GetSearchProfiles............................................32
     3.4.5 GetMECapabilities............................................33
     3.4.6 CreateVideoEncoder...........................................33
3.5  数据结构:IVideoEncoderService.....................................35
     3.5.1 VA2_Encode_MECaps............................................35
     3.5.2 VA2_Encode_StaticConfiguration...............................36
     3.5.3 VA2_Encode_Allocator.........................................37
     3.5.4 VA2_Encode_StreamDescription.................................37
     3.5.5 VA2_Encode_StreamType........................................37
     3.5.6 VA2_Encode_StreamDescription_Video...........................38
     3.5.7 VA2_Encode_StreamDescription_MV..............................38
     3.5.8 VA2_Encode_StreamDescriptoin_Residues........................39
3.6  数据结构:运动矢量.................................................40
     3.6.1运动矢量布局..................................................40
     3.6.2  新的D3D格式.................................................40
     3.6.3 VA2_Encode_MVSurface.........................................41
     3.6.4 VA2_Encode_MVType............................................41
     3.6.5 VA2_Encode_MYLayout..........................................42
     3.6.6 VA2_Encode_MotionVector8.....................................42
     3.6.7 VA2_Encode_MotionVector16....................................42
     3.6.8 VA2_Encode_MotionVectorEx8...................................43
    3.6.9  VA2_Encode_MotionVectorEx16...................................43
  3.7  数据结构:残差....................................................44
    3.7.1  亮度平面......................................................44
    3.7.2  色度4:2:2.....................................................45
    3.7.3色度4:2:0.......................................................45
4  示例性DDI文档.........................................................45
  4.1  枚举和能力........................................................45
    4.1.1  FND3DDDI_GETCAPS..............................................46
    4.1.2  VADDI_QUERYEXTENSIONCAPSINPUT.................................46
    4.1.3  D3DDDIARG_CREATEEXTENSIONDEVICE...............................46
  4.2  编码功能..........................................................47
    4.2.1  VADDI_Encode_Function_Execute_Input...........................47
    4.2.2  VADDI_Encode_Function_Execute_Output..........................47
  4.3  扩展设备结构......................................................48
    4.3.1  VADDI_PRIVATEBUFFER...........................................48
    4.3.2  D3DDDIARG_EXTENSIONEXECUTE....................................48
    4.3.3  FND3DDDI_DESTROYEXTENSIONDEVICE...............................48
    4.3.4 FND3DDDI_EXTENSIONEXECUTE......................................48
    4.3.5 D3DDDI_DEVICEFUNCS.............................................49
  4.4  D3D9结构和函数....................................................49
5  示例性编程模型........................................................49
  5.1  流水线效率........................................................49
    5.1.1  示例:单个运动矢量(流水线满)..................................49
    5.2.1  示例:多个运动矢量............................................52
2示例性设计
2.1  编码器布局
图5示出了根据一个实施例的示例性视频编码器应用程序以示出可利用视频编码加速API的方式。在此示例中,视频编码器116是以DMO或MFT的形式来实现的。图5示出了在若干处理阶段之后的输入数据(对应于“接收”)和输出数据。各框表示数据,而圆圈表示由编码器应用程序调用的API函数。因此,圆圈表示编码器应用程序看到的API的核心。
2.2  流水线或模式配置
加速硬件被视为流水线,并使用流水线GUID来描述该流水线的最基本配置元素。编码加速的目标可被认为是与流水线效率的目标密切相关。
该设计允许拆分的(或多阶段)流水线,其中在获得最终输出之前数据在主机PC和硬件之间来回传递。尚未设计出多阶段流水线配置,以下配置描述了非拆分的、单阶段流水线。
2.2.1 VA2_EncodePipe_Full
//{BFC87EA2-63B6-4378-A619-5B451EDCB940}
cpp_quote(″DEFINE_GUID(VA2_EncodePipe_Full,0xbfc87ea2,0x63b6,0x4378,0xa6,0x19,0x5b,0x45,
0x1e,0xdc,0xb9,0x40);″)
图6示出了根据一个实施例的示例性视频编码流水线配置,其中加速硬件加速运动估计、变换、量化和反过程以产生已解码图像。该硬件产生运动矢量、残差(亮度和色度)和已解码图像作为输出。已解码图像不需要被传送到系统存储器,因为其唯一的目的是计算用于下一帧的运动矢量。
稍后的文献将谈及称为NumStreams(流数)的参数。对于此流水线配置,NumStreams为5。实际的StreamId(流ID)在图中的括号中示出。
这是单阶段的非拆分流水线,因此Execute(执行)的Stage(阶段)参数不适用。
流描述
注意,StreamType_*是VA2_Encode_StreamType_*的缩写。
输入图像
StreamID是1,且流类型是StreamType_Video。该流表示对其寻找运动数据的图像。用于该流的分配符是可协商的-当前接口可以提供一个分配符,或者可使用外部分配符。对分配符的选择是在创建时作出的,并且如果选择了外部分配符,则流ID 1将被认为是对于GetBuffer(获得缓冲区)的非法输入值。
参考图像
流ID为2,并且流类型是StreamType_Video。该流表示用于计算运动矢量的参考图像列表。当前接口不为该流提供单独的分配符。输入表面从已解码图像流(ID=5)中回收,或者从别处获得。
运动矢量
流ID是3,且流类型是StreamType_MV。该流表示包含运动矢量数据的输出参数。用于该流的缓冲区只能经由GetBuffer获得。
残差 
流ID是4,且流类型是StreamType_Residues。该流表示包含用于所有三个平面的残差值的输出参数。用于该流的缓冲区只能经由GetBuffer获得。
已解码图像
流ID是5,并且流类型是StreamType_Video。该流表示包含从量化的残差和运动矢量值获得的已解码图像的输出参数。用于该流的缓冲区只能经由GetBuffer获得。
2.2.2 VA2_EncodePipe_MotionEstimation
//{F18B3D19-CA3E-4a6b-AC10-53F8 6D509E04}
cpp_quote(″DEFINE_GUID(VA2_EncodePipe_MotionEstimation,0xf18b3d19,0xca3e,0x4a6b,0xac,0x10,
0x53,0xf8,0x6d,0x50,0x9e,0x4);″)
图7示出了根据一个实施例的示例性视频编码流水线配置,其中硬件仅加速运动估计。该流水线配置取一组参考图像作为输入,并转储运动矢量作为输出。在此情况下的已解码图像必须由主机软件来生成和提供。
用于此流水线配置的NumStreams是3。用于各种流的SteamId在图中的括号中示出。
这是单阶段、非拆分的流水线,并且Excute的Stage参数不适用。
3示例性API
3.1  接口定义
3.1.1  IVideoEncoder
interface IVideoEncoder:IUnknown
{
   HRESULT  GetBuffer(
      [in]  UINT8 StreamId,
      [in]  UINT32 StreamType,
      [in]  BOOL Blocking,
      [out]  PVOID pBuffer
      );
   HRESULT  ReleaseBuffer(
      [in]  UINT8 StreamId,
      [in]  UINT32 StreamType,
      [in]  PVOID pBuffer
      );
   HRESULT Execute(
      [in]  UINT8 Stage,
      [in]  UINT32 NumInputDataParameters,
      [in,size_is(NumInputDataParameters)]
          VA2_Encode_ExecuteDataParameter**pInputData,
      [in]  UINT32 NumOutputDataParameters,
      [out,size_is(NumOutputDataParameters]
          VA2_Encode_ExecuteDataParameter**pOutputData,
      [in]  UINT32 NumConfigurationParameters,
      [in, size_is(NumConfigurationParameters]
          VA2_Encode_ExecuteConfigurationParameter**pConfiguration,
      [in]  HANDLE hEvent,
      [out]  HRESULT*pStatus
      );
}
3.1.2  IVideoEncoderService
interface IVideoEncoderService:IVideoAccelerationService
{
   HRESULT GetPipelineConfigurations(
      [out] UINT32*pCount,
      [out,unique,size_is(*pCount)]GUID**pGuids
      );
   HRESULT GetFormats(
      [out] UINT32*pCount,
      [out,unique,size_is(*pCount)]GUID**pGuids
      );
   HRESULT GetDistanceMetrics(
      [out] UINT32*pCount,
      [out,unique,size_is(*pCount)]GUID**pGuids
      );
   HRESULT GetSearchProfiles(
      [out] UINT32*pCount,
      [out,unique,size_is(*pCount)]VA2_Encode_SearchProfile**pSearchProfiles
      );
   HRESULT GetMECapabilities(
      [out]VA2_Encode_MECaps*pMECaps
      ) ;
   HRESULT CreateVideoEncoder(
      [in] REFGUID PipelineGuid,
      [in] REFGUID FormatGuid,
      [in] UINT32 NumStreams,
      [in] VA2_Encode_StaticConfiguration*pConfiguration,
      [in,size_is(NumStreams)] VA2_Encode_DataDescription*pDataDescription,
      [in,size_is(NumStreams)] VA2_Encode_Allocator*SuggestedAllocatorProperties,
      [out,size_is(NumStreams)] VA2_Encode_Allocator*pActualAllocatorProperties,
      [out] IVideoEncoder**ppEncode
      );
};
3.2  方法:IVideoEncoder
3.2.1 GetBuffer
该函数返回在Excute调用中使用的缓冲区(编码表面)。该缓冲区在使用之后通过调用ReleaseBuffer(释放缓冲区)来立即释放,以避免使流水线停止。
HRESULT GetBuffer(
   [in] UINT8 StreamId,
   [in] UINT32 StreamType,
   [in] BOOL Blocking,
   [out]PVOID pBuffer
   );
#define E_NOTAVAILABLE     HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
#define E_INVALIDPARAMETER HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER)
参数
StreamId
指的是对其需要缓冲区的特定流。取决于特定的流,将返回不同类型的缓冲区,如输入图像缓冲区、运动矢量缓冲区等等。并非对给定配置的所有流ID都是对此函数的有效输入。对于StreamId的允许值作为流水线配置的一部分来指定。
Stream Type
指定要返回的缓冲区的类型。通常,流类型由StreamId暗示,并且在创建时协商。如果StreamType与StreamId不一致,则该函数返回出错值。数据缓冲区如由备注一节中的表格所描述的基于StreamType的值来解释(强制类型转换)。
Blocking
指定当存在“饥饿”时函数的行为,或用于扼流的某一其它需求。值True(真)指示该函数应当阻塞,而False(假)指示该函数应当返回
E_NOTAVAILABLE。
pBuffer
指向要经由ReleaseBuffer释放的数据缓冲区的指针。该指针基于StreamType参数来重新强制转换(解释),并且在以下备注一节中的表格中描述。
返回值
S_OK
函数成功。
E_NOTAVAILABLE
这是在驱动程序因缺乏缓冲区而饥饿,并且Blocking标志被设为假时返回的。
E_INVALIDPARAMETER
输入参数不正确。这可例如在StreamType不匹配给定StreamId的期望值时使用。
VFW_E_UNSUPPORTED_STREAM
StreamId无效。GetBuffer不提供用于指定流ID的缓冲区。对StreamId的允许值作为流水线配置的一部分来描述。对于指定的流ID,分配符可以是外部的,或者可以完全没有分配符。
E_FAIL
函数失败。
备注
通常,该函数非常快地返回控制,因为缓冲区已经存在于分配符队列中。该函数应当阻塞(或返回E_NOTAVAILABLE)的唯一条件是当来自分配符队列的所有缓冲区都被提交给设备,或被应用程序消耗,因此不被释放的时候。
流类型和缓冲区格式
StreamType_Video IDirect3DSurface9**pBuffer
StreamType_MV IDirect3DSurface9**pBuffer
StreamType_Residues IDirect3DSurface9*pBuffer[3]。即,pBuffer是指向三个D3D表面指针的指针。pBuffer[0]是指向亮度表面的指针。
StreamType_Video IDirect3DSurface9**pBuffer
pBuffer[1]是指向Cb表面的指针,或者如果不适用则为空。pBuffer[2]是指向Cr表面的指针,或者如果不适用则为空。
3.2.2  ReleaseBuffer
该函数用于将表面释放回分配符队列以便经由GetBuffer重复使用。
HRESULT ReleaseBuffer(
   [in] UINT8 StreamId,
   [in] UINT8 StreamType,
   [in] PVOID pBuffer
   );
参数
StreamId
与缓冲区相关联的流ID。
Stream Type
用于缓冲区的流类型。
pBuffer
要释放回分配符队列的缓冲区。
返回值
S_OK
函数成功。
E_FAIL
函数失败。
3.2.3 Execute
该函数用于向硬件提交请求。它包含经由GetBuffer获得的输入和输出数据缓冲区以及某些配置信息。该函数是异步的,并且其完成由用信号表示的事件来指示。完成状态使用pStatus参数来指示,该参数在堆上分配,并且仅在用信号表示事件之后才检查。
作为参数提供给此函数的缓冲区在该函数真正完成之前不被应用程序读取(例如,经由LockRect)或写入。真正的完成是由函数返回出错值来暗示的,或者如果该函数返回成功,则通过用信号表示hEvent(该函数的参数)来暗示。当将同一缓冲区输入到Execute调用的几个实例时,在所有相关联的Execute调用完成之前不访问该缓冲区。指向Execute使用的表面的指针仍作为参数提供给与Execute类似的VA函数,因为这不需要锁定数据。该最后一条规则解释了如何可同时在多个Execute调用中使用同一输入图像。
提供给该调用的缓冲区遵循在创建时协商的分配符语义。如果在期望使用GetBuffer时使用了外部分配符,则该函数将返回E_FAIL。
HRESULT Execute(
   [in] UINT8 Stage,
   [in] UINT32 NumInputDataParameters,
   [in,size_is(NumInputDataParameters)]
         VA2_Encode_ExecuteDataParameter**pInputData,
   [in] UINT32 NumOutputDataParameters,
   [out,size_is(NumOutputDataParameters)]
        VA2_Encode_ExecuteDataParameter**pOutputData,
   [in] UINT32 NumConfigurationParameters,
   [in,size_is(NumConfigurationParameters]
         VA2_Encode_ExecuteConfigurationParameter**pConfiguration,
   [in]HANDLE hEvent,
   [out]HRESULT*pStatus
   );
参数
Stage
对于拆分的流水线配置,该参数标识拆分的流水线的特定阶段。编号是基于1的,并且对于非拆分的流水线该参数被忽略。
NumInputDataParameters
输入数据数组(下一参数)的大小。
pInputData
指向输入数据值的指针数组。个别数据指针基于StreamId值来适当地重新强制转换,该值具有在创建时指定的相关联的StreamDescription(流描述)。数据缓冲区是在创建时分配的,并且在流传送过程期间通过调用GetBuffer来获得。
NumOutputDataParameters
输出数据数组(下一参数)的大小。
pOutputData
指向输出数据值的指针数组。个别数据指针基于StreamId值来适当地重新强制转换,该值具有在创建时指定的相关联的StreamDescription。
数据缓冲区是在创建时分配的,并且在流传送过程期间通过调用GetBuffer来获得。
NumConfigurationParameters
配置数组(下一参数)的大小
pConfiguration
控制流水线的执行的配置参数的数组。总体配置是该结构以及在创建编码器时提供的静态配置参数的并集。
hEvent
用信号标识输出数据就绪的事件句柄。
pStatus
指示所请求的操作是否成功完成的状态。允许的值包括S_OK(成功完成)、E_TIMEOUT(如果超过了TimeLimit(时限))以及E_SCENECHANGE(如果启用场景改变检测并检测到该改变)。在两种出错的情况下,没有一个输出表面包含有用数据。该参数在堆上分配,并且返回值仅在用信号表示了hEvent之后才检查。
返回值
S_OK
函数成功。
E_FAIL
函数失败。
备注
如果用信号表示了事件句柄,则意味着当LockRect在任一输出表面上调用时其应立即完成,因为它们已经就绪。特别地,期望LockRect调用通过在任何事件句柄上等待而不会在任何时间长度上锁定。也不允许通过忙碌的自旋来浪费CPU时间。
3.3  数据结构:Execute
Execute调用具有数据参数和配置参数。具体的数据参数可以被认为是从VA2_Encode_ExecuteDataParameter基类(或结构)导出的,而具体的配置参数可以被认为是从VA2_Encode_ExecuteConfigurationParameter基类(或结构)导出的。
3.1.1 VA2_Encode_ExecuteDataParameter
typedef  struct_VA2_Encode_ExecuteDataParameter{
   UINT32      Length;
   UINT32      StreamId;
} VA2_Encode_ExecuteDataParameter;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。缓冲区格式在创建时使用StreamDescription(流描述)参数来协商。
3.3.2 VA2_Encode_ExecuteConfigurationParameter
typedef  struct_VA2_Encode_ExecuteConfigurationParameter{
   UINT32      Length;
   UINT32      StreamId;
   UINT32      ConfigurationType;
} VA2_Encode_ExecuteConfigurationParameter;
#define VA2_Encode_ConfigurationType_MotionEstimation    0x1
#define VA2_Encode_ConfigurationType_Quantization       0x2
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
ConfigurationType
该参数描述了配置参数,并用于适当地对当前结构进行类型强制转换。
备注
该结构用作更专门的配置信息的基础类型。该基础类型基于ConfigurationType(配置类型)参数进行类型强制转换为更专门的类型。
ConfigurationType和专门的结构之间的映射在下表中描述。
配置类型
ConfigurationType_MotionEstimation  ConfigurationParameter_MotionEstimation
ConfigurationType_Quantization  ConfigurationParameter_Quantization
3.3.3 DataParameter_MotionVectors
typedef  struct_VA2_Encode_ExecuteDataParameter_MotionVectors{
   UINT32               Length;
   UINT32               StreamId;
   VA2_Encode_MVSurface*pMVSurface;
}VA2_Encode_ExecuteDataParameter_MotionVectors;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
pMVSurface
指向包含运动矢量D3D表面的结构。
3.3.4 DataParameter_Residues
typedef struct_VA2_Encode_ExecuteDataParameter_Residues{
   UINT32                     Length;
   UINT32                     StreamId;
   VA2_Encode_ResidueSurface* pResidueSurfaceY;
   VA2_Encode_ResidueSurface* pResidueSurfaceCb;
   VA2_Encode_ResidueSurface* pResidueSurfaceCr;
} VA2_Encode_ExecuteDataParameter_Residues;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
pResidueSurfaceY
包含亮度值的残差表面。
pResidueSurfaceCb
包含色度Cb值的残差表面。
pResidueSurfaceCr
包含色度Cr值的残差表面。
3.3.5 DataParameter_InputImage
typedef struct_VA2_Encode_ExecuteDataParameter_InputImage{
   UINT32              Length;
   UINT32              StreamId;
   VA2_Encode_ImageInfo*pImageData;
} VA2_Encode_ExecuteDataParameter_InputImage;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
pImageData
指向包含输入图像D3D表面的结构的指针。这是对其需要运动矢量的表面。
3.3.6 DataParameter_ReferenceImages
typedef struct_VA2_Encode_ExecuteDataParameter_ReferenceImages{
   UINT32              Length;
   UINT32              StreamId;
   UINT32              NumReferenceImages;
   VA2_Encode_ImageInfo*pReferenceImages
} VA2_Encode_ExecuteDataParameter_ReferenceImages ;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
DataType
NumReferenceImages
参考图像数组(下一参数)的大小
pReferenceImages
作为运动矢量的基础的参考图像的数组。对于如MPEG-2的简单格式,可以仅使用一个逐行帧(或两个半帧)。另一方面,如H.264和VC-1等格式支持跨越几个帧的运动矢量。MPEG-2中的P帧仅使用一个参考图像,而B帧具有隔行的视频,并且半帧类型的运动可能使用4个图像,其中每一图像可以是一帧或一个半帧。
3.3.7 DataParameter_DecodedImage
typedef struct_VA2_Encode ExecuteDataParameter_DecodedImage{
   UINT32              Length;
   UINT32              StreamId;
   VA2_Encode_ImageInfo*pYCbCrImage;
} VA2_Encode_ExecuteDataParameter_DecodedImage;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
DataType
pYCbCrImage
在反量化、反变换和运动补偿之后获得的输出的已解码图像。对于良好的流水线,相关联的D3D表面不应被锁定,也不必将数据传送到系统存储器。表面指针仍可用作参考图像。
3.3.8 VA2_Encode_ImageInfo
typedef struct_VA2_Encode_ImageInfo{
   IDirect3DSurface9*pSurface;
   BOOL             Field;
   BOOL             Interlaced;
   RECT             Window;
} VA2_Encode_ImageInfo;
成员
pSurface
指向包含YCbCr格式的图像的D3D表面的指针。
Field
值为1指示该表面包含视频数据的一个半帧,并且该数据假定为隔行的。0指示完整的逐行帧。
Interlaced
值为1指示该图像数据是隔行的。该标志应仅在Field(上一个参数)被设为1时才使用。如果Field被设为1,则数据被假定为是隔行的。
Window
图像内的矩形。这可用于限制运动估计调用仅返回用于整个图像内的一个矩形的运动矢量。
3.3.9 ConfigurationParameter_MotionEstimation
typedef struct_VA2_Encode_ExecuteConfigurationParameter_MotionEstimation{
   UINT32                  Length;
   UINT32                  StreamId;
   UINT32                  ConfigurationType;
   VA2_Encode_MEParameters*pMEParams;
} VA2_Encode_ExecuteConfigurationParameter_MotionEstimation;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
ConfigurationType
pMEParams
指向定义支配包括搜索窗的运动搜索等的各种参数的结构的指针。
备注
图8示出了根据一个实施例的几个示例性运动估计参数。这些参数在以下结构中使用。
3.3.10 VA2_Encode_SearchResolution
typedef enum(
   VA2_Encode_SearchResolution_FullPixel,
   VA2_Encode_SearchResolution_HalfPixel,
   VA2_Encode_SearchResolution_QuarterPixel
} VA2_Encode_SearchResolution;
描述
FullPixel
运动矢量是以完整的像素为单位来计算的。
HalfPixel
运动矢量是以半像素为单位来计算的。因此运动矢量值(5,5)表示离开(2.5,2.5)像素的数据宏块。
QuarterPixel
运动矢量是以四分之一像素为单位来计算的。因此运动矢量值(10,10)表示离开(2.5,2.5)像素的数据宏块。
在计算子像素运动矢量值时,编码器使用内插来估计亮度和色度值。具体的内插方案是格式相关的,并且以下GUID(静态配置的一部分)控制内插方案。
//{E9AF78CB-7A8A-4d62-887F-B6A418364C79}
cpp_quote( ″DEFINE_GUID(VA2_Encode_Interpolation_MPEG2Bilinear,0xe9af78cb,0x7a8a,0x4d62,
0x88,0x7f,0xb6,0xa4,0x18,0x36,0x4c,0x79);″)
//{A94BBFCB-1BF1-475c-92DE-67298AF56BB0}
cpp_quote(″DEFINE_GUID(VA2_Encode_Interpolation_MPEG2Bicubic,0xa94bbfcb,0x1bf1,0x475c,0x92,
0xde,0x67,0x29,0x8a,0xf5,0x6b,0xb0);″)
3.3.11 VA2_Encode_SearchProfile
typedef struct_VA2_Encode_SearchProfile{
   UINT8   QualityLevel;
   UINT8   TimeTaken;
   GUID    SearchTechnique;
   GUID    SubpixelInterpolation;
} VA2_Encode_SearchProfile;
成员
QualityLevel
范围在[0-100]的数字,指示运动矢量在设备支持的不同简档中的相对质量。
TimeTaken
范围在[0-100]的数字,指示对不同搜索简档花费的相对时间。这使得应用程序能够作出合理的时间-质量折衷。
SearchTechnique
指示所使用的搜索算法的GUID。
SubpixelInterpolation
指示所使用的子像素内插方案的GUID。
备注
没有统一接受的绝对质量定义,因此同意接受相对度量。针对TimeTaken指示的值应当遵循严格的比例规则。如果简档1花费10ms而简档2花费20ms,则TimeTaken值的比例应为20/10=2。
3.3.12 VA2_Encode_MBDescription
typedef struct_VA2_Encode_MBDescription{
   BOOL    ConstantMBSize;
   UINT32  MBWidth;
   UINT32  MBHeight;
   UINT32  MBCount;
   RECT*  pMBRectangles;
}VA2_Encode_MBDescription;
成员
ConstantMBSize
值为1指示当前图像中的所有宏块具有相同的大小。这对于如H.264等格式并不如此。
MBWidth
宏块的宽度。仅当bConstantMBSize为1时才有效。
MBHeight
宏块的高度。仅当bConstantMBSize为1时才有效。
MRCount
如果bConstantMBSize为0,则使用矩形数组来描述图像中的宏块(或段)。该参数用以下pMBRectangles参数的元素来描述大小。
pMBRectangles
描述如何切割图像的矩形数组。
3.3.13 VA2_Encode_SearchBounds
typedef struct_VA2_Encode_SearchBounds{
   BOOL    DetectSceneChange;
   UINT32  MaxDistanceInMetric;
   UINT32  TimeLimit;
   UINT32  MaxSearchWindowX;
   UINT32  MaxSearchWindowY;
} VA2_Encode_SearchBounds;
成员
DetectSceneChange
如果该值为1,则请求场景改变检测。在这一情况下,如果检测到场景改变,则Execute调用不计算运动矢量,并且因此不计算残差或已解码图像。这是经由Execute调用的pStatus参数来指示的,在此情况下该参数应被设为E_SCENECHANGE。
MaxDistanceInMetric
指的是当使用当前选择的距离度量来进行比较时宏块之间的差别。如果该距离超过MaxDistanceInMetric值,则拒绝这一运动矢量。
TimeLimit
允许硬件花费在运动估计阶段上的最大时间。如果花费的时间要长于该时间,则Execute调用的pStatus参数被设为E_TIMEOUT。
Search WindowX
返回的运动矢量的x分量的最大值。换言之,搜索窗的大小(沿x维度)。
Search Window Y
运动矢量的y分量的最大值。换言之,搜索窗的大小(沿y维度)。
备注
3.3.14 VA2_Encode_ModeType
typedef struct_VA2_Encode_ModeType{
   UINT32  SearchProfileIndex;
   GUID    DistanceMetric;
   INT16   HintX;
   INT16   HintY;
} VA2_Encode_ModeType;
成员
SearchProfileIndex
由GetSearchProfiles API调用返回的搜索简档列表的索引。
DistanceMetric
当比较两个宏块时使用的度量。常用的度量包括SAD(绝对距离和)和SSE(均方误差和)。
HintX
关于要引导运动搜索的期望运动方向的提示。这指的是图像中的整体运动,并且不在每一MB的基础上适用。
HintY
关于要引导运动搜索的期望运动方向的提示。这指的是图像中的整体运动,并且不在每一MB的基础上适用。
3.3.15 ConfigurationParameter_Quantization
typedef struct_VA2_Encode_ExecuteConfigurationParameter_Quantization{
   UINT32  Length;
   UINT32  StreamId;
   UINT32  ConfigurationType;
   UINT32 Stepsize;
} VA2_Encode_ExecuteConfigurationParameter_Quantization;
成员
Length
该结构中的字节数。为可扩展性提供。
StreamId
在流水线配置中定义的数据流的ID。这可用于推断数据是输入还是输出。
Configuration Type
StepSize
当执行量化时要使用的步长。该设计允许对在此调用中请求了运动矢量和残差的图像的整个部分仅使用一个步长。
3.4  方法:IVideoEncoderService
该接口中的方法允许应用程序向硬件查询其能力并用给定配置创建编码器对象
3.4.1 GetPipelineConfigurations
HRESULT GetPipelineConfigurations(
   [out] UINT32*pCount,
   [out,unique,size_is(*pCount)]GUID**pGuids
   );
参数
pCount
返回值描述了由该函数返回的pGuids数组(下一参数)的大小。
pGuids
描述设备支持的各种流水线配置的GUID数组。存储器由被调用者分配,并且应当由调用者使用CoTaskMemFree来释放。
返回值
S_OK
函数成功。
E_OUTOFMEMORY
函数无法分配存储器来返回GUID列表
E_FAIL
由于某一设备出错无法确定所支持的流水线配置。
3.4.2 GetFormats
HRESULT GetFormats(
   [out] UINT32*pCount,
   [out,unique,size_is(*pCount)]GUID**pGuids
   );
参数
pCount
返回值描述了由该函数返回的pGuids数组(下一参数)的大小。
pGuids
描述设备支持的各种格式(例如,WMV9、MPEG-2等)的GUID数组。
存储器由被调用者分配,并且应当由调用者使用CoTaskMemFree来释放。
3.4.3 GetDistanceMetrics
HRESULT GetDistanceMetrics(
   [out] UINT32*pCount,
   [out,unique,size_is(*pCount)]GUID**pGuids
   );
参数
pCount
返回值描述了由该函数返回的pGuids数组(下一参数)的大小。
pGuids
描述设备支持的用于运动估计的各种搜索度量的GUID数组。存储器由被调用者分配,并且应当由调用者使用CoTaskMemFree来释放。
返回值
S_OK
函数成功。
E_OUTOFMEMORY
函数无法分配存储器来返回GUID列表
E_FAIL
由于某一设备出错无法确定所支持的度量。
3.4.4 GetSearchProfiles
HRESULT GetSearchProfiles(
   [out] UINT32*pCount,
   [out,unique,size_is(*pCount)]VA2_Encode_SearchProfile**pSearchProfiles
   );
参数
pCount
返回值描述了该函数返回的pGuids数组(下一参数)的大小。
pSerachProfiles
表示设备支持的搜索简档的GUID数组。该搜索简档允许编解码器应用程序更高效地进行时间-质量折衷。存储器由被调用者分配,并且由调用者使用CoTaskMemFree来释放。
返回值
S_OK
函数成功。
E_OUTOFMEMORY
函数无法分配存储器来返回GUID列表
E_FAIL
由于某一设备出错无法确定所支持的搜索简档。
3.4.5 GetMECapabilities
HRESULT GetMECapabilities(
   [out] VA2_Encode_MECaps*pMECaps
   );
参数
pMECaps
指向设备的运动估计能力的指针。这包括关于设备能够处理的图像的大小、最大搜索窗大小以及设备是否支持可变宏块大小的信息。用于该参数的存储器由调用者分配。
返回值
S_OK
函数成功。
E_FAIL
由于某一设备出错函数失败。
3.4.6 CreateVideoEncoder
该函数创建IVideoEncoder的实例。
HRESULT CreateVideoEncoder(
   [in] REFGUID PipelineGuid,
   [in] REFGUID FormatGuid,
[in] UINT32 NumStreams,
[in] VA2_Encode_StaticConfiguration*pConfiguration,
[in,size_is(NumStreams)] VA2_Encode_StreamDescription*pStreamDescription,
[in,size_is(NumStreams)] VA2_Encode_Allocator*SuggestedAllocatorProperties,
[out,size_is(NumStreams)]VA2_Encode_Allocator* pActualAllocatorProperties,
[out] IVideoEncoder**ppEncode
);
参数
PipelineGuid
表示所需的流水线配置的GUID。配置列表经由GetCapabilities获得,并且每一GUID与描述关于该配置的必要细节的公共文档相关联。
FormatGuid
表示最终编码的比特流的格式的GUID。如变换和量化等许多编码操作对其具有格式专用的元素。尽管这些格式专用元素可以由具有足够速度的CPU来处理,但是信息交换将必须使用额外的流水线阶段并且使得更难实现高流水线效率。
NumStreams
与流水线配置相关联的输入和输出数据流的数量。这在许多情况下由流水线GUID来暗示。
pConfiguration
指向静态配置特性的指针。
pStreamDescription
描述流经该流的数据的结构数组,每一个流一个。
SuggestedAllocatorProperties
调用者(编解码器应用程序)基于其流水线设计建议要与不同的流相关联的特定数量的缓冲区(表面)。
pActualAllocatorProperties
驱动程序基于其能够收集的资源和其它考虑事项指定实际分配符队列大小。假设是如果应用程序不能用可用的缓冲(分配符队列大小)来构建高效的流水线则其将放弃对该接口的使用。
ppEncode
输出编码器对象。调用者应当将此认为是要经由IUnknown::Release释放的常规COM对象。
返回值
S_OK
函数成功。
E_FAIL
函数失败(可能是缺少资源)。
3.5  数据结构:IVideoEncoderService
3.5.1 VA2_Encode_MECaps
typedef struct_VA2_Encode_MECaps{
   BOOL    VariableMBSizeSupported;
   BOOL    MotionVectorHintSupported;
   UINT16  MaxSearchWindowX;
   UINT16  MaxSearchWindowY
   UINT32  MaxImageWidth;
   UINT32  MaxImageHeight;
   UINT32  MaxMBSizeX;
   UINT32  MaxMBSizeY;
} VA2_Encode_MECaps;
成员
VariableMBSizeSupported
值为1指示当执行运动估计时硬件支持可变宏块大小。特别地,如果支持可变宏块大小,则此API的调用者在VA2_Encode_MBDescription结构中将ConstantMBSize设为0并使用pMBRectangles参数来描述对图像的划分是合法的。
MotionVectorHintSupported
值为1指示硬件能够在其运动搜索算法中使用来自调用者的某些提示。
特别地,调用者可设置作为Execute配置参数的VA2_Encode_ModeType的HintX和HintY成员。
MaxSearchWindowX
作为VA2_Encode_SearchBounds的成员的SearchWindowX的最大合法值,VA2_Encode_SearchBounds是运动估计配置参数。
MaxSearchWindowY
作为VA2_Encode_SearchBounds的成员的SearchWindowY的最大合法值,VA2_Encode_SearchBounds是运动估计配置参数。
MaxImage Width
输入图像的最大允许宽度。
MaxImageHeight
输入图像的最大允许高度。
MaxMBSizeX
宏块的最大允许宽度。
MaxMBSizeY
宏块的最大允许高度。
3.5.2 VA2_Encode_StaticConfiguration
typedef struct_VA2_Encode_StaticConfiguration{
   GUID                   TransformOperator;
   GUID                   PixelInterpolation;
   GUID                   Quantization;
   UINT8                  NumMotionVectorsPerMB;
   VA2_Encode_MVLayout     MVLayout;
   VA2_Encode_ResidueLayout ResLayout;
} VA2_Encode_StaticConfiguration;
成员
Transform Operator
表示Transform算子-MPEG-2 DCT、WMV9变换等之一-的GUID。
PixelInterpolation
表示要使用的子像素内插的GUID。双线性和双三次内插系统具有格式专用的多个系数。
Quantization
表示要使用的量化方案的GUID。
NumMotion VectorsPerMB
每一宏块要计算的运动矢量的数量。该接口的较早的版本所支持的简单流水线配置可能要求该值为1。
MVLayout
运动矢量表面的布局。
ResidueLayout
残差表面的布局。
3.5.3 VA2_Encode_Allocator
typedef struct_VA2_Encode Allocator{
   BOOL ExternalAllocator;
   UINT32 NumSurfaces;
} VA2_Encode Allocator;
成员
ExternalAllocator
False指示缓冲区是经由GetBuffer获得的,而True指示缓冲区是经由外部分配符获得的,或者没有与所讨论的流相关联的分配符。流水线配置在许多情况下强迫该字段的值(通常为0)。一个值得注意的例外是在允许来自外部分配符的输入图像流中。
NumSurfaces
要与分配符队列相关联的表面的数量。
3.5.4 VA2_Encode_StreamDescription
typedef struct_VA2_Encode_StreamDescription{
   UINT32 Length;
   UINT32 StreamType;
} VA2_Encode_StreamDescription;
成员
Length
用于确认类型强制转换并允许可扩展性的整个结构的长度。
Stream Type
描述与该流相关联的数据的类型。用于类型强制转换。
备注
该基本结构被类型强制转换为StreamType字段上的派生类型。类型强制转换在关于VA2_Encode_StreamType的文档中有描述。
3.5.5 VA2_Encode_StreamType
#define VA2_Encode_StreamType_Video         0x1
#define VA2_Encode_StreamType_MV            0x2
#define VA2_Encode_StreamType_Residues      0x3
类型描述
VA2_Encode_StreamType_Video
相关联的流描述结构可被强制转换为VA2_Encode_StreamDescription_Video。
VA2_Encode_StreamType_MV
相关联的流描述结构可被强制转换为VA2_Encode_StreamDescription_MV。
VA2_Encode_StreamType_Residues
相关联的流描述结构可被强制转换为VA2_Encode_StreamDescription_Residues。
3.5.6 VA2_Encode_StreamDescription_Video
typedef struct_VA2_Encode_StreamDescription{
   UINT32 Length;
   UINT32 StreamType;
   VA2_VideoDesc VideoDescription;
} VA2_Encode_StreamDescription;
成员
Length
用于确认类型强制转换并允许可扩展性的整个结构的长度。
StreamType
描述与该流相关联的数据的类型。用于类型强制转换。
VideoDescription
描述视频流的各种特性,包括维数、帧速率、色原等等。
3.5.7 VA2_Encode_StreamDescription_MV
typedef struct_VA2_Encode_StreamDescription{
   UINT32 Length;
   UINT32 StreamType;
   VA2_Encode_MVType MVType;
   VA2_Encode_MVLayout MVLayout;
} VA2_Encode_StreamDescription;
成员
Length
用于确认类型强制转换并允许可扩展性的整个结构的长度。
StreamType
描述与该流相关联的数据的类型。用于类型强制转换。
MYType
描述用于返回运动数据的运动矢量结构的类型。用于解释运动矢量表面的内容。
MYLayout
描述在存储器中如何布局用于给定输入图像的运动矢量结构。
3.5.8 VA2_Encode_StreamDescriptoin_Residues
typedef struct_VA2_Encode_StreamDescription{
   UINT32 Length;
   UINT32 StreamType;
   VA2_Encode_SamplingType SamplingType;
   UINT32 LumaWidth;
   UINT32 LumaHeight;
   UINT32 ChromaCbWidth;
   UINT32 ChromaCbHeight;
   UINT32 ChromaCrWidth;
   UINT32 ChromaCrHeight;
} VA2_Encode_StreamDescription;
成员
Length
用于确认类型强制转换并允许可扩展性的整个结构的长度。
Stream Type
描述与该流相关联的数据的类型。用于类型强制转换。
SamplingType
指定残差数据是否为4:4:4、4:2:2等等。
LumaWidth
亮度表面的宽度。
LumaHeight
亮度表面的高度。
ChromaCbWidth
包含Cb残差值的表面的宽度。
ChromaCbHeight
包含Cb残差值的表面的高度。
ChromaCrWidth
包含Cr残差值的表面的宽度。
ChromaCrHeight
包含Cr残差值的表面的高度。
3.6  数据结构:运动矢量
3.6.1运动矢量布局
图9示出了根据一个实施例的储存在D3D结构中的示例性运动矢量数据。被描述为“MV”的每一单元是运动矢量结构。取决于VA2_Encode_MVType和VA2_Encode_MVLayout的值使用不同的表示。实际的结构和布局描述如下。
3.6.2新的D3D格式
typedef enum_D3DFORMAT
{
   D3DFMT_MOTIONVECTOR16=105,
   D3DFMT_MOTIONVECTOR32=106,
   D3DFMT_RESIDUE16=107,
} D3DFORMAT;
运动矢量表面和残差表面与以上新的D3D格式类型相关联,该类型指示了个别运动矢量和残差的大小。该大小信息由驱动程序在应用程序使用创建API提供的表面或资源之一来创建表面时使用。与编码表面相关联的资源标志是VA2_EncodeBuffer。
//缓冲区类型
enum
{
   VA2_EncodeBuffer=7,
};
typedef struct_D3DDDI_RESOURCEFLAGS
{
   union
   {
      struct
      {
         UINT   TextApi         :1;//0x20000000
         UINT   EncodeBuffer    :1;//0x40000000
         UINT   Reserved        :1;//0x80000000
      };
      UINT      Value;
   };
} D3DDDI_RESOURCEFLAGS;
3.6.3 VA2_Encode_MVSurface
该结构从IDirect3DSurface9中高效地派生,并且携带了允许解释嵌入的D3D结构的内容的状态信息。
typedef struct_VA2_Encode_MVSurface{
   IDirect3DSurface9*   pMVSurface;
   VA2_Encode_MVType   MVType;
   VA2_Encode_MVLayout MVLayout;
   GUID                DistanceMetric;
} VA2_Encode_MVSurface;
成员
pMVSurface
指向包含运动矢量的D3D表面的指针。
MYType
该值用于标识要用于解释个别运动矢量的结构(VA2_Encode_MotionVector8等)。
MYLayout
该值标识如何在D3D表面中布局个别运动矢量结构。
DistanceMetric
表示用于测量两个宏块之间的距离的距离度量的GUID。距离度量用于标识最接近的宏块,且因此是最优运动矢量。
3.6.4 VA2_Encode_MVType
该枚举值用于解码运动矢量D3D9表面的内容。取决于运动矢量的类型,使用几个不同的运动矢量结构之一来解释该表面的内容。
typedef enum{
   VA2_Encode_MVType_Simple8,
   VA2_Encode_MVType_Simple16,
   VA2_Encode_MVType_Extended8,
   VA2_Encode_MVType_Extended16
} VA2_Encode_MVType;
描述
VA2_Encode_MVType_Simple8
运动矢量结构是VA2_Encode_MotionVector8。
VA2_Encode_MVType_Simple16
运动矢量结构是VA2_Encode_MotionVector16。
VA2_Encode_MVType_Extended8
运动矢量结构是VA2_Encode_MotionVectorEx8。
VA2_Encode_MVType_Extended16
运动矢量结构是VA2_Encode_MotionVectorEx16。
3.6.5 VA2_Encode_MYLayout
typedef enum{
   VA2_Encode_MVLayout_A,
   VA2_Encode_MVLayout_B,
   VA2_Encode_MVLayout_C
} VA2_Encode_MVLayout ;
描述
类型A
实际的D3D表面是由宏块索引和行索引来索引的运动矢量结构数组。
类型B
这是其中每一宏块的运动矢量的数量不是常量的压缩布局。细节待定。
类型C
3.6.6 VA2_Encode_MotionVector8
typedef struct_VA2_Encode_MotionVector8{
   INT8    x;
   INT8    y;
} VA2_Encode_MotionVector8;
成员
x
运动矢量的x坐标。
y
运动矢量的y坐标。
3.6.7 VA2_Encode_MotionVector16
typedef struct_VA2_Encode_MotionVector16{
   INT16   x;
   INT16   y;
} VA2_Encode_MotionVector16;
成员
x
运动矢量的x坐标。
y
运动矢量的y坐标。
3.6.8 VA2_Encode_MotionVectorEx8
typedef struct_VA2_Encode_MotionVectorEx8{
   INT8    x;
   INT8    y;
   UINT8   ImageIndex;
   UINT8   Distance;
} VA2_Encode_MotionVectorEx8;
成员
x
运动矢量的x坐标。
y
运动矢量的y坐标。
ImageIndex
对在对ComputeMotionVectors的调用中提供的参考图像列表的基于0的索引。
Distance
测量单位由VA_Encode_MVSurface的DistanceMetric字段指定。它测量当前宏块与实际运动矢量(x,y)所涉及的参考宏块的距离。
3.6.9 VA2_Encode_MotionVectorEx16
typedef struct_VA2_Encode_MotionVectorEx16{
   INT16   x;
   INT16   y;
   UINT16  ImageIndex;
   UINT16  Distance;
} VA2_Encode_MotionVectorEx16;
成员
x
运动矢量的x坐标。
y
运动矢量的y坐标。
ImageIndex
对在对ComputeMotionVectors的调用中提供的参考图像列表的基于0的索引。
Distance
测量单位由VA_Encode_MVSurface的DistanceMetric字段指定。它测量当前宏块与实际运动矢量(x,y)所涉及的参考宏块的距离。
3.7  数据结构:残差
残差表面是两字节长的有符号整数值的数组-换言之,其类型为INT16。该方案看似在所有重要的情况下都是恰当的。例如,MPEG-2处理9位残差值,而H.264处理12位残差。并且,如果原始数据是YUV2,则每一亮度值占据一字节,且因此残差使用9位(0-255=-255)。此外,应用DCT类型的变换将数据要求增加到每一残差值11位。所有这些情况都通过使用2字节的长整型有符号残差值来适当地处理。
残差表面的宽度是一行中的残差值的数量。例如,具有4:2:2的采样的640x480逐行图像每行具有640个亮度值和320个色度值。相关联的亮度表面的大小是640x480x2,而色度表面的大小是320x480x2字节。
残差表面是使用D3DFMT_RESIDUE16格式标志和VA2_EncodeBuffer资源类型来创建的。
3.7.1亮度平面
图10示出了指示亮度表面的宽度匹配原始的YCbCr图像的示例性图示。例如,一个640x480的图像每行具有480个亮度值,因此亮度表面的宽度是480。因此,亮度表面的大小是640x480x2字节。
平面=VA2_Encode_Residue_Y
采样=VA2_Encode_SamplingType_*
3.7.2色度4:2:2
图11示出了根据一个实施例的指示视频的每行的残差值的数量是原始视频图像的宽度的一半的示例性图示。因此,对于640x480的图像,每行的残差值的数量以及因此的表面宽度是320。
平面=VA2_Encode_Residue_U或VA2_Encode_Residue_V
采样=VA2_Encode_SamplingType_422
3.7.3色度4:2:0
在此情形中,残差表面的宽度是原始逐行帧的宽度的一半,并且高度也是一半。因此,对于640x480的图像,色度表面本身将是320宽240长。
平面=VA2_Encode_Residue_U或VA2_Encode_Residue_V
采样=VA2_Encode_SamplingType_420
4示例性DDI文档
扩展设备是由VA接口提供的通过(pass-through)机制,以添加除了现有的视频解码器和视频处理器功能之外的新功能。例如,它们将用于支持新的视频编码器功能。
扩展设备类似于应用程序可用于向驱动程序发送数据/从驱动程序接收数据的非类型化漏斗来工作。数据的含义对于VA栈是未知的,并且由驱动程序基于CreateExtensionDevice调用的pGuid参数和ExtensionExecute的Function参数来解释。
VA编码器使用以下GUID值(与IVideoEncoder的uuid相同):
{7AC3D93D-41FC-4c6c-A1CB-A875E4F57CA4}
DEFINE_GUID(VA_Encoder_Extension,0x7ac3d93d,0x41fc,0x4c6c,0xa1,0xcb,0xa8,0x75,0xe4,0xf5,
0x7c,0xa4);
4.1  枚举和能力
扩展设备使用其类型参数被设为GETEXTENSIONGUIDCOUNT或GETEXTENSIONGUIDS的FND3DDDI_GETCAPS来枚举。编解码器应用程序在由GETEXTENSIONGUIDS返回的扩展guid列表中查找VA_Encoder_Extension以确定VA编码支持是否可用。
4.1.1  FND3DDDI_GETCAPS
typedef HRESULT
(APIENTRY*PFND3DDDI_GETCAPS)
(
    HANDLE hAdapter,
    CONST D3DDDIARG_GETCAPS*
);
当查询扩展设备(编码器设备)的能力时,使用具有以下结构的GETEXTENSIONCAPS作为D3DDDIARG_GETCAPS结构中的pInfo。
4.1.2 VADDI_QUERYEXTENSIONCAPSINPUT
typedef struct_VADDI_QUERYEXTENSIONCAPSINPUT
{
   CONST GUID*          pGuid;
   UINT                 CapType;
   VADDI_PRIVATEDATA*   pPrivate;
} VADDI_QUERYEXTENSIONCAPSINPUT;
VADDI_QUERYEXTENSIONCAPSINPUT的pGuid参数被设为VA_Encoder_Extension。
#define VADDI_Encode_Captype_Guids            VADDI_EXTENSION_CAPTYPE_MIN
#define VADDI_Encode_Captype_DistanceMetrics  VADDI_EXTENSION_CAPTYPE_MIN+1
#define VADDI_Encode_Captype_SearchProfiles   VADDI_EXTENSION_CAPTYPE_MIN+2
#define VADDI_Encode_Captype_MECaps           VADDI_EXTENSION_CAPTYPE_MIN+3
GETEXTENSIONCAPS的输出在D3DDDIARG_GETCAPS的pData参数中封装。pData参数如下解释:
·Captype_Guids:Type=(GUID*).DataSize=sizeof(GUID)*
guid_count
·Captype_DistanceMetrics:Type=(GUID*).DataSize=sizeof(GUID)*
guid_count.
·Captype_SearchProfiles:Type=(VADDI_Encode_SearchProfile*).
DataSize=sizeof(VADDI_Encode_SearchProfile).
·Captype_MECaps:Type=(VADDI_Encode_MECaps).DataSize=
sizeof(VADDI_Encode_MECaps).
4.1.3 D3DDDIARG_CREATEEXTENSIONDEVICE
实际创建经由D3DDDI_CREATEEXTENSIONDEVICE调用发生,其主自变量如下示出:
typedef struct_D3DDDIARG_CREATEEXTENSIONDEVICE
{
   CONST GUID*           pGuid;
   VADDI_PRIVATEDATA*    pPrivate;
   HANDLE                 hExtension;
} D3DDDIARG_CREATEEXTENSIONDEVICE;
4.2  编码功能
实际扩展单元功能经由D3DDDI_EXTENSIONEXECUTE调用来调用。扩展单元的实例已经与一GUID相关联,因此扩展单元的类型在作出执行调用时已经是已知的。唯一的附加参数是指示要执行的特定操作的Function。例如,类型为Encoder(编码器)的扩展设备可支持MotionEstimation(运动估计)作为其功能之一。通常,扩展设备具有其自己的枚举扩展设备的能力的GetCaps函数。
typedef struct_D3DDDIARG_EXTENSIONEXECUTE
{
   HANDLE                  hExtension;
   UINT                    Function;
   VADDI_PRIVATEDATA*     pPrivateInput;
   VADDI_PRIVATEDATA*     pPrivateOutput;
   UINT                    NumBuffers;
   VADDI_PRIVATEBUFFER*    pBuffers;
} D3DDDIARG_EXTENSIONEXECUTE;
pBuffers参数不被VA编码器使用,并且应被认为是一保留参数。Function参数对于VA编码器取以下值:
#define VADDI_Encode_Function_Execute  1
D3DDDIARG_EXTENSIONEXECUTE的pPrivateInput和pPrivateOutput参数用于封装Execute API调用的参数。嵌入在以下输入和输出参数中的编码专用参数尚未从API领域映射到DDI领域-但这只是重命名的事情,并且有可能能够应付单个定义。
4.2.1 VADDI_Encode_Function_Execute_Input
该参数包含对Execute API调用的输入参数。
typedef struct_VADDI_Encode_Function_Execute_Input
{
   UINT32 NumDataParameters;
   VA2_Encode_ExecuteDataParameter**pData;
   UINT32 NumConfigurationParameters;
   VA2_Encode_ExecuteconfigurationParameter**pConfiguration;
} VADDI_Encode_Function_Execute_Input;
4.2.2 VADDI_Encode_Function_Execute_Output
该结构封装了来自Execute调用的输出数据。
typedef struct_VADDI_Encode_Function_Execute_Output
{
   UINT32 NumDataParameters;
   VA2_Encode_ExecuteDataParameter**pData;
} VADDI_Encode_Function_Execute_Output;
4.3  扩展设备结构
下节描述了与VA扩展机制相关联的各种结构和函数回调。
4.3.1  VADDI_PRIVATEBUFFER
typedef struct_VADDI_PRIVATEBUFFER
{
   HANDLE             hResource;
   UINT               SubResourceIndex;
   UINT               DataOffset;
   UINT               DataSize;
} VADDI_PRIVATEBUFFER;
typedef struct_VADDI_PRIVATEDATA
{
   VOID*        pData;
   UINT          DataSize;
} VADDI_PRIVATEDATA;
4.3.2 D3DDDIARG_EXTENSIONEXECUTE
typedef struct_D3DDDIARG_EXTENSIONEXECUTE
{
   HANDLE                  hExtension;
   UINT                    Function;
   VADDI_PRIVATEDATA*      pPrivateInput;
   VADDI_PRIVATEDATA*      pPrivateOutput;
   UINT                    NumBuffers;
   VADDI_PRIVATEBUFFER*    pBuffers;
} D3DDDIARG_EXTENSIONEXECUTE;
typedef HRESULT
 (APIENTRY*PFND3DDDI_CREATEEXTENSIONDEVICE)
(
    HANDLE hDevice,
    D3DDDIARG_CREATEEXTENSIONDEVICE*
);
hDeVice参数涉及D3D9设备,并且是使用对D3DDDI_CREATEDEVICE的调用来创建的。
4.3.3 FND3DDDI_DESTROYEXTENSIONDEVICE
typedef HRESULT
(APIENTRY*PFND3DDDI_DESTROYEXTENSIONDEVICE)
(
    HANDLE hDevice,
    HANDLE hExtension
);
4.3.4 FND3DDDI_EXTENSIONEXECUTE
typedef  HRESULT
(APIENTRY*PFND3DDDI_EXTENSIONEXECUTE)
(
    HANDLE hDevice,
    CONST D3DDDIARG_EXTENSIONEXECUTE*
);
4.3.5 D3DDDI_DEVICEFUNCS
typedef struct_D3DDDI_DEVICEFUNCS
{
   PFND3DDDI_CREATEEXTENSIONDEVICE    pfnCreateExtensionDevice;
   PFND3DDDI_DESTROYEXTENSIONDEVICE   pfnDestroyExtensionDevice;
   PFND3DDDI_EXTENSIONEXECUTE        pfnExtensionExecute;
} D3DDDI_DEVICEFUNCS;
4.4 D3D9结构和函数
以下D3D结构和回调表示了获得扩展设备的能力的通用D3D机制。
typedef enum_D3DDDICAPS_TYPE
{
   D3DDDICAPS_GETEXTENSIONGUIDCOUNT    =31,
   D3DDDICAPS_GETEXTENSIONGUIDS        =32,
   D3DDDICAPS_GETEXTENSIONCAPS         =33,
} D3DDDICAPS_TYPE;
typedef struct_D3DDDIARG_GETCAPS
{
   D3DDDICAPS_TYPE   Type;
   VOID*          pInfo;
   VOID*          pData;
   UINT            DataSize;
} D3DDDIARG_GETCAPS;
5示例性编程模型
5.1  流水线效率
为了实现最大效率,编码器应用程序以使得CPU以及图形硬件两者都被完全利用的方式来结构化。由此,尽管运动估计对于某一帧是正在进行中,但是在一不同的帧上运行量化步骤可能是有益的。
获得完全硬件利用是用多线程编码器来促进的。
5.1.1示例:单个运动矢量(流水线满)
以下2线程应用程序(伪代码)示出了编码器实现2阶段软件流水线的一种方式,并提供了关于如何高效地使用VA编码接口的某些方针。特别地,如在软件线程中所见到的,它实施了k=AllocatorSize的缓冲。这解决了在提交硬件请求时存在异步性的事实:硬件线程提交请求,同时软件线程稍后拾取该结果并处理它们。
HardwareThread( )
{
     while(Streaming)
     {
        LoadFrame(ppInputBuffer[n]);
        codec->ProcessInput(ppInputBuffer[n]);//阻塞GetBuffer+Execute
     }
}
SoftwareThread()
{
   k=AllocatorSize();
   while(Streaming)
   {
     //k表示流水线阶段之间的缓冲区
     Codec->ProcessOutput(ppOutputBuffer[n-k]);//等待,ReleaseBuffer
     VLE();
     Bitstream();
   }
}
以上的ProcessInput(进程输入)可被认为是Execute和GetBuffer外部的包装,而ProcessOutput(进程输出)可被认为是执行事件上的Wait(等待)以及之后的适当ReleaseBuffer调用外部的包装。
并不清楚如何确定表示流水线阶段之间的缓冲区的参数k。它表示分配符大小,并且作为一个起始点,可以使用在编解码器和VA编码器对象之间的分配符协商中使用的同一值(队列长度)。如果k大于分配符大小,则ProcessInput调用很可能甚至在使用k个缓冲区之前无论如何都阻塞。
应用程序的目标应是最大化花费在SoftwareThread(软件线程)中的时间而在ProcessOutput上没有阻塞。换言之,应用程序大多数时间应在VLE()和Bitstream()函数上工作。如果硬件非常慢,则尽管分配符大小为“k”,ProcessOutput()也将阻塞。软件将始终“在前面”。以上流水线仅在硬件处理缓冲区花费的时间与软件运行VLE和Bitstream花费的时间相同的意义上才是高效的。“k”个缓冲所实现的全部是填充抖动。
以下代码段示出了GetBuffer和ReleaseBuffer的粗略实现。
IVideoEncoder::GetBuffer(Type,ppBuffer,Blocking)
{
   if(Empty)
   {
     if(Blocking)Wait(NotEmptyEvent);
     else return STATUS_EMPTY;
   }
   *ppBuffer=pQueue[Type][Head];
   Head++;
   if(Head==Tail)
   ( 
     Empty=1;
     ResetEvent(NotEmptyEvent);
   }
   return S_OK;
}
IVideoEncoder::ReleaseBuffer(Type,pBuffer)
{
   if((Tail==Head)&&!Empty)return STATUS_FULL;
   pQueue[Type][Tail]=pBuffer;
   Tail++;
   if(Empty)
   {
     Empty=false;
     SetEvent(NotEmptyEvent);
   }
   return S_OK;
}
以下略述了ProcessInput和ProcessOutput的编解码器实现:
//本实现不像普通语义,是阻塞的
Codec::ProcessInput(IMediaBuffer pInput)
{
   GetBuffer(TypeUncompressed,pYUVBuffer,true);
   GetBuffer(TypeMotionVector,pMVBuffer,true);
   GetBuffer(TypeResidues,pResidueBuffer,true);
   memcpy(pYUVBuffer,pInput.Image);
   Execute(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent);
   CodecQueue.Enqueue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent);
}
Codec::ProcessOutput(IMediaBuffer pOutput)
{
   if(CodecQueue.Empty())
   {
     pOutput.dwFlags=DMO_OUTPUT_DATABUFFERF_INCOMPLETE;
     return S_FALSE;
   }
   CodecQueue.Dequeue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent);
   Wait(pEvent);
   memcpy(pOutput.MVBuffer,pMVBuffer);
   memcpy(pOutput.ResidueBuffer,pResidueBuffer);
   ReleaseBuffer(TypeUncompressed,pYUVBuffer);
   ReleaseBuffer(TypeMotionVector,pMVBuffer);
   ReleaseBuffer(TypeResidues,pResidueBuffer);
   return S_OK;
}
此处是Codec::ProcessInput的一个替换实现,它如普通语义一样是非阻塞的。
Codec::ProcessInput(IMediaBuffer pInput)
{
   if(GetBuffer(TypeUncompressed,pYUVBuffer,false)==STATUS_EMPTY)
   {
     return DMO_E_NOTACCEPTING;
   }
   if(GetBuffer(TypeMotionVector,pMVBuffer,false)==STATUS_EMPTY)
   {
     return DMO_E_NOTACCEPTING;
   }
   if(GetBuffer(TypeResidues,pResidueBuffer,false)==STATUS_EMPTY)
    {
        return DMO_E_NOTACCEPTING;
    }
    memcpy(pYUVBuffer,pInput.Image);
    Execute(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent);
    CodecQueue.Enqueue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent);
}
5.2.1示例:多个运动矢量
在本节中,观察其中编码器向硬件请求多个运动矢量并且基于各种参数选择其中一个并重新提交它们以便处理的更复杂的流水线。以下代码单纯地如上一样继续使用2阶段流水线,请求多个运动矢量并重新提交最佳的那一个。在此实现中涉及固有串行化。
HardwareThread()
{
   while(Streaming)
   {
      LoadFrame(ppInputBuffer[n]);
      ProcessInput(ppInputBuffer[n]);
      ProcessOutput(ppOutputBuffer[n]);
      SelectMV(ppOutputBuffer[n],ppOutputBuffer2[n]);
      ProcessInput2(ppOutputBuffer2[n]);
      n++;
   }
}
SoftwareThread()
{
   while(Streaming)
   {
      ProcessOutput2(ppOutputBuffer2[n-k]);
      VLE(ppOutputBuffer2[n-k]);
      Bitstream(ppOutputBuffer2[n-k]);
   }
}
在以上示例中,软件将有一半时间在ProcessOutput和ProcessOutput2上阻塞,这很明显是不利于流水线效率的。另一方面,CPU利用是相当低的,并且总吞吐量仍要高于非加速编码。基于3个线程的3阶段流水线将如下解决串行化问题:
HardwareThreadl()
{
   while(Streaming)
   {
      LoadFrame(ppInputBuffer[n]);
      ProcessInput(ppInputBuffer[n]);
   }
}
HardwareThread2()
{
   while(Streaming)
   {
      ProcessOutput(ppOutputBuffer[n-k1]);
      SelectMV(ppOutputBuffer[n-k1],ppOutputBuffer2[n-k1]);
      ProcessInput2(ppOutputBuffer2[n-k1]);
    }
}
SoftwareThread()
{
   while(Streaming)
   {
      ProcessOutput2(ppOutputBuffer2[n-k1-k2]);
      VLE(ppOutputBuffer2[n-k1-k2]);
      Bitstream(ppOutputBuffer2[n- k1-k2]);
    }
}
由于有3个流水线阶段,因此添加了附加的缓冲区以便在两个硬件阶段之间填充。因此有两个值k1和k2。

Claims (20)

1.一种用于视频编码加速服务的、至少部分地由计算设备实现的方法,所述方法包括:
由所述视频编码加速服务从视频编码器接收一个或多个查询以标识加速硬件的实现细节;
响应于接收所述一个或多个查询,所述视频编码加速服务:
与所述加速硬件接口以获得所述实现细节;
响应于接收所述实现细节,将所述实现细节传送到所述视频编码器;以及
其中,所述实现细节使得所述视频编码器在运行时能够:
(a)确定是否能用一个或多个支持的编码流水线配置和能力的特定编码流水线的实现来提高与所述视频编码器相关联的软件编码操作的速度和质量中的一个或多个;以及
(b)通过与所述视频编码加速服务接口来实现所述特定编码流水线。
2.如权利要求1所述的方法,其特征在于,所述软件编码操作包括运动估计、残差计算、运动补偿和变换操作中的一个或多个。
3.如权利要求1所述的方法,其特征在于,所述软件编码操作包括降噪、图像稳定、边缘检测、锐化和帧速率转换操作中的一个或多个。
4.如权利要求1所述的方法,其特征在于,所述一个或多个查询包括获得能力查询,并且其中所接收到的实现细节包括与所述一个或多个支持的编码流水线配置相关联的信息。
5.如权利要求1所述的方法,其特征在于,所述一个或多个查询包括获得距离度量查询,并且其中所接收到的实现细节包括所述视频编码加速硬件支持的用于运动估计操作的一个或多个搜索度量的描述。
6.如权利要求1所述的方法,其特征在于,所述一个或多个查询包括获得搜索简档查询,并且其中所接收到的实现细节包括所述视频编码加速硬件支持的一个或多个搜索简档的描述,所述一个或多个搜索简档允许所述视频编码器评估视频编码处理时间和视频编码质量度量之间的特定于实现的折衷。
7.如权利要求1所述的方法,其特征在于,所述一个或多个查询包括获得运动估计能力查询,并且其中,所接收到的实现细节包括指示最大支持图像大小、最大支持搜索窗大小和加速硬件是否支持可变宏块大小的指示中的一个或多个的数据。
8.如权利要求1所述的方法,其特征在于,还包括:
由所述视频编码加速服务接收包括一组配置参数的请求以创建实现所述特定编码流水线的编码器对象;以及
响应于接收到所述请求,基于所述配置参数来创建所述编码器对象,所述编码器对象用于使用所述特定编码流水线来对已解码的源视频数据进行编码。
9.如权利要求8所述的方法,其特征在于,所述配置参数指定所述特定编码流水线、已编码视频的输出格式、用于与所述特定编码流水线相关联的多个I/O数据流的数量、用于内插亮度和色度值的静态配置特性、用于所述I/O数据流的建议的数据缓冲区数量、以及基于可用资源的设备驱动程序指定的队列大小中的一个或多个。
10.如权利要求1所述的方法,其特征在于,还包括:
由所述视频编码加速服务从所述视频编码器接收执行请求和一组参数,所述执行请求对应于与所述特定编码流水线相关联的操作以对已解码的源视频数据进行编码;
响应于接收到所述执行请求,所述视频编码加速服务:
将所述执行请求和所述参数传送到所述加速硬件;
从所述加速硬件接收与所传送的执行请求相关联的响应;以及
将所述响应转发给所述视频编码器。
11.一种用于视频编码加速服务的、至少部分地由计算设备实现的方法,所述方法包括:
由视频编码器程序模块将一个或多个请求传送到视频编码加速服务以标识加速硬件支持的视频编码流水线配置和能力中的一个或多个的能力;
响应于从所述视频编码加速服务接收到所述能力,所述视频编码器:
基于所述能力标识与所述视频编码器相关联的、在由所述加速硬件实现的情况下将在速度和质量中的一个或多个上获益的一个或多个视频编码操作;
由所述视频编码器请求所述视频编码加速服务创建定制视频编码流水线,用于经由所述加速硬件来实现所述一个或多个视频编码操作,使得任何其余的视频编码操作以软件来实现。
12.如权利要求11所述的方法,其特征在于,所述一个或多个视频编码操作包括运动估计、残差计算、运动补偿和变换操作中的一个或多个。
13.如权利要求11所述的方法,其特征在于,所述一个或多个视频编码操作包括降噪、图像稳定、边缘检测、锐化和帧速率转换操作中的一个或多个。
14.如权利要求11所述的方法,其特征在于,所述方法还包括用于指示所述视频编码加速服务创建所述定制视频编码流水线,使得系统存储器和图形设备存储器之间的数据流最小化。
15.如权利要求11所述的方法,其特征在于,还包括:
由所述视频编码器接收已编码或已解码的源视频数据;以及
如果所接收的源视频数据是已编码的,则由所述视频编码器至少部分地解码所述源视频数据以生成已解码的源视频数据以便由所述视频编码加速服务创建的编码对象来编码,所述编码对象实现所述定制视频编码流水线。
16.如权利要求11所述的方法,其特征在于,所述方法还包括用于使用所述定制视频编码流水线来编码已解码的源视频数据。
17.一种计算设备,包括:
供视频编码加速服务执行以下动作的接口装置:
从视频编码器接收一个或多个查询,所述一个或多个查询请求所述视频编码加速服务标识加速硬件的实现细节,所述实现细节用于使得所述视频编码器能够:(a)确定是否能用一个或多个支持的编码流水线配置和能力的特定编码流水线的实现来提高与所述视频编码器相关联的软件编码操作的速度和质量中的一个或多个;以及(b)经由所述视频编码加速服务实现所述特定编码流水线以对已解码的源视频数据进行编码;
查询所述加速硬件以获得所述实现细节;以及
将从所述加速硬件接收到的实现细节传送到所述视频编码器。
18.如权利要求17所述的计算设备,其特征在于,所述软件编码操作包括运动估计、残差计算、运动补偿和变换操作中的一个或多个。
19.如权利要求17所述的计算设备,其特征在于,所述软件编码操作包括降噪、图像稳定、边缘检测、锐化、和帧速率转换操作中的一个或多个。
20.如权利要求17所述的计算设备,其特征在于,所述接口装置还包括供所述视频编码加速服务执行以下动作的装置:
从所述视频编码器接收创建编码器对象请求以创建实现所述特定编码流水线的编码器对象;
从所述视频编码器接收一个或多个执行请求以在所述加速硬件中实现与所述特定编码流水线相关联的操作;以及
将与所述一个或多个执行请求相关联的信息转发到所述加速硬件以对所述已解码的源视频数据进行编码。
CN2007800065644A 2006-02-24 2007-02-21 加速视频编码 Active CN101390397B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US11/276,336 2006-02-24
US11/276,336 US7929599B2 (en) 2006-02-24 2006-02-24 Accelerated video encoding
US11/673,423 2007-02-09
US11/673,423 US8654842B2 (en) 2006-02-24 2007-02-09 Accelerated video encoding
PCT/US2007/004638 WO2007100616A1 (en) 2006-02-24 2007-02-21 Accelerated video encoding

Publications (2)

Publication Number Publication Date
CN101390397A CN101390397A (zh) 2009-03-18
CN101390397B true CN101390397B (zh) 2010-09-15

Family

ID=38443961

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2007800065644A Active CN101390397B (zh) 2006-02-24 2007-02-21 加速视频编码

Country Status (7)

Country Link
US (2) US7929599B2 (zh)
EP (1) EP1987674A4 (zh)
JP (1) JP5420254B2 (zh)
KR (1) KR101183429B1 (zh)
CN (1) CN101390397B (zh)
BR (1) BRPI0708265B1 (zh)
WO (1) WO2007100616A1 (zh)

Families Citing this family (59)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7725745B2 (en) * 2006-12-19 2010-05-25 Intel Corporation Power aware software pipelining for hardware accelerators
US8411734B2 (en) 2007-02-06 2013-04-02 Microsoft Corporation Scalable multi-thread video decoding
US20130101023A9 (en) * 2007-03-12 2013-04-25 Vixs Systems, Inc. Video encoder with video decoder reuse and method for use therewith
US8233527B2 (en) * 2007-05-11 2012-07-31 Advanced Micro Devices, Inc. Software video transcoder with GPU acceleration
US9648325B2 (en) 2007-06-30 2017-05-09 Microsoft Technology Licensing, Llc Video decoding implementations for a graphics processing unit
US8311058B2 (en) 2008-05-10 2012-11-13 Vantrix Corporation Modular transcoding pipeline
US8677241B2 (en) 2007-09-10 2014-03-18 Vantrix Corporation Method and system for multimedia messaging service (MMS) to video adaptation
US8220051B2 (en) 2007-09-28 2012-07-10 Vantrix Corporation Generation and delivery of multimedia content-adaptation notifications
US7908632B2 (en) * 2008-01-08 2011-03-15 At&T Intellectual Property I, L.P. Method and system of diagnosing a video condition experienced at a customer premises
US8570441B2 (en) * 2008-06-11 2013-10-29 Microsoft Corporation One pass video processing and composition for high-definition video
US8320448B2 (en) * 2008-11-28 2012-11-27 Microsoft Corporation Encoder with multiple re-entry and exit points
US8180165B2 (en) * 2008-12-19 2012-05-15 Microsoft Corp. Accelerated screen codec
US8594467B2 (en) * 2008-12-19 2013-11-26 Microsoft Corporation Interactive virtual display system for ubiquitous devices
US8069446B2 (en) * 2009-04-03 2011-11-29 Microsoft Corporation Parallel programming and execution systems and techniques
US8942215B2 (en) 2010-07-15 2015-01-27 Dejero Labs Inc. System and method for transmission of data from a wireless mobile device over a multipath wireless router
US10117055B2 (en) 2009-07-08 2018-10-30 Dejero Labs Inc. System and method for providing data services on vehicles
US9756468B2 (en) 2009-07-08 2017-09-05 Dejero Labs Inc. System and method for providing data services on vehicles
US10165286B2 (en) 2009-07-08 2018-12-25 Dejero Labs Inc. System and method for automatic encoder adjustment based on transport data
US8718145B1 (en) 2009-08-24 2014-05-06 Google Inc. Relative quality score for video transcoding
US8516074B2 (en) * 2009-12-01 2013-08-20 Vantrix Corporation System and methods for efficient media delivery using cache
US8896715B2 (en) * 2010-02-11 2014-11-25 Microsoft Corporation Generic platform video image stabilization
US20110317762A1 (en) * 2010-06-29 2011-12-29 Texas Instruments Incorporated Video encoder and packetizer with improved bandwidth utilization
CA2842098C (en) * 2010-07-15 2017-01-03 Dejero Labs Inc. A system and method for transmission of data signals over a wireless network
WO2012018786A1 (en) * 2010-08-02 2012-02-09 Ncomputing Inc. System and method for efficiently streaming digital video
US8700796B2 (en) 2010-09-22 2014-04-15 Qualcomm Incorporated MAC data service enhancements
US9706214B2 (en) 2010-12-24 2017-07-11 Microsoft Technology Licensing, Llc Image and video decoding implementations
US9824426B2 (en) 2011-08-01 2017-11-21 Microsoft Technology Licensing, Llc Reduced latency video stabilization
US8731067B2 (en) 2011-08-31 2014-05-20 Microsoft Corporation Memory management for video decoding
US9819949B2 (en) 2011-12-16 2017-11-14 Microsoft Technology Licensing, Llc Hardware-accelerated decoding of scalable video bitstreams
US20150022536A1 (en) * 2012-01-05 2015-01-22 Google Inc. Heirarchy and hint based rendering pipeline selection
US20130208786A1 (en) * 2012-02-15 2013-08-15 Wei Xiong Content Adaptive Video Processing
US8861877B2 (en) * 2012-07-19 2014-10-14 Omnivision Technologies, Inc. System and method for improving decoder performance by using multiple decoding channels
US9112922B2 (en) 2012-08-28 2015-08-18 Vantrix Corporation Method and system for self-tuning cache management
US10699361B2 (en) * 2012-11-21 2020-06-30 Ati Technologies Ulc Method and apparatus for enhanced processing of three dimensional (3D) graphics data
WO2014089793A1 (zh) * 2012-12-13 2014-06-19 华为技术有限公司 一种视频重定向的方法、装置、系统及计算机可读介质
US20140205012A1 (en) * 2013-01-21 2014-07-24 Mediatek Inc. Method and apparatus using software engine and hardware engine collaborated with each other to achieve hybrid video encoding
WO2014121477A1 (zh) * 2013-02-07 2014-08-14 华为技术有限公司 一种视频重定向的方法、装置、系统及计算机可读介质
US9270999B2 (en) 2013-09-25 2016-02-23 Apple Inc. Delayed chroma processing in block processing pipelines
US9292899B2 (en) * 2013-09-25 2016-03-22 Apple Inc. Reference frame data prefetching in block processing pipelines
US9299122B2 (en) 2013-09-25 2016-03-29 Apple Inc. Neighbor context processing in block processing pipelines
US9305325B2 (en) 2013-09-25 2016-04-05 Apple Inc. Neighbor context caching in block processing pipelines
US9218639B2 (en) 2013-09-27 2015-12-22 Apple Inc. Processing order in block processing pipelines
US9571846B2 (en) 2013-09-27 2017-02-14 Apple Inc. Data storage and access in block processing pipelines
US9215472B2 (en) * 2013-09-27 2015-12-15 Apple Inc. Parallel hardware and software block processing pipelines
KR102250088B1 (ko) 2013-10-24 2021-05-10 삼성전자주식회사 비디오 스트림을 복호화하는 방법 및 장치
US9749642B2 (en) 2014-01-08 2017-08-29 Microsoft Technology Licensing, Llc Selection of motion vector precision
US9942560B2 (en) 2014-01-08 2018-04-10 Microsoft Technology Licensing, Llc Encoding screen capture data
US9774881B2 (en) 2014-01-08 2017-09-26 Microsoft Technology Licensing, Llc Representing motion vectors in an encoded bitstream
US10057590B2 (en) 2014-01-13 2018-08-21 Mediatek Inc. Method and apparatus using software engine and hardware engine collaborated with each other to achieve hybrid video encoding
CN104159113B (zh) * 2014-06-30 2018-08-10 北京奇艺世纪科技有限公司 安卓系统中视频编码方式的选择方法和装置
US9807410B2 (en) 2014-07-02 2017-10-31 Apple Inc. Late-stage mode conversions in pipelined video encoders
US10582259B2 (en) 2015-06-30 2020-03-03 Gopro, Inc. Pipelined video interface for remote controlled aerial vehicle with camera
TWI546779B (zh) 2015-11-06 2016-08-21 財團法人工業技術研究院 串流資料的編碼排程方法、裝置與電腦可讀取媒體
CN109217980B (zh) * 2017-07-03 2020-11-06 腾讯科技(深圳)有限公司 一种编解码能力配置方法、设备和计算机存储介质
CN107948683A (zh) * 2017-11-28 2018-04-20 北京潘达互娱科技有限公司 网络直播多媒体流兼容方法、网络主播端和客户端
WO2020098810A1 (en) 2018-11-17 2020-05-22 Beijing Bytedance Network Technology Co., Ltd. Merge with motion vector difference in video processing
EP3868107A4 (en) 2018-12-21 2021-12-15 Beijing Bytedance Network Technology Co. Ltd. MOTION VECTOR ACCURACY IN INTERACTING WITH MOTION VECTOR DIFFERENCE MODE
US20220279204A1 (en) * 2021-02-26 2022-09-01 Qualcomm Incorporated Efficient video encoder architecture
US11729395B2 (en) * 2021-11-26 2023-08-15 Huawei Technologies Co., Ltd. Methods and devices for extracting motion vector data from compressed video data

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4740073A (en) * 1982-12-27 1988-04-26 Meacham G B Kirby System for projecting three-dimensional images
CN1503122A (zh) * 2002-04-15 2004-06-09 简化视频再现器与图形设备驱动器之间的交互作用

Family Cites Families (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6044408A (en) 1996-04-25 2000-03-28 Microsoft Corporation Multimedia device interface for retrieving and exploiting software and hardware capabilities
US6101276A (en) * 1996-06-21 2000-08-08 Compaq Computer Corporation Method and apparatus for performing two pass quality video compression through pipelining and buffer management
US5926226A (en) * 1996-08-09 1999-07-20 U.S. Robotics Access Corp. Method for adjusting the quality of a video coder
US5805228A (en) * 1996-08-09 1998-09-08 U.S. Robotics Access Corp. Video encoder/decoder system
US5990958A (en) * 1997-06-17 1999-11-23 National Semiconductor Corporation Apparatus and method for MPEG video decompression
US6188381B1 (en) * 1997-09-08 2001-02-13 Sarnoff Corporation Modular parallel-pipelined vision system for real-time video processing
US6275527B1 (en) 1998-01-14 2001-08-14 Conexant Systems, Inc. Pre-quantization in motion compensated video coding
US6252905B1 (en) * 1998-02-05 2001-06-26 International Business Machines Corporation Real-time evaluation of compressed picture quality within a digital video encoder
US6434196B1 (en) * 1998-04-03 2002-08-13 Sarnoff Corporation Method and apparatus for encoding video information
US6128026A (en) 1998-05-04 2000-10-03 S3 Incorporated Double buffered graphics and video accelerator having a write blocking memory interface and method of doing the same
SG82613A1 (en) 1999-05-21 2001-08-21 Inst Of Microelectronics Dynamic load-balancing between two processing means for real-time video encoding
US7072398B2 (en) * 2000-12-06 2006-07-04 Kai-Kuang Ma System and method for motion vector generation and analysis of digital video clips
US6891893B2 (en) 2000-04-21 2005-05-10 Microsoft Corp. Extensible multimedia application program interface and related methods
TW540248B (en) 2000-07-19 2003-07-01 Koninkl Philips Electronics Nv Method and device for generating a multiplexed MPEG signal
WO2002019095A2 (en) 2000-08-29 2002-03-07 Koninklijke Philips Electronics N.V. Method of running an algorithm and a scalable programmable processing device
US20030052909A1 (en) 2001-06-25 2003-03-20 Arcsoft, Inc. Real-time rendering of edited video stream
FI110909B (fi) * 2001-09-06 2003-04-15 Nokia Corp Menetelmä liike-estimoinnin suorittamiseksi videokoodauksessa, videokoodausjärjestelmä sekä videokoodauslaite
KR100846769B1 (ko) 2002-02-19 2008-07-16 삼성전자주식회사 고정 연산량을 갖는 동영상 부호화 방법 및 그 장치
EP2309759A1 (en) 2002-03-18 2011-04-13 STMicroelectronics Limited Compression circuitry for generating an encoded bitstream from a plurality of video frames
US8284844B2 (en) * 2002-04-01 2012-10-09 Broadcom Corporation Video decoding system supporting multiple standards
CN100557593C (zh) * 2003-04-03 2009-11-04 Nxp股份有限公司 多流水线处理系统和结合有该系统的集成电路
KR100512140B1 (ko) 2003-05-12 2005-09-02 엘지전자 주식회사 동영상 코딩 방법
US7792806B2 (en) * 2003-06-27 2010-09-07 Microsoft Corporation Rate change
US7139002B2 (en) 2003-08-01 2006-11-21 Microsoft Corporation Bandwidth-efficient processing of video images
KR100594056B1 (ko) 2003-09-01 2006-07-03 삼성전자주식회사 효율적인 비트율 제어를 위한 h.263/mpeg 비디오인코더 및 그 제어 방법
FR2859591A1 (fr) 2003-09-08 2005-03-11 St Microelectronics Sa Dispositif et procede de traitement de donnees video et graphiques
US20050094730A1 (en) * 2003-10-20 2005-05-05 Chang Li F. Wireless device having a distinct hardware video accelerator to support video compression and decompression
US7634776B2 (en) * 2004-05-13 2009-12-15 Ittiam Systems (P) Ltd. Multi-threaded processing design in architecture with multiple co-processors
US7558428B2 (en) * 2004-09-13 2009-07-07 Microsoft Corporation Accelerated video encoding using a graphics processing unit

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4740073A (en) * 1982-12-27 1988-04-26 Meacham G B Kirby System for projecting three-dimensional images
CN1503122A (zh) * 2002-04-15 2004-06-09 简化视频再现器与图形设备驱动器之间的交互作用

Also Published As

Publication number Publication date
CN101390397A (zh) 2009-03-18
EP1987674A4 (en) 2012-08-08
KR101183429B1 (ko) 2012-09-14
WO2007100616A1 (en) 2007-09-07
JP2009527991A (ja) 2009-07-30
US8654842B2 (en) 2014-02-18
JP5420254B2 (ja) 2014-02-19
KR20080106182A (ko) 2008-12-04
US20070204318A1 (en) 2007-08-30
US20070201562A1 (en) 2007-08-30
US7929599B2 (en) 2011-04-19
EP1987674A1 (en) 2008-11-05
BRPI0708265A2 (pt) 2011-05-24
BRPI0708265B1 (pt) 2020-03-03

Similar Documents

Publication Publication Date Title
CN101390397B (zh) 加速视频编码
USRE48845E1 (en) Video decoding system supporting multiple standards
US8121191B1 (en) AVC to SVC transcoder
US9104424B2 (en) Method of operating a video decoding system
JP4344472B2 (ja) 情報ストリームデコーダへの計算リソース割当
US7506071B2 (en) Methods for managing an interactive streaming image system
JP2003204556A (ja) マルチメディア信号処理のための映像復元プロセッサ
US20040267954A1 (en) Method and system for srvicing streaming media
US10554989B2 (en) Efficient encoding of display data
Chang et al. Performance analysis and architecture evaluation of MPEG-4 video codec system
JPH0923422A (ja) 画像符号化復号化方法
EP1351512A2 (en) Video decoding system supporting multiple standards
JP2002532996A (ja) ウェブに基づく映像編集方法及びシステム
CN1798340A (zh) 转码器及其转码方法
JPH0846977A (ja) 画像圧縮回路
WO2020054060A1 (ja) 動画像符号化方法及び動画像符号化装置
EP1351513A2 (en) Method of operating a video decoding system
Nasim et al. Memory and architectural optimizations for soft video encoders
Nishi et al. A video coding control strategy based on a QOS concept of computational capability
CN102257530A (zh) 视频压缩/解压缩系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: MICROSOFT TECHNOLOGY LICENSING LLC

Free format text: FORMER OWNER: MICROSOFT CORP.

Effective date: 20150430

C41 Transfer of patent application or patent right or utility model
TR01 Transfer of patent right

Effective date of registration: 20150430

Address after: Washington State

Patentee after: Micro soft technique license Co., Ltd

Address before: Washington State

Patentee before: Microsoft Corp.