VideoDecoder的初始化实际就是OMX的创建,Stagefright提供了OMX的封装OMXCodec
在平台上stagefright -l 可以看到所有的组件
VideoDecoder的创建流程
status_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
//最重要的创建mVideoSource
sp<MediaSource> decoder = OMXCodec::Create(
mClient.interface(), mVideoTrack->getFormat(),
false, // createEncoder
mVideoTrack,
NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
status_t err = mVideoSource->start();
}
sp<MediaSource> OMXCodec::Create(
const sp<IOMX> &omx,
const sp<MetaData> &meta, bool createEncoder,
const sp<MediaSource> &source,
const char *matchComponentName,
uint32_t flags,
const sp<ANativeWindow> &nativeWindow) {
//得到MediaExtractor解析的MIME
bool success = meta->findCString(kKeyMIMEType, &mime);
//找到对应的decoder name
findMatchingCodecs(
mime, createEncoder, matchComponentName, flags,
&matchingCodecs, &matchingCodecQuirks);
//可能会找到多个匹配的codec
for (size_t i = 0; i < matchingCodecs.size(); ++i) {
//得到对应的component name
const char *componentNameBase = matchingCodecs[i].string();
//创建软件codec
softwareCodec = InstantiateSoftwareDecoder(componentName, source);
//根据component name创建OMX NODE
status_t err = omx->allocateNode(componentName, observer, &node);
//创建OMXCodec
sp<OMXCodec> codec = new OMXCodec(
omx, node, quirks, flags,
createEncoder, mime, componentName,
source, nativeWindow);