Merge "Remove clearkey hidl code" into udc-dev
diff --git a/media/codec2/components/aom/C2SoftAomEnc.cpp b/media/codec2/components/aom/C2SoftAomEnc.cpp
index 81c593f..59cad9d 100644
--- a/media/codec2/components/aom/C2SoftAomEnc.cpp
+++ b/media/codec2/components/aom/C2SoftAomEnc.cpp
@@ -88,6 +88,12 @@
.withSetter(BitrateSetter)
.build());
+ addParameter(DefineParam(mComplexity, C2_PARAMKEY_COMPLEXITY)
+ .withDefault(new C2StreamComplexityTuning::output(0u, 0))
+ .withFields({C2F(mComplexity, value).inRange(0, 5)})
+ .withSetter(Setter<decltype(*mComplexity)>::NonStrictValueWithNoDeps)
+ .build());
+
addParameter(DefineParam(mQuality, C2_PARAMKEY_QUALITY)
.withDefault(new C2StreamQualityTuning::output(0u, 80))
.withFields({C2F(mQuality, value).inRange(0, 100)})
@@ -306,10 +312,20 @@
return 15 + 35 * (100 - c2Quality) / 100;
}
+static int MapC2ComplexityToAOMSpeed (int c2Complexity) {
+ int mapping[6] = {10, 9, 8, 7, 6, 6};
+ if (c2Complexity > 5 || c2Complexity < 0) {
+ ALOGW("Wrong complexity setting. Falling back to speed 10");
+ return 10;
+ }
+ return mapping[c2Complexity];
+}
+
aom_codec_err_t C2SoftAomEnc::setupCodecParameters() {
aom_codec_err_t codec_return = AOM_CODEC_OK;
- codec_return = aom_codec_control(mCodecContext, AOME_SET_CPUUSED, DEFAULT_SPEED);
+ codec_return = aom_codec_control(mCodecContext, AOME_SET_CPUUSED,
+ MapC2ComplexityToAOMSpeed(mComplexity->value));
if (codec_return != AOM_CODEC_OK) goto BailOut;
codec_return = aom_codec_control(mCodecContext, AV1E_SET_ROW_MT, 1);
@@ -461,6 +477,7 @@
mRequestSync = mIntf->getRequestSync_l();
mColorAspects = mIntf->getCodedColorAspects_l();
mQuality = mIntf->getQuality_l();
+ mComplexity = mIntf->getComplexity_l();
}
@@ -481,9 +498,9 @@
mCodecInterface = aom_codec_av1_cx();
if (!mCodecInterface) goto CleanUp;
- ALOGD("AOM: initEncoder. BRMode: %u. KF: %u. QP: %u - %u, 10Bit: %d",
+ ALOGD("AOM: initEncoder. BRMode: %u. KF: %u. QP: %u - %u, 10Bit: %d, comlexity %d",
(uint32_t)mBitrateControlMode,
- mIntf->getSyncFramePeriod(), mMinQuantizer, mMaxQuantizer, mIs10Bit);
+ mIntf->getSyncFramePeriod(), mMinQuantizer, mMaxQuantizer, mIs10Bit, mComplexity->value);
mCodecConfiguration = new aom_codec_enc_cfg_t;
if (!mCodecConfiguration) goto CleanUp;
diff --git a/media/codec2/components/aom/C2SoftAomEnc.h b/media/codec2/components/aom/C2SoftAomEnc.h
index d7832dd..3067735 100644
--- a/media/codec2/components/aom/C2SoftAomEnc.h
+++ b/media/codec2/components/aom/C2SoftAomEnc.h
@@ -103,6 +103,7 @@
std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
std::shared_ptr<C2StreamQualityTuning::output> mQuality;
+ std::shared_ptr<C2StreamComplexityTuning::output> mComplexity;
std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
@@ -129,6 +130,9 @@
std::shared_ptr<C2StreamFrameRateInfo::output> getFrameRate_l() const { return mFrameRate; }
std::shared_ptr<C2StreamBitrateInfo::output> getBitrate_l() const { return mBitrate; }
std::shared_ptr<C2StreamQualityTuning::output> getQuality_l() const { return mQuality; }
+ std::shared_ptr<C2StreamComplexityTuning::output> getComplexity_l() const {
+ return mComplexity;
+ }
std::shared_ptr<C2StreamBitrateModeTuning::output> getBitrateMode_l() const {
return mBitrateMode;
}
@@ -155,6 +159,7 @@
std::shared_ptr<C2StreamSyncFrameIntervalTuning::output> mSyncFramePeriod;
std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
std::shared_ptr<C2StreamQualityTuning::output> mQuality;
+ std::shared_ptr<C2StreamComplexityTuning::output> mComplexity;
std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
std::shared_ptr<C2StreamProfileLevelInfo::output> mProfileLevel;
std::shared_ptr<C2StreamColorAspectsInfo::input> mColorAspects;
diff --git a/media/libaudioclient/tests/audiosystem_tests.cpp b/media/libaudioclient/tests/audiosystem_tests.cpp
index 2e6915a..2b9b4fa 100644
--- a/media/libaudioclient/tests/audiosystem_tests.cpp
+++ b/media/libaudioclient/tests/audiosystem_tests.cpp
@@ -214,8 +214,11 @@
GTEST_SKIP() << "No ports returned by the audio system";
}
+ bool sourceFound = false;
for (const auto& port : ports) {
if (port.role != AUDIO_PORT_ROLE_SOURCE || port.type != AUDIO_PORT_TYPE_DEVICE) continue;
+ if (port.ext.device.type != AUDIO_DEVICE_IN_FM_TUNER) continue;
+ sourceFound = true;
sourcePortConfig = port.active_config;
bool patchFound;
@@ -223,8 +226,9 @@
// start audio source.
status_t ret =
AudioSystem::startAudioSource(&sourcePortConfig, &attributes, &sourcePortHandle);
- EXPECT_EQ(OK, ret) << "AudioSystem::startAudioSource for source " << port.ext.device.address
- << " failed";
+ EXPECT_EQ(OK, ret) << "AudioSystem::startAudioSource for source "
+ << audio_device_to_string(port.ext.device.type) << " failed";
+ if (ret != OK) continue;
// verify that patch is established by the source port.
ASSERT_NO_FATAL_FAILURE(anyPatchContainsInputDevice(port.id, patchFound));
@@ -233,13 +237,17 @@
if (sourcePortHandle != AUDIO_PORT_HANDLE_NONE) {
ret = AudioSystem::stopAudioSource(sourcePortHandle);
- EXPECT_EQ(OK, ret) << "AudioSystem::stopAudioSource for handle failed";
+ EXPECT_EQ(OK, ret) << "AudioSystem::stopAudioSource failed for handle "
+ << sourcePortHandle;
}
// verify that no source port patch exists.
ASSERT_NO_FATAL_FAILURE(anyPatchContainsInputDevice(port.id, patchFound));
EXPECT_EQ(false, patchFound);
}
+ if (!sourceFound) {
+ GTEST_SKIP() << "No ports suitable for testing";
+ }
}
TEST_F(AudioSystemTest, CreateAndReleaseAudioPatch) {
diff --git a/media/libeffects/loudness/aidl/LoudnessEnhancerContext.cpp b/media/libeffects/loudness/aidl/LoudnessEnhancerContext.cpp
index 033b222..bc3fa45 100644
--- a/media/libeffects/loudness/aidl/LoudnessEnhancerContext.cpp
+++ b/media/libeffects/loudness/aidl/LoudnessEnhancerContext.cpp
@@ -14,6 +14,10 @@
* limitations under the License.
*/
+#define LOG_TAG "LoudnessEnhancerContext"
+
+#include <Utils.h>
+
#include "LoudnessEnhancerContext.h"
namespace aidl::android::hardware::audio::effect {
@@ -21,17 +25,15 @@
LoudnessEnhancerContext::LoudnessEnhancerContext(int statusDepth, const Parameter::Common& common)
: EffectContext(statusDepth, common) {
LOG(DEBUG) << __func__;
- mState = LOUDNESS_ENHANCER_STATE_UNINITIALIZED;
- mSampleRate = common.input.base.sampleRate;
init_params();
}
LoudnessEnhancerContext::~LoudnessEnhancerContext() {
LOG(DEBUG) << __func__;
- mState = LOUDNESS_ENHANCER_STATE_UNINITIALIZED;
}
RetCode LoudnessEnhancerContext::enable() {
+ std::lock_guard lg(mMutex);
if (mState != LOUDNESS_ENHANCER_STATE_INITIALIZED) {
return RetCode::ERROR_EFFECT_LIB_ERROR;
}
@@ -40,6 +42,7 @@
}
RetCode LoudnessEnhancerContext::disable() {
+ std::lock_guard lg(mMutex);
if (mState != LOUDNESS_ENHANCER_STATE_ACTIVE) {
return RetCode::ERROR_EFFECT_LIB_ERROR;
}
@@ -49,12 +52,10 @@
void LoudnessEnhancerContext::reset() {
float targetAmp = pow(10, mGain / 2000.0f); // mB to linear amplification
- {
- std::lock_guard lg(mMutex);
- if (mCompressor != nullptr) {
- // Get samplingRate from input
- mCompressor->Initialize(targetAmp, mSampleRate);
- }
+ std::lock_guard lg(mMutex);
+ if (mCompressor != nullptr) {
+ // Get samplingRate from input
+ mCompressor->Initialize(targetAmp, mCommon.input.base.sampleRate);
}
}
@@ -75,39 +76,41 @@
auto frameSize = getInputFrameSize();
RETURN_VALUE_IF(0 == frameSize, status, "zeroFrameSize");
+ std::lock_guard lg(mMutex);
+ status = {STATUS_INVALID_OPERATION, 0, 0};
+ RETURN_VALUE_IF(mState != LOUDNESS_ENHANCER_STATE_ACTIVE, status, "stateNotActive");
+
LOG(DEBUG) << __func__ << " start processing";
- {
- std::lock_guard lg(mMutex);
- // PcmType is always expected to be Float 32 bit.
- constexpr float scale = 1 << 15; // power of 2 is lossless conversion to int16_t range
- constexpr float inverseScale = 1.f / scale;
- const float inputAmp = pow(10, mGain / 2000.0f) * scale;
- float leftSample, rightSample;
- if (mCompressor != nullptr) {
- for (int inIdx = 0; inIdx < samples; inIdx += 2) {
- // makeup gain is applied on the input of the compressor
- leftSample = inputAmp * in[inIdx];
- rightSample = inputAmp * in[inIdx + 1];
- mCompressor->Compress(&leftSample, &rightSample);
- in[inIdx] = leftSample * inverseScale;
- in[inIdx + 1] = rightSample * inverseScale;
- }
- } else {
- for (int inIdx = 0; inIdx < samples; inIdx += 2) {
- leftSample = inputAmp * in[inIdx];
- rightSample = inputAmp * in[inIdx + 1];
- in[inIdx] = leftSample * inverseScale;
- in[inIdx + 1] = rightSample * inverseScale;
- }
+ // PcmType is always expected to be Float 32 bit.
+ constexpr float scale = 1 << 15; // power of 2 is lossless conversion to int16_t range
+ constexpr float inverseScale = 1.f / scale;
+ const float inputAmp = pow(10, mGain / 2000.0f) * scale;
+ float leftSample, rightSample;
+
+ if (mCompressor != nullptr) {
+ for (int inIdx = 0; inIdx < samples; inIdx += 2) {
+ // makeup gain is applied on the input of the compressor
+ leftSample = inputAmp * in[inIdx];
+ rightSample = inputAmp * in[inIdx + 1];
+ mCompressor->Compress(&leftSample, &rightSample);
+ in[inIdx] = leftSample * inverseScale;
+ in[inIdx + 1] = rightSample * inverseScale;
}
- bool accumulate = false;
- if (in != out) {
- for (int i = 0; i < samples; i++) {
- if (accumulate) {
- out[i] += in[i];
- } else {
- out[i] = in[i];
- }
+ } else {
+ for (int inIdx = 0; inIdx < samples; inIdx += 2) {
+ leftSample = inputAmp * in[inIdx];
+ rightSample = inputAmp * in[inIdx + 1];
+ in[inIdx] = leftSample * inverseScale;
+ in[inIdx + 1] = rightSample * inverseScale;
+ }
+ }
+ bool accumulate = false;
+ if (in != out) {
+ for (int i = 0; i < samples; i++) {
+ if (accumulate) {
+ out[i] += in[i];
+ } else {
+ out[i] = in[i];
}
}
}
@@ -115,15 +118,17 @@
}
void LoudnessEnhancerContext::init_params() {
+ int channelCount = ::aidl::android::hardware::audio::common::getChannelCount(
+ mCommon.input.base.channelMask);
+ LOG_ALWAYS_FATAL_IF(channelCount != 2, "channel count %d not supported", channelCount);
+
mGain = LOUDNESS_ENHANCER_DEFAULT_TARGET_GAIN_MB;
float targetAmp = pow(10, mGain / 2000.0f); // mB to linear amplification
LOG(DEBUG) << __func__ << "Target gain = " << mGain << "mB <=> factor = " << targetAmp;
- {
- std::lock_guard lg(mMutex);
- mCompressor = std::make_unique<le_fx::AdaptiveDynamicRangeCompression>();
- mCompressor->Initialize(targetAmp, mSampleRate);
- }
+ std::lock_guard lg(mMutex);
+ mCompressor = std::make_unique<le_fx::AdaptiveDynamicRangeCompression>();
+ mCompressor->Initialize(targetAmp, mCommon.input.base.sampleRate);
mState = LOUDNESS_ENHANCER_STATE_INITIALIZED;
}
diff --git a/media/libeffects/loudness/aidl/LoudnessEnhancerContext.h b/media/libeffects/loudness/aidl/LoudnessEnhancerContext.h
index b478b27..9a1ec4c 100644
--- a/media/libeffects/loudness/aidl/LoudnessEnhancerContext.h
+++ b/media/libeffects/loudness/aidl/LoudnessEnhancerContext.h
@@ -46,9 +46,8 @@
private:
std::mutex mMutex;
- LoudnessEnhancerState mState;
- int mSampleRate;
- int mGain;
+ LoudnessEnhancerState mState GUARDED_BY(mMutex) = LOUDNESS_ENHANCER_STATE_UNINITIALIZED;
+ int mGain = LOUDNESS_ENHANCER_DEFAULT_TARGET_GAIN_MB;
// In this implementation, there is no coupling between the compression on the left and right
// channels
std::unique_ptr<le_fx::AdaptiveDynamicRangeCompression> mCompressor GUARDED_BY(mMutex);
diff --git a/media/libstagefright/data/media_codecs_sw.xml b/media/libstagefright/data/media_codecs_sw.xml
index cd801b8..d01e326 100644
--- a/media/libstagefright/data/media_codecs_sw.xml
+++ b/media/libstagefright/data/media_codecs_sw.xml
@@ -375,6 +375,7 @@
<Limit name="bitrate" range="1-5000000" />
</Variant>
<Limit name="quality" range="0-100" default="80" />
+ <Limit name="complexity" range="0-5" default="0" />
<Feature name="bitrate-modes" value="VBR,CBR,CQ" />
<Attribute name="software-codec" />
</MediaCodec>
diff --git a/media/libstagefright/xmlparser/MediaCodecsXmlParser.cpp b/media/libstagefright/xmlparser/MediaCodecsXmlParser.cpp
index 67c6102..8c1ef3b 100644
--- a/media/libstagefright/xmlparser/MediaCodecsXmlParser.cpp
+++ b/media/libstagefright/xmlparser/MediaCodecsXmlParser.cpp
@@ -19,6 +19,8 @@
#include <media/stagefright/xmlparser/MediaCodecsXmlParser.h>
+#include <android/api-level.h>
+
#include <android-base/logging.h>
#include <android-base/macros.h>
#include <android-base/properties.h>
@@ -30,6 +32,7 @@
#include <expat.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
@@ -360,7 +363,7 @@
status_t updateMediaCodec(
const char *rank, const StringSet &domain, const StringSet &variants,
- const char *enabled);
+ const char *enabled, const char *minsdk);
};
status_t parseXmlFilesInSearchDirs(
@@ -493,6 +496,9 @@
}
}
+// current SDK for this device; filled in when initializing the parser.
+static int mysdk = 0;
+
MediaCodecsXmlParser::Impl::Parser::Parser(State *state, std::string path)
: mState(state),
mPath(path),
@@ -502,6 +508,20 @@
if (end != std::string::npos) {
mHrefBase = path.substr(0, end + 1);
}
+
+#if defined(__ANDROID_API_U__)
+ // this is sdk calculation is intended only for devices >= U
+ static std::once_flag sCheckOnce;
+
+ std::call_once(sCheckOnce, [&](){
+ mysdk = android_get_device_api_level();
+
+ // work around main development branch being on same SDK as the last dessert release.
+ if (__ANDROID_API__ == __ANDROID_API_FUTURE__) {
+ mysdk++;
+ }
+ });
+#endif // __ANDROID_API_U__
}
void MediaCodecsXmlParser::Impl::Parser::parseXmlFile() {
@@ -930,6 +950,7 @@
const char *a_domain = nullptr;
const char *a_variant = nullptr;
const char *a_enabled = nullptr;
+ const char *a_minsdk = nullptr;
size_t i = 0;
while (attrs[i] != nullptr) {
@@ -953,6 +974,8 @@
a_variant = attrs[++i];
} else if (strEq(attrs[i], "enabled")) {
a_enabled = attrs[++i];
+ } else if (strEq(attrs[i], "minsdk")) {
+ a_minsdk = attrs[++i];
} else {
PLOGD("MediaCodec: ignoring unrecognized attribute '%s'", attrs[i]);
++i;
@@ -981,7 +1004,7 @@
return updateMediaCodec(
a_rank, parseCommaSeparatedStringSet(a_domain),
- parseCommaSeparatedStringSet(a_variant), a_enabled);
+ parseCommaSeparatedStringSet(a_variant), a_enabled, a_minsdk);
}
MediaCodecsXmlParser::Impl::Result
@@ -1035,7 +1058,7 @@
status_t MediaCodecsXmlParser::Impl::Parser::updateMediaCodec(
const char *rank, const StringSet &domains, const StringSet &variants,
- const char *enabled) {
+ const char *enabled, const char *minsdk) {
CHECK(mState->inCodec());
CodecProperties &codec = mState->codec();
@@ -1048,6 +1071,7 @@
codec.variantSet = variants;
+ // we allow sets of domains...
for (const std::string &domain : domains) {
if (domain.size() && domain.at(0) == '!') {
codec.domainSet.erase(domain.substr(1));
@@ -1065,6 +1089,49 @@
ALOGD("disabling %s", mState->codecName().c_str());
}
}
+
+ // evaluate against passed minsdk, with lots of logging to explain the logic
+ //
+ // if current sdk >= minsdk, we want to enable the codec
+ // this OVERRIDES any enabled="true|false" setting on the codec.
+ // (enabled=true minsdk=35 on a sdk 34 device results in a disabled codec)
+ //
+ // Although minsdk is not parsed before Android U, we can carry media_codecs.xml
+ // using this to devices earlier (e.g. as part of mainline). An example is appropriate.
+ //
+ // we have a codec that we want enabled in Android V (sdk=35), so we use:
+ // <MediaCodec ..... enabled="false" minsdk="35" >
+ //
+ // on Q/R/S/T: it sees enabled=false, but ignores the unrecognized minsdk
+ // so the codec will be disabled
+ // on U: it sees enabled=false, and sees minsdk=35, but U==34 and 34 < 35
+ // so the codec will be disabled
+ // on V: it sees enabled=false, and sees minsdk=35, V==35 and 35 >= 35
+ // so the codec will be enabled
+ //
+ // if we know the XML files will be used only on devices >= U, we can skip the enabled=false
+ // piece. Android mainline's support horizons say we will be using the enabled=false for
+ // another 4-5 years after U.
+ //
+ if (minsdk != nullptr) {
+ char *p = nullptr;
+ int sdk = strtol(minsdk, &p, 0);
+ if (p == minsdk || sdk < 0) {
+ ALOGE("minsdk parsing '%s' yielded %d, mapping to 0", minsdk, sdk);
+ sdk = 0;
+ }
+ // minsdk="#" means: "enable if sdk is >= #, disable otherwise"
+ if (mysdk < sdk) {
+ ALOGI("codec %s disabled, device sdk %d < required %d",
+ mState->codecName().c_str(), mysdk, sdk);
+ codec.quirkSet.emplace("attribute::disabled");
+ } else {
+ ALOGI("codec %s enabled, device sdk %d >= required %d",
+ mState->codecName().c_str(), mysdk, sdk);
+ codec.quirkSet.erase("attribute::disabled");
+ }
+ }
+
return OK;
}
diff --git a/media/libstagefright/xmlparser/api/current.txt b/media/libstagefright/xmlparser/api/current.txt
index ecfd85e..95c347a 100644
--- a/media/libstagefright/xmlparser/api/current.txt
+++ b/media/libstagefright/xmlparser/api/current.txt
@@ -84,6 +84,7 @@
method public java.util.List<media.codecs.Feature> getFeature_optional();
method public java.util.List<media.codecs.Limit> getLimit_optional();
method public java.util.List<media.codecs.Mapping> getMapping_optional();
+ method public String getMinsdk();
method public String getName();
method public java.util.List<media.codecs.Quirk> getQuirk_optional();
method public String getRank();
@@ -95,6 +96,7 @@
method public java.util.List<media.codecs.Variant> getVariant_optional();
method public void setDomain(String);
method public void setEnabled(String);
+ method public void setMinsdk(String);
method public void setName(String);
method public void setRank(String);
method public void setType(String);
diff --git a/media/libstagefright/xmlparser/media_codecs.xsd b/media/libstagefright/xmlparser/media_codecs.xsd
index c9a7efc..33f3a27 100644
--- a/media/libstagefright/xmlparser/media_codecs.xsd
+++ b/media/libstagefright/xmlparser/media_codecs.xsd
@@ -74,6 +74,7 @@
<xs:attribute name="domain" type="xs:string"/>
<xs:attribute name="variant" type="xs:string"/>
<xs:attribute name="enabled" type="xs:string"/>
+ <xs:attribute name="minsdk" type="xs:string"/>
</xs:complexType>
<xs:complexType name="Quirk">
<xs:attribute name="name" type="xs:string"/>
diff --git a/media/libstagefright/xmlparser/test/XMLParserTest.cpp b/media/libstagefright/xmlparser/test/XMLParserTest.cpp
index 7629d97..2c5821e 100644
--- a/media/libstagefright/xmlparser/test/XMLParserTest.cpp
+++ b/media/libstagefright/xmlparser/test/XMLParserTest.cpp
@@ -145,6 +145,33 @@
},
{}, "");
+ // minsdk
+ setCodecProperties("test12.encoder", true, 12, {"attribute::disabled"}, {}, {}, "video/t12",
+ {
+ pair<string, string>("tuning-enable-goal", "no"),
+ },
+ {}, "");
+ setCodecProperties("test13.encoder", true, 13, {"attribute::disabled"}, {}, {}, "video/t13",
+ {
+ pair<string, string>("tuning-enable-goal", "no"),
+ },
+ {}, "");
+ setCodecProperties("test14.encoder", true, 14, {"attribute::disabled"}, {}, {}, "video/t14",
+ {
+ pair<string, string>("tuning-enable-goal", "no"),
+ },
+ {}, "");
+ setCodecProperties("test15.encoder", true, 15, {}, {}, {}, "video/t15",
+ {
+ pair<string, string>("tuning-enable-goal", "yes"),
+ },
+ {}, "");
+ setCodecProperties("test16.encoder", true, 16, {}, {}, {}, "video/t16",
+ {
+ pair<string, string>("tuning-enable-goal", "yes"),
+ },
+ {}, "");
+
setRoleProperties("audio_decoder.mp3", false, 1, "audio/mpeg", "test1.decoder",
{pair<string, string>("attribute::disabled", "present"),
pair<string, string>("rank", "4")});
@@ -191,6 +218,22 @@
pair<string, string>("tuning-pi", "3.1415")
});
+ // minsdk
+ setRoleProperties("video_encoder.t12", true, 12, "video/t12", "test12.encoder",
+ {pair<string, string>("tuning-enable-goal", "no"),
+ pair<string, string>("attribute::disabled", "present") });
+ setRoleProperties("video_encoder.t13", true, 13, "video/t13", "test13.encoder",
+ {pair<string, string>("tuning-enable-goal", "no"),
+ pair<string, string>("attribute::disabled", "present") });
+ setRoleProperties("video_encoder.t14", true, 14, "video/t14", "test14.encoder",
+ {pair<string, string>("tuning-enable-goal", "no"),
+ pair<string, string>("attribute::disabled", "present") });
+ setRoleProperties("video_encoder.t15", true, 15, "video/t15", "test15.encoder",
+ {pair<string, string>("tuning-enable-goal", "yes")});
+ setRoleProperties("video_encoder.t16", true, 16, "video/t16", "test16.encoder",
+ {pair<string, string>("tuning-enable-goal", "yes")});
+
+
setServiceAttribute(
{pair<string, string>("domain-telephony", "0"), pair<string, string>("domain-tv", "0"),
pair<string, string>("setting2", "0"), pair<string, string>("variant-variant1", "0")});
diff --git a/media/libstagefright/xmlparser/test/testdata/media_codecs_unit_test.xml b/media/libstagefright/xmlparser/test/testdata/media_codecs_unit_test.xml
index 8cae423..e066927 100644
--- a/media/libstagefright/xmlparser/test/testdata/media_codecs_unit_test.xml
+++ b/media/libstagefright/xmlparser/test/testdata/media_codecs_unit_test.xml
@@ -88,5 +88,21 @@
<Tuning name="hungry" value="yes"/>
<Tuning name="pi" value="3.1415"/>
</MediaCodec>
+ <!-- test minsdk -->
+ <MediaCodec name="test12.encoder" type="video/t12" minsdk="100">
+ <Tuning name="enable-goal" value="no"/>
+ </MediaCodec>
+ <MediaCodec name="test13.encoder" type="video/t13" enabled="false" minsdk="100">
+ <Tuning name="enable-goal" value="no"/>
+ </MediaCodec>
+ <MediaCodec name="test14.encoder" type="video/t14" enabled="true" minsdk="100">
+ <Tuning name="enable-goal" value="no"/>
+ </MediaCodec>
+ <MediaCodec name="test15.encoder" type="video/t15" minsdk="34">
+ <Tuning name="enable-goal" value="yes"/>
+ </MediaCodec>
+ <MediaCodec name="test16.encoder" type="video/t16" enabled="false" minsdk="34">
+ <Tuning name="enable-goal" value="yes"/>
+ </MediaCodec>
</Encoders>
</Included>