Stagefright 之 init Decode

Stagefright之三

                                             ——init Decode

 

       这一节主要介绍 Stagefright是如何根据mime type选择合适的decoder。在Sniff*()中,变量confidence是指可信度参数。如果一个文件匹配几个sniff,那么根据confidence值的大小来选择。

 

(1)

       onPrepareAsyncEvent中,初始化decode是根据(mVideoTrack)和(mAudioTrack)去调用initVideoDecoder()initAudioDecoder()。下面以initVideoDecoder()为例,详述这一过程。

OMXCodec::Create() 会回传video decodermVideoSource

 

status_t AwesomePlayer::initVideoDecoder()                     ……AwesomePlayer.cpp

{

  mVideoSource = OMXCodec::Create(mClient.interface(),

                                  mVideoTrack->getFormat(),

                                  false, // createEncoder

                                  mVideoTrack);

}

 

sp<MediaSource> OMXCodec::Create(&omx, &meta, &source, matchComponentName,)

{

  meta->findCString(kKeyMIMEType, &mime);

 

  findMatchingCodecs(mime, ..., &matchingCodecs); ........ (2)

 

  for (size_t i = 0; i < matchingCodecs.size(); ++i)

  {

    componentName = matchingCodecs[i].string();

 

    softwareCodec =

        InstantiateSoftwareCodec(componentName, ...); ..... (3)

 

    if (softwareCodec != NULL) return softwareCodec;

       

    err = omx->allocateNode(componentName, ..., &node); ... (4)

 

    if (err == OK)

    {

      codec = new OMXCodec(..., componentName, ...); ...... (5)

      return codec;

    }

  }

}

 

 

(2) 根据mVideoTrackmimetype kDecoderInfo挑出合适的components

 

void OMXCodec::findMatchingCodecs(mime, ..., matchingCodecs)

{

  for (int index = 0;; ++index)

  {

    componentName = GetCodec(

                       kDecoderInfo,

                       sizeof(kDecoderInfo)/sizeof(kDecoderInfo[0]),

                       mime,

                       index);

 

    matchingCodecs->push(String8(componentName));

  }

}

 

static const CodecInfo kDecoderInfo[] =

{

  ...

  { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.qcom.video.decoder.mpeg4" },

  { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" },

  { MEDIA_MIMETYPE_VIDEO_MPEG4, "M4vH263Decoder" },

  ...

}

 

GetCodec会依据mimekDecoderInfo挑出所有的 component name,然后存到matchingCodecs中。

 

 

(3) 根据matchingCodecscomponent的顺序,我们会先去检查其是否为software decoder

 

static sp<MediaSource> InstantiateSoftwareCodec(name, ...)

{

  FactoryInfo kFactoryInfo[] =

  {

    ...

    FACTORY_REF(M4vH263Decoder)

    ...

  };

 

  for (i = 0; i < sizeof(kFactoryInfo)/sizeof(kFactoryInfo[0]); ++i)

  {

    if (!strcmp(name, kFactoryInfo[i].name))

      return (*kFactoryInfo[i].CreateFunc)(source);

  }

}

 

所有的 software decoder都会被列在kFactoryInfo中,我们藉由传进来的name来对应到适合的decoder

 

 

(4) 如果该component不是software decoder,那么就尝试去匹配对应的OMX component

 

status_t OMX::allocateNode(name, ..., node)

{

  mMaster->makeComponentInstance(

                           name,

                           &OMXNodeInstance::kCallbacks,

                           instance,

                           handle);

}

 

OMX_ERRORTYPE OMXMaster::makeComponentInstance(name, ...)

{

  plugin->makeComponentInstance(name, ...);

}

 

OMX_ERRORTYPE OMXPVCodecsPlugin::makeComponentInstance(name, ...)

{

  return OMX_MasterGetHandle(..., name, ...);

}

 

OMX_ERRORTYPE OMX_MasterGetHandle(...)

{

  return OMX_GetHandle(...);

}

 

 

(5) 若该componentOMX deocder,则回传;否则继续检查下一个component

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值