summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/OMXCodec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/OMXCodec.cpp')
-rwxr-xr-xmedia/libstagefright/OMXCodec.cpp100
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(&param);
+ 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,
- &param, 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(&param);
- 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,
+ &param, 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;
}