Stagefright (3) - 選擇Video Decoder

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

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

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

status_t AwesomePlayer::initVideoDecoder()
{
  mVideoSource = OMXCodec::Create(mClient.interface(),
                                  mVideoTrack->getFormat(),
                                  false,
                                  mVideoTrack);
}

sp<MediaSource> OMXCodec::Create(&omx, &meta, createEncoder, &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)
根據mVideoTrack的MIME從 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會依據mime從kDecoderInfo挑出所有的 component name,然後存到matchingCodecs中。


(3) 根據matchingCodecs中component的順序,我們會先去檢查其是否為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) 若該component為OMX deocder,則回傳;否則繼續檢查下一個omponent。


利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值