說(shuō)到一種編碼方式在芯片上作優(yōu)化,首先要做的事情就是要完全了解這個(gè)芯片,在做優(yōu)化工作之初,我先看了將近一周時(shí)間的datasheet, 而且由于我本身屬于硬件出身的人, 對這些了解的可能更深入一些, 所以這部分并沒(méi)有讓我吃苦頭,簡(jiǎn)單過(guò)了.不過(guò)即便如此說(shuō),我仍然覺(jué)得開(kāi)始優(yōu)化前必須了解DM642的基本結構,片內的通用寄存器情況,cache情況,dma情況,指令流水情況.
然后重要的就是編碼原理了, 在做優(yōu)化前我從來(lái)沒(méi)接觸過(guò)編碼, 對我來(lái)說(shuō)這個(gè)部分很陌生,用了將近一個(gè)月時(shí)間專(zhuān)門(mén)看編碼的標準和代碼, 也許很多人并沒(méi)有作這部分工作, 但我覺(jué)得這部分時(shí)間花的值得, 深入了解一下編碼以及要優(yōu)化的東西對以后的數據結構設計和程序結構設計都有很大的幫助,最起碼對我來(lái)說(shuō)這是我做設計的基礎,優(yōu)化工作結束后的我正在寫(xiě)一份自己的編碼器和解碼器.
在然后就是真正的優(yōu)化工作了,這部分比較枯燥,不過(guò)堅持下來(lái)收獲很大。在這個(gè)部分上我的經(jīng)驗就是一直保持PC上的優(yōu)化先行,DSP跟上的方式。這樣對以后程序出現錯誤時(shí)的調試很有幫助,畢竟DSP調試受限于調試速度,而且調試遠不如PC方便。
我優(yōu)化的時(shí)候始終保持著(zhù)編碼代碼的重建幀數據與解碼重建數據完全一致,其實(shí)這個(gè)不是必要的,對很多情況來(lái)說(shuō),不完全一致也看不出來(lái)的問(wèn)題,這個(gè)可能是小bug而不是致命錯誤,但是為了避免致命bug的出現,我還是一致保持了編解碼的一致性。
再以后就是具體問(wèn)題了,下面的章節中具體問(wèn)題具體分析了。
由于需要做的是H.264編碼,那么需要做的大量工作都是圍繞編碼進(jìn)行的,需要了解編碼的具體細節,也許不了解編碼也能做優(yōu)化,但絕對做不好優(yōu)化。
編碼的原理部分個(gè)人比較推薦《新一代視頻壓縮編碼標準H.264》這本書(shū),作者是畢厚杰,這本書(shū)里面是有一些錯誤,但是原理部分的東西講的比較清楚,看過(guò)以后編碼框架大致都了解了。
其實(shí)就是標準,然后就是一定要花大力氣去了解代碼,這樣才能真的去理解編碼的細節。
這里面有兩個(gè)問(wèn)題,首先就是網(wǎng)上有很多H.264編碼的資料,究竟需不需要。個(gè)人認為是因人而異的,從我自己的角度出發(fā),我不是一個(gè)喜歡接受別人思想的人,在看編碼的初期也去下載了很多資料,結果幾乎都沒(méi)怎么看,直到第一遍優(yōu)化做過(guò)以后再看看才覺(jué)得比較有收獲。第二個(gè)就是編碼優(yōu)化的核心問(wèn)題——從哪一份代碼入手比較方便,通常來(lái)說(shuō)我實(shí)在不推薦從JM代碼入手,它的功能太強大了,很多東西根本無(wú)法在DSP上應用,甚至可以說(shuō)它根本無(wú)法在日常生活中應用,它實(shí)現了標準的所有細節,但是太復雜了,使用一般水平的PC編碼需要幾分鐘才能編碼一幀,這個(gè)速度無(wú)法做到實(shí)時(shí),它更是一個(gè)研究階段的產(chǎn)物。我是從T642開(kāi)始看代碼的,然后仔細研究了X642,這兩份代碼差異不大,不過(guò)T642維護的不好,所以我的主要參考代碼是X264,在理清楚了編碼細節以后我看了JM的代碼,發(fā)現即使有編碼的基礎了,JM的代碼理解起來(lái)還是比較麻煩的,不過(guò)這時(shí)的麻煩主要在代碼風(fēng)格方面和代碼冗余方面了。
當PC端實(shí)現了預期設計后就可以開(kāi)始著(zhù)手DSP端的代碼實(shí)現了,DSP端可以完全使用PC端的代碼,不過(guò)DSP端還是會(huì )遇到不少問(wèn)題,所以我建議可以先做一個(gè)小的測試工程,也就是先別把視頻采集部分的代碼合到一起去,可以通過(guò)讀文件的方式編碼測試序列,然后與PC端的做對比,然后在這個(gè)小工程下進(jìn)行優(yōu)化,等到一切結束后再整合代碼也來(lái)得及。
下一步工作就是真的開(kāi)始優(yōu)化代碼了,首先去掉一切冗余計算,然后開(kāi)始處理具體數據了,第一個(gè)需要處理的就是片內寄存器的數據量問(wèn)題,編碼最終是對4x4塊進(jìn)行操作,4x4的數據可以直接在寄存器內完成所有計算,所以做DCT、量化、zigzag、IDCT、 反量化最好能在一個(gè)函數中完成,這樣就不會(huì )涉及到寄存器數據重復導入和導出的問(wèn)題了。第二個(gè)就是線(xiàn)性匯編的問(wèn)題了,關(guān)于線(xiàn)性匯編這里就不重復了,其實(shí)大多時(shí)間都是一些基本操作,在TI的文檔中講的比較清楚,而且我本人線(xiàn)性匯編寫(xiě)的實(shí)在是不多,怕誤人子弟啊。最后就是摳摳邊角了,原則就是不需要的不計算,盡量不用判斷,有些時(shí)候 “? :”這個(gè)組合也比if else強。
聯(lián)系客服