多媒體檔案經過解析後,需要根據mime尋找適合的codec,2.3的系統有兩種方式 SoftwareCodec和omx的node codec,後者可以結合特殊硬體做最佳化處理,前者感覺就是比較標準的軟解碼。
下面是代碼
omxcodec.cpp
omxcodec::create
Vector<String8> matchingCodecs;------系統對於某種mime的所有codec集合
findMatchingCodecs(
mime, createEncoder, matchComponentName, flags, &matchingCodecs);
if (matchingCodecs.isEmpty()) {
return NULL;
}
sp<OMXCodecObserver> observer = new OMXCodecObserver;
IOMX::node_id node = 0;
const char *componentName;
for (size_t i = 0; i < matchingCodecs.size(); ++i) {--------去其中遍曆所有的codec,一般是omx的node先,然後是軟解碼
componentName = matchingCodecs[i].string();
sp<MediaSource> softwareCodec = createEncoder?
InstantiateSoftwareEncoder(componentName, source, meta):
InstantiateSoftwareCodec(componentName, source);
if (softwareCodec != NULL) {
LOGV("Successfully allocated software codec '%s'", componentName);
return softwareCodec;-----------------是軟解碼-返回codec
}
LOGV("Attempting to allocate OMX node '%s'", componentName);
uint32_t quirks = getComponentQuirks(componentName, createEncoder);
if (!createEncoder
&& (quirks & kOutputBuffersAreUnreadable)
&& (flags & kClientNeedsFramebuffer)) {
if (strncmp(componentName, "OMX.SEC.", 8)) {
// For OMX.SEC.* decoders we can enable a special mode that
// gives the client access to the framebuffer contents.
LOGW("Component '%s' does not give the client access to "
"the framebuffer contents. Skipping.",
componentName);
continue;
}
}
status_t err = omx->allocateNode(componentName, observer, &node);
if (err == OK) {
LOGV("Successfully allocated OMX node '%s'", componentName);
sp<OMXCodec> codec = new OMXCodec(
omx, node, quirks,
createEncoder, mime, componentName,
source);------------------------產生一個omxcodec,這個需要後面再細細研究
observer->setCodec(codec);
err = codec->configureCodec(meta, flags);
if (err == OK) {
return codec;
}
LOGV("Failed to configure codec '%s'", componentName);
}
}