From 732c6d955524ead6c31e6e1bafbd41ea4cee525d Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Thu, 14 Aug 2014 19:54:08 -0700 Subject: stagefright/media: add support for codec features with text value Bug: 11990470 Change-Id: I7600d999c5f4b6821d825d25fa7e8a2bb5a80c46 --- include/media/MediaCodecInfo.h | 1 + media/libmedia/MediaCodecInfo.cpp | 6 ++++++ media/libstagefright/MediaCodecList.cpp | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/media/MediaCodecInfo.h b/include/media/MediaCodecInfo.h index ab7a4b8..cd56adb 100644 --- a/include/media/MediaCodecInfo.h +++ b/include/media/MediaCodecInfo.h @@ -107,6 +107,7 @@ private: status_t initializeCapabilities(const CodecCapabilities &caps); void addDetail(const AString &key, const AString &value); void addFeature(const AString &key, int32_t value); + void addFeature(const AString &key, const char *value); void removeMime(const char *mime); void complete(); diff --git a/media/libmedia/MediaCodecInfo.cpp b/media/libmedia/MediaCodecInfo.cpp index 446c582..7b4c4e2 100644 --- a/media/libmedia/MediaCodecInfo.cpp +++ b/media/libmedia/MediaCodecInfo.cpp @@ -257,4 +257,10 @@ void MediaCodecInfo::addFeature(const AString &key, int32_t value) { mCurrentCaps->mDetails->setInt32(tag.c_str(), value); } +void MediaCodecInfo::addFeature(const AString &key, const char *value) { + AString tag = "feature-"; + tag.append(key); + mCurrentCaps->mDetails->setString(tag.c_str(), value); +} + } // namespace android diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp index 2f2a0b3..5b8be46 100644 --- a/media/libstagefright/MediaCodecList.cpp +++ b/media/libstagefright/MediaCodecList.cpp @@ -783,6 +783,7 @@ status_t MediaCodecList::addFeature(const char **attrs) { const char *name = NULL; int32_t optional = -1; int32_t required = -1; + const char *value = NULL; while (attrs[i] != NULL) { if (attrs[i + 1] == NULL) { @@ -801,6 +802,9 @@ status_t MediaCodecList::addFeature(const char **attrs) { required = value; } ++i; + } else if (!strcmp(attrs[i], "value")) { + value = attrs[i + 1]; + ++i; } else { return -EINVAL; } @@ -816,7 +820,16 @@ status_t MediaCodecList::addFeature(const char **attrs) { return -EINVAL; } - mCurrentInfo->addFeature(name, (required == 1) || (optional == 0)); + if ((optional != -1 || required != -1) && (value != NULL)) { + ALOGE("feature '%s' has both a value and optional/required attribute", name); + return -EINVAL; + } + + if (value != NULL) { + mCurrentInfo->addFeature(name, value); + } else { + mCurrentInfo->addFeature(name, (required == 1) || (optional == 0)); + } return OK; } -- cgit v1.1