stagefright框架(三)-選擇Video Decoder

在《Stagefright (1) – Video Playback的流程》中,我們並沒有詳述Stagefright是如何根據影片檔的類型來選擇適合的video decoder,現在,就讓我們來看一看。

(1) Video decoder是在onPrepareAsyncEvent中的initVideoDecoder被決定的

OMXCodec::Create()會回傳video decoder給mVideoSource。

 
 
  1. status_t AwesomePlayer::initVideoDecoder() 
  2.   mVideoSource = OMXCodec::Create(mClient.interface(), 
  3.                                   mVideoTrack->getFormat(), 
  4.                                   false, 
  5.                                   mVideoTrack); 
  6.  
  7. sp<MediaSource> OMXCodec::Create(&omx, &meta, createEncoder, &source, matchComponentName) 
  8.   meta->findCString(kKeyMIMEType, &mime); 
  9.  
  10.   findMatchingCodecs(mime, ..., &matchingCodecs); ........ (2) 
  11.  
  12.   for (size_t i = 0; i < matchingCodecs.size(); ++i) 
  13.   { 
  14.     componentName = matchingCodecs[i].string(); 
  15.  
  16.     softwareCodec = 
  17.         InstantiateSoftwareCodec(componentName, ...); ..... (3) 
  18.  
  19.     if (softwareCodec != NULL) return softwareCodec; 
  20.          
  21.     err = omx->allocateNode(componentName, ..., &node); ... (4) 
  22.  
  23.     if (err == OK) 
  24.     { 
  25.       codec = new OMXCodec(..., componentName, ...); ...... (5) 
  26.       return codec; 
  27.     } 
  28.   } 

(2) 根據mVideoTrack的MIME從kDecoderInfo挑出合適的components

 
 
  1. void OMXCodec::findMatchingCodecs(mime, ..., matchingCodecs) 
  2.   for (int index = 0;; ++index) 
  3.   { 
  4.     componentName = GetCodec( 
  5.                        kDecoderInfo, 
  6.                        sizeof(kDecoderInfo)/sizeof(kDecoderInfo[0]), 
  7.                        mime, 
  8.                        index); 
  9.  
  10.     matchingCodecs->push(String8(componentName)); 
  11.   } 
  12.  
  13. static const CodecInfo kDecoderInfo[] = 
  14.   ... 
  15.   { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.decoder.mpeg4" }, 
  16.   { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" }, 
  17.   { MEDIA_MIMETYPE_VIDEO_MPEG4, "M4vH263Decoder" }, 
  18.   ... 

GetCodec會依據mime從kDecoderInfo挑出所有的component name,然後存到matchingCodecs中。

(3) 根據matchingCodecs中component的順序,我們會先去檢查其是否為software decoder

 
 
  1. static sp<MediaSource> InstantiateSoftwareCodec(name, ...) 
  2.   FactoryInfo kFactoryInfo[] = 
  3.   { 
  4.     ... 
  5.     FACTORY_REF(M4vH263Decoder) 
  6.     ... 
  7.   }; 
  8.  
  9.   for (i = 0; i < sizeof(kFactoryInfo)/sizeof(kFactoryInfo[0]); ++i) 
  10.   { 
  11.     if (!strcmp(name, kFactoryInfo[i].name)) 
  12.       return (*kFactoryInfo[i].CreateFunc)(source); 
  13.   } 

所有的software decoder都會被列在kFactoryInfo中,我們藉由傳進來的name來對應到適合的decoder。

(4) 如果該component不是software decoder,則試著去配置對應的OMX component

 
 
  1. status_t OMX::allocateNode(name, ..., node) 
  2.   mMaster->makeComponentInstance( 
  3.                            name, 
  4.                            &OMXNodeInstance::kCallbacks, 
  5.                            instance, 
  6.                            handle); 
  7.  
  8. OMX_ERRORTYPE OMXMaster::makeComponentInstance(name, ...) 
  9.   plugin->makeComponentInstance(name, ...); 
  10.  
  11. OMX_ERRORTYPE OMXPVCodecsPlugin::makeComponentInstance(name, ...) 
  12.   return OMX_MasterGetHandle(..., name, ...); 
  13.  
  14. OMX_ERRORTYPE OMX_MasterGetHandle(...) 
  15.   return OMX_GetHandle(...); 

(5) 若該component為OMX deocder,則回傳;否則繼續檢查下一個component
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值