S3C6410 硬件JPEG解碼無關(guān)代碼影響解碼問題終于得以解決
早在今年8月份的時(shí)候就將jpeg解碼弄好了,但是一直以來非常的不穩(wěn)定,如果修改了任意地方的代碼都會造成解碼可能失敗,起初我以為是堆棧問題,或者后面有非法指針,但是都沒得到結(jié)果,最后讓我只能懷疑編譯器了,而且我同樣的程序使用了RVDS4.0編譯后JPEG解碼老是等待超時(shí),但是可以解碼頭部,得到相關(guān)的JPEG信息,就是無法解碼圖片主體部分,我換到RVDS2.2上面竟然解碼成功了,同樣的程序,不同的編譯器結(jié)果不一樣,讓我對RVDS4.0十分的失望,但是無意間我發(fā)現(xiàn)RVDS2.2也出現(xiàn)修改無關(guān)代碼后JPEG無法解碼了,我意識到我錯(cuò)怪RVDS4.0了,我開始另想辦法了,當(dāng)我仔細(xì)閱讀S3C6410 dataset的后,終于找到一線希望了,文中說道,JPEG CODE最高時(shí)鐘不能超過66MHz,我當(dāng)時(shí)就修改了JPEG的時(shí)鐘分頻,給的是4分頻,剛好是66MHz,恰在此時(shí)解碼又成功了,讓我高興了不久,沒過多大一會,又悲劇了,打印的信息顯示解碼失敗,等待超時(shí),我開始懷疑是編譯的地址,我就開始打印各個(gè)緩沖區(qū),指針,變量的地址,最終發(fā)現(xiàn)了一個(gè)問題,就是只有源圖像地址的那個(gè)指針如果最后一位為0(16進(jìn)制),解碼就成功了,試了很多次,這個(gè)結(jié)論是對的,最終找出了問題所在了,源圖像地址必須是16字節(jié)地址對齊的,這就能解釋我之前遇到的種種不可思議的問題了。
很高興,只要添加一句代碼就能解決這個(gè)問題了,因?yàn)?2bit的CPU,編譯器默認(rèn)是32位對齊的。
if(JpgAddr%16)//源地址一定要是16字節(jié)(128位)對齊的,否則會出現(xiàn)各種意想不到的問題,這個(gè)問題困擾了我5個(gè)多月。
JpgAddr=(JpgAddr/16+1)*16;
這樣,可以在申請了源圖像緩沖區(qū)后,使用一個(gè)指針,指向這個(gè)緩沖區(qū)起始位置最近的那個(gè)128位對齊的地址,即可解決這個(gè)問題。