summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/stagefright/foundation/ADebug.h10
-rw-r--r--media/libstagefright/foundation/ADebug.cpp38
-rw-r--r--media/libstagefright/tests/Utils_test.cpp22
3 files changed, 44 insertions, 26 deletions
diff --git a/include/media/stagefright/foundation/ADebug.h b/include/media/stagefright/foundation/ADebug.h
index 24df85a..65f415a 100644
--- a/include/media/stagefright/foundation/ADebug.h
+++ b/include/media/stagefright/foundation/ADebug.h
@@ -117,7 +117,7 @@ struct ADebug {
};
- // parse the property or string to get the debug level for a component name
+ // parse the property or string to get a long-type level for a component name
// string format is:
// <level>[:<glob>][,<level>[:<glob>]...]
// - <level> is 0-5 corresponding to ADebug::Level
@@ -125,10 +125,14 @@ struct ADebug {
// matches all components
// - string is read left-to-right, and the last matching level is returned, or
// the def if no terms matched
+ static long GetLevelFromSettingsString(
+ const char *name, const char *value, long def);
+ static long GetLevelFromProperty(
+ const char *name, const char *value, long def);
+
+ // same for ADebug::Level - performs clamping to valid debug ranges
static Level GetDebugLevelFromProperty(
const char *name, const char *propertyName, Level def = kDebugNone);
- static Level GetDebugLevelFromString(
- const char *name, const char *value, Level def = kDebugNone);
// remove redundant segments of a codec name, and return a newly allocated
// string suitable for debugging
diff --git a/media/libstagefright/foundation/ADebug.cpp b/media/libstagefright/foundation/ADebug.cpp
index 0d1cea4..24fa561 100644
--- a/media/libstagefright/foundation/ADebug.cpp
+++ b/media/libstagefright/foundation/ADebug.cpp
@@ -32,11 +32,10 @@
namespace android {
//static
-ADebug::Level ADebug::GetDebugLevelFromString(
- const char *name, const char *value, ADebug::Level def) {
+long ADebug::GetLevelFromSettingsString(
+ const char *name, const char *value, long def) {
// split on ,
const char *next = value, *current;
- const unsigned long maxLevel = (unsigned long)kDebugMax;
while (next != NULL) {
current = next;
next = strchr(current, ',');
@@ -52,8 +51,8 @@ ADebug::Level ADebug::GetDebugLevelFromString(
// get level
char *end;
- errno = 0; // strtoul does not clear errno, but it can be set for any return value
- unsigned long level = strtoul(current, &end, 10);
+ errno = 0; // strtol does not clear errno, but it can be set for any return value
+ long level = strtol(current, &end, 10);
while (isspace(*end)) {
++end;
}
@@ -77,23 +76,30 @@ ADebug::Level ADebug::GetDebugLevelFromString(
}
}
- // update debug level
- def = (Level)min(level, maxLevel);
+ // update value
+ def = level;
}
return def;
}
//static
-ADebug::Level ADebug::GetDebugLevelFromProperty(
- const char *name, const char *propertyName, ADebug::Level def) {
+long ADebug::GetLevelFromProperty(
+ const char *name, const char *propertyName, long def) {
char value[PROPERTY_VALUE_MAX];
if (property_get(propertyName, value, NULL)) {
- return GetDebugLevelFromString(name, value, def);
+ def = GetLevelFromSettingsString(name, value, def);
}
return def;
}
//static
+ADebug::Level ADebug::GetDebugLevelFromProperty(
+ const char *name, const char *propertyName, ADebug::Level def) {
+ long level = GetLevelFromProperty(name, propertyName, (long)def);
+ return (Level)min(max(level, (long)kDebugNone), (long)kDebugMax);
+}
+
+//static
char *ADebug::GetDebugName(const char *name) {
char *debugName = strdup(name);
const char *terms[] = { "omx", "video", "audio" };
@@ -118,6 +124,15 @@ char *ADebug::GetDebugName(const char *name) {
bool ADebug::getExperimentFlag(
bool allow, const char *name, uint64_t modulo,
uint64_t limit, uint64_t plus, uint64_t timeDivisor) {
+ // see if this experiment should be disabled/enabled based on properties.
+ // default to 2 to allow 0/1 specification
+ const int undefined = 2;
+ long level = GetLevelFromProperty(name, "debug.stagefright.experiments", undefined);
+ if (level != undefined) {
+ ALOGI("experiment '%s': %s from property", name, level ? "ENABLED" : "disabled");
+ return level != 0;
+ }
+
static volatile int32_t haveSerial = 0;
static uint64_t serialNum;
if (!android_atomic_acquire_load(&haveSerial)) {
@@ -138,11 +153,10 @@ bool ADebug::getExperimentFlag(
num = num * 256 + c;
}
}
- ALOGI("got serial");
serialNum = num;
android_atomic_release_store(1, &haveSerial);
}
- ALOGI("serial: %llu, time: %llu", (long long)serialNum, (long long)time(NULL));
+ ALOGD("serial: %llu, time: %lld", (long long unsigned)serialNum, (long long)time(NULL));
// MINOR: use modulo for counter and time, so that their sum does not
// roll over, and mess up the correlation between related experiments.
// e.g. keep (a mod 2N) = 0 impl (a mod N) = 0
diff --git a/media/libstagefright/tests/Utils_test.cpp b/media/libstagefright/tests/Utils_test.cpp
index c1e663c..d736501 100644
--- a/media/libstagefright/tests/Utils_test.cpp
+++ b/media/libstagefright/tests/Utils_test.cpp
@@ -109,21 +109,21 @@ TEST_F(UtilsTest, TestStringUtils) {
TEST_F(UtilsTest, TestDebug) {
#define LVL(x) (ADebug::Level)(x)
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", "", LVL(5)), LVL(5));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", " \t \n ", LVL(2)), LVL(2));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", "3", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", "3:*deo", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString(
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "", LVL(5)), LVL(5));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", " \t \n ", LVL(2)), LVL(2));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3", LVL(5)), LVL(3));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3:*deo", LVL(5)), LVL(3));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString(
"video", "\t\n 3 \t\n:\t\n video \t\n", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", "3:*deo,2:vid*", LVL(5)), LVL(2));
- ASSERT_EQ(ADebug::GetDebugLevelFromString(
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3:*deo,2:vid*", LVL(5)), LVL(2));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString(
"avideo", "\t\n 3 \t\n:\t\n avideo \t\n,\t\n 2 \t\n:\t\n video \t\n", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString(
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString(
"audio.omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(2));
- ASSERT_EQ(ADebug::GetDebugLevelFromString(
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString(
"video.omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("video", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(3));
- ASSERT_EQ(ADebug::GetDebugLevelFromString("omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(4));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(3));
+ ASSERT_EQ(ADebug::GetLevelFromSettingsString("omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(4));
#undef LVL
}