一種基于uvd的hevc視頻解碼方法
【技術領域】
[0001]本發明涉及視頻解碼領域,特別涉及一種基于UVD的HEVC視頻解碼方法。
【背景技術】
[0002]DirectShow是針對基于微軟Windows平臺的流媒體應用的框架,能完美提供高質量的多媒體流的數據采集和回放處理。它能為常見的高性能多媒體應用如文件播放器、TV和DVD播放器、視頻編輯軟件、格式轉換器、音視頻采集軟件、解碼器、編碼器、數字信號處理器等提供完美的解決方案。DirectShow支持豐富的流媒體數據格式和壓縮格式,包括 ASF、MPEG、AV1、MP3、WAV 音頻文件等,和 ACC、DV、H.264、MJPEG-1、MPEG-2 等壓縮格式。DirectShow的出現,一方面幫助簡化了多媒體應用開發過程中涉及的播放、格式轉換、捕獲等任務;同時它還提供了可定制的解決方案來訪問底層流媒體架構,開發人員甚至還可以通過創建自己的DirectShow組件來支持不同的新格式和定制處理效果。
[0003]高效率視頻編碼(High Efficiency Video Coding,簡稱HEVC)是一種視頻壓縮標準,被視為是ITU-T H.264/MPEG-4AVC標準的繼任者。2004年開始由IS0/IEC MovingPicture Experts Group (MPEG)和 ITU-T Video Coding Experts Group (VCEG)作為 ISO/IEC 23008-2MPEG-H Part 2 或稱作 ITU-T H.265 開始制定。第一版的 HEVC/H.265 視頻壓縮標準在2013年4月13日被接受為國際電信聯盟(ITU-T)的正式標準。HEVC被認為不僅提升視頻質量,同時也能達到H.264/MPEG-4AVC兩倍之壓縮率(等同于同樣畫面質量下比特率減少了 50 % ),可支持4K分辨率甚至到超高清電視(UHDTV),最高分辨率可達到8192 X 4320 (8K分辨率)。HEVC能夠顯著減少文件的存儲和分發成本,為更高清晰度的內容進入消費層應用鋪平了道路。
[0004]FFmpeg是一個集錄制、轉換、音視頻編解碼功能為一體的、完整的開源解決方案,采用LGPL或GPL許可證,包含了非常先進的音視頻編解碼庫libavcodec。FFmpeg是音視頻編解碼領域的權威項目,其中對于HEVC解碼,其提供了軟件解碼方法和基于DXVA2的硬件加速解碼方法。開源項目LAVFilters將FFmpeg的大部分解碼功能封裝為DirectShowFilter。軟件解碼方法雖通用性和兼容性較好,但其解碼效率和CPU計算資源占用較高;而硬件解碼方法雖解碼效率相對較高,但對圖像數據傳輸有特殊要求,其通用性和兼容性較差。
【發明內容】
[0005]本發明的目的在于克服現有技術的缺點與不足,提供一種基于UVD的HEVC視頻解碼方法,針對Windows桌面系統進行設計,基于DirectShow系統將HEVC視頻解碼功能封裝為一個 DirectShow Filter。
[0006]本發明的目的通過以下的技術方案實現:
[0007]—種基于UVD的HEVC視頻解碼方法,包含以下順序的步驟:
[0008]利用AMD Media SDK 1.1對AMD異構計算平臺中的UVD視頻硬解碼模塊進行調用,將接收到的HEVC視頻數據進行解析和處理后投放到UVD中,同時不斷從UVD中獲取解碼后圖像并推送出去。
[0009]所述的UVD視頻硬解碼模塊為基于UVD的HEVC解碼功能的DirectShow Filter,DirectShow Filter 命名為 UVD HEVC Decoder,屬于 Transform Filter,其具有一個輸入Pin和一個輸出Pin,主媒體類型均為視頻流MEDIATYPE_Video ;在爪0) HEVC Decoder中,輸入Pin暫時僅接受HEVC視頻的兩種媒體類型(MEDIASUBTYPE_HEVC和MEDIASUBTYPE_HVC1)的上游輸出Pin與之連接,輸出Pin僅提供MEDIASUBTYPE_NV12 —種媒體類型的輸出Pin連接;UVD HEVC Decoder的整體對外功能為接收從上游Filter輸入的HEVC視頻流,并將其解碼為YUV 4:2:0圖像數據的NV12格式碼流,輸出到下游Filter中。
[0010]所述的UVD HEVC Decoder 繼承自 DirectShow Filter 的基類庫中 CtransformFilter,利用其中的輸入和輸出Pin實現Pin的連接和數據傳輸和其他DirectShow Filter基本功能的實現,數據傳輸方式屬于Push模式。
[0011 ] 所述的利用AMD Media SDK 1.1對AMD異構計算平臺中的UVD視頻硬解碼模塊進行調用,具體包含以下步驟:
[0012](1)初始化UVD:調用Media SDK相關API,創建AMF上下文和AMF HEVC硬件解碼器;之后以AMF上下文和解碼器作為初始化參數創建解碼流輸出線程;
[0013](2)將視頻流輸入到UVD:將接收到的視頻流數據封裝成AMFData類型數據,并設置時間戳信息;之后將封裝好的AMFData數據輸入到UVD解碼器中;如果解碼器中的輸入隊列已滿,則循環等待并嘗試輸入,直到將視頻流數據輸入到UVD解碼器中后返回。若解碼器中的輸入隊列已滿,則循環等待并嘗試輸入,直到將視頻流數據輸入到UVD解碼器中后返回,對上游Filter的數據傳輸起到阻塞的效果。
[0014]所述的不斷從UVD中獲取解碼后圖像并推送出去,具體如下:
[0015]A、OutputThread 類定義
[0016]OutputThread類繼承AMFThread 類,AMFThread類的定義與實現在 AMD Media SDK的示例代碼中通用類集中。OutputThread類中有三個指針成員屬性,將用來分別指向AMF上下文對象和AMF解碼器對象和HEVCDecoder對象。其中成員函數Run是OutputThread對象線程啟動后會調用執行的線程計算邏輯函數。
[0017]B、解碼圖像輸出
[0018]OutputThread對象線程啟動后,其成員函數Run將會被調用執行;
[0019]在Run函數中,不斷循環訪問AMF解碼器對象指針指向的UVD解碼器,嘗試從中取出解碼圖像;如果從UVD解碼器中取出的數據非空,即成功取出解碼圖像,則將解碼圖像數據從顯存轉換到系統內存中存放,并轉換成AMFSurface類型;之后根據輸出媒體類型創建一個輸出Sample,根據解碼圖像數據中的時間戳信息設置輸出Sample的時間戳,并將解碼圖像數據從AMFSurface對象中復制填充到輸出Sample對象中;
[0020]最后將封裝好的輸出Sample對象通過輸出Pin傳輸到下游Filter中;如果從UVD解碼器中取出的數據為空,即仍未有解碼數據輸出,則循環等待并進行下一次嘗試從UVD解碼器中取出解碼數據;如果訪問UVD解碼器取出解碼數據時遇到文件結束符,并返回AMF_E0F值,則結束循環,Run函數將返回,線程將會終結。
[0021]本發明與現有技術相比,具有如下優點和有益效果:
[0022]在傳統的HEVC視頻解碼方法中,軟件解碼方法雖通用性和兼容性較好,但其解碼效率和CPU計算資源占用較高;而硬件解碼方法雖解碼效率相對較高,但對圖像數據傳輸有特殊要求,其通用性和兼容性較差。相比之下,本發明利用AMD異構計算平臺中的UVD視頻硬解碼模塊,對HEVC視頻進行高效實時解碼,并且使用了通用圖像數據傳輸方法,具有較高的HEVC解碼效率和更好的通用性和兼容性。
[0023]本發明利用AMD異構計算平臺中的UVD視頻硬解碼模塊,對HEVC視頻進行高效實時解碼,充分利用了異構計算平臺中的計算資源,降低了 CPU資源的占用和總體功耗。本專利提高了 HEVC視頻解碼的效率,支持高質量HEVC視頻的實時解碼,并且使用了通用圖像數據傳輸方法,具有更好的通用性和兼容性,對AMD異構計算平臺下的HEVC視頻解碼有重要的實踐指導價值。
【附圖說明】
[0024]圖1為UVD HEVC Decoder的功能示意圖。
[0025]圖2為UVD HEVC Decoder的輸入線程工作流程圖。
[0026]圖3為UVD HEVC Decoder的輸出線程工作流程圖。
【具體實施方式】
[0027]下面結合實施例及附圖對本發明作進一步詳細的描述,但本發明的實施方式不限于此。
[0028]—種基于UVD的HEVC視頻解碼方法,包含以下順序的步驟:
[0029]利用AMD Media SDK 1.1對AMD異構計算平臺中的UVD視頻硬解碼模塊進行調用,將接收到的HEVC視頻數據進行解析和處理后投放到UVD中,同時不斷從UVD中獲取解碼后圖像并推送出去。
[0030]具體如下:
[0031 ] (一)HEVC 視頻解碼 FiIter 設計
[0032]基于UVD 的 HEVC 解碼功能的 DirectShow Filter 命名為 “UVD HEVC Decoder”,屬于Transform Filter,具有一個輸入Pin和一個輸出Pin,主媒體類型均為視頻流MEDIATYPE_Video。如圖1,在UVD HEVC Decoder中,輸入Pin暫時僅接受HEVC視頻的兩種媒體類型(MEDIASUBTYPE_HEVC和MEDIASUBTYPE_HVC1)的上游輸出Pin與之連接,輸出Pin僅提供MEDIASUBTYPE_NV12—種媒體類型的輸出Pin連接。UVD HEVC Decoder的整體對外功能為接收從上游Filter輸入的HEVC視頻流,并將其解碼為YUV4:2:0圖像數據的NV12格式碼流,輸出到下游Fi 1 ter中。
[0033]UVD HEVC Decoder 繼承自 DirectShow Filter 的基類庫中的 Ctransform Filter,利用其中的輸入和輸出Pin實現Pin的連接和數據傳輸和其他DirectShow Filter基本功能的實現,數據傳輸方式屬于Push模式。
[0034]繼承自CTransformFilter的媒體Transform Filter的基本開發中,除了實現 CTransformFilter 中的 4