H.264視頻開發---代碼移植

基于DSP系統開發的視頻編解碼系統,國內幾乎都是走的移植,優化的路線,并且移植的代碼,都是開源的。畢竟花費大量的人力,物力去開發一套自己的代碼,并不見得比一些成熟的開源代碼效率更高,健壯性更好。更何況開發速度對于一個產品的發展而言,更是重要。

目前對于H.264而言,移植的代碼主要有JM,x264和T264。移植的時候,就需要對各個代碼進行測試,以確定要移植的代碼。相對而言,JM 的移植更容易,但效率比較差,如果基于科學研究,移植JM的比較多,多見于各高校的研究人員。對企業而言,考慮到實時性的要求,移植以X264和T264 居多。

將視頻編解碼移植到DSP的時候,考慮到DSP系統資源的寶貴,主要考慮的因素是系統空間,包括程序空間和數據空間,所以需要對原始的C代碼,進行評估,這就需要對于所移植的代碼有一個比較詳細的了解。代碼空間一般可以通過map文件進行估算。數據空間的估計,需要計算程序中內存的使用情況,除了 malloc申請的空間,還包括靜態數組,主要是H.264標準中的各種表格數組以及一些全局變量等等。

準備好了這些,就可以開始移植了,移植,也是一個考驗你的過程。

做好了移植的準備工作,就進入了開發過程的第一個重要階段---移植。

??? 移植開發的時候,最好準備兩個版本,一個純C代碼,在VC下編譯,運行,另一個是VDSP下的版本(ccs同理),VC版本主要是驗證代碼運行是否正確, VDSP版本就是移植以后的版本,兩個版本同步更新,即盡量保持兩個版本的一致性,但能夠同時在VC和VDSP下運行。在移植過程中,一般會遇到的問題如下:

?? 1.頭文件的不同,一般問題都是linux下的頭文件,在VDSP中沒有存在。最典型的就是inttypes.h 和 stdint.h,這種頭的作用主要是定義了8字符,16字符,32字符,64字符的數據類型,移植的時候,可以自己建一個頭文件或者直接在其他的頭文件中把這些數據類型的定義加進去,這樣的話,就不會出現問題。其他的類似,要么找相應的頭文件替換,要么干脆自己定義。

? 2.Int64_t和Uint64_t 的問題, 在第一步中,其實也存在這個問題, 不過我最初是用long和Unsigned long 來代替,不過這樣的話,編譯是可以通過,但仔細分析,其實是有問題的。一般來講,64位數的用途有兩個,第一種是這個數字可能比較大,當累積到一定的程度,可能超過32位,這種情況下,可以用32位代替,不過最好加上注釋,告訴自己這個數可能越界,在后面調試的時候,要提示自己注意一下。另一種用途,是開發者為了速度的要求,對一些變量復制的時候,使用了強制性的指針賦值,這種情況下,就不能直接該成32位數據了,那樣的話,雖然編譯通過,后面運行,肯定有錯誤的。這種情況下,可以使用32位數據類型,分兩條語句對變量賦值,當然,這是個時候要千萬注意,不要把地址搞錯了。

3. Inline的問題,移植以后,編譯的時候Inline經常會報錯。雖然有編譯選項可以去掉錯誤,不過你如果和我一樣不熟悉的話,直接去掉 Inline關鍵字,到后面隨著對VDSP熟悉以后,如果有優化的需要,再按照VDSP的語法,為自己想要嵌入的函數增加Inline關鍵字。

經過上面的修改,一般情況下,編譯就沒有問題了,當然,這只是移植的第一步。距離成功,還很遠!

?

1. 配置LDF文件。因為剛移植的代碼,往往數據和程序都非常大,所以,SRAM里面肯定是放不下的,這個時候,鏈接就會有問題。剛開始的時候,最好把所有的程序和數據都放在SDRAM里面去,這樣的,鏈接就不會有問題了。Stack和heap情況類似,開始的時候,都先放到SDRAM。開始的時候,你需要的是一個可以運行正確的程序,速度倒在其次。

2.Malloc的問題。DSP下的開發,malloc都是一個需要解決的問題。動態申請內存,就算可以運行,結果往往也是不對的。所以,最好進行靜態分配,用數組的形式分配,這樣做的好處是可以方便自己管理,那些數組多大,放在那里,自己都很清楚,因為優化的時候,有一些是要放在SRAM中,另外一些特別大的才放在SDRAM中,這樣才能取的比較好的效果,另外,靜態數組也穩定性一些,不需要記著去釋放。

3.文件操作。在VDSP的SETTING下,有一個STDIO的開關,其實可以支持文件操作,但是我調試的時候發現,有些情況下是有問題的。比如我在一個循環中使用fread,但是他只有第一次的讀取是有效的,但有些時候,它好像又可以。所以,你調試的時候,如果發現結果和VC下運行的不同,可以重點看看,是不是這里出了問題。

4.調試跟蹤。經過上面的準備,程序已經可以運行了。你可以在Simulator下仿真,或者板子上直接仿真。在SI下,速度會很慢,不過 Sesion里面,有一個blackfin family那個sision,速度還可以,當然,有板子會更好。我們開發的時候,我使用板子的時間總共不到兩個月,所以浪費了很多時間,現在回頭看看,好心痛。

調試結果OK了的話,說明移植已經成功了。就可以進入下一個最主要的階段---優化了


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454411.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django REST framework 源碼解析

先放圖,放圖說話,可能有點長 主流程 這個顏色 從setting導入默認數據流程是 這個顏色 主流程大概流程寫一下:as_view 實際返回view,并把參數{"get":"list","post":"create"}傳遞給view…

-9 逆序輸出一個整數的各位數字_leetcode兩數相加(大整數相加)

題目來源于leetcode第二題兩數相加。題目描述給出兩個非空的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式存儲的,并且它們的每個節點只能存儲一位數字。如果,我們將這兩個數相加起來,則會返回一個新的鏈表來…

計算機如何添加管理員權限,電腦使用代碼如何添加管理員權限

我們在使用電腦運行某些軟件的時候,可能需要用到管理員權限才能運行,通常來說直接點擊右鍵就會有管理員權限,但最近有用戶向小編反饋,在需要管理員權限的軟件上點擊右鍵沒有看到管理員取得所有權,那么究竟該如何才能獲…

mysql選擇數據庫創建數據庫

MySQL 選擇數據庫 在你連接到 MySQL 數據庫后,可能有多個可以操作的數據庫,所以你需要選擇你要操作的數據庫。 從命令提示窗口中選擇MySQL數據庫 在 mysql> 提示窗口中可以很簡單的選擇特定的數據庫。你可以使用SQL命令來選擇指定的數據庫。 實例 以下…

英語面試技巧以及準備工作

如果你提前知道了電話面試的時間,則可以在面試時把簡歷、coverletter放在你旁邊的桌子上,直接運用里面的句子回答問題。一些基本的問題,你可以事先準備好答案。通常,在電話英語面試的時候會提道:  please tell me som…

sql注入問題

${}拼接sql,會引起sql注入,sql注入例如: select * from user where name like ‘%’ or 11 or ‘%’; 這種情況下,論name為什么都可以執行 轉載于:https://www.cnblogs.com/mengyinianhua/p/7649325.html

Python 面向對象之雙下方法,內置函數

isinstance和issubclass isinstance(obj,cls) # 檢查是否obj是否是類 cls 的對象 class Foo(object):passobj Foo()isinstance(obj, Foo) # ture issubclass(sub, super) # 檢查sub類是否是 super 類的派生類 class Foo(object):passclass Bar(Foo):passissubclass…

teechart繪制實時曲線_快速學會CAD繪制傳輸線路圖紙

一工具CAD工程設計軟件二方法和步驟萬事開頭難,遇到不懂的知識剛開始都有畏難的情緒,只要有決心學習,誠心想學會一項技能,那學會學好它就只是時間問題了。我們常常面臨時間緊、需要快速入門甚至熟練地解決工作中實際情況的問題&am…

彝文計算機,試論計算機彝文字符編碼的轉換.pdf

試論計算機彝文字符編碼的轉換.pdf第17卷 第1期 云南民族大學學報(自然科學版) V01.17 No.12008年1月 Journal of Yunnan Nationalities University(Natural Sciences Edition) Jan.2o08試論計算機彝文字符編碼的轉換李金發(紅河學院人文學院…

ActiveMQ(07):ActiveMQ結合Spring開發--建議

1、Camel框架支持大量的企業集成模式,可以大大簡化集成組件間的大量服務和復雜的消息流。而Spring框架更注重簡單性,僅僅支持基本的最佳實踐。 2、Spring消息發送的核心架構是JmsTemplate,隔離了像打開、關閉Session和Producer的繁瑣操作&…

使用ajax獲取用戶所在地的天氣

1.要獲取用戶歸屬地的天氣&#xff0c;首先得獲取用戶所在的市區&#xff0c; 這里先獲取用戶的IP&#xff0c;通過IP獲取IP的歸屬地&#xff0c;從而得到用戶 地址。 獲取客戶端ip: js: <scripttype"text/javascript" src"http://pv.sohu.com/cityjson?ieu…

Python 之協程

之前我們學習了線程、進程的概念&#xff0c;了解了在操作系統中進程是資源分配的最小單位,線程是CPU調度的最小單位。按道理來說我們已經算是把cpu的利用率提高很多了。但是我們知道無論是創建多進程還是創建多線程來解決問題&#xff0c;都要消耗一定的時間來創建進程、創建線…

ip變換器蘋果系統_加密鎖能為高鐵做什么?鐵路電力變換器系統告訴您

代表國之重器的高鐵&#xff0c;是怎樣保護他們在軟件上投資的專有技術不被仿冒、逆向工程和篡改呢&#xff1f;與一般的軟件保護加密不同&#xff0c;高鐵運行中的實時控制器對物理環境有著嚴苛的要求&#xff0c;如鐵路電力變換器系統&#xff0c;須滿足典型工業應用的擴展溫…

華為服務器ibmc怎么裝系統,華為服務器安裝操作系統

《華為服務器安裝操作系統》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《華為服務器安裝操作系統(11頁珍藏版)》請在人人文庫網上搜索。1、華為服務器安裝操作系統 1把網線接到服務器管理口上&#xff0c;2288服務器管理口在服務器背后中下 部位置&#xff0c;有Mg…

英語面試(自我介紹,電話面試..)

大凡找工作的人&#xff0c;都有對面試的擔心&#xff0c;而英語面試最令人頭痛。面試氣氛總是緊張的&#xff0c;一緊張就容易出錯&#xff0c;中文“臺詞”都會結巴&#xff0c;何況英語&#xff01; 可俗話說&#xff0c;養兵千日&#xff0c;用兵一時&#xff0c;學了那么多…

服務端渲染與 Universal React App

隨著 Webpack 等前端構建工具的普及&#xff0c;客戶端渲染因為其構建方便&#xff0c;部署簡單等方面的優勢&#xff0c;逐漸成為了現代網站的主流渲染模式。而在剛剛發布的 React v16.0 中&#xff0c;改進后更為優秀的服務端渲染性能作為六大更新點之一&#xff0c;被 React…

zxing .net 多種條碼格式的生成

下載地址&#xff1a;http://zxingnet.codeplex.com/ zxing.net是.net平臺下編解條形碼和二維碼的工具&#xff0c;使用非常方便。 本文主要說明一下多種類型條碼的生成。 適用的場景&#xff0c;標簽可視化設計時&#xff0c;自定義條碼類型&#xff0c;預覽。 遍歷zxing支持的…

k8s dashboard_windows10 部署 docker+k8s 集群

下面是經過踩坑之后的 windows10 單機部署 docker k8s 步驟&#xff0c;其中有幾處比較關鍵的地方需要注意&#xff0c;后面加粗標注&#xff0c;下面就開始吧&#xff01;0、下載cmder在 windows 上有一個趁手的命令行工具非常有必要&#xff0c;推薦 Cmder&#xff0c;下面是…

Python 之網絡編程基礎

套接字&#xff08;socket&#xff09;初使用 基于TCP協議的socket tcp是基于鏈接的&#xff0c;必須先啟動服務端&#xff0c;然后再啟動客戶端去鏈接服務端 server端 import socket sk socket.socket() sk.bind((127.0.0.1,8898)) # 把地址綁定到套接字 sk.listen() …

ajax on ture,細數Ajax請求中的async:false和async:true的差異

實例如下&#xff1a;function test(){var temp"00";$.ajax({async: false,type : "GET",url : userL_checkPhone.do,complete: function(msg){alert(complete);},success : function(data) {alert(success);tempdata;temp"aa";}});alert(temp);…