歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> S3C6410 硬件JPEG解碼無關代碼影響解碼問題終於得以解決

S3C6410 硬件JPEG解碼無關代碼影響解碼問題終於得以解決

日期:2017/3/1 9:59:20   编辑:Linux編程

早在2012年8月份的時候就將jpeg解碼弄好了,但是一直以來非常的不穩定,如果修改了任意地方的代碼都會造成解碼可能失敗,起初我以為是堆棧問題,或者後面有非法指針,但是都沒得到結果,最後讓我只能懷疑編譯器了,而且我同樣的程序使用了RVDS4.0編譯後JPEG解碼老是等待超時,但是可以解碼頭部,得到相關的JPEG信息,就是無法解碼圖片主體部分,我換到RVDS2.2上面竟然解碼成功了,同樣的程序,不同的編譯器結果不一樣,讓我對RVDS4.0十分的失望,但是無意間我發現RVDS2.2也出現修改無關代碼後JPEG無法解碼了,我意識到我錯怪RVDS4.0了,我開始另想辦法了,當我仔細閱讀S3C6410 dataset的後,終於找到一線希望了,文中說道,JPEG CODE最高時鐘不能超過66MHz,我當時就修改了JPEG的時鐘分頻,給的是4分頻,剛好是66MHz,恰在此時解碼又成功了,讓我高興了不久,沒過多大一會,又悲劇了,打印的信息顯示解碼失敗,等待超時,我開始懷疑是編譯的地址,我就開始打印各個緩沖區,指針,變量的地址,最終發現了一個問題,就是只有源圖像地址的那個指針如果最後一位為0(16進制),解碼就成功了,試了很多次,這個結論是對的,最終找出了問題所在了,源圖像地址必須是16字節地址對齊的,這就能解釋我之前遇到的種種不可思議的問題了。

很高興,只要添加一句代碼就能解決這個問題了,因為32bit的CPU,編譯器默認是32位對齊的。

if(JpgAddr % 16) //源地址一定要是16字節(128位)對齊的,否則會出現各種意想不到的問題,這個問題困擾了我5個多月。

JpgAddr = (JpgAddr / 16 + 1) * 16;

這樣,可以在申請了源圖像緩沖區後,使用一個指針,指向這個緩沖區起始位置最近的那個128位對齊的地址,即可解決這個問題。

S3C6410裸機jpeg解碼:http://www.linuxidc.com/Linux/2013-03/81965.htm

Copyright © Linux教程網 All Rights Reserved