• 沒有找到結果。

第一階段--找出candidate modules

第四章 尋找合適模組機制

4.2 module_Need()函數運作分析

4.2.2 第一階段--找出candidate modules

第一階段的主要目的就是從VLC 內所有的 module 中,先找出符合功能需求 的candidate module,如下圖 4.3 所示,整個第一階段的運作流程,大致上我們它 分成四個部分,其中第四部份是最為重要的部分,因為在這邊才是真正進行尋找 符合功能需求的candidate module 的部分。而經過這四個部分的運作處理,就可 以先找出candidate module 並進行到第二階段的部分。

look for candidate modules for psa_capability

if( psz_name &&

psz_name[0] == '$' ) deal with

if( psz_name &&

*psz_name )

count how many different shorcuts

were asked for false

sort modules

parse the module list for capability and probe each of

them

4.2.2.1 part 1 與 part 2 說明

在進入part 1 和 part 2 前,會先確認 psz_name 此字串變數的所儲存的字串為 何;若符合part 1 之前的判斷式,在 part1 則會對 psz_name 變數做處理;若符合 part 2 之前的判斷式,在 part 2 則會去計算有多少個 shortcuts,計算 shortcut 的目 的是為了在後面part 4 部分內,利用 shortcuts 數目來決定有多少

i_shortcut_bonus,細節會在後面的 part 4 說明,而 shortcuts 的數目則是以變數 i_shortcuts 儲存之;然而如果 psz_name 此字串變數的所儲存的字串為空字串,那 麼當然不會經過part 1 和 part 2 這兩個部分的處理。

4.2.2.2 part 3 與 part 4 說明

圖4.4:將所有 module 排序

如上圖4.4 所示,在 part 3 是先將所有 module 排序後,到了 part 4 就會開始 從這所有的module 中,尋找出哪些是符合功能需求的,所以接下來的 part 4 就開 始進行尋找的程序。

圖4.5:part 4 內的尋找程序

如上圖4.5 所示,在整個尋找的程序中,是在 for 迴圈內來確認每一個 module 是不是符合功能需求的module,其中 p_all->i_count 所代表的是全部 module 的數 量。進到for 迴圈裡,就會將 part 3 所排序的 modules 一個個的比對檢查,也就是 上圖4.5 中的 p_module 結構變數,這個結構變數所代表的就是一個 module 的屬 性,這個屬性的設定就是在 4.1 節裡我們所提到過的。如下圖 4.6 所示,這是 p_module 結構變數內的部分成員變數,以 psz_capability 與 i_score 這兩個成員變 數來說,它們的設定就是set_capability()此巨集定義的,例如前面所提的 libmpeg2 module 來 說 , set_capability("decoder",150) 就 會 設 定 成 員 變 數 psz_capability="decoder",i_score=150,表示設定這個 libmpeg2 module 的能力是

"decoder",能力值是 150。而 VLC 就是去比對檢查每個 module 的設定值,來尋 找出符合功能的模組。

圖4.6:p_module 結構變數內的部分成員變數

由圖4.5 可以看到,一開始必須要比對檢查的條件就是 p_module 的 capability 要符合VLC 所需要的 psz_capability(也就是呼叫 module_Need()函數時所傳入的參 數),這表示 module 的能力要能夠符合 VLC 需要具備某種功能的模組,如果此 module 的能力不符合 VLC 的需要,就會認定此 module 不適合並重新比對檢查下 一個module。

接下來就是判別i_shortcuts 的值來計算 i_shortcut_bonus 的值,而 i_shortcuts 的值則是在前面part 2 時所得到的。如果 i_shortcuts 小於等於 0,那麼接下來會

判斷i_score 是否為 0;若 i_shortcuts 大於 0,才會去計算 i_shortcut_bonus 的值是 多少。每個module 都會針對某個功能而設定的能力值(i_score),而這個能力值的 大小會影響到在第二階段的篩選過程的先後順序,module 的能力值越大,在第二 階段時就會先比對檢查此module。因此在第一階段比對檢查某個 module 時,會 將所計算出的 i_shortcut_bonus 加上此 module 原先的 i_score,成為此 module 的 新的i_score。

所以在通過初步的比對檢查之後,就會先將此 modules 先儲存起來,成為 candidate module,並且將此 p_module 的 score 加上 i_shortcut_bonus,變成此 module 新的 score,最後要儲存的 module 也會按照新的 score 值由高到低來重新排列,

排列完之後,又會回到for 迴圈的開始處,繼續比對檢查下一個 module,直到所 有的module 比對檢查完畢。

圖4.7:儲存符合功能需求的 modules

而我們把整個part4 的程序以下圖 4.8 來表示:在符合兩個必要條件後,會判 別i_shortcuts 的值,若 i_shortcuts 大於 0,則會去計算 i_shortcut_bonus;若小於 等於0,就必須再判別 module 的 score 是否等於 0。通過了前面的篩選之後,將 合適的module 儲存起來並更新 modules 的 score 值,並且再按照 score 值的高低 來將這些 module 以 link list 的方式來排列。等到第二階段要尋找合適的 module 時,就是從這些candidate modules 來一一測試。

part4 start

part4 end for( i_which_module < p_all->i_count )

strcmp( p_module->psz_capability, psz_capability )

i_shortcuts > 0

p_module->i_score <= 0

module was ranged in i_score order from high to low

all candi modules w

found date

ere

store this candidate module and update

i_scoe

count how i_shortcut many

_bonus

在經過前面第一階段的篩選之後,就會得到符合功能的 candidate modules,

而這些 modules 是以 i_score 高低來排列。接下來的第二階段就是要從這些 candidate modules 中,尋找出一個合適的 module,決定 module 是否合適的方式,

是從i_score 最高的 module 開始測試,"一直到第一個 module 測試成功",那麼就 會選擇使用這個module,表示此 module 就是合適的 module,而剩下的 candidate modules 就不再去測試,並結束整個 module_Need()程序。

相關文件