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了的話,說明移植已經成功了。就可以進入下一個最主要的階段---優化了。

移植搞好了以后,就可以進行優化了,優化是一個長期的,枯燥的,但很有挑戰性的工作。做優化,你要熟悉blackfin的匯編指令,熟悉H.264標準,熟悉你所移植的代碼結構,在優化過程中,的確是很枯燥的,需要你很有耐性,經常會因為一個小小的錯誤,讓你跟蹤幾天甚至幾星期,但是,當你看到隨著你工作的不斷進展,程序需要的cycle數越來越少,還是很有成就感的。

在blackfin上做優化,最主要的工作可以分為:

1.系統結構優化。

2.匯編優化。

3 cache和DMA優化。

一個好的優化程序,這幾個方面肯定都會涉及。至于各自所起的作用,我沒有詳細測試。系統結構優化和匯編優化可以先進行。等做到一定程度了,再進行cache和DMA的優化。


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

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

相關文章

SublimeText2 快捷鍵

SublimeText2 快捷鍵,與對應功能一覽表: 快捷鍵功能ctrlshiftn打開新Sublimectrlshiftw關閉Sublime,關閉所有打開文件ctrlshiftt重新打開最近關閉文件ctrln新建文件ctrls保存ctrlshifts另存為ctrlf4關閉文件ctrlw關閉ctrlk, ctrlb切換側邊欄顯…

java-linux-eclipse配置

轉載于:https://www.cnblogs.com/sheying/p/8327517.html

n皇后問題java_經典n皇后問題java代碼實現

問題描述:在n*n的二維表格,把n個皇后在表格上,要求同一行、同一列或同一斜線上不能有2個以上的皇后。例如八皇后有92種解決方案,五皇后有10種解決方案。public class TestQueen {int n; //皇后的個數int num 0; // 記錄方案數int…

ffmpeg mplayer x264 代碼重點詳解 詳細分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 顯而易見...,注意a,b宏表達式可能引出的副作用 2 SIMD by software…

nagios監控服務器的搭建

nagios 概述: 開源的免費的網絡監視工具。 監控: windows, Linux,Unix,交換機和路由器。報警。 Nagios是插件式的結構,它本身沒有任何監控功能,所有的監控都是通過插件進行的,因此其是高度模塊化和富于彈性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜歡鉆研問題的JS同學,最近又迷上了對加密方法的思考。一天,他突然想出了一種他認為是終極的加密辦法&#…

java棧頂元素_棧在Java類庫中的實現

棧是一種后進先出的數據結構。在它之上,主要有三種操作:(1)判斷棧是否為空——empty();(2)在棧頂添加一個元素——push(E);(3)刪除并返回棧頂元素——pop()。在Java類庫中,Stack類實現了棧,它繼承自Vector類…

LoadRunner遠程監測Centos服務性能配置過程

由于公司的需要,經過一段時間的探索,參考了很多業內人士的文檔,終于完成LoadRunner遠程監測centos服務器的配置過程。 首先監測所需要服務是否存,如果存在就不必要安裝,如果不存在,需要安裝對應的服務。 監…

day 68 增刪改查 語法

1 普通正則 2 分組正則 url(r/blog/(\d)/(\d),views.blog) blog(request,arq1,arq2) 按照位置傳參 3 分組命名 url(r/blog/(?P<year>\d)/(?P<month>\d),views.blog) blog(request,year,month) 4 用name 指定別名 url(r/blog/(?P<year>\d)/(?P…

編譯器入門 語法分析器 java_從零開始寫個編譯器吧 - Parser 語法分析器

Parser(語法分析器)的編寫相對于 Tokenizer (詞法分析器)要復雜得多&#xff0c;因此&#xff0c;在編寫之前可能也會鋪墊得更多一些。當然&#xff0c;本系列旨在“寫出”一個編譯器&#xff0c;所以理論方面只會簡單介紹 tao 語言所涉及的部分。之前的幾章中&#xff0c;我純…

017——數組(十七) asort ksort rsort arsort krsort

<?php /*** 數組 asort ksort rsort arsort krsort*///asort()對數組按值排序&#xff0c;保留鍵名&#xff1a; /*$arrarray(bbs_url>bbs.lantian.com,web_url>www.lantian.com,bbs_name>免費視頻教程,www_name>PHP項目開發, ); asort($arr); print_r($arr);…

v4l打開video設備 ,執行VIDIOC_DQBUF,出現Resource temporarily unavailable 問題

如果你在執行VIDIOC_DQBUF突然提示以下錯誤&#xff1a; error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打開設備文件的造成的。 Resource temporarily unavailable是一種EAGAIN的錯誤。EAGAIN是較常見的一種錯誤(比如用在非阻塞操作…

ubuntu下無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)

sudo apt-get install git E: 無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用) E: 無法鎖定管理目錄(/var/lib/dpkg/)&#xff0c;是否有其他進程正占用它&#xff1f; 當執行sudo apt-get相關的命令&#xff0c;會顯示上面類似的錯誤 參考別人的解決方法是 sudo r…

java get方法不序列化_Java中的Json序列化,不容忽視的getter

在開發的過程中&#xff0c;經常會碰到和自己預期不一樣的情況。有的時候自己去研究一下還是很有趣的。這兩天在寫java web的時候&#xff0c;碰到了一個對象序列化的問題。問題重現public class AjaxJson {private boolean success;private String msg;private Object obj;pri…

mysql 通過echo的方式寫入數據庫 中文亂碼解決方案

echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" | MYSQL echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" 前面增加 set names utf8;

getParameter和getAttribute的區別

轉自http://blog.csdn.net/java_xiaobin/article/details/45363897 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string&#xff1b;attribute得到的是object 3.request.getParameter()方法傳遞的數據&#xff0c;會從Web客戶端傳到Web服務器…

java int字母,從Java中獲取int,也包含字母

How can I get the int value from a string such as 423e - i.e. a string that contains a number but also maybe a letter?Integer.parseInt() fails since the string must be entirely a number.解決方案Unless youre talking about base 16 numbers (for which theres …

Spring-data-jpa常用方法

轉載于:https://www.cnblogs.com/summary-2017/p/7904926.html

面試問題匯總 精選 分析 解答 職業規劃 part 1

C/C/C#面試題精選&#xff08;1&#xff09; 題目&#xff08;一&#xff09;&#xff1a;C中我們可以用static修飾一個類的成員函數&#xff0c;也可以用const修飾類的成員函數&#xff08;寫在函數的最后表示不能修改成員變量&#xff0c;不是指寫在前面表示返回值為常量&am…

java byte md5_Java開發網 - byte[]按自定義編碼轉換成String(MD5)

差不多了&#xff0c;這樣應該就可以了&#xff0c;剩下的就是擴展能接受的類型了。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HashPasswords {public String getPassword(byte[] input) {byte[] digest;synchronized (…