Android 2.3 StageFright如何選定OMX組件的?

原文鏈接地址:http://www.cnblogs.com/super119/archive/2011/09/01/2161896.html

 

stagefright -l

就可以看到所有的OMX組件。OMX.PV打頭的是Android自帶的,軟解碼的(PV - Packet Video),其他的都是廠商的。

那StageFright如何選定使用哪個OMX組件來服務某個特定的decode或者encode?

stagefright有個命令行選項:-s(prefer software codec)

所以看看stagefright的源碼,看看這個-s選項做了什麼就知道了。

原來是直接在OMXCodec::Create的時候,最後最後一個參數傳入的,也就是設置了OMXCodec類的kPreferSoftwareCodecs成員爲TRUE。

所以,其實是OMXCodec來決定到底選用哪個OMX組件的,調用者使用OMXCodec::Create方法即可。

OMXCodec::Create的時候,會調用OMXCodec的findMatchingCodecs方法,這個方法會給出所有滿足的OMX組件的名字。此時,如果

kPreferSoftwareCodecs是TRUE的話,findMatchingCodecs就會把軟codec(也就是OMX.PV打頭的OMX組件)放到vector的前面了。(kPreferSoftwareCodecs爲1則硬解碼優先!)

 

當kPreferSoftwareCodecs不是TRUE的時候,那麼findMatchingCodecs查找出來的OMX組件的排序就完全是按照kDecoderInfo(以decode爲例)這個全局變量中定義的順序了,如下就是這個變量中有關H.264的定義部分:(kPreferSoftwareCodecs爲0則軟解碼優先!)

    { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.7x30.video.decoder.avc" },
    { MEDIA_MIMETYPE_VIDEO_AVC, 
"OMX.qcom.video.decoder.avc"
 },
    { MEDIA_MIMETYPE_VIDEO_AVC, 
"OMX.TI.Video.Decoder"
 },
    { MEDIA_MIMETYPE_VIDEO_AVC, 
"OMX.SEC.AVC.Decoder"
 },
    { MEDIA_MIMETYPE_VIDEO_AVC, 
"AVCDecoder"
 },
//    { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.PV.avcdec" },

 

 

很明顯,這裏首先是考慮廠商的OMX組件(從高通->TI->三星),然後纔是自帶的軟解碼的。

 

 

發佈了90 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章