2009年8月10日 星期一

trace ffmpeg finding arm specific code II

繼續trace ffmpeg
目前是先trace ps2的code 因為這部份的code較少
在libavcodec/ps2/dsputil_mmi.c 就是實作出這些加速的function
而這些加速的function要怎麼用勒

其實很簡單 他會在libavcodec/dsputil.h底下有一個struct DSPContext
在這個struct會有很多function的pointer 我們可以替換掉這些function pointer
這裡會有像idct的function pointer替換掉這個就會變成我們用的硬體加速
這樣使用的就是我們有加速過的function
但是現在問題有來了 我們要在哪裡換掉這些function pointer
其實每個arch或是加速的instruction set都會有一個dsputil_init_(加速的名稱)
像ps2就是dsputil_init_mmi(像這個function的實做就是擺在libavcodec/ps2/dsputil_mmi.c)
(但是這個function的宣告是擺在libavcodec/dsputil.h)
在這裡就是用來寫function pointer的轉換
而這些dsputil_init_mmi dsputil_init_arm都是放在dsputil_init的function(在libavcodec/dsputil.c)
dsputil_init會根據不同的arch來call不同的function

接下就是說他在哪裡設定原本這些可以加速的function
其實就是在libavcodec/dsputil.c的dsputil_init裡面
這裡就寫著原本可以加速的function是指到哪一個function

好 看完ps2簡單的版本 現在就可以開始看arm的部份
因為我用的arm926ejs 沒有neon iwmmxt vfp armv6的code要看 但是要看armv5的
從libavcodec/Makefile 我們知道至少有8個檔要看 當然實際上有10個
根據剛剛ps2的經驗 就從/libavcodec/arm/dsputil_arm.c
以下是每個檔案大致上的功用
jrevdct_arm.S 這個是實做j_rev_dct_ARM這個function
simple_idct_arm.S 這個是實做simple_idct_ARM這個function
simple_idct_armv5te.S 主要是實做simple_idct_armv5te simple_idct_add_armv5te simple_idct_put_armv5te 三個function
dsputil_arm_s.S 主要是實做跟pixel相關的function

現在就先trace到這裡
還有asm.S mpegvideo_armv5te_s.S
dsputil_arm.c mathops.h
mpegvideo_arm.c mpegvideo_armv5te.c
需要去trace
還要去看看如何只使用libavcodec的功能 好像有個檔案叫做dct-test.c的樣子

沒有留言:

張貼留言