TWI428850B - 解碼方法 - Google Patents

解碼方法 Download PDF

Info

Publication number
TWI428850B
TWI428850B TW96120726A TW96120726A TWI428850B TW I428850 B TWI428850 B TW I428850B TW 96120726 A TW96120726 A TW 96120726A TW 96120726 A TW96120726 A TW 96120726A TW I428850 B TWI428850 B TW I428850B
Authority
TW
Taiwan
Prior art keywords
decoding
instruction
register
module
cavlc
Prior art date
Application number
TW96120726A
Other languages
English (en)
Other versions
TW200821982A (en
Inventor
Hussain Zahid
Brothers John
Huy Bui Duc
Original Assignee
Via Tech Inc
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 Via Tech Inc filed Critical Via Tech Inc
Publication of TW200821982A publication Critical patent/TW200821982A/zh
Application granted granted Critical
Publication of TWI428850B publication Critical patent/TWI428850B/zh

Links

Landscapes

  • Image Generation (AREA)
  • Image Processing (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)

Description

解碼方法
本發明係有關於資料處理系統,特別是有關於可編程圖形處理系統以及方法。
電腦圖形是用電腦產生圖像、影像或是其他圖形或圖像資訊的一種技術。目前,許多的圖形系統是透過介面的使用而實施,例如:微軟的Direct3D介面、OpenGL等,其可在執行特定操作系統(例如:微軟的視窗系統)的電腦上對多媒體硬體(例如:圖形加速器或是圖形處理單元(graphics processing unit,GPU)提供控制。圖像或是影像的產生一般稱之為描繪成像(rendering),上述操作的細節主要是經由圖形加速器所實施。一般而言,在三維(three dimensional,3D)電腦圖形中,場景內物件表面(或容體)所表示的幾何被轉換成像素(圖像元素),並儲存在圖框緩衝器(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)。
為了滿足這些連續變化的需要,已提出了許多不同的純軟體或是純硬體解決方式,然而,已知技術皆會導致較高的庫存、立即淘汰的技術以及在設計上缺乏彈性。
本發明揭露用於圖形處理單元之多執行序平行計算核心之解碼系統以及方法。本發明提供一方法,包括:提供配置有複數指令集之一著色器,以解碼一視頻串流,其中上述視頻串流係根據複數不同編碼方法而得;載入具有上述複數指令集之一者的上述著色器至一軟體可編程核心處理單元的一可變長度解碼單元,以供上述可變長度解碼單元執行;以及藉由執行上述可變長度解碼單元的上述著色器解碼上述視頻串流。
本發明提供另一方法,包括:藉由執行一著色器解碼 一視頻串流,上述著色器是在內嵌於一可編程核心處理單元之一可變長度解碼單元內,以及上述解碼係根據複數不同編碼方法;以及提供一已解碼資料輸出。
為讓本發明之上述和其他目的、特徵、和優點能更明顯易懂,下文特舉出較佳實施例,並配合所附圖式,作詳細說明如下:
實施例:
本發明揭露解碼系統以及方法的許多實施例(其中,上述系統及方法將統稱為解碼系統)。在一實施例中,解碼系統係內嵌於圖形處理單元(graphics processing unit,GPU)之可編程、多執行序(multithread)以及平行計算核心之一或多個執行單元中。使用軟體或硬體之結合以實施解碼功能。即視訊解碼是在圖形處理單元程式設計(programming)的內容(context)以及圖形處理單元資料路徑內的硬體實施所完成。例如,在一實施例中,解碼運算或方法係由具有擴充指令集(extended instruction set)之著色器(shader)(例如:頂點著色器)、圖形處理單元的執行單元資料路徑、以及用於位元流緩衝器之自動管理的額外硬體所實施。相較於現有系統,現有系統為處理純硬體或純軟體為主的解決方式,因此會遇到於先前技術中所提到的一些問題。
在本文所描述的解碼系統中,可實施使用複數熵編碼技術之資訊解碼的編碼動作。解碼系統可根據著名之國際電信聯盟通訊標準部門(international telecommunication union telecommunication 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 signal processor,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 address remapping 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 data path,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位元之資料,但是此參數亦可隨不同實施例而改變。在第三圖的實施例中,匯流排分成兩條512位元通道,其中各通道保持四像素的128位元RGBA色彩值及128位元UVRQ紋理座標。
圖形管線208包括固定功能之圖形處理功能。回應來自驅動軟體128的命令,例如繪出三角形,則頂點資訊通過計算核心204內的頂點著色邏輯單元以實施頂點轉換。尤其是從物件空間轉換物件成為工作空間和/或螢幕空間的三角形。三角形通過計算核心204至圖形管線208的三 角形設定單元,其中圖形管線208結合基元(primitive),並亦執行已知的任務,例如:邊界盒(bounding box)產生、揀選(culling)、邊緣功能產生(edge function generation)以及三角形層級剔除(triangle level rejection)。三角形設定單元傳遞資料至圖形管線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包括具有128x128位元暫存器檔案之一讀一寫埠和一讀寫埠的八個記憶庫(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,則從最低有效位元(lest significant 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 length decoding,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、檢查字串(INPSTR)模組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讀取尾隨位元(trailing bit)的數量,並根據Exp-Golomb模式而執行計算以判斷值。
讀取鄰近內容記憶體模組568包括對應於產生位址以及請求記憶體讀取操作的邏輯電路。在記憶體讀取操作 中,從鄰近內容記憶體564讀取固定的位元數並輸出資料至目標暫存器。鄰近內容記憶體指令為從內容記憶體564讀取32位元的資料並經由多工器586傳回所讀取的值給執行單元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的輸出提供至目標暫存器以進一步處理。模組568-582的輸出亦提供至多工器588,其對應於一命令,選擇模組568-582的輸出並提供至SREG暫存器562a以作為輸入。在個別相同的運算期間,提供來自轉發、控制以及運算暫存器566的資料給CABAC模組580以及CAVLC模組582 使用。經由接收控制信號(標示為第5C圖的EXP_GOLOMB_OP)以致能Exp-Golomb模組584。Exp-Golomb模組584接收來自計算前導0(CLZ)模組576的輸入並提供輸出至多工器586。CABAC模組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編碼器可提供高效率編碼方法。這些主要符號可用較小位元/符號比例來進行編碼。編碼器持續更新進入資料的頻率統計,並適當地調整編碼演算的計算以及內容模型。具有較高可能性的二進位符號稱為高可能性符號(mostprobable 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提供的功能。指向片段資料位置的指標還包含片段資料的第一位元組(例如:RBSPbyeAddress)以及指出是位元流開始或標頭位置(例如:sREGptr)的位元偏移量指標(例如一或多個位元)。位元流的初始化將於稍後解釋。在某些實施例中,可以利用主機處理器(例如第1圖之中央處理單元126)處理外 部程序以提供圖片階段解碼以及片段標頭解碼。在部分實施例中,由於解碼系統200的編程特性,可以在任何階段中進行解碼。
參考第5C圖以及第6A圖,SREG串流緩衝器/DMA引擎562用以分別接收匯流排632以及匯流排630的匯流排SRC1值以及匯流排SRC2值,以及對應於轉發暫存器以及控制暫存器的資料。SREG串流緩衝器/DMA引擎562包含內部位元流緩衝器562b,在一實施例中可為BigEndian格式之32位元暫存器以及8個128位元(8x128)暫存器。經由驅動軟體發出如前述之初始化指令可初始設定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位元片段x 4)以紀錄位元流緩衝器562b並提供填充。在某些實施例中,可以使用單一緩衝器,不過一個循環緩衝器需要更複雜的指標計算以跟上記憶體的速度。
可以利用初始化指令來達成內部緩衝器562b的內部動作,稱為INIT_BSTR指令。在一實施例中是由驅動軟體128發出INIT_BSTR指令以及其他之後說明的指令。已知位元流位置的位元組位址及位元偏移量,INIT_BSTR指令將資料載入至內部位元流緩衝器562b並開始管理程序。對於每一次呼叫處理片段資料,將發出下列格式之指令:INIT_BSTR offset,RBSPbyteAddress
發出INIT_BSTR指令以載入資料至SREG串流緩衝器/DMA引擎562的內部緩衝器562b。SRC2暫存器提供位元組位址(RBSPbyteAddress),而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指令之格式如下:READDST,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_BSTR指令、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為1920x1080像素)。目前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可以是 4x460x16位元表(8位元給m,另外8位元給n,具正負號的值)或是其他資料結構,內容表的每一個項目包含從狀態索引暫存器602以及高可能性符號值暫存器604所存取之pStateIdx值及valMPS值。
INIT_ADE指令起始化二進位計算解碼模組624,亦稱為解碼引擎。在一實施例中,完成INIT_BSTR指令後呼叫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,#Imm16,SRC1, 其中,DST對應於目標暫存器652,而#Imm16對應16位元目前數值,以及SRC1對應於輸入暫存器SRC1。BIND指令操作的輸入包含語法成分(包含16位元目前數值Imm)以及內容區塊種類(ctxBlockCat)。語法成分可以包含任何符合H.264規格的任何語法成分型式(例如:MBTypeInI、MBSkipFlagB、IntraChromaPredMode等)。呼叫BIND指令會使得驅動軟體128從儲存在記憶體(例如:晶片上記憶體或遠端記憶體)中的表單(或其他資料結構)讀取語法成分,並取得語法成分索引(SEIdx)。語法成分索引用於存取其他表單或是資料結構以獲得如下文所描述之各巨集區塊參數。
在一實施例中,目標暫存器652包含32位元暫存器,其具有下列格式:位元0-8(ctxIdxOffset)、位元16-18(maxBinIdxCtx)、位元21-23(ctxBlockCat)、位元24-29(ctxIdxBlockOffset)、以及位元31(bypass flag)。這些數值(例如ctxIdxOffset,maxBinIdxCtx等等)會傳送至取得內容模組622當作內容模型之用。在此實施例中,任何未定義的保留位元可以是0。根據語法成分索引以及內容區塊種類的配對結果,ctxIdxBlockOffset可經由儲存於遠端或晶片上記憶體之表單或其他資料結構而取得。表一說明一非限定實施例之表單內容:
如果接收到未定義之內容區塊種類,則可變長度解碼單元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;當目前語法成分包含codedBlockPattern時,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以及得到內容資訊,在一實施例中,下面表二以及表三所顯示的資訊分別對應於結構鄰近內容記憶體564以及mbNeighCtxCurrent暫存器603的值。mbNeighCtxCurrent暫存器603包含目前巨集區塊的解碼輸出結果。在目前巨集區塊處理的最後部分,發出CWRITE指令,其複製來自mbNeighCtxCurrent暫存器603的資訊至鄰近內容記憶體564陣列內所對應的位置。之後,所複製的資訊被當作頂部鄰近值。
在一實施例中,參數codedFlagTrans被分為三部分。舉例來說,開始的4位元係有關於內容區塊種類為0或是1,而上面的4位元係有關於內容區塊種類為3或是4。上 面的4位元更可分為兩部分,較低的2位元給iCbCr=0而其他2位元給iCbCr=1。參數predMode(預測模式)具有下列三選項之一:predL0=0、predL1=1以及NiPred=2。
第6D係顯示參考表二以及表三之參數refIdx結構的一實施例。需注意到參數refIdx與使用在圖像復原之參考圖像列表之索引有關。上述結構可提供記憶體以及邏輯電路的最佳化。如圖所顯示,計算語法成分結構包括巨集區塊的頂部列609、巨集區塊分區611(如顯示的四區)、L0/L1值613以及各L0/L1值的儲存位元值Gt0(大於0)615以及儲存位元值Gt1(大於1)617。通常,需要存取頂部鄰近巨集區塊609,然而巨集區塊的底部列也是需要存取,其被分為4x4方陣的一實施例,結果產生四個mbPartition 611。對各mbPartition 611而言,L0/L1值613的消息被確定,但並非實際值。關於L0值以及L1值為1或是大於1的判斷被決定。在一實施例中,藉由儲存Gt0 615以及Gt1 617兩位元而獲得決定,其被使用於計算語法成分。
進一步簡單說明計算語法成分結構,兩個最佳化被執行。在一最佳化中,只有保持2位元(雖然參考值傳統上較大),而不需要更多位元以供可變長度解碼單元530a內計算語法成分的解碼。解碼全部的值並維持在執行單元暫存器或是記憶體(例如:L2快取記憶體)。第二最佳化只有四個元素被維持(例如兩個在頂部而兩個在左方)。四個元素為再循環,而最後的值會由CWRITE指令寫入於鄰近,其儲存在記憶體中。之後,只有16位元被維持在 mbNeighCtxCurrent暫存器603,而只有8位元被維持在mbNeighCtxLeft暫存器605以及陣列564的頂部mbNeighCtx元素601。在計算邏輯電路使用再儲存,因為解碼參考值的全部計算被較少位元的布林運算所取代。
mb_type包括如下列表四所顯示。
未顯示在第6B圖的額外暫存器可以被使用,例如mbPerLine(例如8位元,不具正負號)、mb_qp_delta(8位元,具正負號),以及mbAddrCurr(16-bit,目前巨集區塊位址)。對mbAddrCurr而言,1920x1080陣列被實施,雖然其只需要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))I SDATA需注意到一些欄位(例如: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圖,其顯示將被解碼的圖像(16x8巨集區塊且mbPerLine=16)。當解碼第35巨集區塊時(mbCurrent標記為35,而第36巨集區塊尚未被完全解碼)時,需要來自先前已解碼之上方巨集區塊(標記為19)以及左方巨集區塊(標記為34)的資料。上方巨集區塊的資訊可從mbNeighCtx[i]得到,其中i=mbCurrent%mbPerLine。因此,就這個例子而言,i=35%16,則i=3。在目前巨集區塊被解碼後,可使用CWRITE指令來更新陣列中的mbNeighCtxLeft 605以及mbNeighCtx[i]601。
當另一例子時,考慮下列: 其中,maxMB為8192而mbPerLine=120。在一實施例中,除可以藉由乘上(1/mbPerLine)而實施,其查找儲存於晶片上記憶體之表(例如120x11位元的表)。當mbCurrentAddr為13位元時,可使用13x11位元的乘法器。在一實施例中,完成乘法運算的結果、儲存上方13位元,以及執行13x7位元的乘法,藉以儲存較低13位元。最後,執行13位元的減法以決定「a」。運算的全部順序會使用到2個週期,而結果將被儲存以使用在其他運算,以及當mbCurrAddr值改變時再計算一次。
在部分實施例中,模數(modulo)運算不會被執行,反而可使用執行單元內的著色邏輯電路以提供對齊置於片段之第一線的第一mbAddrCurr值。舉例來說,上述著色邏輯電路可執行下列計算:mbAddrCurr=absoluteMbAddrCurr-n*mbPerLine。因為,部分H.264彈性巨集區塊排序(Flexibility Macroblock Ordering,FMO)模式具有一些非常複雜的鄰近結構,為了複製這些模式,可在解碼系統200的額外著色器計算左方/上方的可得性,並載入至可變長度解碼單元530a的一或多個暫存器。藉由離開載入可變長度解碼單元530a,當啟動全部H.264模式以進行符號解碼時可減少硬體的複雜性。
CWRITE指令從mbNeighCtxCurrent 603複製適當的欄位至mbNeighCtxTop[]601以及mbNeighCtxLeft[](例如陣列564的左方巨集區塊)。根據是否設定mBaffFrameFlag(MBAFF)以及目前與先前巨集區塊是否為欄位或是圖框解碼,則特定mbNeighCtxTop[]601以及mbNeighCtxLeft[]資料寫入。當(mbAddrCurr% mbPerLine==0)成立時,標記mbNeighCtxLeft 605為不可用(例如其被初始化成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,#Imm10,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.264 CAVLC程序。
已知,CAVLC程序編碼有關巨集區塊或是其位置之信號的位準(例如:大小),以及位準何時會重複(例如多少週期),以避免需要對每一位元做解碼。位元流562b接收以及分析上述資訊,其中當資訊由解碼可變長度解碼單元530b的解碼引擎使用時,緩衝器被填充。可變長度解碼單元530b藉由從已接收位元流所擷取具有位準以及運行(run)係數的巨集區塊資訊來反向編碼過程並重建信號。因此,可變長度解碼單元530b從位元流緩衝器562b接收巨集區塊資訊,並分析串流已分別得到位準以及運行係數值給位準以及運行陣列的暫時儲存器。舉例來說,位準以及運行陣列讀出對應於巨集區塊中區塊之4x4區塊的像素,接著清除位準以及運行陣列以供下一個區塊使用。依照H.264標準,軟體可根據4x4構建區塊而使用全部的巨集區塊。
現在提供有關於解碼巨集區塊資訊的一般操作,下列敘述提出在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程序,即INPSTR指令(對應於檢查字串模組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)可實施INPSTR指令:MODULE INPSTR(DST)OUTPUT[31:0]DST DST={ZE(sREGbitptr),sREG[msb:msb-15]};ENDMODULE
另一個分析位元流的指令為INPTRB指令,其檢查原始位元組序列承載(raw byte sequence payload,RBSP)尾隨位元(例如排列成位元組的位元流)。INPTRB指令提供位元流暫存器562b的讀取。INPTRB指令的示範格式描述如下:INPTRB DST。
在INPTRB運算中,沒有位元從SREG暫存器562a移除。當SREG暫存器562a的高有效位元包含例如100時,則SREG暫存器562a包含RBSP停止位元,以及位元組內剩下的位元為alignment zero bits。根據下列示範偽碼可實施INPTRB指令:MODULE INPTRB(DST)OUTPUT DST;REG[7:0]P;P=sREG[msb:msb-7];Sp=sREGbitptr;T[7:0]=(P>>sp)<<sp; DST[1]=(T==0x80)?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時的例子,其描述如下:
在偽碼(pseudo code)方面,上述表格可表示如下:Table9-5[8]={0,{{33,0}},0,{{0,0}},0,{{66,0}},2,{{2,2},{99,2},{34,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,不管是8x8像素區塊或是4x4像素區塊正在已知位置上進行處理。由驅動軟體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被當成輸入。如第7 A圖所顯示,當設定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])來指定寫入的位置。在一實施例中,係數是在子區塊(區塊為8x8)的一個4x4矩陣內,而不按照光柵(raster)順序。陣列之後轉換成4x4矩陣。換句話說,被解碼的係數位準以及運行不是光柵格式。從位準-運行資料,4x4矩陣可以被重建(但是以鋸齒形掃描順序),接著重新排列成光柵順序4x4。
從係數符記模組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,可使用下列偽碼來描述。
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位元流具有全決定文法(fully deterministic 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不由硬體所支援,因為其不需要支援設定檔。然而,部分實施例可透過對效能具有最小影響之不同指令(例如:INPSTR、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_MBDC=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}//EOBELSE{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,SGN(R[0])*1});001X:OUTPUT({5,SGN(R[0])*2});010X:OUTPUT({0,SGN(R[0])*7});011X:OUTPUT({2,SGN(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[O])*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);CASE(R){0:S=READ(1);OUTPUT({0,SGN(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,SGN(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,SGN(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表格的關係描述於下面表五。
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)格式,顯示如下:
因為多數的碼字較短,有壓縮被獲得。再者,多數的碼字為唯一並且容易解碼。在H.264中,有四種EXP-Golomb編碼方法使用:不具正負號一元(Unary)、正負號以及映射(碼字被映射至表格)。這些方法用以編碼已編碼之巨集區塊圖型以及截短(truncate)。在可變長度解碼單元530d中,提供單一指令以執行如下面表六所顯示不同型式之EXP-Golomb碼的解碼。截短EXP-Golomb解碼描述如下。
進一步解釋這些指令,EXP_GOLOMB_UD指令解碼一元編碼之編碼符號。EXP_GOLOMB_SD指令解碼具正負號之一元編碼的編碼符號。如表六所顯示,對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 x 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的部分)。因此編譯器/翻譯器可映射全部的運算至單一指令。再者,這些運算為固定(例如運算不會動態改變)。參考下面表七的pseudonym行,注 意到對EXP-GOLOMB-UD以及EXP-GOLOMB-SD運算,SRC1可以被加入(或是由核心所忽略),具有機制用以區別這些運算。同樣地,注意到沒有單一來源指令分組存在,但是可被映射至暫存器-立即分組。藉由使用如表七所顯示不同指令的明顯立即數目,可以得到這些指令之間的區別,因此導致只有一個主要/次要運算碼而不是五個,其包括一個有意義的儲存。即只有一個次要運算碼被使用因為可使用立即格式指令,以及藉由編碼帶有適當資料的立即資料欄位並指定Pseudonym可完成不同EXP_Golomb指令之間的區別。
EXP_GOLOMB_D Dst,#Type,Src1.lane,其中經由下列表七可決定#Type:
進一步解釋表七,對#type=0x0或是#type=0x1而言,沒有Src1欄位是需要的,以及不需要指定這些指令至另一主要或是次要運算碼群組,因為可指定虛擬(dummy)Src或是Src以及Dst可被標示為相同。
EXP-Golomb編碼符號被編碼成如下圖所顯示(例如包括0或是多個引導0、跟隨著1,以及然後是對應於引導0 之數量的一些位元): 這些位元如何被解釋是根據特定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 bottomFieldFlag,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_CIZ、VLC_CLO以及INPSTR指令以解碼位元流。例如,使用下列偽碼可執行特定表格://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 & 0x63;Q=(S2>>6)& 0x3;READ S0,Q RETURN; GO20:INPSTR S1,#4 READ_NCM S2,#0,off+s1>>2 VALUE=S2 & 0x63;Q=(S2>>6)& 0x3;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‧‧‧運行陣列
第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圖中解碼系統所使用的表格結構實施例之方塊圖。
100‧‧‧圖形處理器系統
102‧‧‧顯示裝置
104‧‧‧顯示介面單元
106‧‧‧局部記憶體
110‧‧‧記憶介面單元
114‧‧‧圖形處理單元
118‧‧‧PCI-E匯流排介面單元
122‧‧‧晶片組
124‧‧‧系統記憶體
126‧‧‧中央處理單元
128‧‧‧驅動軟體
200‧‧‧解碼系統

Claims (18)

  1. 一種解碼方法,包括:提供配置有複數指令集之一著色器以解碼一視頻串流,其中上述視頻串流係根據複數不同編碼方法之至少一者而得;載入具有上述複數指令集之一者的上述著色器至一軟體可編程核心處理單元的一可變長度解碼單元,以供上述可變長度解碼單元執行;以及藉由執行上述可變長度解碼單元的上述著色器解碼上述視頻串流,其中上述載入更包括初始化上述可變長度解碼單元,上述解碼係於一圖形處理單元之內容編程內,透過執行於上述圖形處理單元資料路徑之硬體以及於一位元流緩衝器中,用以自動管理之額外硬體而完成,以及其中上述複數編碼方法包括內容適應二進位算術編碼(CABAC)、內容適應可變長度編碼(CAVLC)、EXP-Golomb、動畫專家群(MPEG-2)以及VC-1之二或多者,其中上述初始化更包括:至少初始化一內容記憶體陣列、複數暫存器、複數內容表以及一解碼引擎之一;對應於解碼運算更新上述暫存器之欄位或是初始化上述暫存器之欄位,其中上述更新包括在上述暫存器以及上述內容記憶體陣列之間移動值;以及讀取上述內容記憶體陣列。
  2. 如申請專利範圍第1項所述之解碼方法,其中用以初始化之上述指令集包括至少一INIT_CTX以及INIT_ADE以供CABAC解碼、INIT_CAVLC以供CAVLC解碼、INIT_MPEG2以供MPEG-2解碼、INIT_VC-1以供VC-1解碼以及INIT_CTX或是INIT_CAVLC以供EXP-Golomb解碼,以及更包括INIT_AVS用以根據一音頻視頻標準而解碼。
  3. 如申請專利範圍第1項所述之解碼方法,其中用以移動或是初始化之上述指令集包括一CWRITE指令,而用以更新之上述指令集包括一INSERT指令,以及用以讀取之上述指令集包括一READ_NCM指令。
  4. 如申請專利範圍第1項所述之解碼方法,其中上述初始化更包括初始化一位元流緩衝器以及相關暫存器,用以接收上述視頻串流之片段,其中用以初始化上述位元流緩衝器以及相關暫存器之上述指令集包括一INIT_BSTR指令,用以載入對應於上述視頻串流之資料至上述位元流緩衝器,並開始上述位元流緩衝器以及相關暫存器之自動管理的一程序。
  5. 如申請專利範圍第4項所述之解碼方法,更包括以位元組方式排列上述位元流緩衝器之資料,其中用以以位元組方式排列之上述指令集包括一ABST指令。
  6. 如申請專利範圍第4項所述之解碼方法,更包括在解碼期間當資料被使用時,從相關暫存器讀取資料,其中用以讀取資料之上述指令集包括一READ指令。
  7. 如申請專利範圍第4項所述之解碼方法,更包括檢查上述位元流緩衝器之一位元流或是相關暫存器以供不需要執行上述位元流之特定圖型,其中用以檢查之上述指令集包括至少下列之一者:一INPSTR指令,對應於相關暫存器之檢查,以及一既定數量之最高有效位元至對應於上述檢查之一目標暫存器的一傳回;以及一INPTRB指令,對應於相關暫存器之原始位元組序列承載尾隨位元的檢查。
  8. 一種解碼方法,包括:藉由執行一著色器解碼一視頻串流,上述著色器是在內嵌於一可編程核心處理單元之一可變長度解碼單元內,以及上述解碼係根據複數不同編碼方法之至少一者;以及提供一已解碼資料輸出,以及更包括至少下列之一者:使用一指令中之位元而決定使否使用儲存於一內部暫存器之一前一運算之一結果,或是在一來源運算元之一資料應使用於在一或多個模組之一目前運算;當一既定數量的位元被使用於解碼時,重複地且自動地在一位元流緩衝器緩衝上述既定數量的位元,上述位元數係對應於上述視頻串流;延遲對應於在上述位元流緩衝器中之預期向下溢位之緩衝;以及追蹤在上述位元流緩衝器中所使用之位元數,對應於上述位元數係大於一既定數量之偵測,停止上述位元流緩 衝器運算,並轉換控制至一主機處理器。
  9. 如申請專利範圍第8項所述之解碼方法,其中上述解碼係於圖形處理單元之內容編程內,透過執行於一圖形處理單元資料路徑之硬體以及自動管理位元流緩衝器之額外硬體而完成,以及其中上述複數編碼方法包括內容適應二進位算術編碼(CABAC)、內容適應可變長度編碼(CAVLC)、EXP-Golomb、動畫專家群(MPEG-2)以及VC-1之二或多者。
  10. 如申請專利範圍第8項所述之解碼方法,其中根據CABAC之上述解碼包括:在一二進位化模組內,接收一第一資訊,包括一語法成分以及一內容區塊種類;對應於由上述二進位化模組所執行之上述著色器之一第一指令,根據用於內容模型之上述第一資訊而提供對應於一或多個巨集區塊參數的一第二資訊;在一得到內容模組內,接收上述第二資訊;對應於由上述得到內容模組所執行之上述著色器之一第二指令,提供用於二進位解碼之一二進位資訊以及一內容識別資訊,其中上述內容識別資訊對應於一高可能性符號或是一低可能性符號機率;在一二進位計算解碼模組內,接收上述二進位資訊、上述內容識別資訊、一偏移量以及一範圍;以及對應於由上述二進位計算解碼模組所執行之上述著色器之一第三指令,解碼一或多個二進位符號。
  11. 如申請專利範圍第10項所述之解碼方法,其中根據CABAC之上述解碼更包括下列之結合:接收一或多個解碼過之二進位符號在一二進位字串暫存器內,上述一或多個解碼過之二進位符號代表一解碼過之語法成分;提供更新過之內容資訊;以及寫入至一內容記憶體陣列,上述寫入係根據包含由供應上述內容記憶體之暫存器至上述內容記憶體陣列之數值轉換的布林邏輯運算。
  12. 如申請專利範圍第8項所述之解碼方法,其中根據CAVLC之上述解碼包括:在CAVLC單元之一係數符記模組內,接收一巨集區塊資訊;對應於上述著色器之一第四指令(CAVLC_TOTC),提供一拖尾係數(TrailingOnes)資訊以及一非零係數(TotalCoeff)資訊;在CAVLC單元之一位準模組內,接收上述拖尾係數資訊以及一位準碼資訊;對應於上述著色器之一第五指令(CAVLC_LVL),提供一字尾長度資訊以及一位準索引(Level[Idx])資訊;在CAVLC單元之一位準碼模組內,接收上述字尾長度資訊;以及對應於上述著色器之一第六指令(CAVLC_LC),提供上述位準碼資訊至上述位準模組。
  13. 如申請專利範圍第12項所述之解碼方法,其中上述字尾長度資訊以及上述位準索引資訊係經由一轉發暫存器以及一執行單元暫存器之一者在位準模組內被接收,其中上述位準索引資訊為遞增。
  14. 如申請專利範圍第12項所述之解碼方法,其中根據CAVLC之上述解碼更包括下列之結合:在CAVLC單元之一位準0模組內,接收上述拖尾係數資訊,以及對應於上述著色器之一第七指令(CAVLC_LVL0),提供一第二位準索引資訊至一位準陣列;在CAVLC單元之一零位準模組內,接收上述非零係數資訊以及係數資訊之一最大值;對應於上述著色器之一第八指令(CAVLC_ZL),提供一零剩餘資訊以及一重置值至一第一以及一第二多工器;在CAVLC單元之一運行模組,分別接收來自上述第一以及第二多工器之上述零剩餘資訊以及上述第二位準索引資訊;對應於上述著色器之一第九指令(CAVLC_RUN),提供一運行索引至一運行陣列;對應於上述著色器之一第十指令(READ_LRUN),分別由上述位準陣列以及上述運行陣列提供一解碼過之位準值以及一解碼過之運行值;以及對應於上述著色器之一第十一指令(CLR_LRUN),清除上述位準陣列以及上述運行陣列。
  15. 如申請專利範圍第14項所述之解碼方法,其中上述第一多工器係用以接收來自一第一轉發暫存器之上述零剩餘資訊,而上述第二多工器係用以接收來自一第二轉發暫存器之上述第二位準索引資訊。
  16. 如申請專利範圍第8項所述之解碼方法,其中根據EXP-Golomb之上述解碼包括:偵測以及追蹤在結合一位元流緩衝器之一暫存器中引導0以及引導1的數量,其中根據EXP-Golomb之上述解碼係使用一單一運算碼執行複數EXP-Golomb運算,每一上述複數EXP-Golomb運算可使用在一著色器指令中之一立即資料欄位值之個別值來加以區別,其中上述偵測以及追蹤引導0係根據一計算引導0(CLZ)指令,而上述偵測以及追蹤引導1係根據一計算引導0(CLO)指令,以及其中對應於EXP-Golomb解碼之上述著色器指令包括一EXP_GOLOMB_D指令。
  17. 如申請專利範圍第8項所述之解碼方法,其中根據MPEG-2之上述解碼包括:使用一或多個MatchVLC函數執行MPEG標準表格,每一上述一或多個MatchVLC函數對應於一個別語法成分,上述表格選擇係依據上述著色器之一指令,其中對應於MatchVLC函數之上述著色器指令包括一VLC_MPEG2指令。
  18. 如申請專利範圍第8項所述之解碼方法,其中根據VC-1之上述解碼包括:選擇性地載入VC-1表格至一內容記憶體陣列,其中上述解碼係根據上述選擇性載入之表格。
TW96120726A 2006-06-08 2007-06-08 解碼方法 TWI428850B (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US81182106P 2006-06-08 2006-06-08

Publications (2)

Publication Number Publication Date
TW200821982A TW200821982A (en) 2008-05-16
TWI428850B true TWI428850B (zh) 2014-03-01

Family

ID=38899303

Family Applications (4)

Application Number Title Priority Date Filing Date
TW96120726A TWI428850B (zh) 2006-06-08 2007-06-08 解碼方法
TW096120896A TWI348653B (en) 2006-06-08 2007-06-08 Decoding of context adaptive binary arithmetic codes in computational core of programmable graphics processing unit
TW96120899A TWI344795B (en) 2006-06-08 2007-06-08 Decoding of context adaptive variable length codes in computational core of programmable graphics processing unit
TW96120728A TWI354239B (en) 2006-06-08 2007-06-08 Decoding system unit

Family Applications After (3)

Application Number Title Priority Date Filing Date
TW096120896A TWI348653B (en) 2006-06-08 2007-06-08 Decoding of context adaptive binary arithmetic codes in computational core of programmable graphics processing unit
TW96120899A TWI344795B (en) 2006-06-08 2007-06-08 Decoding of context adaptive variable length codes in computational core of programmable graphics processing unit
TW96120728A TWI354239B (en) 2006-06-08 2007-06-08 Decoding system unit

Country Status (2)

Country Link
CN (4) CN101072350B (zh)
TW (4) TWI428850B (zh)

Families Citing this family (39)

* Cited by examiner, † Cited by third party
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
CN101577629B (zh) * 2009-05-14 2011-05-25 北京邮电大学 组播网络中基于图着色的编码向量动态分配方法
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
CN103037213B (zh) * 2011-09-28 2016-02-17 晨星软件研发(深圳)有限公司 布林熵解码器及影像播放系统的布林熵解码方法
EP2779643A4 (en) 2011-11-08 2015-09-02 Samsung Electronics Co Ltd METHOD AND DEVICE FOR VIDEO ARITHMETIC ENCODING, AND METHOD AND DEVICE FOR VIDEO ARITHMETIC DECODING
US20130307860A1 (en) * 2012-03-30 2013-11-21 Mostafa Hagog Preempting Fixed Function Media Devices
US9451258B2 (en) * 2012-04-03 2016-09-20 Qualcomm Incorporated Chroma slice-level QP offset and deblocking
KR101638720B1 (ko) * 2012-05-29 2016-07-20 미디어텍 인크. 샘플 어댑티브 오프셋 정보를 부호화하는 방법 및 장치
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 辉达公司 一种视频解码系统和方法
US9947084B2 (en) 2013-03-08 2018-04-17 Nvidia Corporation Multiresolution consistent rasterization
JP6379107B2 (ja) * 2013-05-21 2018-08-22 株式会社スクウェア・エニックス・ホールディングス 情報処理装置並びにその制御方法、及びプログラム
CN107037984B (zh) * 2013-12-27 2019-10-18 威盛电子股份有限公司 数据储存装置及其数据写入方法
US9455743B2 (en) * 2014-05-27 2016-09-27 Qualcomm Incorporated Dedicated arithmetic encoding instruction
US9727392B2 (en) 2014-09-16 2017-08-08 Nvidia Corporation Techniques for render pass dependencies in an API
US10205957B2 (en) * 2015-01-30 2019-02-12 Mediatek Inc. Multi-standard video decoder with novel bin decoding
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的并行方法
GB2542162B (en) 2015-09-10 2019-07-17 Imagination Tech Ltd Trailing or leading digit anticipator
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熵编码方法与装置
CN107277505B (zh) * 2017-05-19 2020-06-16 北京大学 基于软硬件分区的avs-2视频解码器装置
CN107242882A (zh) * 2017-06-05 2017-10-13 上海瓴舸网络科技有限公司 一种b超显示辅助设备及其控制方法
CN110710219B (zh) * 2017-12-08 2022-02-11 谷歌有限责任公司 用于系数代码化的上下文推导的方法和设备
TWI674558B (zh) * 2018-06-12 2019-10-11 財團法人工業技術研究院 數值陣列資料影像處理裝置、數值陣列資料影像處理方法及色碼表產生方法
CN109818855B (zh) * 2019-01-14 2020-12-25 东南大学 一种NDN中支持pipeline模式获取内容的方法
CN110458120B (zh) * 2019-08-15 2022-01-04 中国水利水电科学研究院 一种复杂环境下不同车型识别方法及系统
CN111028135B (zh) * 2019-12-10 2023-06-02 国网重庆市电力公司电力科学研究院 一种图像文件修复方法
CN112582009B (zh) * 2020-12-11 2022-06-21 武汉新芯集成电路制造有限公司 单调计数器及其计数方法
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
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
CN114816434B (zh) * 2022-06-28 2022-10-04 之江实验室 一种面向可编程交换的硬件解析器及解析器实现方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7742544B2 (en) * 2004-05-21 2010-06-22 Broadcom Corporation System and method for efficient CABAC clock
EP1599049A3 (en) * 2004-05-21 2008-04-02 Broadcom Advanced Compression Group, LLC Multistandard video decoder
KR100612015B1 (ko) * 2004-07-22 2006-08-11 삼성전자주식회사 컨텍스트 적응형 이진 산술 부호화 방법 및 그 장치
US7800620B2 (en) * 2004-11-05 2010-09-21 Microsoft Corporation Optimizing automated shader program construction

Also Published As

Publication number Publication date
TWI344795B (en) 2011-07-01
TWI348653B (en) 2011-09-11
TW200809689A (en) 2008-02-16
TWI354239B (en) 2011-12-11
CN101072349B (zh) 2012-10-10
CN101072353B (zh) 2013-02-20
CN101087411A (zh) 2007-12-12
TW200821982A (en) 2008-05-16
CN101072353A (zh) 2007-11-14
CN101072350A (zh) 2007-11-14
CN101072349A (zh) 2007-11-14
TW200803526A (en) 2008-01-01
TW200813884A (en) 2008-03-16
CN101072350B (zh) 2012-12-12

Similar Documents

Publication Publication Date Title
TWI428850B (zh) 解碼方法
US7626521B2 (en) Decoding control of computational core of programmable graphics processing unit
US7626518B2 (en) Decoding systems and methods in 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
US8520740B2 (en) Arithmetic decoding acceleration
USRE44923E1 (en) Entropy decoding methods and apparatus using most probable and least probable signal cases
US7710296B2 (en) N-bin arithmetic coding for context adaptive binary arithmetic coding
US9392292B2 (en) Parallel encoding of bypass binary symbols in CABAC encoder
US9001882B2 (en) System for entropy decoding of H.264 video for real time HDTV applications
US20030118114A1 (en) Variable length decoder
US6781529B1 (en) Methods and apparatuses for variable length encoding
US8749409B2 (en) Entropy decoding methods and apparatus using most probable and least probable signal cases
US6674376B1 (en) Programmable variable length decoder circuit and method
KR100731640B1 (ko) 비트스트림 처리기
Baroud et al. Architecture for parallel marker-free variable length streams decoding
XIAOHUA System-on-Chip design of a high performance low power full hardware cabac encoder in H. 264/AVC
Golston et al. C64x VelociTI. 2 extensions support media-rich broadband infrastructure and image analysis systems
Choi et al. Design of an application specific instruction set processor for a universal bitstream codec
Wu et al. Hardware-assisted syntax decoding model for software AVC/H. 264 decoders
Tian et al. Design of a CABAC Encoder