并行處理的H.264到AVS轉碼器設計

發(fā)布時(shí)間:2010-8-2 11:58    發(fā)布者:lavida
關(guān)鍵詞: AVS , 并行處理 , 轉碼器
1 引言

轉碼應用涉及視頻服務(wù)器、通用多媒體訪(fǎng)問(wèn)設備、監控系統、機頂盒、DVD等多媒體設備和系統。其基本原則是在環(huán)境和處理能力受限的情況下,在碼流轉換的質(zhì)量和復雜性之間取得最佳折衷。  

實(shí)現的關(guān)鍵是對壓縮視頻碼流中的壓縮數據進(jìn)行復用,避免重新編碼中的復雜運算。研究中的轉碼技術(shù)主要包括:碼率轉換、分辨率轉換、幀率轉換、語(yǔ)法轉換等。  

MediaCoder是目前比較優(yōu)秀的一款轉碼軟件,它將眾多來(lái)自開(kāi)源社區優(yōu)秀的音視頻軟件整合于一個(gè)友好的圖形界面。它可以直接、批量地在眾多音頻視頻壓縮格式和容器格式之間轉換,支持的格式包括H.264,Xvid,MPEG-1/2/4等,但是沒(méi)有將AVS視頻編碼標準融合進(jìn)來(lái)。本文介紹的軟件解碼器實(shí)現了H.264到AVS兩個(gè)視頻編碼標準的轉碼。針對這兩個(gè)標準的硬件轉碼器還在研發(fā)之中,上海龍晶微電子有限公司基于A(yíng)VS標準提出了國內第一款具有完全自主知識產(chǎn)權的高清電視解碼芯片DS10000。雙核技術(shù)的廣泛應用可用并行處理辦法加快速度。視頻轉碼可分為同類(lèi)視頻轉碼技術(shù)和不同類(lèi)視頻轉碼技術(shù)。  

2 像素域和變換域轉碼結構  

圖1是空域轉碼器結構框圖,將H.264碼流進(jìn)行熵解碼和反量化,然后逆DCT變換,得到像素域的像素值;根據解碼的運動(dòng)矢量和頻域殘差數據進(jìn)行運動(dòng)估計(Motion Estimation,ME),根據得到的運動(dòng)矢量進(jìn)行運動(dòng)補償(Motion Compensation,MC);再將得到的殘差數據進(jìn)行變換和量化、熵編碼形成AVS碼流。  



  




圖2是變換域轉碼器結構框圖,轉碼中不需要解得像素域的像素值,H.264碼流經(jīng)過(guò)熵解碼和反量化,在頻域中進(jìn)行補償,得到頻域中重構的HT系數值,然后由H.264中的4×4HT系數變換成AVS中的8×8HT系數,根據H.264中解碼得到的運動(dòng)矢量和HT系數值來(lái)進(jìn)行運動(dòng)估計ME,由得到的8×8HT系數值在頻域進(jìn)行誤差補償;進(jìn)行量化和熵編碼形成AVS碼流。   

3 多線(xiàn)程轉碼器設計


應用程序加載到內存中,給出一個(gè)執行點(diǎn)稱(chēng)為線(xiàn)程。線(xiàn)程是系統需要分配CPU時(shí)間的基本執行單元。單個(gè)進(jìn)程在任何時(shí)刻可包含多個(gè)線(xiàn)程,它們可同時(shí)執行進(jìn)程地址空間內的代碼。   

1) 子線(xiàn)程的創(chuàng )建與終止  

VC++應用程序的主線(xiàn)程在創(chuàng )建應用程序時(shí)生成,創(chuàng )建子線(xiàn)程可通過(guò)調用CreateThread函數創(chuàng )建,其格式:  
HANDLE = CreateThread (LPSECURITY ATTRIBUTES Ipsa,DWORD cbstack,LPTHREAD START ROUTINE lpStartAd2dr,LPVOIDlpvThreadParm,DWORD fdwCreate,LPDWORD lpIDThread);  
在本轉碼器中,子線(xiàn)程創(chuàng )建方法如下:  
slot=0; hThrds[slot]=CreateThread(NULL,0,ThreadFunc,(LPVOID)slot,0,&threadID).  

2) 轉碼器的多線(xiàn)程實(shí)現結構  

由圖1和圖2可以看出,轉碼器的解碼和編碼部分是相對獨立的。雖然在編碼端要用到解碼得到的運動(dòng)矢量、分塊模式還有頻域中的系數等信息,如果是單線(xiàn)程程序的話(huà),在編碼到這一幀時(shí),解碼程序就要停止,只有當編碼這一幀的程序執行完后,才能開(kāi)始執行下一幀的解碼程序。所以,在解碼時(shí)編碼程序停止,在編碼時(shí)解碼程序停止,這將花費大量的時(shí)間來(lái)等待。  

如果是在雙核或者多核計算機上,可采用并行處理的方法,可啟動(dòng)兩個(gè)或多個(gè)線(xiàn)程,一個(gè)解碼線(xiàn)程和一個(gè)編碼線(xiàn)程,在編碼第n幀時(shí),同時(shí)解碼第n+1幀,達到解碼和編碼同時(shí)執行的效果?紤]到對系統內存的要求,這里設置緩存區的大小為2,多線(xiàn)程轉碼器實(shí)現框架如圖3所示。  




多線(xiàn)程轉碼器執行順序如下:當解碼第n幀完成,判斷第n-1幀是否已經(jīng)編碼完成,如果沒(méi)有完成,則等待編碼第n-1幀直到它完成,如果第n-1幀已完成,則開(kāi)始解碼第n+1幀,并同時(shí)開(kāi)始編碼第n幀;當第n+1幀解碼完成時(shí),再判斷第n幀編碼是否完成,若沒(méi)完成,則等待它完成,若完成,則開(kāi)始編碼第n+1幀,然后令n=n+2,進(jìn)行循環(huán)。所以,實(shí)現了編碼和解碼并行處理,解碼當前幀和編碼前一幀是同時(shí)進(jìn)行的。

3) 多線(xiàn)程轉碼器的具體實(shí)現方法  

緩存區大小設置為2,奇數幀共用一組變量,偶數幀共用一組變量。H.264中解碼的當前幀序號用img->number表示,AVS編碼端編碼的當前幀序號用img_avs->number表示。在解碼第n+2幀時(shí),decode_slice()解碼一幀的函數前面加上判斷是否編碼完第n幀:  
if (img->number=(img_aVs->number+2))WaitForSingleObject(hThrds[0],INFINITE);  
解碼第n+2幀完成時(shí),等待編碼線(xiàn)程結束,Wait-ForSingleObjeet(hThrds[0],INFINITE),然后開(kāi)始一個(gè)新的進(jìn)程:  
slot=0;hThrds[0]=CreateThread(NULL,0,ThreadFunc,(LPVOID)slot,0,&threadID)  
在整個(gè)程序執行完之前,等待線(xiàn)程執行完以后,再結束整個(gè)轉碼程序。  

4 仿真結果  

測試序列:foreman,格式為CIF(352×288),編碼成IPPPPIPPP…,264量化系數為28,AVS端編碼的量化系數為36,編碼幀數為100幀。  

計算機配置:Intel奔騰1.6 GHz,內存1 Gbyte,Win-dows XP sp2操作系統。  




對于串行單線(xiàn)程的方式,平均轉碼一幀的時(shí)間為113.57 ms;并行多線(xiàn)程的方式,平均轉碼一幀的時(shí)間為80.19 ms。所以使用多線(xiàn)程編碼的方式,由于編碼和解碼同時(shí)執行,時(shí)間可節約41.63%,轉碼速度是單線(xiàn)程編碼方式的1.42倍。這是因為進(jìn)程調度也要花費一定時(shí)間,所以雙線(xiàn)程編碼的速度沒(méi)有達到單線(xiàn)程編碼的2倍。本文中,考慮到對存儲的要求,緩存區僅設置為2,使用的是一種乒乓式的訪(fǎng)問(wèn)策略,解碼端和編碼端在每一時(shí)刻都分別只訪(fǎng)問(wèn)一組存儲空間,不會(huì )同時(shí)訪(fǎng)問(wèn)一組存儲空間。如果把緩存區設置得更大一點(diǎn),速度將還會(huì )有大幅度的提高。
本文地址:http://selenalain.com/thread-18516-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页