diff options
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 100 |
1 files changed, 57 insertions, 43 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index e844e36..1c4b47e 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -4509,67 +4509,81 @@ status_t QueryCodecs( for (size_t c = 0; c < matchingCodecs.size(); c++) { const char *componentName = matchingCodecs.itemAt(c).string(); - if (strncmp(componentName, "OMX.", 4)) { - // Not an OpenMax component but a software codec. - - results->push(); - CodecCapabilities *caps = &results->editItemAt(results->size() - 1); - caps->mComponentName = componentName; - continue; - } + results->push(); + CodecCapabilities *caps = &results->editItemAt(results->size() - 1); - sp<OMXCodecObserver> observer = new OMXCodecObserver; - IOMX::node_id node; - status_t err = omx->allocateNode(componentName, observer, &node); + status_t err = + QueryCodec(omx, componentName, mime, !queryDecoders, caps); if (err != OK) { - continue; + results->removeAt(results->size() - 1); } + } + + return OK; +} - OMXCodec::setComponentRole(omx, node, !queryDecoders, mime); +status_t QueryCodec( + const sp<IOMX> &omx, + const char *componentName, const char *mime, + bool isEncoder, + CodecCapabilities *caps) { + if (strncmp(componentName, "OMX.", 4)) { + // Not an OpenMax component but a software codec. - results->push(); - CodecCapabilities *caps = &results->editItemAt(results->size() - 1); caps->mComponentName = componentName; + return OK; + } - OMX_VIDEO_PARAM_PROFILELEVELTYPE param; - InitOMXParams(¶m); + sp<OMXCodecObserver> observer = new OMXCodecObserver; + IOMX::node_id node; + status_t err = omx->allocateNode(componentName, observer, &node); - param.nPortIndex = queryDecoders ? 0 : 1; + if (err != OK) { + return err; + } - for (param.nProfileIndex = 0;; ++param.nProfileIndex) { - err = omx->getParameter( - node, OMX_IndexParamVideoProfileLevelQuerySupported, - ¶m, sizeof(param)); + OMXCodec::setComponentRole(omx, node, isEncoder, mime); - if (err != OK) { - break; - } + caps->mComponentName = componentName; - CodecProfileLevel profileLevel; - profileLevel.mProfile = param.eProfile; - profileLevel.mLevel = param.eLevel; + OMX_VIDEO_PARAM_PROFILELEVELTYPE param; + InitOMXParams(¶m); - caps->mProfileLevels.push(profileLevel); - } + param.nPortIndex = !isEncoder ? 0 : 1; - // Color format query - OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; - InitOMXParams(&portFormat); - portFormat.nPortIndex = queryDecoders ? 1 : 0; - for (portFormat.nIndex = 0;; ++portFormat.nIndex) { - err = omx->getParameter( - node, OMX_IndexParamVideoPortFormat, - &portFormat, sizeof(portFormat)); - if (err != OK) { - break; - } - caps->mColorFormats.push(portFormat.eColorFormat); + for (param.nProfileIndex = 0;; ++param.nProfileIndex) { + err = omx->getParameter( + node, OMX_IndexParamVideoProfileLevelQuerySupported, + ¶m, sizeof(param)); + + if (err != OK) { + break; } - CHECK_EQ(omx->freeNode(node), (status_t)OK); + CodecProfileLevel profileLevel; + profileLevel.mProfile = param.eProfile; + profileLevel.mLevel = param.eLevel; + + caps->mProfileLevels.push(profileLevel); } + // Color format query + OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; + InitOMXParams(&portFormat); + portFormat.nPortIndex = !isEncoder ? 1 : 0; + for (portFormat.nIndex = 0;; ++portFormat.nIndex) { + err = omx->getParameter( + node, OMX_IndexParamVideoPortFormat, + &portFormat, sizeof(portFormat)); + if (err != OK) { + break; + } + caps->mColorFormats.push(portFormat.eColorFormat); + } + + CHECK_EQ(omx->freeNode(node), (status_t)OK); + return OK; } |