CN101072353A - 译码***以及图形处理单元 - Google Patents
译码***以及图形处理单元 Download PDFInfo
- Publication number
- CN101072353A CN101072353A CN 200710126452 CN200710126452A CN101072353A CN 101072353 A CN101072353 A CN 101072353A CN 200710126452 CN200710126452 CN 200710126452 CN 200710126452 A CN200710126452 A CN 200710126452A CN 101072353 A CN101072353 A CN 101072353A
- Authority
- CN
- China
- Prior art keywords
- mentioned
- decoding
- buffer
- instruction
- module
- 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.)
- Granted
Links
Images
Landscapes
- Image Generation (AREA)
- Image Processing (AREA)
- Compression Or Coding Systems Of Tv Signals (AREA)
Abstract
本发明提供一种译码***以及图形处理单元,其中揭露译码***以及方法的不同实施例。一***实施例包括软件可编程核心处理单元。软件可编程核心处理单元具有可变长度译码单元,用以执行着色器。着色器根据多个编码方法以选择性地执行视频串流编码的译码,以提供译码过的数据输出,其中译码的动作系使用软件以及硬件的组合来执行。本发明所述的译码***以及图形处理单元,可将指令延迟减缩到最小,在设计上具有弹性。
Description
技术领域
本发明是有关于数据处理***,特别是有关于可编程图形处理***以及方法。
背景技术
计算机图形是用计算机产生图像、影像或是其他图形或图像信息的一种技术。目前,许多的图形***是透过接口的使用而实施,例如:微软的Direct3D接口、OpenGL等,其可在执行特定操作***(例如:微软的窗口***)的计算机上对多媒体硬件(例如:图形加速器或是图形处理单元(graphics processingunit,GPU)提供控制。图像或是影像的产生一般称为描绘成像(rendering),上述操作的细节主要是经由图形加速器所实施。一般而言,在三维(three dimensional,3 D)计算机图形中,场景内物件表面(或容体)所表示的几何被转换成像素(图像元素),并储存在帧缓冲器(frame buffer)内,接着显示于显示装置上。每个物件或是物件群都有与表面外观有关的特定视觉性质(例如:材料、反射系数、形状、纹理(texture)等),其可被定义成物件或物件群的描绘成像内容(rendering context)。
计算机图形用以增加消费者对游戏及其他多媒体产品的控制性及特色的要求、产生更加真实的影像以及改善处理速度及耗能。现已发展出许多标准,可以利用较少的位数来产生较佳品质的影像。这些标准的一的H.264标准(亦为ISO动画专家群(motion picture experts group,MPEG)-4的第十部分)为高压缩数字视频编码译码(codec)标准。相较于MPEG-2编码器,H.264相容的编码译码器仅使用几乎三分之一的位数来编码视频并维持相似的视频品质。H.264规格提供两种型式的熵(entropy)编码处理,包括内容适应二进制算术编码(context-adaptive binary arithmetic coding,CABAC)以及内容适应可变长度编码(context-adaptive variable length coding,CAVLC)。
为了满足这些连续变化的需要,已提出了许多不同的纯软件或是纯硬件解决方式,然而,已知技术皆会导致较高的库存、立即淘汰的技术以及在设计上缺乏弹性。
发明内容
本发明揭露用于图形处理单元的多执行序平行计算核心的译码***以及方法。本发明提供一***,包括一软件可编程核心处理单元,具有一可变长度译码单元,用以执行一着色器,上述着色器系选择性地执行一视频串流的一译码步骤以输出一译码数据,其中上述视频串流系根据内容适应二进制算术编码(CABAC)、内容适应可变长度编码(CAVLC)、EXP-Golomb、动画专家群(MPEG-2)以及VC-1标准而得,且上述译码步骤系使用软件以及硬件的一组合而执行。
本发明提供另一***,包括一图形处理单元耦接至一主机处理器以及存储器,上述图形处理单元包括一图形处理器,具有一软件可编程核心处理单元,包括一或多个执行单元,上述一或多个执行单元包括执行单元数据路径硬件,其包括一可变长度译码单元,上述可变长度译码单元用以执行一着色器,上述着色器根据内容适应二进制算术编码、内容适应可变长度编码、EXP-Golomb、MPEG-2以及VC-1标准选择性地执行一视频串流编码的译码以提供一译码过的数据输出,其中上述视频串流系根据多个编码方法编码而得。
本发明所述的译码***以及图形处理单元,可将指令延迟(latency)减缩到最小,在设计上具有弹性。
附图说明
图1系显示图形处理器***实施例的方块图,其中可执行不同的译码***及方法;
图2系显示示范处理环境的方块图,其中可执行译码***的不同实施例;
图3系显示图2所显示的示范处理环境的选择元件方块图;
图4系显示第2、3图所显示的示范处理环境的计算核心方块图,其中可执行译码***的不同实施例;
图5A系显示图4中计算核心的执行单元的选择元件方块图,其中可执行译码***的不同实施例;
图5B系显示执行单元数据路径的方块图,其中可执行译码***的不同实施例;
图5C系显示图5B中译码***实施例的方块图,其适用于多个编码标准,以及更显示对应的位流缓冲器的实施例;
图6A系显示图5C中译码***实施例的方块图,用以进行CABAC译码;
图6B系显示图6A中译码***实施例的方块图;
图6C系显示图6A中译码***的内容存储结构及相关暂存器实施例的方块图;
图6D系显示使用图6A中译码***的宏区块划分机制;
图6E系显示使用图6A中译码***所执行的示范宏区块译码机制的方块图;
图7A系显示图5C中译码***实施例的方块图,用以进行CABAC译码;以及
图7B系显示图7A中译码***所使用的表格结构实施例的方块图。
具体实施方式
为让本发明的上述和其他目的、特征、和优点能更明显易懂,下文特举出较佳实施例,并配合所附图式,作详细说明如下。
实施例:
本发明揭露译码***以及方法的许多实施例(其中,上述***及方法将统称为译码***)。在一实施例中,译码***系内嵌于图形处理单元(graphics processing unit,GPU)的可编程、多执行序(multithread)以及平行计算核心的一或多个执行单元中。使用软件或硬件的结合以实施译码功能。即视频译码是在图形处理单元程序设计(programming)的内容(context)以及图形处理单元数据路径内的硬件实施所完成。例如,在一实施例中,译码运算或方法系由具有扩充指令集(extendedinstruction set)的着色器(shader)(例如:顶点着色器)、图形处理单元的执行单元数据路径以及用于位流缓冲器的自动管理的额外硬件所实施。相较于现有***,现有***为处理纯硬件或纯软件为主的解决方式,因此会遇到于背景技术中所提到的一些问题。
在本文所描述的译码***中,可实施使用多个熵编码技术的信息译码的编码动作。译码***可根据著名的国际电信联盟通讯标准部门(international telecommunication uniontelecommunication standardization sector,ITU-T)H.264标准的CABAC以及CAVLC进行译码,亦可根据MPEG-2以及VC-1标准进行译码。不同的译码***实施例系根据多个模式之一而操作,其中各模式系对应于先前所描述的标准的一并根据执行一或多个从图形处理单元帧缓冲存储器或对应于主机处理器的存储器(例如主机中央处理单元(central processing unit,CPU))所接收到的指令集(例如经由预先载入(preload)等已知机制或是快取失败)。可重新使用硬件以提供多种型式的译码标准(即根据所选择的模式)。再者,所选择的模式亦会对初始化、使用和/或更新内容存储器的方式造成影响。
根据译码的启动模式,译码***可使用如Exp-Golomb编码、像霍夫曼(Huffman)的编码(例如:CAVLV、MPEG-2以及VC-1)和/或算术编码(例如:CABAC)。通过延伸对应于一或多执行单元的指令集,以及提供额外的自动管理位流的硬件来执行熵译码方法,以在CAVLV译码以及CABAC译码中执行内容模型。在一实施例中,熵编码表系使用不同的存储器表格或是其他的数据结构(例如只读存储器(read only memory,ROM)表)。
此外,自动位流缓冲器具备一些优点,例如,一旦位流缓冲器的直接存储器存取(direct memory access,DMA)引擎得知位流的位置(地址),便会自动管理位流而不需要进一步的指令。相较于传统的微处理器/数字信号处理器(digital signalprocessor,DSP)***,位流管理代表了大量的间接费用。再者,透过追踪所使用的位数量,位流缓冲器机制可以侦测和处理错误的位流。
本发明译码***实施例的另一优点是将指令延迟(latency)减缩到最小。例如,因为CABAC译码是非常连续的动作且不易利用多执行序处理,因此在不同实施例中使用一种转发(forwarding)机制(例如暂存转发)以减少有效相依延迟。进一步解释,许多深管线(deep-pipeline)以及多执行序处理器的限制是无法在同一执行序(thread)中每一周期内执行指令。有些***可使用一般转发,其系通过检查先前结果的运算元(operand)地址以及指令运算元地址,当两者相同时,则使用先前结果的运算元。传统上,一般转发需要复杂的比较和多工。在译码***的部分实施例中,不管是使用先前的计算结果(例如储存在内部的暂存器)或是原始运算元的数据,将利用不同的转发型式来使用指令中的位以编码,例如:总共2位而每一运算元使用1位。通过这种方式,可以减少整体的延迟而改善处理器管线的效率。
图1系显示图形处理***100的一实施例的方块图,其中译码***以及方法的实施例于图形处理***100中实施。在部分实施例中,图形处理***100可以是计算机***。图形处理器***100可包括由显示接口单元(display interface unit,DIU)104驱动的显示装置102以及局部存储器106(例如:可包括显示缓冲器、帧缓冲器、纹理缓冲器、命令缓冲器等)。局部存储器106亦可取代为帧缓冲器或是储存单元。局部存储器106经由一或多个存储接口单元(memory interface unit,MIU)110耦接于图形处理单元114。在一实施例中,存储接口单元110、图形处理单元114以及显示接口单元104皆耦接至与高速***设备互连(peripheral component interconnect express,PCI-E)相容的总线接口单元(bus interface unit,BIU)118。在一实施例中,总线接口单元118可使用图形地址重新映射表(graphics addressremapping table,GART),然而亦可使用其他的存储映射(mapping)机制。图形处理单元114包括译码***200,其将描述于后。在部分实施例中,虽然译码***200系显示为图形处理单元114内的一个元件,译码***200亦可包括所显示的图形处理***100的一或多个额外元件或是不同元件。
总线接口单元118耦接于芯片组122(例如:北桥芯片组)或开关。芯片组122包括接口电子电路以增强来自中央处理单元126(又称主机处理器)的信号,并分离从***存储器124进出的信号以及从输入输出(I/O)装置(未显示)进出的信号。虽然提到了PCI-E总线协议,然而在部分实施例中亦可在主机处理器与图形处理单元114之间使用其他的连接和/或通讯方式,例如:PCI、专属高速总线等。***存储器124亦包括驱动软件128,其可使用中央处理单元126将指令集或命令传送至图形处理单元114内的暂存器。
在部分实施例中,可透过芯片组122使用额外的图形处理单元经由PCI-E总线协议耦接至图1中的元件。在一实施例中,图形处理单元100可包括图1所显示的所有元件,或是较少元件和/或不同于图1所显示的元件。再者,在部分实施例中,可使用额外的元件,例如耦接至芯片组122的南桥芯片组。
参考图2,图2系显示实施译码***200的一实施例的处理环境的方块图。特别是图形处理单元114包括图形处理器202。图形处理器202包括多执行单元(execution unit,EU)及计算核心204(亦称为软件可编程核心处理单元)。在一实施例中,计算核心204包括内嵌于执行单元数据路径(execution unit datapath,EUDP)的译码***200(亦称为VLD单元),其中执行单元数据路径被分配至一或多个执行单元。图形处理器202亦包括执行单元集合(execution unit pool,EUP)控制、顶点/串流快取单元206(这里称为执行单元集合控制单元206)以及具有固定功能逻辑单元(例如包含三角形设定单元(triangle set-up unit,TSU)、栅格-图块产生器(span-tile generator,STG)等)的图形管线208,其将描述于后。计算核心204包括多执行单元的集合以符合不同着色器程序的着色任务的计算要求,其中着色器程序包括顶点着色器、几何着色器和/或像素着色器处理图形管线208的数据。在一实施例中,当着色器透过计算核心204执行译码***200的功能时,图形处理器实施例的说明将被描述,接着说明译码***200的特定实施例。
译码***200可以用硬件、软件、韧体或其组合等方式而实施。在较佳实施例中,译码***200系以硬件以及软件的方式实施,其包括下列已知技术的任何技术或是结合:具有逻辑门且可对数据信号进行逻辑功能的离散逻辑电路、具有适当组合逻辑门的专用集成电路(application specific integrated circuit,ASIC)、可编程门阵列(programmable gate array,PGA)、现场可编程门阵列(field programmable gate array,FPGA)以及状态机(state machine)等。
参考图3以及图4,其分别为图形处理器202的实施例中选择元件的方块图。如前所述,译码***200的一实施例可以是具有扩充指令集以及额外硬件元件的图形处理器202内的着色器,图形处理器202的一实施例以及对应的处理将描述于后。虽然图3与图4并未显示图形处理的全部元件,但是图3与图4所显示的元件已足够使本领域技术人员理解到相关图形处理器的功能及架构。参考图3,可编程处理环境的中心为计算核心204,其包括译码***200并可处理各种指令。不同型式的着色器程序可执行或映射到计算核心204,例如顶点、几何、像素着色器程序。多重事件(multi-issue)处理器的计算核心204可以在单一时脉周期内处理多个指令。
参考图3,图形处理器202的相关元件包括计算核心204、纹理过滤(filtering)单元302、像素包装器(packer)304、命令流处理器306、写回单元308以及纹理地址产生器310。图3亦包括执行单元集合控制单元206,其中执行单元集合控制单元206亦包括顶点快取存储器和/或串流(stream)快取存储器。举例来说,如图3所显示,纹理过滤单元302提供纹素(texel)数据给计算核心204(输入A以及输入B)。在部分实施例中,纹素数据为512位数据。
像素包装器304提供像素着色输入给计算核心204(输入C以及输入D),像素着色输入亦为512位数据格式。此外,像素包装器304向执行单元集合控制单元206请求像素着色任务,而执行单元集合控制单元206便会提供指定执行单元号码及执行绪号码给像素包装器304。像素包装器304及纹理过滤单元302为已知的技术,因此将不再进一步描述于此。虽然图3所显示的像素及纹素包为512位的数据包,但是依据图形处理器202所需的效能特征,可在部分实施例中改变包的大小。
命令流处理器306提供三角形顶点索引给执行单元集合控制单元206。在图3的实施例中,索引为256位的数据。执行单元集合控制单元206组合来自串流快取存储器的顶点着色输入,并传送数据至计算核心204(输入E)。执行单元集合控制单元206亦组合几何着色输入并传送至计算核心204(输入F)。执行单元集合控制单元206亦控制执行单元输入402及执行单元输出404(图4)。换句话说,执行单元集合控制单元206控制各输入流以及各输出流至计算核心204。
经过处理之后,计算核心204提供像素着色输出(输出J1与输出J2)至写回单元308。像素着色输出包括色彩信息,例如红/绿/蓝/透明度(RGBA)信息,其为本领域技术人员所熟知。像素着色输出可以是两条512位的数据流。其他实施例亦可使用其他的位宽度。
相似于像素着色输出,计算核心204亦输出包括UVRQ信息的纹理坐标(输出K1以及输出K2)至纹理地址产生器310。纹理地址产生器310发出纹理描述符号请求至计算核心204的L2快取存储器408(输入X),而计算核心204的L2快取存储器408(输出W)会输出纹理描述符号数据至纹理地址产生器310。纹理地址产生器310及写回单元308为已知的技术,因此将不再进一步描述于此。再者,虽然URVQ及RGBA是显示为512位的数据,但是此参数亦可随不同实施例而改变。在图3的实施例中,总线分成两条512位通道,其中各通道保持四像素的128位RGBA色彩值及128位UVRQ纹理坐标。
图形管线208包括固定功能的图形处理功能。回应来自驱动软件128的命令,例如绘出三角形,则顶点信息通过计算核心204内的顶点着色逻辑单元以实施顶点转换。尤其是从物件空间转换物件成为工作空间和/或屏幕空间的三角形。三角形通过计算核心204至图形管线208的三角形设定单元,其中图形管线208结合基元(primitive),并亦执行已知的任务,例如:边界盒(bounding box)产生、拣选(culling)、边缘功能产生(edgefunction generation)以及三角形层级剔除(triangle levelrejection)。三角形设定单元传递数据至图形管线208中具有图块产生功能的栅格及图块产生单元。因此,数据物件被分割成图块(例如8×8、16×16等),并传递至其他的固定功能单元以执行深度(例如z-值)处理,例如z-值的高阶(例如:在相似的程序下,高阶使用的位数比低阶少)剔除。然后,根据所接收的纹理及管线数据,将z-值传回至计算核心204的像素着色逻辑元件以作为像素着色功能的效能。计算核心204将已处理的值输出至位于图形管线208内的目的单元。在不同快取存储器需要更新内部值之前,目的单元用以执行α测试及模板测试。
值得注意的是,计算核心204的L2快取存储器408以及执行单元集合控制单元206之间亦有512位的顶点快取存储器溢出数据的传输。此外,从计算核心204输出两个512位顶点快取存储器写入数据(输出M1及输出M2)至执行单元集合控制单元206做进一步的处理。
参考图4,图4系显示计算核心204的附加元件以及相关元件。计算核心204包括执行单元集合412。在一实施例中,执行单元集合412包括一或多个执行单元420a-420h(统称为执行单元420)。每一个执行单元420可以在一个时脉周期内处理多个指令。因此,执行单元集合412在尖峰时可同时或是大体上同时处理多个执行绪。虽然图4显示了8个执行单元420(标示为EU0-EU7),可以了解的是其并非用以限定执行单元的数量为8,在部分实施例中可增加或是减少执行单元的数量。至少一个执行单元(例如执行单元420a,EU0)包含译码***200的一实施例,其将进一步描述于后。
计算核心204亦包括存储器存取单元(memory access unit,MXU)406,其中存储器存取单元406经由存储器接口仲裁器410耦接于L2快取存储器408。L2快取存储器408从执行单元集合控制单元206接收顶点快取存储器溢出数据(输入G),并提供顶点快取存储器溢出数据(输出H)给执行单元集合控制单元206。此外,L2快取存储器408从纹理地址产生器310接收纹理描述符号请求(输入X),并对所接收到的请求提供纹理描述符号数据(输出W)给纹理地址产生器310。
存储器接口仲裁器410对局部视频存储器提供控制接口(例如:画面缓冲器或是局部存储器106)。总线接口单元118对***提供如PCI-E总线的接口。存储器接口仲裁器410以及总线接口单元118提供了存储器以及L2快取存储器408之间的接口。在部分实施例中,L2快取存储器408经由存储器存取单元406耦接至存储器接口仲裁器410与总线接口单元118。存储器存取单元406将从L2快取存储器408以及其他区块得到的虚拟存储器地址转换成实际存储器地址。
存储器接口仲裁器410对L2快取存储器408提供存储器存取(例如读出/写入存取)、指令/常数/数据/纹理的提取、直接存储器存取(例如载入/储存)、暂存存取的索引、暂存器溢出以及顶点快取存储器内容溢出等。
计算核心204更包括执行单元输入402以及执行单元输出404,并分别用于提供输入给执行单元集合412以及接收来自执行单元集合412的输出。执行单元输入402以及执行单元输出404可以是交叉开关(crossbar)或是其他总线,或是其他已知的输入与输出架构。
执行单元输入402接收来自于执行单元集合控制单元206的顶点着色输入(输入E)以及几何着色输入(输入F),并提供信息给执行单元集合412以供各执行单元420进行处理。此外,执行单元输入402接收像素着色输入(输入C与输入D)以及纹素包(输入A与输入B),并将这些包传送至执行单元集合412以供各执行单元420进行处理。再者,执行单元输入402从L2快取存储器408接收信息(L2读取),以及当需要时将这些信息提供给执行单元集合412。
在图4的实施例中,执行单元输出404被分配成偶输出404a以及奇输出404b。相似于执行单元输入402,执行单元输出404可以是交叉开关、总线或是其他已知的架构。执行单元偶输出404a处理偶执行单元420a、420c、420e以及420g的输出,而执行单元奇输出404b处理奇执行单元420b、420d、420f以及420h的输出。执行单元偶输出404a以及执行单元奇输出404b共同地接收来自于执行单元集合412的输出,例如:UVRQ以及RGBA。这些输出可回传至L2快取存储器408或是从计算核心204经由输出J1以及输出J2输出至写回单元308,或是经由输出K1及输出K2输出至纹理地址产生器310。
执行单元集合412的执行单元流程通常包括多个层级,其包括:描绘内容层级、执行绪或任务层级,以及指令或执行层级。在任一时间点,各执行单元420可准许两个描绘内容,其中通过使用一位旗标或是其他机制来识别内容。在属于这个内容的任务开始之前,从执行单元集合控制单元206传递内容信息。内容层级信息可包括着色器种类、输入/输出暂存器的数量、指令起始地址、输出映射表、顶点识别符以及个别常数缓冲器内的常数。执行单元集合412的各执行单元420可同时储存多个任务或执行绪(例如在部分实施例中有32个执行绪)。在一实施例中,各执行绪系根据程序计数器来提取指令。
执行单元集合控制单元206可作为任务的总排程,并利用数据驱动(data-driven)方法(例如:在输入内的顶点、像素以及几何包)来指派执行单元420内的适当执行绪。举例来说,执行单元集合控制单元206指派一执行绪给执行单元集合412的各执行单元420内的一空执行绪槽(slot)。当开始执行执行绪之后,由顶点快取存储器、其他元件或是模块(根据着色器种类)所提供的数据将放置在通用暂存缓冲器中。
通常,图形处理器202系使用可编程顶点、几何以及像素缓冲器。不把这些元件当成具有不同设计以及指令集的个别固定功能单元而实施这些元件的功能或是操作,而是通过具有统一指令集的执行单元420a、420b...420n的集合来执行这些操作。除了执行单元420a(其包括译码***200,因此具有额外的功能)之外,各执行单元420的设计相同并且用于编程操作。在一实施例中,各执行单元420可同时地进行多执行绪操作。当顶点着色器、几何着色器以及像素着色器产生不同的着色任务时,这些着色任务将传送至个别的执行单元420去执行。在使用顶点着色器的一实施例中,译码***200可以被实施,其具有部分修改和/或与其他执行单元420有差别。举例来说,包含译码***200的执行单元(例如:执行单元420a)与其他执行单元(例如:执行单元420b)之间的差异是执行单元420a使用一译码***200。而其他执行单元与执行单元420a不同的地方是在于一或多个对应的内部缓冲器中译码***200安排。译码***200的数据系通过连接413以及执行单元输入402从存储器存取单元406所接收。
当个别任务产生时,执行单元集合控制单元206会指派这些任务给不同执行单元420中可使用的执行绪。当任务完成时,执行单元集合控制单元206进一步管理相关执行绪的释放。就这点而言,执行单元集合控制单元206指派顶点着色器、几何着色器以及像素着色器的任务给不同执行单元420的执行绪,并记录相关的任务以及执行绪。具体地,执行单元集合控制单元206会维持全部执行单元420的执行绪以及存储器的资源表(未显示)。执行单元集合控制单元206会明确知道哪一个执行绪被指派给任务并使用、当执行绪结束后哪一个执行绪会被释放、多少共用暂存器文件存储器暂存器(register file memory register)在使用中,以及每一个执行单元有多少闲置空间可使用。
因此,当指派任务给执行单元(例如执行单元420a)时,执行单元集合控制单元206将标示此执行绪为忙碌,并将全部可使用的共用暂存器文件存储器减去各执行绪所占用的暂存器文件覆盖区(footprint)的数量。覆盖区是由顶点着色器、几何着色器及像素着色器的状态而设定或决定。再者,各着色器状态可以有不同的覆盖区大小。例如,顶点着色器执行绪可以要求10个共用暂存器文件暂存器,而像素着色器执行绪可以仅要求5个共用暂存器文件暂存器。
当执行绪完成其被指派的工作时,执行该执行绪的执行单元420会发出信号给执行单元集合控制单元206。接着,执行单元集合控制单元206会更新资源表以标注该执行绪未使用,并将全部执行绪共用暂存器文件空间的数量加回至可用空间。当所有的执行绪都是忙碌或是所有的共用暂存器文件存储器都被分配时(或是剩下的暂存器空间太小而无法容纳额外的执行绪时),执行单元420被视为已全满,以及执行单元集合控制单元206将不会指派任何额外或是新的执行绪给该执行单元。
在各执行单元420内部亦有一个执行绪控制器以负责管理或标示各执行绪为使用中(例如执行中)或是可使用。就这点而言,至少在一实施例中,当顶点着色器正在执行译码***200的功能时,执行单元集合控制单元206可以避免几何着色器以及像素着色器在同一时间被执行。
图5A系显示具有前述图形处理器202以及计算核心204特征的执行单元420a,其包括内嵌译码***200的执行单元数据路径512。具体来说,图5A是执行单元420a的方块图。在一实施例中,执行单元420a包括指令快取存储器控制器504、耦接于指令快取存储器控制器504的执行绪控制器506、缓冲器508(例如:常数缓冲器)、共用暂存器文件(common register file,CRF)510、耦接于执行绪控制器506和缓冲器508以及共用暂存器文件510的执行单元数据路径(EU data path,EUDP)512、执行单元数据路径先进先出缓冲器(first in first out,FIFO)514、述词暂存器文件(predicate register file,PRF)516、纯量暂存器文件(scalar register file,SRF)518、数据输出控制器520以及执行绪任务接口524。如前所述,执行单元420从执行单元输入402接收输入,并提供输出给执行单元输出404。
执行绪控制器506提供执行单元420a的控制功能,其包括管理各执行绪的功能以及判断功能,例如决定如何执行执行绪。执行单元数据路径512包括译码***200,将进一步描述于后,其通常包括执行不同计算的功能,并包含像是浮点以及整数计算逻辑单元(arithmetic logic unit,ALU)、移位逻辑功能等的逻辑电路。
数据输出控制器520将已完成的数据移至耦接于执行单元输出404的某些元件,例如执行单元集合控制单元206的顶点快取存储器、写回单元308等。执行单元数据路径512传送“任务结束”的信息给数据输出控制器520,并告知任务已完成。数据输出控制器520包含储存器以储存完成的任务(例如32项目(entry))以及多个写入端口。数据输出控制器520从储存器选择任务,并通过着色描绘内容所指定的暂存器位置,从共用暂存器文件510读取所有的输出数据项目,并将数据发送至执行单元输出404。
执行绪任务接口524送出执行单元420a完成的任务识别符给执行单元集合控制单元206。任务识别符会通知执行单元集合控制单元206以指派新任务给一特定执行单元(例如:执行单元420a)。
在一实施例中,缓冲器508可分成16个区块,其中各区块有16槽,而每一槽有128位的水平向量常数。着色器使用运算元以及索引以存取常数缓冲器槽。举例来说,索引可以是包括32位不具正负号的整数或是接近32位不具正负号的常数的暂时暂存器。
指令快取存储器控制器504是连接到执行绪控制器506的接口区块。当执行绪控制器读取请求存在时(例如从指令存储器提取可执行着色器码),指令快取存储器控制器504较佳地通过查找标签表(未显示)以执行命中/未命中(hit/miss)测试。举例来说,当请求的指令是位于指令快取存储器控制器504的快取存储器中时,则命中发生。当所请求的指令将从L2快取存储器408或是存储器106中提取时,则未命中发生。当命中发生时,如果没有来自执行单元输入402的请求,则指令快取存储器控制器504即可同意请求,这是因为指令快取存储器控制器504的指令快取存储器只有一个读写端口,而执行单元输入402具有最高的优先权。否则,如果未命中发生时,当快取存储器408内有可取代的区块以及有空间存在于暂停请求的执行单元数据路径先进先出缓冲器514中,指令快取存储器控制器504可同意请求。在一实施例中,指令快取存储器控制器504的快取存储器具有32组,其中每一组有4个区块。各区块带有2位状态信号以指示三种状态,其分别是无效、载入或是有效状态。在区块载入L2数据之前,区块为“无效”状态;当等候L2数据时,区块变为“载入”状态;以及当L2数据载入后,区块变为“有效”状态。
经由执行单元数据路径512可对述词暂存器文件516进行读写。执行单元输入402作为进入数据与执行单元420a的接口。在一实施例中,执行单元输入402包含一个8项目先进先出缓冲器以缓冲进入数据。执行单元输入402亦可传送数据至指令快取存储器控制器504的指令快取存储器以及常数缓冲器508。执行单元输入402亦维持着色器内容。
执行单元输出404作为从执行单元420a送出数据至执行单元集合控制单元206、L2快取存储器408以及写回单元308的接口。在一实施例中,执行单元输出404包含一个4项目先进先出缓冲器,用以接收仲裁的请求,并缓冲执行单元集合控制单元206的数据。执行单元输出404包含多种功能,其包括仲裁指令快取存储器读取请求、数据输出写入请求以及执行单元数据路径读出/写入请求的功能。
共用暂存器文件510用于储存输入、输出以及暂存数据。在一实施例中,共用暂存器文件510包括具有128×128位暂存器文件的一读一写端口和一读写端口的八个存储库(bank)。一读一写端口是由执行单元数据路径512所使用,以供由指令执行所初始的读出以及写入存取。存储库0、2、4以及6系由偶数执行绪所共用,而存储库1、3、5以及7系由奇数执行绪所共用。执行绪控制器506比对不同执行绪的指令,并确认共用暂存器文件的存储器没有读出或写入存储库的冲突。
一读写端口是由执行单元输入402以及数据输出控制器520所使用,用以载入初始执行绪输入数据并将最后执行绪输出写至执行单元集合控制单元数据缓冲器及L2快取存储器408或是其他模块。执行单元输入402以及执行单元输出404共用一个读写输入/输出端口,以及在一实施例中,写入比读出具有较高的优先权。512位的输入数据进入四个不同的存储库以避免将数据载入至共用暂存器文件510时会发生冲突。传送2位通道索引、数据以及512位对齐基准地址(aligned base address)以指定输入数据的开始存储库。举例来说,当开始通道索引为1时,假设执行绪基准存储库偏移量(offset)为0,则从最低有效位(lestsignificant bit,LSB)起算的第一个128位被载入至存储库1,下一个128位被载入至存储库2...等,以及最后一个128位被载入至存储库0。值得注意的是,使用执行绪ID的两个最低有效位来产生存储库偏移量,以随机排列每一个执行绪的开始存储库位置。
可使用共用暂存器文件暂存器索引以及执行绪ID以建立唯一的逻辑地址,使标签能比对共用暂存器文件510所写入以及读出的数据。举例来说,地址可以排成128位,即共用暂存器文件存储库的宽度。通过结合8位的共用暂存器文件暂存器索引以及5位的执行绪ID,可以建立13位的地址以产生唯一的地址。每一个1024位线具有一标签,以及每一位线有两个512位项目(字)。各字储存于4个存储库中,以及将共用暂存器文件索引的两个最低有效位加入至目前执行绪的存储库偏移量以建立存储库选择。
标签比对方法可让不同执行绪的暂存器共同使用共用暂存器文件510以有效利用存储器,因为执行单元集合控制单元206记录共用暂存器文件510的存储器使用程度,并确保对执行单元420a的新任务进行排程之前有足够的空间。
对照于目前执行绪的全部共用暂存器文件暂存器的大小以检查目标共用暂存器文件索引。在执行绪控制器506着手进行执行绪以及着色器执行开始之前,输入数据就被预期存放在共用暂存器文件510内。当执行绪执行结束后,通过数据输出控制器520从共用暂存器文件510读取输出数据。
前述执行单元420的实施例包括内含译码***200的实施例的执行单元数据路径512,图5B系显示执行单元数据路径512的一实施例。执行单元数据路径512包含暂存器文件526、多工器528、向量浮点单元532、向量整数计算逻辑单元534、特殊目的单元536、多工器538、暂存器文件540,以及译码***200。译码***200包含一或多个可变长度译码(variable lengthdecoding,VLD)单元530,其可以译码一或多个串流。例如,单一可变长度译码单元530可以译码单一串流,两个可变长度译码单元530(如虚线所显示,因简洁之故而未显示其连接关系)可以同时译码两个串流等等。为了说明,之后的叙述仅针对使用单一可变长度译码单元530的译码***200的操作,可以了解的是其原则可推衍至超过一个可变长度译码单元。
如图所示,执行单元数据路径512包含对应于可变长度译码单元530、向量浮点单元532、向量整数计算逻辑单元534以及特殊目的单元536的一些平行数据路径,其根据所接收到的指令执行对应的操作。暂存器文件526接收运算元(标示为SRC1与SRC2)。在一实施例中,暂存器文件526可对应于图5A所显示的共用暂存器文件510、述词暂存器文件516,和/或纯量暂存器文件518。值得注意的是在某些实施例中,可使用额外的运算元。操作(功能)信号线542提供各单元530-536接收运算信号的媒介(medium)。当前信号线544耦接至多工器528,传送编码成指令的当前值以供各单元530-536完成小整数值的整数运算。指令译码器(未显示)提供运算元、运算(功能)信号以及当前信号。数据路径(可包含写回阶段)末端的多工器538选择已被选择的正确数据路径的输出结果并提供输出给暂存器文件540。输出暂存器文件540包括目标元件,其可以是相同于暂存器文件526或是不同暂存器的元件。值得注意的是在实施例中,当来源以及目标暂存器包含相同元件时,指令提供的位具有由多工器所使用的来源与目标选择以多路传输数据至/来自适当暂存器文件。
因此,执行单元420a可视为多阶管线(例如4阶管线,具有4个计算逻辑单元),并在4个执行阶段中发生译码操作。需要实施延迟以允许执行译码执行绪。举例来说,当位流缓冲器发生向下溢位(underflow)、等候初始内容存储器、等候将位流载入至先进先出缓冲器以及SREG暂存器(解释于后),和/或处理时间已超过时间的既定定限(threshold)时,可以在执行阶段加入延迟。
如前所述,在部分实施例中,译码***200能使用单一执行单元420a同时译码两个位流。举例来说,根据一个扩充指令集,译码***可以使用两个数据路径(例如新增另一可变长度译码单元530)以同时进行两个串流的译码,然而可一次译码较多或较少的串流(因此会使用较多或较少的数据路径)。当需要多个串流时,译码***200的部分实施例并未限定于同时译码。再者,在部分实施例中,单一可变长度译码单元530可以执行串流的多个同时发生的译码。
在实施例中,当译码***200使用两个数据路径时,两个执行绪可以同时运行。例如,在两串流译码的实施例中,执行绪的数量限制为两个,其中指派第一执行绪(例如执行绪0)给译码***200的第一存储库(即可变长度译码单元530),而指派第二执行绪(例如执行绪1)给译码***200的第二存储库(例如图5B虚线所显示的可变长度译码单元)。在部分实施例中,两个或多个执行绪可运作在单一存储库。在部分实施例中,虽然显示译码***200是内嵌于执行单元数据路径512内,其亦可包含其他的元件,例如执行单元集合控制单元206内的逻辑电路。在下面的描述中,可变长度译码单元530以及译码***200可交换使用,而可以了解到译码***200可包括一或多个可变长度译码单元530。
将描述位于译码***200下的结构,而各单独译码***模式描述如下。特别地,在一实施例中,由驱动软件128所提出的下列指令可设定不同模式。进一步描述如下:指令INIT_CTX(设置译码***200为CABAC处理模式)、指令INIT_CAVLC(设置译码***200为CAVLC处理模式)、指令INIT_MPEG2(设置译码***200为MPEG-2处理模式),以及指令INIT_VC1(设置译码***200为VC-1/WMV9处理模式)。在部分实施例中,经由指令INIT_AVS可提供额外的初始化,其可初始化音频视频标准(audio video standard,AVS)位流编码。对EXP-Golomb***而言,在CABAC以及CAVLC编码下使用EXP-Golomb编码符号,因此指令INIT_CTX以及指令INIT_CAVLC下载EXP-Golomb***的位流。其中,不需要对EXP-Golomb***进行初始。举例来说,对要被编码的符号而言,在位流(例如在片段标头电平的位设定)所接收的计算编码旗标会显示符号为EXP-Golomb编码、CABAC编码以及CAVLC编码。当使用EXP-Golomb编码时,执行下列所提出的适当的EXP-Golomb编码指令。虽然这些模式会影响编码引擎的实施,其亦会影响初始、使用以及更新存储器的方法,进一步描述于后。
参考图5C,图5C系显示可变长度译码单元530的功能方块图,用以根据所选择的模式完成任何多个译码操作之一。可变长度译码单元530包括可变长度译码逻辑电路550,其中可变长度译码逻辑电路550耦接于由SREG串流缓冲器/DMA引擎562(于此亦称为DMA引擎模块)所组成的位流缓冲器管理以及邻近内容存储器(neighborhood context memory,NCM)564(亦称为内容存储器)。可变长度译码单元530亦包括一或多个暂存器566,其包括用以储存来自执行单元420(“CONTROL”,例如使用来自执行单元的译码器的控制信号以选择可变长度译码逻辑电路550的模块)有关给定模式的选择的译码数据的暂存器、运算元(例如“SRC1”以及“SRC2”),以及转发暂存器(例如“F1”以及“F2”)。SREG串流缓冲器/DMA引擎562包括SREG暂存器562a以及位流缓冲器562b,将进一步解释于后。
在一实施例中,可变长度译码逻辑电路550包括图5C所显示的模块(亦称为逻辑电路)。可变长度译码逻辑电路550包括硬件,其包括暂存器和/或布林或是计算逻辑电路,用以执行指令并根据所选择的模式执行译码。进一步解释,可变长度译码逻辑电路550包括读取邻近内容存储器模块(read_NCM)568、检查字串(INP STR)模块570、读取模块572、计算前导1(CLO)模块574、计算前导0(CLZ)模块576、MPEG模块578、CABAC模块580、CAVLC模块582,以及耦接于计算前导0(CLZ)模块576的Exp-Golomb模块584。计算前导0(CLZ)模块576以及计算前导1(CLO)模块574包括可译码MPEG-2以及VC-1位流的指令。关于Exp-Golomb模块584,Exp-Golomb符号由跟在1之后的一些前导零所编码,接着一些位会等于零的数量。计算前导0(CLZ)模块576侦测前导零的数量,接着移动这些位加上1以记录前导零的数量。Exp-Golomb模块584读取尾随位(trailingbit)的数量,并根据Exp-Golomb模式而执行计算以判断值。
读取邻近内容存储器模块568包括对应于产生地址以及请求存储器读取操作的逻辑电路。在存储器读取操作中,从邻近内容存储器564读取固定的位数并输出数据至目标暂存器。邻近内容存储器指令为从内容存储器564读取32位的数据并经由多工器685传回所读取的值给执行单元420a的目标暂存器。CABAC以及CAVLC编码没有使用到邻近内容存储器指令,然而对其他可变长度译码运算而言(例如:VC-1、MPEG-4 ASP(DivX)),可使用内容存储器564以维持可变长度译码表,以及可使用读取邻近内容存储器模块以读取可变长度译码表内的值。
读取模块572包含逻辑电路以读取SREG暂存器562a,且从SREG暂存器562a的最高有效位(most significant bit,MSB)部分撷取特定位数,零延伸(zero extend),并将值放入暂存器内。因此,读取模块572包含逻辑电路以执行读取操作,其读取特定位数并从SREG暂存器562a移除以传回不具正负号数值的值给目标暂存器。检查字串模块570从SREG暂存器562a读取固定位数,但没有从SREG暂存器562a移除任何位(例如不改变指标位置),并传回不具正负号数值的值给目标暂存器。
各模块568-584皆耦接至多工器586,其中多工器586根据各自的命令而选择一模式。在一实施例中,多工器586的输出提供至目标暂存器以进一步处理。模块569-582的输出亦提供至多工器586,其对应于一命令,选择模块569-582的输出并提供至SREG暂存器562a以作为输入。在个别相同的运算期间,提供来自转发、控制以及运算暂存器566的数据给CABAC模块580以及CAVLC模块582使用。经由接收控制信号(标示为图5C的EXP GOLOMB OP)以致能Exp-Golomb模块584。Exp-Golomb模块584接收来自计算前导0(CLZ)模块576的输入并提供输出至多工器586。CAB AC模块580以及CAVLC模块582可使用内容存储器564。
对除了CABAC以及CAVLC模式之外的全部模式而言,读取指令为从SREG暂存器562a读取n位,并经由多工器586传回所读取的值至执行单元420a的目标暂存器。对除了CABAC以及CAVLC模式的模式而言,使用内容存储器564以维持上方以及左方的内容值,其为自动读取以作为译码程序的部分。这些元件以及可变长度译码单元530的其他元件将结合不同模式而进一步描述于后。值的注意的是在部分实施例中,可变长度译码逻辑电路550可包括少于(或多于)全部所显示的模块和/或多工器。
将描述可变长度译码单元530的一般功能,而可变长度译码单元530配置在不同模式下的操作将进一步描述于后。
CABAC译码
下面简单解释CABAC译码,然后说明译码***200的一些实施例。通常,H.264标准的CABAC译码程序可以说明为包括解析第一语法成分的已编码位流、初始化一片段的内容变量以及第一语法成分的译码引擎,以及二进制化(binarization)。接着,对每一个二进制值(bin)进行译码,其程序包括获得内容模块以及各语法成分的二进制值的译码,直到获得有意义的字码(codeword)比对。更进一步解释,译码***200对语法成分进行译码,其中每一语法成分可以代表量子化系数、动作向量、和/或预测模式或其他有关宏区块(macroblock)的参数,用以表示影像或是视频的特定图场(field)或是帧(frame)。每一个语法成分可以包含连续的一或多个二进制符号或是二进制值,而每一个二进制符号会被译码成0或1值。译码***200根据输入二进制符号的发生机率控制输出位长度。
当某些符号(称为主要符号)比其他符号更可能发生,CABAC编码器可提供高效率编码方法。这些主要符号可用较小位/符号比例来进行编码。编码器持续更新进入数据的频率统计,并适当地调整编码演算的计算以及内容模型。具有较高可能性的二进制符号称为高可能性符号(most probable symbol,MPS),而其他符号则为低可能性符号(least probable symbol,LPS)。二进制符号与其内容模型结合,具有对应于低可能性符号的可能性以及高可能性符号值的各内容模型。
为了对各二进制符号进行译码,译码***200决定或是接收一对应范围、偏移量以及内容模型。内容模型是根据符号种类以及由邻近空间(例如目前宏区块或是属于前次译码的相邻宏区块)所决定的内容而从多个可能的内容模型中所选择。可由内容模型决定内容辨识符号,从而并使用以得到高可能性符号值以及用于译码程序的译码引擎的目前状态。范围表示一个区间(interval),每经过一次二进制译码就会缩小一次范围。
区间分为两个子范围,分别对应于高可能性符号值以及低可能性符号值。通过将范围以及已知内容模型所指定的低可能性符号可能性相乘则可计算出低可能性符号子范围。通过将范围减去低可能性符号子范围可计算出高可能性符号子范围。偏移量是决定译码二进制值的标准,且通常是从编码位流中取出前9位进行初始化。对于已知二进制符号译码及内容模型,当偏移量小于高可能性符号子范围时,二进制值为高可能性符号值,而下一次译码所使用的范围会设为高可能性符号子范围。反之,二进制值由低可能性符号决定、高可能性符号值的反向值会包含在相关的内容模型中,以及下一个范围会设为低可能性符号子范围。译码程序的结果为连续的已译码二进制值,其被评估以判断此序列是否符合有意义的字码。
概括叙述译码***200的操作与CABAC译码的关系,下列叙述提出在CABAC译码程序的内容中译码***200的各种元件,可将符合实际应用的各种变动列入考虑。熟悉本领域技术人员可知下列所使用的许多术语是出自H.264规格,为了简洁不再赘述,除非是有助于了解所述的不同程序和/或元件,才会再做进一步的说明。
图6A至图6F系显示译码***200及相关元件的具体实施例的方块图。如图所显示,译码***200具有单一CABAC单元530(在图6A至图6F,所使用的CABAC单元530可与译码***200互换),因此在实施例中,译码***200可译码单一位流。同样的原理可应用至具有额外可变长度译码单元的译码***200,可同时译码多个(例如两个)串流。简单地说,图6A系显示译码***200的选择元件的方块图,而图6B系显示图6A所显示的选择元件加上其他元件的功能方块图。图6C以及图6E系显示译码***200的内容存储器功能的方块图;以及图6D系显示使用于译码宏区块的示范机制的方块图。虽然下列叙述是有关宏区块译码的内容,但是本发明所提出的原理可应用到各种区块译码。
参考图6A,可变长度译码单元530a包括CABAC逻辑模块580以及存储器模块650。在一实施例中,CABAC逻辑模块580包含三个模块,其分别是二进制化(BIND)模块620、取得内容(GCTX)模块622以及二进制计算译码(BARD)引擎624。二进制计算译码引擎624更包含状态索引(pStateldx)暂存器602、高可能性符号值(valMPS)暂存器604、码长范围(codlRange)暂存器606,以及码长偏移量暂存器(codlOffset)608。可变长度译码单元530a更包括存储器模块650,其包括内容存储器564(亦称为宏区块邻近内容(mbNeighCtx)存储器或是内容存储器阵例)、局部暂存器612、总体暂存器614,以及SREG串流缓冲器/DMA引擎562(亦称为DMA引擎模块,将于图6C中做进一步说明),另外还有未显示的暂存器。在一实施例中,内容存储器564包含如图6C的阵列结构,之后会有更进一步的说明。存储器模块650亦包括二进制字串(binstring)暂存器616。
可变长度译码单元530a与执行单元420a的接口包括目标(DST)总线628、两个来源总线SRC1 632以及SRC2 630、共用以及执行绪信息总线634,以及延迟/重置总线636。目标总线628上的数据可以直接或间接(例如经由中间快取存储器、暂存器、缓冲器或存储器)传送至图形处理单元114内部或外部的视频处理单元。目标总线628上的数据可以是多个不同格式之一,包括微软的DX API格式或是其他格式。这些数据可包含系数、宏区块参数、动作信息,和/或IPCM采样或是其他数据。可变长度译码单元530a亦包括具有地址总线638和数据总线640的存储器接口。通过从地址总线638得到地址,存储器接口可存取位流数据以供存取数据总线640所接收的数据。在一实施例中,数据总线640上的数据可以包括未编码视频串流,其包括各种信号参数以及其他数据与格式。于部分实施例中,可以使用载入-储存操作来存取位流数据。
在开始说明可变长度译码单元530a的不同元件之前,简单说明有关CABAC译码的执行单元420a的整体操作。通常,根据片段(slice)的种类,驱动软件128(图1)准备并载入CABAC着色器至执行单元420a。CABAC着色器使用标准指令集,再加上二进制化指令、取得内容指令以及二进制计算译码指令以译码位流。因为可变长度译码单元530a使用的内容表可根据片段种类改变,其中每一片段均要载入。在一实施例中,在发出其他指令前,CABAC着色器所执行的第一个指令包含INIT_CTX指令和INIT_ADE指令。这两个指令使CABAC单元530开始译码CABAC位流,并从自动安排串流译码的指标载入位流至先进先出缓冲器,稍后将说明这两个指令。
关于解析位流,从存储器接口的数据总线640接收位流,然后由SREG串流缓冲器/DMA引擎562进行缓冲。从片段数据解析阶段提供位流译码。亦即,位流(例如:NAL位流)包括一或多张图片,其将切割成图片档头(header)以及许多片段。片段通常与连续的宏区块有关。在一实施例中,外部程序(即可变长度译码单元530a外部)解析NAL位流、译码片段档头并传送指向该片段数据(例如片段开始处)位置的指标。硬件(加上软件)可以从图形来解析H264位流。不过,在一实施例中,CABAC编码仅出现于片段数据与宏区块阶段。通常,驱动软件128从片段数据阶段处理位流,因为这是应用程序以及AP所I提供的功能。指向片段数据位置的指标还包含片段数据的第一字节(例如:RB SPbyeAddress)以及指出是位流开始或标头位置(例如:sREGptr)的位偏移量指标(例如一或多个位)。位流的初始化将于稍后解释。在某些实施例中,可以利用主机处理器(例如图1的中央处理单元126)处理外部程序以提供图片阶段译码以及片段标头译码。在部分实施例中,由于译码***200的编程特性,可以在任何阶段中进行译码。
参考图5C以及图6A,SREG串流缓冲器/DMA引擎562用以分别接收总线632以及总线630的总线SRC1值以及总线SRC2值,以及对应于转发暂存器以及控制暂存器的数据。SREG串流缓冲器/DMA引擎562包含内部位流缓冲器562b,在一实施例中可为BigEndian格式的32位暂存器以及8个128位(8×128)暂存器。经由驱动软件发出如前述的初始化指令可初始设定SREG串流缓冲器/DMA引擎562。一旦初始化,便自动管理SREG串流缓冲器/DMA引擎562的内部缓冲器562b。使用SREG串流缓冲器/DMA引擎562以保留解析位的位置。在一实施例中,SREG串流缓冲器/DMA引擎562使用两个暂存器,一快速32位触发器与一较慢512或1024位存储器。位流会使用位。SREG暂存器562a以位进行操作,而位流缓冲器562b以字节进行操作,其可以节省电源。通常,指令操作在SREG暂存器562a中,并使用少许位(例如1-3位)。当SREG暂存器562a使用超过一字节的数据时,数据(以字节片段)将从位流缓冲器562b传送给SREG暂存器562a,然后缓冲器指标会减少所传送的字节数量。当SREG串流缓冲器/DMA引擎562的DMA侦测到使用256位或是更多位时,从存储器提取256位以再填满位流缓冲器562b。因此,可变长度译码单元530a实施一个简单的循环缓冲器(256位片段×4)以记录位流缓冲器562b并提供填充。在某些实施例中,可以使用单一缓冲器,不过一个循环缓冲器需要更复杂的指标计算以跟上存储器的速度。
可以利用初始化指令来达成内部缓冲器562b的内部动作,称为INIT_BSTR指令。在一实施例中是由驱动软件128发出INIT_BSTR指令以及其他之后说明的指令。已知位流位置的字节地址及位偏移量,INIT_BSTR指令将数据载入至内部位流缓冲器562b并开始管理程序。对于每一次呼叫处理片段数据,将发出下列格式的指令:
INIT_BSTR offset,RBSPbyteAddress
发出INIT_BSTR指令以载入数据至SREG串流缓冲器/DMA引擎562的内部缓冲器562b。SRC2暂存器提供字节地址(RB SPbyteAddress),而SRC1暂存器提供位偏移量。如此,可提供下列通用的指令格式:
INIT_BSTR SRC2,SRC1
其中,这个指令中的SRC1以及SRC2以及其他对应于内部暂存器566的值非限定在这些暂存器。在一实施例中,使用256位排列的存储器提取以存取位流数据,其写入至缓冲器暂存器并传送至SREG串流缓冲器/DMA引擎562的32位SREG暂存器562a。于一实施例中,在任何其他操作针对这些暂存器或是缓冲器的操作开始之前,位流缓冲器562b内的数据是以字节方式排列。通过使用排列指令可实施数据的排列,称之为ABST指令。ABST指令排列位流缓冲器562b内的数据,其中在译码程序中,排列位(例如:填充位)最后将丢弃。
当SREG暂存器562a使用数据时,内部缓冲器562b便会填充数据。换句话说,SREG串流缓冲器/DMA引擎562的内部缓冲器562b作为以3为模(modulo)的循环缓冲器以输入SREG串流缓冲器/DMA引擎562的32位暂存器562a。CABAC模块580与读取模块572一起可使用READ指令以从SREG暂存器562a读取数据。例如,在H.264规格中,某些符号为固定长度编码,以及通过执行这些特定位数的READ指令而得到值,并零延伸至暂存器的尺寸。READ指令的格式如下:
READ DST,SRC1,
其中DST对应于输出或目标暂存器。在一实施例中,SRC1暂存器包含不具正负号的整数值n。透过READ指令,从SREG暂存器562a读取n位。当从32位暂存器562a使用了256位的数据(例如译码一或多个语法成分),自动开始提取动作以获得另一个256位的数据以写入至内部缓冲器562b的暂存器,接着进入SREG暂存器562a进行使用。
在某些实施例中,如果对应于一符号译码的SREG暂存器562a的数据已被使用了预定数量的位或字节,且内部缓冲器562b没有再接收到任何数据,则CABAC模块580可以经由延迟/重置总线636执行延迟,以便执行其他的执行绪(例如与CABAC译码程序无关的执行绪),像是顶点着色器操作。
使用SREG串流缓冲器/DMA引擎562的DMA引擎可以减少所需的全部缓冲器以补偿存储器延迟(例如,于某些图形处理单元中,会有三百多周期)。当使用了位流,可以请求流入另外的位流数据。如果位流数据太低,且位流缓冲器562b有向下溢位的风险时(例如已知周期数量,让信号从可变长度译码单元530a流至处理器管线),可传递延迟信号给处理器管线以暂停操作直到所等候的数据到达位流缓冲器562b。
此外,SREG串流缓冲器/DMA引擎562原本就有处理错误位流的能力。例如,由于位流错误,有可能会没有侦测到片段结尾标示。这种侦测错误可能会导致完全地译码错误,并且使用到后来的图样或片段的位。SREG串流缓冲器/DMA引擎562记录所使用的位数。当使用的位数大于预设的定限值(可针对每一片段改变)时,结束处理程序并送出异常的信号至处理器(例如:主机处理器)。接着,处理器执行编码以尝试从错误中恢复。
请同时参考图6A以及图6B,进一步说明可变长度译码单元530a的功能,尤其是译码引擎(例如:BARD引擎或是模块624)以及内容变量的初始化。在片段起始处且在译码对应于第一宏区块的语法成分之前,内容状态以及二进制计算译码模块624被初始化。在一实施例中,驱动软件128发出INIT_CTX指令以及INIT_ADE指令来进行初始化。
INIT_CTX指令会启动CABAC译码模式并初始化一个或多个内容表(例如远端储存或是芯片上存储器,例如ROM)。INIT_CTX指令可根据下列指令格式而执行:
INIT_CTX SRC2, SRC1
对INIT_CTX指令而言,根据位位置,运算元SRC1可具有下列一或多个关于已知H.264宏区块参数的值:cabac_init_idc、mbPerLine、constrained_intra_pred_flag、NAL_unit_type(NUT)以及MbaffFlag。需注意到constrained_intra_pred_flag、NAL_unit_type(NUT)以及MbaffFlag对应于已知H.264宏区块参数。此外,根据位位置,运算元SRC2具有下列值:SliceQPY以及mbAddrCurr。在一实施例中,进一步解释,执行INIT_CTX指令(即CABAC内容表的初始化)需要cabac_init_idc以及sliceQPY(如量子化)参数。不过,要初始化整个CABAC引擎需要三个指令,即INIT_BTSR指令、INIT_CTX指令以及INIT_ADE指令,因此,SRC1及SRC2(例如:全部64位或各32位)中的可用位可以传递其他用于CABAC邻近内容的参数。因此两个来源暂存器SRC1以及SRC2 664可以包含下列值:
SRC1[15:0]=cabac_init_idc
SRC1[23:16]=mbPerLine
SRC1[24]=constrained_intra_pred_flag
SRC1[27:25]=NAL_unit_type(NUT)
SRC1[28]=MbaffFlag
SRC1[31:29]=未定义
SRC2[15:0]=SliceQPY
SRC2[31:16]=mbAddrCurr
SliceQPY的值是用于初始化位流缓冲器562b内的状态机(未显示)。
虽然前文已讨论各种已知的图形与片段参数,另外提供一些关于可变长度译码单元530a的参数。在一实施例中,cabac_init_idc是针对未编码为I-picture和切换I-picture(SI)的片段所定义。换句话说,cabac_init_idc只能针对P、SP以及B片段而定义,以及当接收到I和SI片段时,cabac_init_idc为预设值。举例来说,当大概460个内容(例如I以及SI片段)被初始化时,可以将cabac_init_idc设为3(因为根据H.264规格,cabac_init_idc的值只能是0~2),致能2位以表示该片段为I或SI。
可变长度译码单元530a亦可使用INIT_CTX指令以初始化局部暂存器612以及宏区块邻近内容存储器564阵列结构或是元件,包括与暂存相邻宏区块有关的暂存器。参考图6C,在一实施例中,宏区块邻近内容存储器564位于图的上方。在一实施例中,宏区块邻近内容存储器564的宏区块基准邻近内容存储器排列成存储器阵列以储存有关宏区块的列(row)的数据。如图所示,宏区块邻近内容存储器564包括阵列元素mbNeighCtx[0,1,i-1,i,i+1,...119](标号为601),各元素用以储存120个宏区块中的一个宏区块至一列(例如对应于HDTV为1920×1080像素)。目前mbNeighCtxCurrent暂存器603用于储存当前译码的宏区块,而mbNeighCtxLeft暂存器605用于储存先前译码的邻近(左方)宏区块。此外,利用指标607a、607b和607c(在图6C中以箭头表示)指向暂存器603、605和阵列元素601。为了译码目前的宏区块,译码的数据储存于mbNeighCtxCurrent暂存器603。已知CABAC译码的内容本质,根据前次译码宏区块时所搜集的信息来译码目前的宏区块,亦即左方宏区块储存于左方mbNeighCtxLeft暂存器605并由指标607b所指向,而上方宏区块储存于阵列元素[i]中并由指标607c所指向。
继续解释初始化指令,INIT_CTX指令用于初始化与目前宏区块(例如宏区块邻近内容存储器564阵列的元素)相邻的宏区块有关的上方及左方指标607c及607b。例如,左方指标607b可以设为0而上方指标607c可以设为1。此外,INIT_CTX指令会更新总体暂存器614。
关于内容表的初始化,因应呼叫INIT_CTX指令,可变长度译码单元530a建立一或多个内容表,亦称为CTX_TABLE。在一实施例中,CTX_TABLE可以是4×460×16位表(8位给m,另外8位给n,具正负号的值)或是其他数据结构,内容表的每一个项目包含从状态索引暂存器602以及高可能性符号值暂存器604所存取的pStateIdx值及valMPS值。
INIT_ADE指令起始化二进制计算译码模块624,亦称为译码引擎。在一实施例中,完成INIT_BTSR指令后呼叫INIT_ADE指令。于执行INIT_ADE指令之后,可变长度译码单元530a建立两个暂存器,分别是码长范围(codlRange)暂存器606以及码长偏移量(codlOffset)暂存器608,具有下列指令或是数值:
codlRange=0x01FE 以及
codlOffset=ZeroExtend(READ(#9),#16)
如此,在一实施例中,这些变量可以是9位数值。关于codlOffset指令,9位是从位流缓冲器562b所读取,零延伸(ZeroExtend)则储存于16位码长偏移量暂存器608中。部分实施例亦可使用其他数值。二进制计算译码模块624使用储存于暂存器606及608的数值以决定要输出0或1,且当二进制译码之后,这些值将进行更新。
除了初始化码长范围暂存器606以及码长偏移量暂存器608,INIT_ADE指令操作亦初始化二进制字串暂存器616。在一实施例中,二进制字串暂存器616可以是32位暂存器,其接收来自二进制计算译码模块624的输出位。在部分实施例中可使用其他大小的暂存器。
当宏区块编码成I_PCM数据时,二进制计算译码模块624亦被初始化。已知I_PCM数据包含像素数据,根据H.264规格,其并没有将转换或预测模型应用至原始视频数据。例如,I_PCM可被使用以供无损(lossless)编码应用。
以上已描述与解析位流以及初始化各种译码***元件有关的架构以及指令,下面将描述有关二进制化、接收模型信息与内容,以及根据模型及内容译码的一或多个程序。通常,可变长度译码单元530a用于取得解析语法成分(syntax element,SE)所有可能的二进制化,或是经由二进制化模块620及BIND指令至少足够取得模型信息。可变长度译码单元530a更经由取得内容模块622及GCTX指令得到已知语法成分的内容,并根据内容及模型信息,经由二进制计算译码模块624及BARD指令实施运算译码。实际上,呼叫GCTX/BARD指令、输出一位给二进制字串暂存器616直到发现配合已知语法成分的有意义字码会构成一循环。在一实施例中,每一次译码二进制值之后,提供对应的译码位给二进制字串暂存器616,而二进制字串暂存器被读回至内容模块622,直到发现配对。
更详细解释使用单一可变长度译码单元530a的译码***架构,并同时参考图6A与图6B,经由驱动软件128所发出的BIND指令以致能二进制化模块620。于一实施例中,BIND指令具有下列格式:
BIND DST,#Imm 16,SRC1,
其中,DST对应于目标暂存器652,而#Imm 16对应16位目前数值,以及SRC1对应于输入暂存器SRC1。BIND指令操作的输入包含语法成分(包含16位目前数值Imm)以及内容区块种类(ctxBlockCat)。语法成分可以包含任何符合H.264规格的任何语法成分型式(例如:MB TypeInI、MB SkipFlagB、IntraChromaPredMode等)。呼叫BIND指令会使得驱动软件128从储存在存储器(例如:芯片上存储器或远端存储器)中的表单(或其他数据结构)读取语法成分,并取得语法成分索引(SEIdx)。语法成分索引用于存取其他表单或是数据结构以获得如下文所描述的各宏区块参数。
在一实施例中,目标暂存器652包含32位暂存器,其具有下列格式:位0-8(ctxIdxOffset)、位16-18(maxB inIdxCtx)、位21-23(ctxBlockCat)、位24-29(ctxIdxBlockCatOffset)以及位31(bypass flag)。这些数值(例如ctxIdxOffset,maxBinIdxCtx等等)会传送至取得内容模块622当作内容模型的用。在此实施例中,任何未定义的保留位可以是0。根据语法成分索引以及内容区块种类的配对结果,ctxIdxBlockOffset可经由储存于远端或芯片上存储器的表单或其他数据结构而取得。表1说明一非限定实施例的表单内容:
表1
codeNum(k) | Coded_block_pattern | |
Intra 4×4 | Inter | |
0 | 47 | 0 |
1 | 31 | 16 |
2 | 15 | 1 |
3 | 0 | 2 |
4 | 23 | 4 |
5 | 27 | 8 |
6 | 29 | 32 |
7 | 30 | 3 |
8 | 7 | 5 |
9 | 11 | 10 |
10 | 13 | 12 |
11 | 14 | 15 |
12 | 39 | 47 |
13 | 43 | 7 |
14 | 45 | 11 |
15 | 46 | 13 |
16 | 16 | 14 |
17 | 3 | 6 |
18 | 5 | 9 |
19 | 10 | 31 |
20 | 12 | 35 |
21 | 19 | 37 |
22 | 21 | 42 |
23 | 26 | 44 |
24 | 28 | 33 |
25 | 35 | 34 |
26 | 37 | 36 |
27 | 42 | 40 |
28 | 44 | 39 |
29 | 1 | 43 |
30 | 2 | 45 |
31 | 4 | 46 |
32 | 8 | 17 |
33 | 17 | 18 |
34 | 18 | 20 |
35 | 20 | 24 |
36 | 24 | 19 |
37 | 6 | 21 |
38 | 9 | 26 |
39 | 22 | 28 |
40 | 25 | 23 |
41 | 32 | 27 |
42 | 33 | 29 |
43 | 34 | 30 |
44 | 36 | 22 |
45 | 40 | 25 |
46 | 38 | 38 |
47 | 41 | 41 |
如果接收到未定义的内容区块种类,则可变长度译码单元530a可以把未定义参数当成0,使得ctxIdxBlockOffset被考虑成具有0值。
呼叫BIND指令亦会使得重置信号(Rst_Signal)从二进制化模块620输出至二进制计算译码模块624,说明如下。
为了说明二进制化模块620的各种输入与输出,这里提出根据至少一实施例的二进制化模块620的操作。呼叫二进制化模块620,则二进制化模块620撷取语法成分,并且经由软件提供已知的语法成分索引(SEIdx)。使用语法成分索引,二进制化模块620查找表单以获得maxBinIdxCtx、ctxIdxOffset以及bypassFlag的对应值。这个查找值会暂时储存在目标暂存器652的预先定义位配置。此外,使用语法成分索引以及内容区块种类,二进制化模块620进行第二次表单查找(例如:远端存储器或是芯片上存储器)以获得ctxIdxBlockOffset数值。第二次的查找值亦是暂时储存在目标暂存器652中。因此,已决定的值将用于建立目标暂存器652以作为32位数值输出目标。
对某些语法成分而言,可使用额外的信息(语法成分与内容区块种类除外)以开始H.264译码操作。例如,对像是SigCoeffFlag以及lastSigCoeffFlag的宏区块参数而言,使用储存在宏区块邻近内容存储器564的阵列元素maxBinIdxCtx[1]里的值以及输入内容区块种类值以决定宏区块是图场编码或是帧编码。在某些实施例中,即使是不同的语法成分,同样的语法成分数目也使用于这些旗标,然后使用mb_field_decoding_flag(mbNeighCtx[1]栏位)来识别。
除了上述有关二进制化模块620的功能,注意到在图6B中,二进制化模块620可结合二进制索引暂存器654、多工器单元656和/或转发暂存器F1以及F2。至于二进制索引暂存器654以及多工器单元656,多工器单元656会根据不同输入而提供输出SRC1(例如暂存器SRC1内的值)给取得内容模块622。
关于标示为F1的转发暂存器,当BIND(或GCTX)指令产生结果时,结果可被写入至目标暂存器(例如目标暂存器652和/或转发暂存器F1)。通过已知指令中的转发旗标可表示一个指令以及对应的模块(例如取得内容模块622或二进制计算译码模块624)是否使用转发暂存器F1以及F2。代表转发暂存器的符号包括F1(即使用转发来源1的值,在一实施例中可以是指令中的位26所表示)以及F2(即使用转发来源2的值,在一实施例中可以是指令中的位27所表示)。对于取得内容模块622以及二进制计算译码模块624,数据可被转发至个别的输入,说明如下。
前面已说明二进制化模块620以及相关程序,这里将说明关于取得内容模块622在GCTX指令方面如何取得已知模型的内容以及二进制索引。简单地说,取得内容模块622的输入包含maxBinIdxCtx、binIdx以及CtxIdxOffset,描述如下。取得内容模块622使用CtxIdxOffset及binIdx数值来计算CtxIdx的值(为一输出,代表内容索引)。GCTX指令的示范格式如下:
GCTX DST,SRC2,SRC1,
其中,SRC1对应于由多工器单元656所输出的值并储存于暂存器SRC1,而SRC2对应于由目标暂存器652所输出的值并储存于暂存器SRC2,以及DST对应于目标暂存器。在一实施例中,各暂存器具有下列数值:
SRC1[7:0]=binIdx;当目前语法成分包含codedB lockPattern时,SRC1的值(从多工器单元656输出,并作为取得内容模块622的输入)可以是二进制索引暂存器654的值。
SRC1[15:8]可以是levelListIdx(当计算sigCoeffFlag时)、lastSigCoeffFlag或是mbPartIdx(当计算编码区块图样的Ref_Idx或是binIdx)。当语法成分是sigCoeffFlag或是lastSigCoeffFlag时,多工器单元656可以用来传送levelListIdx。
SRC1[16]可包含iCbCr旗标,而当其值为0时,区块为Cb色度区块。此外,SRC1[16]可包含L0/L1值,如果是L0时,其值为0,本领域技术人员从本发明的内容可知L0/L1是用于移动 补偿预测的图形参考列表(L0=list0,L1=list1)。
SRC1[21:20]=mbPartitionMode
SRC2[8:0]=ctxIdxOffset
SRC2[18:16]=maxBinIdxCtx
SRC2[23:31]=ctxBlockCat
SRC2[29:24]=ctxIdxBlockOffset
SRC2[31]=bypassFlag
再者,DST包括取得内容模块622的输出并具有下列值:
DST[15:00]=ctxIdx
DST[23:16]=binIdx
DST[27:24]=mbPartIdx
DST[29:28]=mbPartitionMode
DST[30]=L0
取得内容模块622亦可与转发暂存器互动。因此,当使用转发暂存器时,指令可取得GCTX.F1.F2的格式,其中F1以及F2指示转发暂存器被使用,即有2位在指令译码(F1以及F2)。假如未得到一或两个转发旗标,则表示转发暂存器未被使用。当这些位被设定时(例如设为1),则使用转发暂存器的值(内部产生的值)。否则,就使用来源暂存器的值。因此,转发暂存器更提供一个有关何时为最早的时间可发出指令的建议给编译程序。当未使用转发时,指令可能遇到已知来源暂存器的写入后读取的延迟。
对GCTX指令而言,当重置信号(Rst_Signal)被设定时,SRC1的值为0。当运算(F1&Rst_Signal)成立时,SRC1为来自取得内容模块622内部的binIdx值再加上1,否则SRC1为来自执行单元暂存器的binIdx值。可使用二进制化模块620的输出作为GCTX指令以及BARD指令的转发SRC2值。在后面的指令中,不会发出BIND指令直到BARD指令使用到转发暂存器。进一步解释,重置信号以及F1转发信号结合成一信号(例如2位信号){F1,reset},其指示输入至取得内容模块622的SRC1值是否包括binIdx值或是转发值。提供重置信号的另一个作用是清除以及重置二进制字串暂存器616,并重置二进制索引暂存器654成0。
继续讨论取得内容模块622以及得到内容信息,在一实施例中,下面表2以及表3所显示的信息分别对应于结构邻近内容存储器564以及mbNeighCtxCurrent暂存器603的值。mbNeighCtxCurrent暂存器603包含目前宏区块的译码输出结果。在目前宏区块处理的最后部分,发出CWRITE指令,其复制来自mbNeighCtxCurrent暂存器603的信息至邻近内容存储器564阵列内所对应的位置。之后,所复制的信息被当作顶部邻近值。
表2
参数 | 大小(位) | |
transform_size_8×8_flag | 1 | 0 |
mb field_decode_flag | 1 | 1 |
mb_skip_flag | 1 | 2 |
Intra_chroma_pred_mode | 2 | 4:3 |
mb_type | 3 | 7:5 |
codedB lockPatternLuma | 4 | 11:8 |
codedBlockPatternChroma | 2 | 13:12 |
codedF lagY | 1 | 14 |
codedFlagCb | 1 | 15 |
codedFlagCr | 1 | 16 |
codedFlagTrans | 8 | 24:17 |
refIdx | 8 | 32:25 |
predMode | 4 | 36:33 |
表3
参数 | 大小(位) | |
transform_size_8×8_flag | 1 | 0 |
mb_field_decode_flag | 1 | 1 |
mb_skip_flag | 1 | 2 |
Intra_chroma_pred_mode | 2 | 4:3 |
mbQpDeltaGT0 | 1 | 88 |
codedBlockPattemLuma | 4 | 11:8 |
codedBlockPatternChroma | 2 | 13:12 |
codedFlagY | 1 | 14 |
codedFlagCb | 1 | 15 |
codedFlagCr | 1 | 16 |
codedFlagTrans | 24 | 87:64 |
refIdx | 16 | 52:37 |
predMode | 8 | 60:53 |
mb_type | 3 | 63:61 |
在一实施例中,参数codedFlagTrans被分为三部分。举例来说,开始的4位系有关于内容区块种类为0或是1,而上面的4位系有关于内容区块种类为3或是4。上面的4位更可分为两部分,较低的2位给iCbCr=0而其他2位给iCbCr=1。参数predMode(预测模式)具有下列三选项之一:predL0=0、predL1=1以及NiPred=2。
图6D系显示参考表2以及表3的参数refIdx结构的一实施例。需注意到参数refIdx与使用在图像复原的参考图像列表的索引有关。上述结构可提供存储器以及逻辑电路的最佳化。如图所显示,计算语法成分结构包括宏区块的顶部列609、宏区块分区611(如显示的四区)、L0/L1值613以及各L0/L1值的储存位值Gt0(大于0)617以及储存位值Gt1(大于1)615。通常,需要存取顶部邻近宏区块609,然而宏区块的底部列也是需要存取,其被分为4×4方阵的一实施例,结果产生四个mbPartition611。对各mbPartition 611而言,L0/L1值613的消息被确定,但并非实际值。关于L0值以及L1值为1或是大于1的判断被决定。在一实施例中,通过储存Gt0 617以及Gt1 615两位而获得决定,其被使用于计算语法成分。
进一步简单说明计算语法成分结构,两个最佳化被执行。在一最佳化中,只有保持2位(虽然参考值传统上较大),而不需要更多位以供可变长度译码单元530a内计算语法成分的译码。译码全部的值并维持在执行单元暂存器或是存储器(例如:L2快取存储器)。第二最佳化只有四个元素被维持(例如两个在顶部而两个在左方)。四个元素为再循环,而最后的值会由CWRITE指令写入于邻近,其储存在存储器中。之后,只有16位被维持在mbNeighCtxCurrent暂存器603,而只有8位被维持在mbNeighCtxLeft暂存器605以及阵列564的顶部mbNeighCtx元素601。在计算逻辑电路使用再储存,因为译码参考值的全部计算被较少位的布林运算所取代。
mb_type包括如下列表4所显示。
表4
mb_ty | 名称 |
pe | |
4’b000 | SI |
4’b001 | I_4×4 or I_N×N |
4’b010 | I_16×16 |
4’b011 | I_PCM |
4’b100 | P_8×8 |
4’b101 | B_8×8 |
4’b110 | B_Direct_16×16 |
4’b111 | Others |
未显示在图6B的额外暂存器可以被使用,例如mbPerLine(例如8位,不具正负号)、mb_qp_delta(8位,具正负号),以及mbAddrCurr(16-bit,目前宏区块地址)。对mbAddrCurr而言,1920×1080阵列被实施,虽然其只需要13位。部分实施例会使用16位以帮助16位计算的执行。
来自先前所描述的暂存器的值亦被储存在总体暂存器614。复制储存在总体暂存器614内的值并储存在暂存器以帮助硬件设计。在一实施例中,总体暂存器614包括格式化的32位暂存器以包含对应于mbPerline、mbAddrCurr以及mb_qp_delta的值,除了对应于NUT、MBAFF FLAG以及chroma_format_idc的其他值之外。
可使用INSERT指令来更新总体暂存器614内的不同栏位。INSERT指令的示范格式描述如下:
INSERT DST,#Imm,SRC1
在上面INSERT指令中,#Imm的一实施例包括10位数字,其中前面5位宽度的数据以及上面5位指定数据被***的位置。输入参数包括下列所述:
Mask=NOT(0xFFFFFFFF<<#Imm[4:0])
Data=SRC1&Mask
SDATA=Data<<#Imm[9:5]
SMask=Mask<<#Imm[9:5]
输出DST可表示如下:
DST=(DST & NOT(sMask))ISDATA
需注意到一些栏位(例如:NUT(NAL_UNIT_TYPE)、C(constrained_intra_pred_flag))、MBAFF_FLAG、mbPerLine以及mbAddrCurr值亦可使用INIT_CTX指令来写入/初始化至总体暂存器614。
在一实施例中,局部暂存器612包括32位暂存器,其具有对应于b、mb_qp_delta、numDecodAbsLevelEq1以及numDecodAbsLevelGt1的栏位。这些栏位可使用INSERT指令来更新。局部暂存器612亦被初始化,使得b=0、mb_qp_delta=0、numDecodAbsLevelEq1=-1以及numDecodAbsLevelGt1=0。用以提供初始化的指令可使用下列格式:
CWRITE SRC1
其中SRC1[15:0]=mbAddrCurr。CWRITE SRC1更新总体暂存器614的mbAddrCurr栏位。在邻近元素结构以及其译码的简单描述之后,将描述透过CWRITE指令所提供的额外功能。
在CABAC译码中,语法值被预期并从其邻近宏区块模仿。不同方法描述如后,其提供可变长度译码单元530a的实施例如何判断左方以及上方邻近宏区块以及如何判断这些宏区块为实际上为可使用。如前文所描述,译码程序使用邻近值(例如:从宏区块或区块至上方以及至左方)。在一实施例中,二进制计算译码引擎624计算下列方程序,其使用目前宏区块数量以及位于一线(mbPerLine)的宏区块的数量以计算上方宏区块的地址以及左方与上方宏区块是否为可用。
举例来说,为了判断邻近宏区块(例如:左方邻近)是否存在(即有效),可执行运算(例如:mbCurrAddr%mbPerLine)以检查其结果是否为0。在一实施例中,可执行下列计算:
a=(mbCurrAddr%mbPerLine)
需注意到mbCurrAddr与对应于要译码的二进制符号的目前宏区块位置有关,而mbPerLine与每一已知列的宏区块的数量有关。上面计算是使用一个除法、一个乘法以及一个减法而实施。
进一步描述由二进制计算译码引擎624所实施的译码机制,参考图6E,其显示将被译码的图像(16×8宏区块且mbPerLine=16)。当译码第35宏区块时(mbCurrent标记为35,而第36宏区块尚未被完全译码)时,需要来自先前已译码的上方宏区块(标记为19)以及左方宏区块(标记为34)的数据。上方宏区块的信息可从mbNeighCtx[i]得到,其中i=mbCurrent%mbPerLine。因此,就这个例子而言,i=35%16,则i=3。在目前宏区块被译码后,可使用CWRITE指令来更新阵列中的mbNeighCtxLeft 605以及mbNeighCtx[i]601。
当另一例子时,考虑下列:
mbCurrAddr∈[0:maxMB-1]
其中,maxMB为8192而mbPerLine=120。在一实施例中,除可以通过乘上(1/mbPerLine)而实施,其查找储存于芯片上存储器的表(例如120×11位的表)。当mbCurrentAddr为13位时,可使用13×11位的乘法器。在一实施例中,完成乘法运算的结果、储存上方13位,以及执行13×7位的乘法,借以储存较低13位。最后,执行13位的减法以决定“a”。运算的全部顺序会使用到2个周期,而结果将被储存以使用在其他运算,以及当mbCurrAddr值改变时再计算一次。
在部分实施例中,模数(modulo)运算不会被执行,反而可使用执行单元内的着色逻辑电路以提供对齐置于片段的第一线的第一mbAddrCurr值。举例来说,上述着色逻辑电路可执行下列计算:mbAddrCurr=absoluteMbAddrCurr_n*mbPerLine。因为,部分H.264弹性宏区块排序(Flexibility MacroblockOrdering,FMO)模式具有一些非常复杂的邻近结构,为了复制这些模式,可在译码***200的额外着色器计算左方/上方的可得性,并载入至可变长度译码单元530a的一或多个暂存器。通过离开载入可变长度译码单元530a,当启动全部H.264模式以进行符号译码时可减少硬件的复杂性。
CWRITE指令从mbNeighCtxCurrent 603复制适当的栏位至mbNeighCtxTop[]601以及mbNeighCtxLeft[](例如阵列564的左方宏区块)。根据是否设定mBaffFrameFlag(MBAFF)以及目前与先前宏区块是否为栏位或是帧译码,则特定mbNeighCtxTop[]601以及mbNeighCtxLefe[]数据写入。当(mbAddrCurr%mbPerLine==0)成立时,标记mbNeighCtxLeft605为不可用(例如其被初始化成0)。使用CWRITE指令可移除mbNeighCtx存储器564、局部暂存器612以及总体暂存器614的内容。例如,CWRITE指令移动邻近内容存储器564的相关内容至第i个宏区块(例如mbNeighCtx[i]或是目前宏区块)的左方以及上方区块,并且亦清除mbNeighCtxCurrent暂存器603。如前文所描述,上方指标607c以及左方指标607b与邻近内容存储器564有关。在CWRITE指令之后,上方索引增加1,并且目前宏区块的内容移动到阵列内的上方位置以及左方位置。上述机构可减少读出/写入时存储器阵列中读出/写入端口的数量。
可使用INSERT指令来更新邻近内容存储器564、局部暂存器612以及总体暂存器614的内容,如前文所述。例如,可使用INSERT指令(例如:INSERT $mbNeighCtxCurrent_1,#Imm 10,SRC1)来写入目前宏区块。后来的运算不会影响上方指标607c以及左方指标607b(即只写入至目前位置)。
INSERT指令以及来自二进制计算译码模块624的更新被写入至邻近内容存储器564的mbNeighCtxCurrent阵列601。左方指标607b指向存储器564的元素,其相同于邻近(邻近于mbNeighCtx 601)阵列元素(即mbNeighCtx[i-1])。
鉴于上述关于得到内容以及模型信息,下文将根据内容以及模型信息讨论二进制计算译码模块624以及计算译码。二进制计算译码模块624在BARD指令下操作。BARD指令的示范格式描述如下:
BARD DST,SRC2,SRC1
其提供二进制计算译码运算,其中各二进制重复译码导致单一位输出。输入参数描述如下:
SRC1=binIdx/ctxIdx,为取得内容模块622的输出;以及
SRC2=bypassFlag,为二进制化模块620的输出。
当使用转发暂存器时,一示范格式可包括BARD.F1.F2,其指示转发暂存器。假如未得到一或两个对应的转发旗标,则表示转发暂存器未被使用。注意到二进制计算译码模块624亦接收如前文所描述的重置信号。特别地,在接收重置信号之后,二进制计算译码模块624维持重置信号直到接收到第一次呼叫BARD指令。之后,重置信号被清除。
在运算中,二进制计算译码模块624接收内容索引(ctxIdx)值以及指标至来自取得内容模块622的译码位流(binIdx)的目前位分析位置。二进制计算译码模块624使用来自于码长偏移量暂存器608以及码长范围暂存器606的偏移量以及范围值以记录译码引擎的目前间隔状态(偏移量,偏移量+范围)。二进制计算译码模块624使用内容索引值以存取内容表(CTX_TABLE),其依序使用以存取目前可能状态pStateIdx以及高可能性符号值。使用pStateIdx(例如:来自于储存在远端或芯片上存储器的表单)以读取低可能性符号子范围值、下一个高可能性符号值以及下一个低可能性符号的可能值。
根据高可能性符号值的状态、下一个范围以及可能性信息,二进制计算译码模块624计算目前二进制符号的高可能性符号值。二进制计算译码模块624输出二进制信号(位或是二进制值,例如:b0、b1、...bn)至二进制字串暂存器616。接着,对下一个二进制的相同或是不同内容重复程序,例如从二进制字串暂存器616至取得内容模块622的反馈连接658所显示。二进制计算译码模块624根据高可能性符号值的选择而更新偏移量以及范围值和可能性状态。此外,二进制计算译码模块624将目前高可能性符号以及可能性状态写入至内容表以供后来的内容使用。
注意到关于转发暂存器F1以及转发暂存器F2的使用,当信号发出转发时,指令可能或是不可能具有延迟。例如,当从二进制化模块620转发至取得内容模块622中,没有延迟存在,且可在下一个周期发出GCTX指令。在从取得内容模块622转发至二进制计算译码模块624中,会使用到4个周期。当在周期j发出GCTX指令时,则可在周期(j+5)发出BARD指令。有用指令的缺少会导致延迟槽最多填充4个NOP。在从二进制化模块620转发至二进制计算译码模块624中,没有延迟存在。在从二进制计算译码模块624转发至取得内容模块622中,当在周期j发出BARD指令时,则可在周期(j+5)发出GCTX指令。在从二进制计算译码模块624转发至二进制化模块620中,如果第二二进制字串被保留且二进制计算译码模块624与二进制化模块620之间有切换存在,则没有延迟存在。通过保留第二二进制字串,可允许发出BARD至BARD指令以供不需忍受延迟的旁路(bypass)情况。
CAVLC译码
已经描述用于CABAC译码的可变长度译码单元530a,目前将针对译码***200的CAVLC实施例作进一步描述,其亦称为可变长度译码单元530b,如图7A所显示。在描述CAVLC架构之前,先简单描述在可变长度译码单元530b中内容的H.264CAVLC程序。
已知,CAVLC程序编码有关宏区块或是其位置的信号的电平(例如:大小),以及电平何时会重复(例如多少周期),以避免需要对每一位做译码。位流562b接收以及分析上述信息,其中当信息由译码可变长度译码单元530b的译码引擎使用时,缓冲器被填充。可变长度译码单元530b通过从已接收位流所撷取具有电平以及运行(run)系数的宏区块信息来反向编码过程并重建信号。因此,可变长度译码单元530b从位流缓冲器562b接收宏区块信息,并分析串流已分别得到电平以及运行系数值给电平以及运行阵列的暂时储存器。举例来说,电平以及运行阵列读出对应于宏区块中区块的4×4区块的像素,接着清除电平以及运行阵列以供下一个区块使用。依照H.264标准,软件可根据4×4构建区块而使用全部的宏区块。
现在提供有关于译码宏区块信息的一般操作,下列叙述提出在CAVLC译码程序的内容中可变长度译码单元530b的不同元件,可将符合实际应用的各种变动列入考虑。本领域技术人员可知下列所使用的许多术语(例如不同参数的标号)是出自H.264规格,为了简洁不再赘述,除非是有助于了解所述的不同程序和/或元件,才会再做进一步的说明。
图7A系显示可变长度译码单元530b一实施例的方块图。图7A系显示单一可变长度译码单元530b,而单一可变长度译码单元530b用以在实施例中译码单一位流。同样的原理可应用至具有额外可变长度译码单元的译码***200,可同时译码多个(例如两个)串流。简单地说,图7A系显示可变长度译码单元530b的选择元件,而图7B系显示CAVLC译码的表格结构。虽然下列叙述是有关宏区块译码的内容,但是本发明所提出的原理可应用到各种区块译码,将不再进一步描述相同的部分。
可变长度译码单元530b用以分析位流、初始化译码硬件与暂存器/存储器结构,以及阶段-运行译码。上述H.264标准的CAVLC译码程序的上述各功能将进一步描述于后。关于位流缓冲器操作,在CABAC以及CAVLC运算之间共用SREG串流缓冲器/DMA引擎562,因此除了下面提及CABAC以及CAVLC模式之间的操作差异之外,为了简洁将不再进一步描述相同的部分。CABAC以及CAVLC译码实施例皆使用相同的内容存储器564,但是栏位(例如:结构)不相同,其将描述于后。因此,当CAVLC的内容存储器564操作相似于前文所描述的CABAC运算时,为了简洁将不再进一步描述相同的部分。此外,总体暂存器614以及局部暂存器612亦被使用,因此将不再进一步描述相同的部分。
参考图7A,可变长度译码单元530b包括硬件的不同模块,其包括系数符记(token)模块(coeff_token)710、电平码模块(CAVLC_LevelCode)712、电平模块(CAVLC_ Level)714、电平0模块(CAVLC_L0)716、零电平模块(CAVLC_ZL)718、运行模块(CAVLC_Run)720、电平阵列(LevelArray)722以及运行阵列(RunArray)724。译码***亦包括如前文所描述的SREG串流缓冲器/DMA引擎562、总体暂存器614、局部暂存器612以及邻近内容存储器564。
可变长度译码单元530b与执行单元420a的接口包括相同于前文所述的CABAC实施例的一或多个目标总线与对应的暂存器(例如:目标暂存器),以及两个来源总线与对应的暂存器(SRC1以及SRC2等)。
通常,根据片段的种类,驱动软件128(图1)准备并载入CAVLC着色器至执行单元420a。CAVLC着色器使用标准指令集再加上额外的指令集,包括coeff_token、CAVLC_LevelCode、CAVLC_Level、CAVLC_L0、CAVLC_ZL以及CAVLC_Run指令以译码位流。额外的指令系包括有关于电平阵列722以及运行阵列724的读取以及清除运算的READ_LRUN以及CLR_LRUN指令。在一实施例中,在发出其他指令前,CAVLC着色器所执行的第一个指令包含INIT_CTX指令和INIT_ADE指令。这两个指令初始化可变长度译码单元530b以译码CAVLC位流,并从自动安排串译码的指标载入位流至先进先出缓冲器,稍后将说明这两个指令。因此,可变长度译码单元530b可用以分析位流、初始化译码硬件与暂存器/存储器结构,以及阶段-运行译码。H.264标准的CAVLC译码程序的上述各功能将进一步描述于后。
关于分析位流的指令,除了先前描述于CABAC程序的READ以及INIT_BSTR指令会共用于CAVLC程序之外,还有两个其他指令分析位流存取更有关于CAVLC程序,即INP STR指令(对应于检查字串模块570)以及INPTRB指令(图5C中前次载入至可变长度译码逻辑电路550)。INPSTR指令以及INPTRB指令不需要限定在CAVLC操作(例如上述指令可使用在其他程序,如CABAC、VC-1以及MPEG)。使用INPSTR指令以及INPTRB指令以侦测特定图型(pattern)(例如:数据开始或是结束图型)是否出现在片段、宏区块等,用以致能位流的读出而不需要进行位流。在一实施例中,指令的顺序包括INPSTR以及INPTRB然后READ指令的实施。INPSTR指令的示范格式描述如下:
INPSTR DST
其中,在一实施例中,检查位流并传回SREG暂存器562a的最高有效16位在目标暂存器的较低16位。目标暂存器的上16位包含sREGbitptr值。由于此操作,数据并未从SREG暂存器562a移除。根据下列示范伪码(pseudocode)可实施INP STR指令:
MODULE INPSTR(DST)
OUTPUT[31:0]DST
DST={ZE(sREGbitptr),sREG[msb:msb-15]};
ENDMODULE
另一个分析位流的指令为INPTRB指令,其检查原始字节序列承载(raw byte sequence payload,RB SP)尾随位(例如排列成字节的位流)。INPTRB指令提供位流暂存器562b的读取。INPTRB指令的示范格式描述如下:
INPTRB DST。
在INPTRB运算中,没有位从SREG暂存器562a移除。当SREG暂存器562a的高有效位包含例如100时,则SREG暂存器562a包含RBSP停止位,以及字节内剩下的位为alignment zerobits。根据下列示范伪码可实施INPTRB指令:
MODULE INPTRB(DST)
OUTPUT DST;
REG[7:0]P;
P=sREG[msb:msb-7];
Sp=sREGbitptr;
T[7:0]=(P>>sp)<<sp;
DS T[1]=(T==0×80)?1∶0;
DST[0]=!(CVLC_BufferBytesRemaining>0);
ENDMODULE
提供READ指令以供位流缓冲器562b中数据调正。
现在将描述可变长度译码单元530b的额外位串缓冲器操作,目前将针对CAVLC操作的的初始化作描述,尤其是存储器、暂存器结构以及译码引擎(例如:CAVLC模块582)的初始化。在片段起始处且在译码对应于第一宏区块暂存器结构的语法成分之前,总体暂存器614、局部暂存器612以及CAVLC模块582被初始化。在一实施例中,驱动软件128发出INIT_CAVLC指令以进行初始化。INIT_CAVLC指令的示范格式描述如下:
INIT_CAVLC SRC2,SRC1
其中,SRC2包括片段数据中译码的字节的数目。其值写入于内部CVLC_bufferBytesRemaining内:
SRC1[15:0]=mbAddrCurr;
SRC1[23:16]=mbPerLine;
SRC1[24]=constrained_intra_predflag;
SRC1[27:25]=NAL_unit_type(NUT);
SRC1[29:28]=chroma_format_idc(一实施例系使用对应于4:2:0格式的1的chroma_format_idc值,然而部分实施例可使用其他采样机制);以及
SRC1[31:30]=未定义。
关于INIT_CAVLC指令,SRC1内的值被写入至总体暂存器614中所对应的栏位。再者,SRC2内的值被写入至由INIT指令所设定的内部暂存器(例如:CVLC_bufferByteRemaining暂存器)。使用CVLC_bufferByteRemaining暂存器以复原任何错误位流,如前文所述。举例来说,可变长度译码单元530b(例如:SREG串流缓冲器/DMA引擎562)记录了分析已知片段的位流中缓冲位的信息。当使用位流时,可变长度译码单元530b计数并更新CVLC_bufferByteRemaining值。当其值低于0时,其中低于0的值是表示缓冲器或是位流错误,提示处理的终止以及返回至应用控制或是由驱动软件128控制以处理复原。
INIT_CAVLC指令亦初始化可变长度译码单元530b的不同储存结构,包括在某方面来说相似于先前描述的CABAC程序的邻近内容存储器564、mbNeighCtxLeft暂存器605以及mbNeighCtxCurrent暂存器603。已知CAVLC译码的内容本质,根据前次译码宏区块时CAVLC_TOTC指令所搜集的信息来译码目前的宏区块,亦即左方宏区块储存于左方mbNeighCtxLeft暂存器605并由指标607b所指向,而上方宏区块储存于阵列元素[i]601中并由指标607c所指向。使用INIT_CAVLC指令来初始化上方指标607c与左方指标607b,并更新总体暂存器614。
为了判断邻近宏区块(例如:左方邻近)是否存在(即有效),可由CAVLC_TOTC指令执行运算(例如:mbCurrAddr%mbPerLine),其相似于CABAC实施例中所执行的同一程序,因此将不再描述。
相似于所描述的CABAC程序,使用CWRITE指令可移除邻近内容存储器564的内容,而使用INSERT指令可更新邻近内容存储器564的内容、局部暂存器612以及总体暂存器614,其中可使用INSERT指令以供写入至mbNeighCtxCurrent暂存器603。维持在邻近内容存储器564的数据的结构可描述如下:
mbNeighCtxCurrent[01:00]:2’b:mbType
mbNeighCtxCurrent[65:02]:4’b:TC[16]
mbNeighCtxCurrent[81:66]:4’b:TCC[cb][4]
mbNeighCtxCurrent[97:82]:4’b:TCC[cr][4]
当执行CWRITE指令时,更新mbNeighCtx[]邻近值,然后初始mbNeighCtxCurrent暂存器603。
已描述由可变长度译码单元530b初始的内容存储器结构以及初始化,下面将描述可变长度译码单元530b(特别是CAVLC_TOTC指令)如何使用邻近内容信息以计算总系数(TotalCoeff,TC),其之后将被使用来判断是否应该使用CAVLC表格以译码符号。通常,CAVLC的译码是利用描述于H.264规格的可变长度译码表格(于此称为CAVLC表格),其中根据先前已译码符号的内容选择CAVLC表格以译码各符号。即对每一格符号而言,其为不相同的CAVLC表格。图7B系显示基本表格结构,其为可变大小的二维阵列。提供表格的阵列(每一个表格可为一特定符号),而每一个符号为霍夫曼(Huffman)编码。霍夫曼码被储存成下列结构的表格:
struct Table{
unsigned head;
struct table{
unsigned val;
unsigned shv;
}table[];
}Table[];
下面将描述根据唯一前置(prefix)编码用以比对的方法(MatchVLC函数)。通常,CAVLC表格包括可变长度部分以及固定长度部分。通过执行一些固定大小的索引查找(lookup)可简化比对。在MatchVLC函数中,可执行READ运算而不从SREG暂存器562a移除位。因此,对处理位流的位流缓冲器562b而言,READ运算不同于前文所描述的READ指令。在下面所描述的MatchVLC函数中,一些位(fixL)从位流缓冲器562b被复制,然后于一指定表格中查找。指定表格内的各项目包含特定格式(例如:值以及以位型式的大小)。使用项目的大小以进行位流。
FUNCTION MatchVLC(Table,maxIdx)
INPUT Table;
INPUT maxIdx;
Idx1=CLZ(sREG);//count number of leading zeros
Idx1=(Idx1>maxIdx)?maxIdx:Idx1;
fixL=Table[Idx1].head;
SHL(sREG,Idx1+#1);//shift buffer Idx1+1 bit left
Idx2=(fixL)?0:READ(fixL);
(val,shv)=Table[Idx1][Idx2];
SHL(sREG,shv);
return val;
ENDFUNCTON
图7B系显示上述表格结构的示范二维阵列的方块图,用以描述在CAVLC译码的内容中的MatchVLC函数。从H.264标准内的表格9-5中得到当nC==-1时的例子,其描述如下:
Coeff_token | TrailingOnes | TotalCoeff | Head | Value | Shift |
1 | 1 | 1 | 0 | 33 | 0 |
01 | 0 | 0 | 0 | 0 | 0 |
001 | 2 | 2 | 0 | 66 | 0 |
000100 | 0 | 2 | 2 | 2 | 2 |
000101 | 3 | 3 | 99 | 2 | |
000110 | 1 | 2 | 34 | 2 | |
000111 | 0 | 1 | 1 | 2 | |
000010 | 0 | 4 | 1 | 4 | 1 |
000011 | 0 | 3 | 3 | 1 | |
0000010 | 2 | 3 | 1 | 67 | 1 |
0000011 | 1 | 3 | 35 | 1 | |
00000010 | 2 | 4 | 1 | 68 | 1 |
00000011 | 1 | 4 | 36 | 1 | |
0000000 | 3 | 4 | 0 | 100 | 0 |
在伪码(pseudo code)方面,上述表格可表示如下:
Table9-5[8]={
0,{{33,0}},
0,{{0,0}},
0,{{66,0}},
2,{{2,2},{99,2},{3 4,2},{1,2}},
1,{{4,1},{3,1}},
1,{{67,1},{35,1}},
1,{{68,1},{36,1}},
0,{{100,0}}
};
使用上述表格结构,可使用上述的MatchVLC函数以实施CAVLC译码。由于MatchVLC函数,对位流执行计算前导0以存取已知语法成分的表格。再者,通过计算前导0的值是否大于Idx的最大值,MatchVLC函数可启动计算前导0运算(例如在部分实施例中,使用计算前导0模块576与读取模块572),然后传回maxIdx(其处置的情况为0000000,如图7B的表格所显示)。MatchVLC函数以及表格结构的另一优点为不需要多个指令来处置这些情况,其由下面MatchVLC区段所处置:Idx1=CLZ(sREG)计算前导0的数量,以及Idx1=(Idx1>maxIdx)?maxIdx:Idx1。接着,使用MatchVLC函数的下列区段移除已使用的位:SHL(sREG,Idx1+#1)。使用下面MatchVLC区段读取子阵列(sub-array)的标头:fixL=Table[Idx1].head,以及Idx2=(!fixL)?0:READ(fixL),其传送最大数量的位数以被不确定地读取。前导0可以相同,但尾随位的大小可以改变。因此,在一实施例中,可实施CASEX种类情况叙述(使用较多存储器,但较简单的码结构)。
使用(val,shv)=Table[Idx1][Idx2]以及SHL(sREG,shv)读取表格的实际值,其亦显示实际上多少位为语法成分所使用。这些位从位流被移除,且语法成分的值返回至目标暂存器。
已描述VLC匹配的方法以及表格结构的配置,接着返回参考图7A以描述CAVLC译码引擎或是程序(例如:CAVLC模块582)。一旦位流被载入,且译码引擎、存储器结构以及暂存器被载入,通过驱动软件128发出CAVLC_TOTC指令可启动系数符记模块710。在一实施例中,CAVLC_TOTC指令具有下面示范格式:
CAVLC_TOTC DST,S1,
其中,S1以及DST分别包括一输入暂存器以及一内部输出暂存器,具有下面所提供的示范格式:
SRC1[3:0]=blkIdx
SRC1[18:16]=blkCat
SRC1[24]=iCbCr
剩下的位为未定义。输出格式描述如下:
DST[31:16]=TrailingOnes
DST[15:0]=TotalCoeff
因此,如图所显示,系数符记模块710接收对应于mbCurrAddr、mbType、是否正在处理色度通道的指示(例如:iCbCr),以及blkIdx(例如:区块索引,因为图像可被分成许多区块)。对从位流缓冲器562b所存取的已知宏区块而言,传送blkIdx,不管是8×8像素区块或是4×4像素区块正在已知位置上进行处理。由驱动软件128提供上述信息。系数符记模块710包括一查找表。根据前文描述而输入至系数符记模块710的查找表,可得到拖尾系数的个数(TrailingOnes)以及非零系数(TotalCoeff)的个数。TrailingOnes传送有多少个1在一列上,而TotalCoeff传送有多少运行/电平对(run/level pair)系数在从位流抽出的块状数据上。TrailingOnes以及TotalCoeff分别提供至CAVLC电平模块714以及零电平模块718。TrailingOnes亦提供至电平0模块716,其对应于从位流缓冲器562b所撷取的第一电平(例如:直流(DC)值)。
电平模块714记录符号的字尾(suffix)长度(例如:尾随1的数目),以及电平模块714结合电平码(levelCode)来计算电平值(level[Idx]),之后电平值储存在电平阵列722以及运行阵列724内。电平模块714操作在CAVLC_LVL指令下,其具有下列格式:
CAVLC_LVL DST,S2,S1,其中:
S1=Idx(16-bit);
S2=suffixLength(16-bit);以及
DST=suffixLength(16-bit)。
字尾长度(suffixLength)传送码字(code word)的大小为何。来自驱动软件128的输入提供指定字尾长度的大小的信息。此外,在一实施例中,因为字尾长度值被更新,DST以及S2可选择为同一暂存器。
更注意到,转发暂存器(例如维持由已知模块内部地产生的数据)亦可被使用,例如F1以及F2。由已知指令内的转发旗标指示指令以及对应模块是否使用到转发暂存器。符号F1(即使用转发来源1的值,在一实施例中可由指令中的位26所指示)以及符号F2(即使用转发来源2的值,在一实施例中可由指令中的位27所指示)可表示转发暂存器。当使用转发暂存器时,CAVLC_LVL指令可具有下列示范格式:
CAVLC_LVL.F1.F2 DST,SRC2,SR1
其中当不是F1就是F2被设定时(例如成立),所指定的转发来源被当成输入。在电平模块714的情况中,转发暂存器F1对应于由电平模块714产生的电平索引(level[Idx]),其在递增(increment)模块内递增并输入至多工器730。同样地,转发暂存器F2对应于字尾长度(suffixLength),其由电平模块714所产生并输入至多工器728。多工器730以及多工器728的其他输入包括执行单元暂存器输入(在图7A中标示为EU),如下文所描述。
电平模块714的另一输入是由电平码模块712所提供的电平码。电平码模块712以及电平模块714的结合运算译码可译码电平值(电平为按比例缩放(scaling)之前的转换系数值)。透过具有下列示范格式的指令可致能电平码模块712。
CAVLC_LC SRC1
其中SRC1=suffixLength(16位)。当使用转发暂存器F1时,指令可表示如下:
CAVLC_LVL.F1 SRC1
其中如果设定F1,则转发SRC1被当成输入。如图7A所显示,当设定F1时(例如F1=1),电平码模块712获得转发SRC1值(例如来自电平模块714的字尾长度)以作为输入,否则输入是从执行单元暂存器所获得(例如F1=0)。
回到电平模块714,字尾长度输入可以是由电平模块714经由多工器728所转发,或是经由执行单元暂存器透过多工器728所提供。此外,Idx输入亦可由电平模块714经由多工器730所转发(且由递增模块来递增,或是在部分实施例中,能自动递增而不需要递增模块),或是经由执行单元暂存器透过多工器730所提供。再者,电平模块714亦直接从电平码模块712接收电平码输入。除了至转发暂存器的输出之外,电平模块714亦提供电平索引(level[idx])输出至电平阵列722。
如前文所提到,TrailingOnes输出至电平0模块716。电平0模块716经由下列指令而致能:
CAVLC_LVL0 SRC
其中SRC=trailingOnes(coeff_token)。电平0模块716的输出包括电平索引(Level[Idx]),其被提供至电平阵列722。系数值被编码成为正负号以及大小。电平0模块716提供系数的正负号值。结合来自CAVLC电平模块714的大小值以及来自电平0模块716的正负号值,并写入至电平阵列722。使用电平索引(level[Idx])来指定写入的位置。在一实施例中,系数是在子区块(区块为8×8)的一个4×4矩阵内,而不按照光栅(raster)顺序。阵列之后转换成4×4矩阵。换句话说,被译码的系数电平以及运行不是光栅格式。从电平-运行数据,4×4矩阵可以被重建(但是以锯齿形扫描顺序),接着重新排列成光栅顺序4×4。
从系数符记模块710输出的TotalCoeff被提供至零电平模块718。零电平模块718可经由下列指令而致能:
CAVLC_ZL DST,SRC1
其中,SRC1=maxNumCoeff(16位)以及DST=ZerosLeft(16位)。maxNumCoeff系由H.264标准所给定,并被重送以作为指令的原始值。换句话说,maxNumCoeff是由软件所设定。在部分实施例中,maxNumCoeff可被储存在硬件中。变换系数被编码成(电平,运行)格式,其与被编码成0的系数(电平)的数目有关。零电平模块718提供两个输出ZerosLeft以及Reset(reset=0),其分别被提供至多工器740以及多工器742。多工器740亦接收来自运行模块720的转发暂存器F2。多工器742接收来自运行模块720的已递增(在部分实施例中是经由递增模块或是其他方式)的转发暂存器F1。
运行模块720分别从多工器740以及多工器742接收ZerosLeft以及Idx输入并提供运行索引(Run[Idx])输出至运行阵列724。如前文所描述,因为运行-长度编码被用作进一步压缩,则系数被编码成(电平,运行)格式。举例来说,假设拥有下列的值10 12 12 15 19 1 1 1 0 0 0 0 0 0 1 0,则可被编码成(10,0)(12,1)(15,0)(19,0)(1,2) (0,5)(1,0) (0,0)。这个码字通常较短。索引为电平索引的对应索引。运行模块720可经由下列指令而致能:
CAVLC_RUN DST,S2,S1
其中,由于ZerosLeft值被更新,DST以及S2可选择为相同暂存器。因此,CAVLC_RUN指令的示范不具正负号值显示如下:
S1=Idx(16-bit),
S2=ZerosLeft(16-bit),
DST=Zerosleft(16-bit)。
参考图7A,转发暂存器被使用,其中CAVLC_RUN指令可得到下列格式:
CAVLC.F1.F2 DST,SRC2,SRC1
其中,当不是F1就是F2被设定时,则适当的转发来源被当成输入。
关于两暂存器暂列,电平阵列722对应于电平,而运行阵列724对应于运行。在一实施例中,各阵列包含16个元素。对电平阵列722而言,各元素的大小包括16位具正负号的值,而对运行阵列724而言,其值为4位且不具正负号。使用下列指令分别从电平阵列722以及运行阵列724读取电平值以及运行值。
READ_LRUN DST
其中,在一实施例中,DST包括四个128位连续的暂时暂存器(例如:执行单元暂时或是共用暂存器)。上述操作读取可变长度译码单元530内的电平暂存器以及运行暂存器,并储存至目标暂存器。当此运行被读出并储存于暂时暂存器时,运行值被转换成16位不具正负号的值。举例来说,前两个暂存器维持16个16位的电平值(即阵列储存第一16个系数),而第三以及第四暂存器维持16个16位的运行值。当超过16个系数时,其被译码至存储器。在一实施例中,以下列顺序写入值:在第一暂存器中,最低有效16位包含LEVEL[0]值,而位16-31包含LEVEL[1]值等,直到位112-127包含LEVEL[7]值。接着,对第二暂存器对而言,最低有效16位包含LEVEL[8]等。相同的方法应用在RUN值。
根据下列示范指令格式,可使用CLR_LRUN指令来清除电平阵列722以及运行阵列724的暂存器。
上述可变长度译码单元530b的软件(着色程序)以及硬件操作(例如模块),特别是CAVLC模块582,可使用下列伪码来描述。
Residual_block_cavlc(coeffLevel,maxNumCoeff){ |
CLR_LEVEL_RUN |
coeff_token |
if(TotalCoeff(coeff_token)>0){ |
if(TotalCoeff(coeff_token)>10 &&TrailingOnes(coeff_token)<3) |
suffixLength=1 |
Else |
suffixLength=0 |
CAVLC_level0(); |
for(I=TrailingOnes(coeff_taken);I<TotalCoeff(coeff_token);i++){ |
CAVLC_levelCode(levelCode,suffixLength); |
CAVLC_level(suffixLength,i,levelCode) |
} |
CAVLC_ZerosLeft(ZerosLeft,maxNumCoeff) |
for(i=0;i<TotalCoeff(coeff_token)-1;i++){ |
CAVLC_run(i,ZerosLeft) |
READ_LEVEL_RUN(level,run) |
run[TotalCoeff(coeff_token)-1]=zerosLen |
coeffNum=□1 |
for(i=TotalCoeff(coeff_token)-1;i>=0; i--){ |
coeffNum+=run[i]+1 |
coeffLevel[coeffNum]=level[i] |
} |
} |
} |
MPEG译码
以上已描述用作CABAC译码(经由CABAC模块580的可变长度译码单元530a)以及CAVLC译码(经由CAVLC模块582的可变长度译码单元530b)的译码***200,接下来将描述译码***200的MPEG实施例,于此称为可变长度译码单元530c。可变长度译码单元530c是根据由MPEG模块578(图5C所显示)所执行的运算而操作。为了简化,与CABAC以及CAVLC实施例共有的特征(包括位流缓冲器以及对应的指令)被省略,除了下列其他需要注意的部分。INIT指令设置可变长度译码单元530进入MPEG模式,以及使用READ、NPSTR、INPTRB(解释于前文)以及VLC_MPEG2指令的混合以译码MPEG-2位流。由着色器程序判断使用何种方法。MPEG-2位流具有全决定文法(fullydeterministic grammar),且着色码执行用以解密文法的方法。
在一实施例中,对MPEG-2处理而言,实施表格以霍夫曼译码于MatchVLC_X函数,描述于后。因此,两指令被载入至MPEG模块578,包括INIT_MPEG2指令以及VLC_MPEG2指令。INIT_MPEG2指令载入位流并设定可变长度译码单元530进入MPEG2模式。在此模式中,当第一系数为直流(DC)时,总体暂存器614保持住值。在MPEG-2中有一或多个串流,其为相同的,但是根据是否为直流或是交流而有不同的解译。位载入至VLD_globalReGIster.InitDC暂存器被使用,而不是创造另一个指令。注意到对应于总体暂存器614(例如映射到总体暂存器614(例如globalregister[0]))的暂存器使用在CABAC以及CAVLC模式中,但是因为MPEG2模式下而有不同的解译(以及因此标示不同)。因此,在宏区块的开始,值(VLD_globalRegister.InitDC暂存器内的位)被初始化成1。当使用MatchVLC_3函数时,判断VLD_globalRegister.InitDC暂存器内的位是否为1或是0。如果为1的话,位被改变成0,以供已知宏区块后来的离散余弦变换(discrete cosine transform,DCT)符号进行译码。由着色器以及内部重置设定上述值。在实体部分,VLD_globalRegister.InitDC位为旗标值,其传送被译码的DCT符号是否为已知宏区块的DCT符号的开始。
MPEG模块578使用一具有符号的非常特定文法进行译码,其中上述符号是使用限定数量的霍夫曼表格所译码。在具有特定符号值的着色器内执行文法的分析,其中特定符号值是使用具有#Imm16值使用于特定霍夫曼表格的VLC MPEG2指令所得到,其应该被使用以译码特定符号。
在描述可变长度译码单元530c的不同元件之前,用以实施MPEG-2标准的不同表格的硬件以及软件结构的简单描述如下。在MPEG-2标准(ISO-IEC 13818-2(1995))中,所使用的编码被定义在表B-1至表B-15,其为MPEG-2标准所提供的已知表格。在可变长度译码单元530c的不同实施例中,一或多个表B-1至表B-15以专业硬件型式而实施,例如合成为逻辑门。根据实施方式(例如:HDTV、HDDVD等)或是所需的硬件安排,部分表格可以不用硬件方式来实施,而是可以使用其他指令(例如:将描述于后的EXP-GOL_UD指令,或是透过READ指令)来实施。举例来说,虽然表B-2、表B-3以及表B-11的逻辑门数量不大,所使用到的加法可能需要额外的多工器阶段,其意味有关速度以及延迟。在部分实施例中,表B-5至表B-8不由硬件所支援,因为其不需要支援设定档。然而,部分实施例可透过对效能具有最小影响的不同指令(例如:INP STR、EXP_GOL_UD以及READ指令)而提供上述支援。
继续参考已知的MPEG表格,表B-1(Macroblock_address_increment)、表B-10(motion_code)以及表B-9(coded_blocK_pattern)具有相似的结构。由于部分相似,上述三个表格可使用由MPEG模块578执行的MatchVLC函数而实施以及描述于后。对表B-9以及表B-10而言,示范的表格结构表示如下:
struct Table{
unsigned head;//表格地址的位数
struct table{
unsigned val:6;//表B-10中为5位
unsigned shv:2;//实际位数
}table[];
}Table[];
对表B-1而言,示范的表格结构表示如下:
struct Table{
unsigned head;//表格地址的位数
struct table{
unsigned val:5;
unsigned shv:3;//实际位数
}table[];
}Table[];
在下面功能中,只有SHL运算能从SREG暂存器562a移除数据。不像着色器的READ指令,使用在MatchVLC函数的READ功能能从SREG暂存器562a移除位而不需要从SREG暂存器562b移除任何位。 面描述使用在MPEG-2中实施表格的MatchVLC函数以提供作为霍夫曼译码。
FUNCTION MatchVLC_1{
T=READ(2); //读取2位
SHL(2);
CASE(T){
00:OUTPUT(1);
01:OUTPUT(2);
10:{
Q=READ(1);
SHL(1);
CASE(Q){
0:OUTPUT(0);
1:OUTPUT(3);
}
}
11:{
Idx=CLO(sREG);//计算前导1
Idx=min(Idx,7);
shv=(Idx!=7)Idx+1:Idx;
SHL(shv);
OUTPUT(4+Idx);
}
}
FUNCTION MatchVLC_2{
T=READ(2);//读取2位
SHL(2);
CASE(T){
00:OUTPUT(0);
01:OUTPUT(1);
10:OUTPUT(2);
11:{
Idx=CLO(sREG);//计算前导1
Idx=min(Idx,8);
shv=(Idx!=8)Idx+1:Idx;
SHL(shv);
OUTPUT(3+Idx);
}
}
FUNCTION MatchVLC_3{
INIT_MB DC=TRUE;
T=CLZ(sREG);
SHL(T+1);
CASE(T){
0:IF(DC){
DC=FALSE;
Q=READ(1);
SHL(1);
OUTPUT({0,SGN(Q)*1});}
ELSE{
Q=READ(1);
IF(!Q){OUTPUT({63,0}); shv=1}//EOB
ELSE{R=READ(1);OUTPUT({0,SGN(R)*1});shv=2}
SHL(shv);
}
1:{
Q=READ(3);
CASE(Q){
1XX:OUTPUT({1,SGN(Q[1])*1}); shv=2;
01X:OUTPUT({2,SGN(Q[0])*1}); shv=3;
00X:OUTPUT({0,SGN(Q[0])*2}); shv=3;
}
SHL(shv);
}
2:{
Q=READ(2); SHL(2);
CASE(Q){
00:{
R=READ(4);
CASE(R){
000X:OUTPUT({16,S GN(R[0])*1});
001X:OUTPUT({5,S GN(R[0])*2});
010X:OUTPUT({0,S GN(R[0])*7});
011X:OUTPUT({2,S GN(R[0])*3});
100X:OUTPUT({1,SGN(R[0])*4});
101X:OUTPUT({15,SGN(R[0])*1});
110X:OUTPUT({14,SGN(R[0])*1});
111X:OUTPUT({4,SGN(R[0])*2});
}
Shv=4;
}
01X:SGN=READ(1); OUTPUT({0,SGN*3}); shv=1;
10X: SGN=READ(1); OUTPUT({4,SGN*1}); shv=1;
11X: SGN=READ(1); OUTPUT({3,SGN*1}); shv=1;
}
SHL(shv);
}
3:{
Q=READ(3);
CASE(Q){
00X:OUTPUT({7,SGN(Q[0])*1});
01X:OUTPUT({6,SGN(Q[0])*1});
10X:OUTPUT({1,SGN(Q[0])*2});
11X:OUTPUT({5,SGN(Q[0])*1});
}
SHL(3);
}
4:{
Q=READ(3);
CASE(Q){
00X:OUTPUT({2,SGN(Q[0])*2});
01X:OUTPUT({9,SGN(Q[0])*1});
10X:OUTPUT({0,SGN(Q[0])*4});
11X:OUTPUT({8,SGN(Q[0])*1});
}
SHL(3);
}
5:Q=READ(19); OUTPUT({Q[18:13],Q[12:0]});
6:{
Q=READ(4);
CASE(Q){
000X:OUTPUT({16,SGN(Q[0])*1});
001X:OUTPUT({5,SGN(Q[0])*2});
010X:OUTPUT({0,SGN(Q[0])*7});
011X:OUTPUT({2,SGN(Q[0])*3});
100X:OUTPUT({1,SGN(Q[0])*4});
101X:OUTPUT({15,SGN(Q[0])*1});
110X:OUTPUT({14,SGN(Q[0])*1});
111X:OUTPUT({4,SGN(Q[0])*2});
}
SHL(4);
}
7, 8, 9, 10, 11:JVLC(TableC[T]);
}
}
FUNCTION MatchVLC_4{
T=CLZ(sREG);
SHL(T+1);
CASE(T){
0:{
Q=CLO(sREG);
R=min(Q,7);
shv=(R!=7)R+1:R;
SHL(shv);
CA SE(R){
0:S=READ(1); OUTPUT({0, S GN(S)*1});shv=1;
1:S=READ(1); OUTPUT({0,SGN(S)*2});shv=1;
2:{
R=READ(2); SHL(2);
CASE(R){
0X:OUTPUT({0,SGN(R[0])*4});
1X:OUTPUT({0,SGN(R[0])*5});
}
}
3:{
R=READ(3); SHL(3);
CASE(R){
00X:OUTPUT({9,SGN(R[0])*1});
01X:OUTPUT({1,SGN(R[0])*3});
10X:OUTPUT({10,SGN(R[0])*1});
11X:OUTPUT({0,SGN(R[0])*8});
}
}
4:{
R=READ(3);
CASE(R){
0XX:OUTPUT({0,SGN(R[0])*9});shv=2;
10X:OUTPUT({0,S GN(R[0])*12}); shv=3;
11X:OUTPUT({0,SGN(R[0])*13}); shv=3;
}
SHL(shv);
}
5::{
R=READ(2); SHL(2);
CASE(R){
0X:OUTPUT({2,SGN(R[0])*3});
1X:OUTPUT({4,SGN(R[0])*2});
}
}
6:S=READ(1); OUTPUT({0,SGN(S)*14});shv=1;
7:S=READ(1); OUTPUT({0,S GN(S)*15});shv=1;
}
SHL(shv);
}
1:{
Q=READ(2); SHL(2);
CASE(Q){
0X:OUTPUT({1,SGN(Q[0])*1});
10:OUTPUT({63,0});//<EOB>
11:R=READ(1);SHL(1);OUTPUT(0,SGN(R)*3});
}
}
2:{
Q=READ(2); SHL(2);
CASE(Q){
00:{
R=READ(4); shv=4;
CASE(R){
000X:OUTPUT({1,SGN(R[0])*5});
001X:OUTPUT({11,SGN(R[0])*1});
010X:OUTPUT({0,SGN(R[0])*11});
011X:OUTPUT({0,SGN(R[0])*10});
100X:OUTPUT({13,SGN(R[0])*1});
101X:OUTPUT({12,SGN(R[0])*1});
110X:OUTPUT({3,SGN(R[0])*2});
111X:OUTPUT({1,SGN(R[0])*4});
}
}
01:R=READ(1); OUTPUT({2,SGN(R)*1});shv=1;
10:R=READ(1); OUTPUT({1,SGN(R)*2});shv=1;
11:R=READ(1); OUTPUT({3,SGN(R)*1});shv=1;
}
SHL(shv);
}
3:{
Q=READ(3); SHL(3);
CASE(Q){
00X:OUTPUT({0,SGN(Q[0])*7});
01X:OUTPUT({0,SGN(Q[0])*6});
10X:OUTPUT({4,SGN(Q[0])*1});
11X:OUTPUT({5,SGN(Q[0])*1});
}
}
4:{
Q=READ(3);SHL(3);
CASE(Q){
00X:OUTPUT({7,SGN(Q[0])*1});
01X:OUTPUT({8,SGN(Q[0])*1});
10X:OUTPUT({6,SGN(Q[0])*1});
11X:OUTPUT({2,SGN(Q[0])*2});
}
}
5:Q=READ(19); OUTPUT({Q[18:13],Q[12:0]});
6:{
Q=READ(2); SHL(2);
CASE(Q){
00:R=READ(1); OUTPUT({5,SGN(R)*2});shv=1;
01:R=READ(1); OUTPUT({14,SGN(R)*1});shv=1;
10:{
R=READ(2); shv=2;
CASE(R){
0X:OUTPUT({2,SGN(R[0])*4});
1X:OUTPUT({16,SGN(R[0])*1});
}
}
11:R=READ(1); OUTPUT({15,SGN(R)*1});shv=1;
}
SHL(shv);
}
7, 8, 9, 10, 11:JVLC(TableC[T]);
}
}
从上面MatchVLC函数注意到,通常已译码的最低有效位会决定值的正负号,如此可使用SGN功能来检查,其描述如下:
FUNCTION SGN(R){RETURN(R==1)?-1∶1;}更注意到对MatchVLC_3以及MatchVLC_4而言,表格为共同的(或是至少为一超集),因此可使用下面表格来存取功能。
FUNCTION JVLC(Table){
Q=READ(5);
SHL(5);
{R,L}=Table[Q];
RETURN{R,L};
}
到MatchVLC的接口,或者应该说MatchVLC_X(其中X等于1、2等)函数为下列指令:
VLC_MPEG2 DST, #Imm16,其中,使用#Imm16值以选择适当的表格,且因此以译码特定语法成分。使用#Imm16作为表格的索引(例如:0、1、2、3)而从指令存取表格。#Imm16的值以及对应方法、语法成分以及MPEG-2表格的关系描述于下面表5。
表5
#Imm16 | 方法 | 语法成分 | MPEG-2VLC表 |
0 | MatchVLC(B-1,7) | Macroblock_address_increment | B-1 |
1 | MatchVLC(B-9,8) | Coded_block_pattern | B-9 |
2 | MatchVLC(B-10,6) | Motion_code | B-10 |
3 | MatchVLC_1 | Dct_dc_size_luminance | B-12 |
4 | MatchVLC_2 | Dct_dc_size_chrominance | B-13 |
5 | MatchVLC_3 | DCT coefficients(Table 0) | B-14 |
6 | MatchVLC_4 | DCT coefficients(Table 1) | B-15 |
EXP-GOLOMB译码
已描述用作CABAC译码(经由CABAC模块580的可变长度译码单元530a)、CAVLC译码(经由CAVLC模块582的可变长度译码单元530b)以及MPEG译码(经由MPEG模块578的可变长度译码单元530c)的译码***200,接下来将描述译码***200的EXP-Golomb实施例,于此称为可变长度译码单元530d。可变长度译码单元530d根据EXP-Golomb模块584(图5C所显示)的运算而操作。可变长度译码单元530d使用如CABAC及CAVLC实施例所使用的相同硬件以及相同位流缓冲器排列。因此,与CABAC以及CAVLC实施例共有的特征被省略,除了下列需要注意的部分。在描述可变长度译码单元530d之前,先提出有关EXP-Golomb的简单描述。
在EXP-Golomb中,数据包含字首(prefix)以及字尾(suffix)格式,显示如下:
codeNum范围
1 0
0 1 x0 1-2
0 0 1 x1 x0 3-6
0 0 0 1 x2 x1 x0 7-14
0 0 0 0 1 x3 x2 x1 x0 15-30
0 0 0 0 0 1 x4 x3 x2 x1 x0 31-62
… …
因为多数的码字较短,有压缩被获得。再者,多数的码字为唯一并且容易译码。在H.264中,有四种EXP-Golomb编码方法使用:不具正负号一元(Unary)、正负号以及映射(码字被映射至表格)。这些方法用以编码已编码的宏区块图型以及截短(truncate)。在可变长度译码单元530d中,提供单一指令以执行如下面表6所显示不同型式的EXP-Golomb码的译码。截短EXP-Golomb译码描述如下。
表6
进一步解释这些指令,EXP_GOL OMB_UD指令译码一元编码的编码符号。EXP_GOL OMB_SD指令译码具正负号的一元编码的编码符号。如表6所显示,对EXP_GOLOMB_SD指令而言,当k=0时,在正0以及负0之间没有差别,因此传回的值为0。EXP_GOLOMB_MD(SRC1)指令译码映射编码符号,其中SRC1=Type,其与宏区块参数以及coded_block_pattern有关。Type的值会导致下列coded_block_parameter:
Type=0→Intra 4×4
Type=1→Inter
可使用表格(例如:芯片上存储器或是远端存储器内的表格)以根据宏区块预测模式(例如:码数量、k)而指定值给coded_block_parameter。
译码截短Exp-Golomb符号的EXP-Golomb指令更描述如下:
EXP_GOLOMB_TD DST, SRC1
其中,SRC1为范围。至少在一实施例中,执行截短Exp-Golomb编码时,需要先知道范围。接着,截短Exp-Golomb编码可被推导如下:
codeNum=EXP_GOLOMB_TD(range){
else if(range==1)return READ(1)^1;
else return EXP_GOLOMB_UE;
}
因此,EXP_GOLOMB_D指令被提供。
解释运算码以及驱动-发出软件指令之间的差异是有用的。通常,当设计ISA时,至少有两个影响在工作上:(1)让指令译码器较简单以及在单一管线阶段中完成(即快速);以及(2)让程序设计师助记(mnemonics)较简单。参考五种EXP-Golomb基准的运算,从使用者的观点来看这些运算为有区别的。再者,有两种不同格式:全部EXP-Golomb基准的运算输出相同值,但是只有部分运算具有一输入(除了内含在运算中的位流),其提供至少一基本区别。传统上,CPU指令不具有隐含输入,但是却透过运算包括隐含输入。然而,位流不经由运算而揭露,但是却是内部自动管理以及使用INIT指令进行初始。
从硬件的观点,可使用EXP-GOLOMB-UD的相同硬件的相同核心(或是至少)以及有关核心硬件的小加法来执行全部的其他EXP-GOLOMB-UD运算(例如在软件内相似于CASE/SWITCH的部分)。因此编译器/翻译器可映射全部的运算至单一指令。再者,这些运算为固定(例如运算不会动态改变)。参考下面表7的pseudonym行,注意到对EXP-GOLOMB-UD以及EXP-GOLOMB-SD运算,SRC1可以被加入(或是由核心所忽略),具有机制用以区别这些运算。同样地,注意到没有单一来源指令分组存在,但是可被映射至暂存器-立即分组。通过使用如表7所显示不同指令的明显立即数目,可以得到这些指令之间的区别,因此导致只有一个主要/次要运算码而不是五个,其包括一个有意义的储存。即只有一个次要运算码被使用因为可使用立即格式指令,以及通过编码带有适当数据的立即数据栏位并指定Pseudonym可完成不同EXP_Golomb指令之间的区别。
EXP_GOLOMB_D Dst, #Type, Src l.lane
其中经由下列表7可决定#Type:
表7
#Type | Pseudonym | 指令 |
0×0 | EXP_GOLOMB_UD Dst | EGOLD Dst,0×0,Src1 |
0×1 | EXP_GOLOMB_SD Dst | EGOLD Dst,0×1,Src1 |
0×2 | EXP_GOLOMB_TD Dst,Src1 | EGOLD Dst,0×2,Src1 |
0×3 | EXP_GOLOMB_MD Dst,Src1 | EGOLD Dst,0×3,Src1 |
0×4 | EXP_GOLOMB_CD Dst,Src1 | EGOLD Dst,0×4,Src1 |
进一步解释表7,对#type=0×0或是#type=0×1而言,没有Src1栏位是需要的,以及不需要指定这些指令至另一主要或是次要运算码群组,因为可指定虚拟(dummy)Src或是Src以及Dst可被标示为相同。
EXP-Golomb编码符号被编码成如下图所显示(例如包括0或是多个引导0、跟随着1,以及然后是对应于引导0的数量的一些位):
codeNum范围
1 0
0 1 x0 1-2
0 0 1 x1 x0 3-6
0 0 0 1 x2 x1 x0 7-14
0 0 0 0 1 x3 x2 x1 x0 15-30
0 0 0 0 0 1 x4 x3 x2 x1 x0 31-62
… …
这些位如何被解释是根据特定Golomb型式而定(这里是根据H.264的三种型式以及AVS的第四型式)。使用UD以及SD(不具正负号以及正负号)计算逻辑单元来计算值。例如,当位流为0001010时,则UD的值为(1<<3)-1+2=9,而SD的值为(-1)^10*ceil(9/2)=+5。CD也发生相似的程序。然而,对MD而言,表单查找被执行(例如当UD编码时,对值作译码,接着使用此值做为索引进入表格,传回6位的值(在表格中储存成6位的值,但是传回值是从0延伸至暂存器的宽度))。在一实施例中有两表格,一表格为Intra编码而另一表格为Inter编码。
上述指令转换如何被使用在EXP-Golomb译码的内容中的例子,可通过H.264片段标头部分译码的示范伪码显示如下。
sliceHeaderDecode:
EXP_GOLOMB_UD firstMBSlice
EXP_GOLOMB_UD sliceType
EXP_GOLOMB_UD picParameterSetID
READ frameNum,Nval
IB_GT frameMbsOnlyFlag,ZERO, $Label1
READ fieldPicFlag,ONE
IB_EQ fieldPicFlag, ZERO, $Label1
READ bottomFieldF lag,ONE
Label1:
ISUBI t1,#5,nalUnitType
IB_NEQ ZERO,t1,$Label2
EXP_GOLOMB_UD idrPicID
Label2:
IB_NEQ ZERO, picOrderCntType, $Label3
READ picOrderCntLSB,Nvalt
Label3:
ICMPI_EQ p1,ONE,fieldPicFlag
[p1]MOV nfieldPicFlag,ZERO
[!p1]MOV nfieldPicFlag,ONE
AND t1,picOrderPresentFlag,nfieldPicFlag
B_NEQ ONE,t1,$Label4
EXP_GOLOMB_SD deltapicOrderCntBottom
Label4:
转换至sliceHeaderDecode:
EGOLD firstMBSlice,#0,ZERO
EGOLD sliceType,#0,ZERO
EGOLD picParameterSetID,#0,ZERO
READ frameNum,Nval
IB_GT frameMbsOnlyFlag,ZERO, $Label1
READ fieldPicFlag, ONE
IB_EQ fieldPicFlag,ZERO, $Label1
READ bottomFieldFlag,ONE
Label1:
ISUBI t1,#5,nalUnitType
IB_NEQ ZERO,t1,$Label2
EGOLD idrPicID,#0,ZERO
Label2:
IB_NEQ ZERO,picOrderCntTyPe, $Label3
READ picOrderCntLSB,NValt
Label3:
ICMPI_EQ p1,ONE,fieldPicFlag
[p1]MOV nfieldPicFlag, ZERO
[!p1]MOV nfieldPicFlag,ONE
AND t1,picOrderPresentFlag,nfieldPicFlag
B_NEQ ONE,t1,$Label4
EGOLD deltaPicOrderCntBottom,#1,ZERO
VC-1译码
已描述用作CABAC译码(经由CABAC模块580的可变长度译码单元530a)、CAVLC译码(经由CAVLC模块582的可变长度译码单元530b)、MPEG译码(经由MPEG模块578的可变长度译码单元530c)以及EXP-Golomb译码(经由EXP-Golomb模块584的可变长度译码单元530d)的译码***200,接下来将描述译码***200的VC-1实施例,于此称为可变长度译码单元530e。可变长度译码单元530e根据计算前导1模块574、计算前导0模块576的运算而操作。VC-1使用霍夫曼编码且具有更多表格。代替建立以及测试这些表格,既然位率需要较低,但是验证成本较高,必要的表格被载入至邻近内容存储器564。表格格式相同于MPEG-2所使用,而使用READ、VLC_CLZ、VLC_CLO以及INP STR指令以译码位流。例如,使用下列伪码可执行特定表格:
//TABLE-I Picture CBPCY VLC TABLE
VLC_CLZ DST0,#8
CASE DST0
0:VALUE=0; BREAK;//USE MOVL
1:VLC_CLZ DST1#5
CASE DST1
1:T=READ(2);
CASE T
0:VALUE=48;BREAK;
1:VALUE=56;BREAK;
2:GO20;BREAK;
3:VALUE=1;BREAK;
CASE_END
2:VALUE=2;BREAK;
3:VLC_CLO DST2,#5
CASE DST2
0:VALUE=28;BREAK;
1:VALUE=22;BREAK;
2:VALUE=43;BREAK;
3:VALUE=30;BREAK;
4:VALUE=41;BREAK;
5:VALUE=49;BREAK;
CASE_END
4:T=READ(1);VALUE=(T)?(READ(1)?31:54):27;
BREAK;
5:VALUE=6;BREAK;
CASE_END
2:VLC_CLZ DS1#4
CASE DST1
1:VALUE=3;BREAK;
2:T=READ(1);VALUE=(T)?19:36;BREAK;
3:T=READ(2);
CASE T
0:VALUE=38;BREAK;
1:VALUE=47;BREAK;
2:VALUE=59;BREAK;
3:VALUE=5;BREAK;
CASE_END
4:VALUE=7;BREAK;
CASE_END
3:T=READ(1);VALUE=(T)?16:8;BREAK;
4:T=READ(1);VALUE=(T)GO10?:12;BREAK;
5:VALUE=20;BREAK;
6:VALUE=44;BREAK;
7:T=READ(1);VALUE=(T)?33:58;BREAK;//USE SEL??
8:VALUE=15;BREAK;
CASE_END
GO10:
INPSTR S1,#3
READ_NCM S2,#0,off+S1>>2
VALUE=S2 & 0×63;
Q=(S2>>6)& 0×3;
READ S0,Q
RETURN;
GO20:
INPSTR S1,#4
READ_NCM S2,#0,off+s1>>2
VALUE=S2 & 0×63;
Q=(S2>>6)& 0×3;
READ S0,Q
RETURN;
在部分实施例中,可用分支指令代替CASE叙述。因此,和MPEG-2一样的VC-1具有容易定义的文法。文法中的符号具有特定方法(表格),其可被执行成着色器,如上述编码所显示。
以上所述仅为本发明较佳实施例,然其并非用以限定本发明的范围,任何熟悉本项技术的人员,在不脱离本发明的精神和范围内,可在此基础上做进一步的改进和变化,因此本发明的保护范围当以本申请的权利要求书所界定的范围为准。
附图中符号的简单说明如下:
100:图形处理器*** 102:显示装置
104:显示接口单元 106:局部存储器
110:存储接口单元 114:图形处理单元
118:PCI-E总线接口单元 122:芯片组
124:***存储器 126:中央处理单元
128:驱动软件 200:译码***
202:图形处理器 204:计算核心
206:执行单元集合控制以及顶点/串流快取单元
208:图形管线 302:纹理过滤单元
304:像素包装器 306:命令流处理器
308:写回单元 310:纹理地址产生器
402:执行单元输 412:执行单元集合
404a:执行单元偶输出 404b:执行单元奇输出
406:存储器存取单元 408:L2快取存储器
410:存储器接口仲裁器
504:指令快取存储器控制器
506:执行绪控制器 508:缓冲器
510:共用暂存器文件 512:执行单元数据路径
514:执行单元数据路径FIFO
516:述词暂存器文件 518:纯量暂存器文件
520:数据输出控制器 524:执行绪任务接口
526:暂存器文件 530:可变长度译码单元
532:向量浮点单元
534:向量整数计算逻辑单元
536:特殊目的单元 540:暂存器文件
562:SREG串流缓冲器/DMA引擎
562a:SREG暂存器 562b:位流缓冲器
564:邻近内容存储器
568:读取邻近内文存储器模块
570:检查字串模块 572:读取模块
574:计算前导1模块 576:计算前导0模块
578:MPEG模块 580:CABAC模块
582:CAVLC模块 584:Exp-Golomb模块
602:状态索引 604:高可能性符号值
606:码长范围 608:码长偏移量
612:局部暂存器 614:总体暂存器
616:二进制字串暂存器 620:二进制化模块
622:取得内容模块
624:二进制计算译码引擎
628:目标
630:SRC2
632:SRC1
634:共用以及执行绪信息
636:延迟/重置 638:地址
640:数据 650:存储器模块
654:二进制索引 710:系数符记模块
712:电平码模块 714:电平模块
716:电平0模块 718:零电平模块
720:运行模块 722:电平阵列
724:运行阵列
Claims (20)
1.一种译码***,其特征在于,包括:
一软件可编程核心处理单元,具有一可变长度译码单元,用以执行一着色器,上述着色器系选择性地执行一视频串流的一译码步骤以输出一译码数据,其中上述视频串流根据多个编码方法编码而得,且上述译码步骤使用软件以及硬件的一组合而执行。
2.根据权利要求1所述的译码***,其特征在于,上述译码步骤于一图形处理单元的内容编程内,透过执行于上述图形处理单元数据路径的硬件以及于一位流缓冲器中,用以自动管理的额外硬件而完成,以及其中上述多个编码方法包括内容适应二进制算术编码、内容适应可变长度编码、EXP-Golomb、动画专家群以及VC-1的至少二者。
3.根据权利要求2所述的译码***,其特征在于,对应于用以适应二进制算术译码的可变长度译码单元更包括:
一二进制化模块,用以接收包括一语法成分以及一内容区块种类的一第一信息,以及,对应于由上述二进制化模块所执行的上述着色器的一第一指令而根据用于上述内容模型的上述第一信息而提供对应于一或多个宏区块参数的一第二信息;
一得到内容模块,用以接收上述第二信息,以及,对应于由上述得到内容模块所执行的上述着色器的一第二指令而提供用于二进制译码的一二进制以及内容识别信息,其中上述内容识别信息对应于一高可能性符号或是一低可能性符号机率;以及
一二进制计算译码模块,用以接收上述二进制、上述内容识别信息、一偏移量以及一范围,以及,对应于由上述二进制计算译码模块所执行的上述着色器的一第三指令而译码一二进制符号。
4.根据权利要求3所述的译码***,其特征在于,更包括一内容存储器阵列,用于基于内容的译码以及对应的暂存器,其中上述内容存储器阵列包括一目前宏区块以及一邻近宏区块单元,其中对应于由上述得到内容模块所执行的上述着色器的一第五指令,上述得到内容模块用以根据包含由上述暂存器至上述内容存储器阵列的数值转换的布林逻辑运算而写入至上述内容存储器阵列。
5.根据权利要求1所述的译码***,其特征在于,上述可变长度译码单元更包括一二进制字串暂存器,用以接收一译码过的二进制符号并提供更新过的内容信息。
6.根据权利要求5所述的译码***,其特征在于,上述二进制字串暂存器用以接收表示一译码过的语法成分的多个二进制符号。
7.根据权利要求1所述的译码***,其特征在于,对应于用于适应可变长度译码的可变长度译码单元更包括:
一系数符记模块,用以接收宏区块信息,以及,对应于上述着色器的一第六指令而提供一拖尾系数以及一非零系数的信息;
一电平模块,用以接收上述拖尾系数信息以及一电平码信息,以及,对应于上述着色器的一第七指令而提供一字尾长度信息以及一电平索引信息,其中上述电平索引信息为递增;
一电平码模块,用以接收上述字尾长度信息,以及,对应于上述着色器的一第八指令而提供上述电平码信息至上述电平模块;
一电平0模块,用以接收上述拖尾系数信息,以及,对应于上述着色器的一第九指令,提供一第二电平索引信息至一电平阵列,其中上述第二电平索引信息为递增;
一零电平模块,用以接收上述总系数信息以及系数信息的一最大值,以及,对应于上述着色器的一第十指令而提供一零剩余信息以及一重置值至一第一多工器以及一第二多工器;以及
一运行模块,用以分别接收来自上述第一多工器以及第二多工器的上述零剩余信息以及第二电平索引信息,以及,对应于上述着色器的一第十一指令而提供一运行索引至一运行阵列。
8.根据权利要求7所述的译码***,其特征在于,上述电平阵列以及上述运行阵列用以对应于上述着色器的一第十二指令而提供一译码过的电平值以及一译码过的运行值。
9.根据权利要求7所述的译码***,其特征在于,上述电平阵列以及上述运行阵列对应于上述着色器的一第十三指令而被清除。
10.根据权利要求1所述的译码***,其特征在于,上述可变长度译码单元更用以使用一指令中的位数而决定是否使用储存于一内部暂存器的一前一运算的一结果,或是在一来源运算元的一数据应使用于在一或多个模块的一目前运算。
11.根据权利要求1所述的译码***,其特征在于,上述可变长度译码单元更包括一直接存储器存取引擎模块,包括一位流缓冲器以及一直接存储器存取引擎,上述直接存储器存取引擎用以对应于每片段的上述着色器的一指令的执行而于一既定数量的位数被使用时,重复地且自动地在上述位流缓冲器缓冲上述既定数量的位数,上述位数对应于上述视频串流。
12.根据权利要求11所述的译码***,其特征在于,上述可变长度译码单元更用以对应于在上述位流缓冲器中的预期向下溢位而延迟上述直接存储器存取引擎模块。
13.根据权利要求11所述的译码***,其特征在于,上述直接存储器存取引擎更用以追踪在上述位流缓冲器中所使用的位数,以及对应于上述位数大于一既定数量的侦测而停止上述位流缓冲器运算,并转换控制至一主机处理器。
14.根据权利要求1所述的译码***,其特征在于,对应于用于MPEG-2译码的上述可变长度译码单元更包括:
一MPEG模块,用以使用一或多个MatchVLC函数以执行MPEG标准表格,每一上述一或多个MatchVLC函数对应于一个别语法成分,上述表格选择依据上述着色器的一指令。
15.根据权利要求14所述的译码***,其特征在于,上述MatchVLC函数系至少部分以硬件来执行。
16.根据权利要求1所述的译码***,其特征在于,对应于用于EXP-Golomb译码的上述可变长度译码单元更包括:
一EXP-Golomb模块,用以使用一单一运算码执行多个EXP-Golomb运算,每一上述多个EXP-Golomb运算使用在一着色器指令中的一立即数据栏位值的个别值来加以区别。
17.根据权利要求1所述的译码***,其特征在于,对应于用于VC-1译码的上述可变长度译码单元用以选择性地载入VC-1表格至一内容存储器阵列,其中上述译码系根据上述选择性载入的表格。
18.一种图形处理单元,其特征在于,耦接至一主机处理器以及存储器,上述图形处理单元包括:
一图形处理器,具有一软件可编程核心处理单元,上述软件可编程核心处理单元包括一或多个执行单元,上述一或多个执行单元包括执行单元数据路径硬件,上述执行单元数据路径硬件包括一可变长度译码单元,上述可变长度译码单元用以执行一着色器,上述着色器选择性地执行一视频串流的译码步骤以输出一译码数据,其中上述视频串流根据多个编码方法编码而得。
19.根据权利要求18所述的图形处理单元,其特征在于,上述译码步骤系于一图形处理单元的内容编程内,透过执行于上述图形处理单元数据路径的硬件以及于一位流缓冲器中,用以自动管理的额外硬件而完成,以及其中上述多个编码方法包括内容适应二进制算术编码、内容适应可变长度编码、EXP-Golomb、动画专家群以及VC-1的至少二者。
20.根据权利要求18所述的图形处理单元,其特征在于,更包括具有与上述可变长度译码单元类似结构的一或多个额外可变长度译码单元,其中上述可变长度译码单元以及上述一或多个额外可变长度译码单元用以同步地译码多视频串流。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US81182106P | 2006-06-08 | 2006-06-08 | |
US60/811,821 | 2006-06-08 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101072353A true CN101072353A (zh) | 2007-11-14 |
CN101072353B CN101072353B (zh) | 2013-02-20 |
Family
ID=38899303
Family Applications (4)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200710126453 Pending CN101087411A (zh) | 2006-06-08 | 2007-06-08 | 译码方法 |
CN 200710110295 Active CN101072349B (zh) | 2006-06-08 | 2007-06-08 | 内容适应性可变长度编码的解码***与方法 |
CN 200710110297 Active CN101072350B (zh) | 2006-06-08 | 2007-06-08 | 译码***及其译码方法 |
CN 200710126452 Active CN101072353B (zh) | 2006-06-08 | 2007-06-08 | 译码***以及图形处理单元 |
Family Applications Before (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200710126453 Pending CN101087411A (zh) | 2006-06-08 | 2007-06-08 | 译码方法 |
CN 200710110295 Active CN101072349B (zh) | 2006-06-08 | 2007-06-08 | 内容适应性可变长度编码的解码***与方法 |
CN 200710110297 Active CN101072350B (zh) | 2006-06-08 | 2007-06-08 | 译码***及其译码方法 |
Country Status (2)
Country | Link |
---|---|
CN (4) | CN101087411A (zh) |
TW (4) | TWI348653B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101577629B (zh) * | 2009-05-14 | 2011-05-25 | 北京邮电大学 | 组播网络中基于图着色的编码向量动态分配方法 |
CN103037213A (zh) * | 2011-09-28 | 2013-04-10 | 晨星软件研发(深圳)有限公司 | 布林熵解码器及影像播放***的布林熵解码方法 |
CN105426259A (zh) * | 2014-09-16 | 2016-03-23 | 辉达公司 | 用于传递api中的依赖关系的技术 |
CN105847801A (zh) * | 2015-01-30 | 2016-08-10 | 联发科技股份有限公司 | 具有新颖的二进制元素译码多标准视频译码器 |
CN106528050A (zh) * | 2015-09-10 | 2017-03-22 | 想象技术有限公司 | 尾随或前导数字预测器 |
CN107242882A (zh) * | 2017-06-05 | 2017-10-13 | 上海瓴舸网络科技有限公司 | 一种b超显示辅助设备及其控制方法 |
CN107277505A (zh) * | 2017-05-19 | 2017-10-20 | 北京大学 | 基于软硬件分区的avs‑2视频解码器结构 |
US9947084B2 (en) | 2013-03-08 | 2018-04-17 | Nvidia Corporation | Multiresolution consistent rasterization |
TWI674558B (zh) * | 2018-06-12 | 2019-10-11 | 財團法人工業技術研究院 | 數值陣列資料影像處理裝置、數值陣列資料影像處理方法及色碼表產生方法 |
CN110458120A (zh) * | 2019-08-15 | 2019-11-15 | 中国水利水电科学研究院 | 一种复杂环境下不同车型识别方法及*** |
CN111028135A (zh) * | 2019-12-10 | 2020-04-17 | 国网重庆市电力公司电力科学研究院 | 一种图像文件修复方法 |
Families Citing this family (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8156410B2 (en) * | 2008-03-05 | 2012-04-10 | Himax Technologies Limited | Fast debugging tool for CRC insertion in MPEG-2 video decoder |
US8686921B2 (en) * | 2008-12-31 | 2014-04-01 | Intel Corporation | Dynamic geometry management of virtual frame buffer for appendable logical displays |
CN101908200B (zh) * | 2009-06-05 | 2012-08-08 | 财团法人资讯工业策进会 | 具电源闸控功能的绘图处理***及方法 |
US8681162B2 (en) * | 2010-10-15 | 2014-03-25 | Via Technologies, Inc. | Systems and methods for video processing |
GB2488159B (en) * | 2011-02-18 | 2017-08-16 | Advanced Risc Mach Ltd | Parallel video decoding |
US9378560B2 (en) | 2011-06-17 | 2016-06-28 | Advanced Micro Devices, Inc. | Real time on-chip texture decompression using shader processors |
US9231616B2 (en) * | 2011-08-05 | 2016-01-05 | Broadcom Corporation | Unified binarization for CABAC/CAVLC entropy coding |
TWI590649B (zh) | 2011-11-08 | 2017-07-01 | 三星電子股份有限公司 | 視訊之算術解碼裝置 |
EP2831720A4 (en) * | 2012-03-30 | 2015-12-09 | Intel Corp | PREFERRING MEDIA DEVICES WITH DETERMINED FUNCTIONS |
US9451258B2 (en) | 2012-04-03 | 2016-09-20 | Qualcomm Incorporated | Chroma slice-level QP offset and deblocking |
CN106851275A (zh) * | 2012-05-29 | 2017-06-13 | 寰发股份有限公司 | 视频数据的自适应采样点偏移的处理装置及方法 |
US9196014B2 (en) * | 2012-10-22 | 2015-11-24 | Industrial Technology Research Institute | Buffer clearing apparatus and method for computer graphics |
CN103813177A (zh) * | 2012-11-07 | 2014-05-21 | 辉达公司 | 一种视频解码***和方法 |
JP6379107B2 (ja) * | 2013-05-21 | 2018-08-22 | 株式会社スクウェア・エニックス・ホールディングス | 情報処理装置並びにその制御方法、及びプログラム |
CN106959822B (zh) * | 2013-12-27 | 2020-02-07 | 威盛电子股份有限公司 | 数据储存装置及其数据写入方法 |
US9455743B2 (en) * | 2014-05-27 | 2016-09-27 | Qualcomm Incorporated | Dedicated arithmetic encoding instruction |
US10250912B2 (en) * | 2015-02-17 | 2019-04-02 | Mediatek Inc. | Method and apparatus for entropy decoding with arithmetic decoding decoupled from variable-length decoding |
CN104869398B (zh) * | 2015-05-21 | 2017-08-22 | 大连理工大学 | 一种基于cpu+gpu异构平台实现hevc中的cabac的并行方法 |
US9537504B1 (en) * | 2015-09-25 | 2017-01-03 | Intel Corporation | Heterogeneous compression architecture for optimized compression ratio |
US10467006B2 (en) * | 2015-12-20 | 2019-11-05 | Intel Corporation | Permutating vector data scattered in a temporary destination into elements of a destination register based on a permutation factor |
US10375395B2 (en) | 2016-02-24 | 2019-08-06 | Mediatek Inc. | Video processing apparatus for generating count table in external storage device of hardware entropy engine and associated video processing method |
CN106921859A (zh) * | 2017-05-05 | 2017-07-04 | 郑州云海信息技术有限公司 | 一种基于fpga的cabac熵编码方法与装置 |
CN114449277B (zh) * | 2017-12-08 | 2024-06-07 | 谷歌有限责任公司 | 用于系数代码化的上下文推导的方法和设备 |
CN109818855B (zh) * | 2019-01-14 | 2020-12-25 | 东南大学 | 一种NDN中支持pipeline模式获取内容的方法 |
CN112582009B (zh) * | 2020-12-11 | 2022-06-21 | 武汉新芯集成电路制造有限公司 | 单调计数器及其计数方法 |
US11748011B2 (en) | 2021-03-31 | 2023-09-05 | Silicon Motion, Inc. | Control method of flash memory controller and associated flash memory controller and storage device |
US11733895B2 (en) * | 2021-03-31 | 2023-08-22 | Silicon Motion, Inc. | Control method of flash memory controller and associated flash memory controller and storage device |
CN114816434B (zh) * | 2022-06-28 | 2022-10-04 | 之江实验室 | 一种面向可编程交换的硬件解析器及解析器实现方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1599049A3 (en) * | 2004-05-21 | 2008-04-02 | Broadcom Advanced Compression Group, LLC | Multistandard video decoder |
US7742544B2 (en) * | 2004-05-21 | 2010-06-22 | Broadcom Corporation | System and method for efficient CABAC clock |
KR100612015B1 (ko) * | 2004-07-22 | 2006-08-11 | 삼성전자주식회사 | 컨텍스트 적응형 이진 산술 부호화 방법 및 그 장치 |
US7800620B2 (en) * | 2004-11-05 | 2010-09-21 | Microsoft Corporation | Optimizing automated shader program construction |
-
2007
- 2007-06-08 TW TW096120896A patent/TWI348653B/zh active
- 2007-06-08 CN CN 200710126453 patent/CN101087411A/zh active Pending
- 2007-06-08 TW TW96120728A patent/TWI354239B/zh active
- 2007-06-08 TW TW96120899A patent/TWI344795B/zh active
- 2007-06-08 TW TW96120726A patent/TWI428850B/zh active
- 2007-06-08 CN CN 200710110295 patent/CN101072349B/zh active Active
- 2007-06-08 CN CN 200710110297 patent/CN101072350B/zh active Active
- 2007-06-08 CN CN 200710126452 patent/CN101072353B/zh active Active
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101577629B (zh) * | 2009-05-14 | 2011-05-25 | 北京邮电大学 | 组播网络中基于图着色的编码向量动态分配方法 |
CN103037213A (zh) * | 2011-09-28 | 2013-04-10 | 晨星软件研发(深圳)有限公司 | 布林熵解码器及影像播放***的布林熵解码方法 |
CN103037213B (zh) * | 2011-09-28 | 2016-02-17 | 晨星软件研发(深圳)有限公司 | 布林熵解码器及影像播放***的布林熵解码方法 |
US9947084B2 (en) | 2013-03-08 | 2018-04-17 | Nvidia Corporation | Multiresolution consistent rasterization |
CN105426259A (zh) * | 2014-09-16 | 2016-03-23 | 辉达公司 | 用于传递api中的依赖关系的技术 |
US9727392B2 (en) | 2014-09-16 | 2017-08-08 | Nvidia Corporation | Techniques for render pass dependencies in an API |
CN105426259B (zh) * | 2014-09-16 | 2019-08-06 | 辉达公司 | 用于传递api中的依赖关系的方法和介质 |
US10205957B2 (en) | 2015-01-30 | 2019-02-12 | Mediatek Inc. | Multi-standard video decoder with novel bin decoding |
CN105847801A (zh) * | 2015-01-30 | 2016-08-10 | 联发科技股份有限公司 | 具有新颖的二进制元素译码多标准视频译码器 |
CN105847801B (zh) * | 2015-01-30 | 2019-02-26 | 联发科技股份有限公司 | 具有新颖的二进制元素译码多标准视频译码器 |
CN106528050A (zh) * | 2015-09-10 | 2017-03-22 | 想象技术有限公司 | 尾随或前导数字预测器 |
CN106528050B (zh) * | 2015-09-10 | 2022-04-22 | 想象技术有限公司 | 尾随或前导数字预测器 |
US11669305B2 (en) | 2015-09-10 | 2023-06-06 | Imagination Technologies Limited | Trailing or leading digit anticipator |
CN107277505A (zh) * | 2017-05-19 | 2017-10-20 | 北京大学 | 基于软硬件分区的avs‑2视频解码器结构 |
CN107277505B (zh) * | 2017-05-19 | 2020-06-16 | 北京大学 | 基于软硬件分区的avs-2视频解码器装置 |
CN107242882A (zh) * | 2017-06-05 | 2017-10-13 | 上海瓴舸网络科技有限公司 | 一种b超显示辅助设备及其控制方法 |
TWI674558B (zh) * | 2018-06-12 | 2019-10-11 | 財團法人工業技術研究院 | 數值陣列資料影像處理裝置、數值陣列資料影像處理方法及色碼表產生方法 |
US10965839B2 (en) | 2018-06-12 | 2021-03-30 | Industrial Technology Research Institute | Device and method for processing image array data, and color table generation method thereof |
CN110458120A (zh) * | 2019-08-15 | 2019-11-15 | 中国水利水电科学研究院 | 一种复杂环境下不同车型识别方法及*** |
CN111028135A (zh) * | 2019-12-10 | 2020-04-17 | 国网重庆市电力公司电力科学研究院 | 一种图像文件修复方法 |
CN111028135B (zh) * | 2019-12-10 | 2023-06-02 | 国网重庆市电力公司电力科学研究院 | 一种图像文件修复方法 |
Also Published As
Publication number | Publication date |
---|---|
TW200809689A (en) | 2008-02-16 |
TW200803526A (en) | 2008-01-01 |
TWI428850B (zh) | 2014-03-01 |
TWI348653B (en) | 2011-09-11 |
CN101072349A (zh) | 2007-11-14 |
TW200821982A (en) | 2008-05-16 |
CN101072349B (zh) | 2012-10-10 |
TWI344795B (en) | 2011-07-01 |
CN101072353B (zh) | 2013-02-20 |
CN101072350A (zh) | 2007-11-14 |
CN101072350B (zh) | 2012-12-12 |
TWI354239B (en) | 2011-12-11 |
CN101087411A (zh) | 2007-12-12 |
TW200813884A (en) | 2008-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101072353B (zh) | 译码***以及图形处理单元 | |
US7626518B2 (en) | Decoding systems and methods in computational core of programmable graphics processing unit | |
US7626521B2 (en) | Decoding control of computational core of programmable graphics processing unit | |
US7656326B2 (en) | Decoding of context adaptive binary arithmetic codes in computational core of programmable graphics processing unit | |
US7623049B2 (en) | Decoding of context adaptive variable length codes in computational core of programmable graphics processing unit | |
US7710296B2 (en) | N-bin arithmetic coding for context adaptive binary arithmetic coding | |
CN1312938C (zh) | 用于解码可变长度编码位流的方法和设备 | |
CN104081772B (zh) | 熵编码缓冲器配置 | |
CN103119849B (zh) | 概率区间分割编码器和译码器 | |
US7884743B2 (en) | Arithmetic decoding device | |
US9001882B2 (en) | System for entropy decoding of H.264 video for real time HDTV applications | |
US7286066B1 (en) | Acceleration of bitstream decoding | |
EP3386199A1 (en) | Lossless compression method and system appled to video hard decoding | |
WO2007129508A1 (ja) | 動画像処理方法、動画像処理方法のプログラム、動画像処理方法のプログラムを記録した記録媒体及び動画像処理装置 | |
CN101753148A (zh) | 算术解码设备 | |
CN101951516A (zh) | 基于h.264/avc中cabac的并行编码实现电路及编码方法 | |
CN104581154B (zh) | 一种熵编码方法和熵编码器电路 | |
RU2265879C2 (ru) | Устройство и способ для извлечения данных из буфера и загрузки их в буфер | |
CN105306067B (zh) | 算术编码的方法和设备 | |
JP4061104B2 (ja) | コンテキストモデルによるラン・スキップカウントに基づくメモリアクセス及びスキッピング | |
CN101365131A (zh) | 适于vlsi实现的avs视频解码器变长解码的简化码表及实施方法 | |
Zhang et al. | Performance analysis and architecture design for parallel EBCOT encoder of JPEG2000 | |
CN106488245A (zh) | 用于对视频数字数据流进行解码的***和方法 | |
CN100403802C (zh) | 一种基于寄存器组的行程解码与反扫描实现方法 | |
Chen et al. | Implentation of onboard JPEG XR compression on a low clock frequency FPGA |
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 |