libstagefright: add version string to profile results.

Bug: 21333717
Change-Id: I79966be5ba355633f83885844165b7d9a6b2643f
diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp
index d2352bc..a153cee 100644
--- a/media/libstagefright/MediaCodecList.cpp
+++ b/media/libstagefright/MediaCodecList.cpp
@@ -71,10 +71,24 @@
             if (gCodecList->initCheck() == OK) {
                 sCodecList = gCodecList;
 
-                struct stat s;
-                if (stat(kProfilingResults, &s) == -1) {
+                FILE *resultsFile = fopen(kProfilingResults, "r");
+                if (resultsFile) {
+                    AString currentVersion = getProfilingVersionString();
+                    size_t currentVersionSize = currentVersion.size();
+                    char *versionString = new char[currentVersionSize];
+                    fgets(versionString, currentVersionSize, resultsFile);
+                    if (strncmp(versionString, currentVersion.c_str(), currentVersionSize) != 0) {
+                        // profiling result out of date
+                        profilingNeeded = true;
+                    }
+                    fclose(resultsFile);
+                    delete[] versionString;
+                } else {
                     // profiling results doesn't existed
                     profilingNeeded = true;
+                }
+
+                if (profilingNeeded) {
                     for (size_t i = 0; i < gCodecList->countCodecs(); ++i) {
                         infos.push_back(gCodecList->getCodecInfo(i));
                     }
diff --git a/media/libstagefright/MediaCodecListOverrides.cpp b/media/libstagefright/MediaCodecListOverrides.cpp
index 0d95676..4cb28b8 100644
--- a/media/libstagefright/MediaCodecListOverrides.cpp
+++ b/media/libstagefright/MediaCodecListOverrides.cpp
@@ -20,6 +20,7 @@
 
 #include "MediaCodecListOverrides.h"
 
+#include <cutils/properties.h>
 #include <gui/Surface.h>
 #include <media/ICrypto.h>
 #include <media/IMediaCodecList.h>
@@ -32,6 +33,15 @@
 
 const char *kProfilingResults = "/data/misc/media/media_codecs_profiling_results.xml";
 
+AString getProfilingVersionString() {
+    char val[PROPERTY_VALUE_MAX];
+    if (property_get("ro.build.display.id", val, NULL) && (strlen(val) > 0)) {
+        return AStringPrintf("<!-- Profiled-with: %s -->", val);
+    }
+
+    return "<!-- Profiled-with: UNKNOWN_BUILD_ID -->";
+}
+
 // a limit to avoid allocating unreasonable number of codec instances in the measurement.
 // this should be in sync with the MAX_SUPPORTED_INSTANCES defined in MediaCodecInfo.java.
 static const int kMaxInstances = 32;
@@ -307,6 +317,8 @@
     }
 
     AString overrides;
+    overrides.append(getProfilingVersionString());
+    overrides.append("\n");
     overrides.append("<MediaCodecs>\n");
     if (global_results.size() > 0) {
         overrides.append("    <Settings>\n");
diff --git a/media/libstagefright/MediaCodecListOverrides.h b/media/libstagefright/MediaCodecListOverrides.h
index e350d2a..d4bb225 100644
--- a/media/libstagefright/MediaCodecListOverrides.h
+++ b/media/libstagefright/MediaCodecListOverrides.h
@@ -26,10 +26,13 @@
 
 namespace android {
 
+extern const char *kProfilingVersionString;
 extern const char *kProfilingResults;
 
 struct MediaCodecInfo;
 
+AString getProfilingVersionString();
+
 bool splitString(const AString &s, const AString &delimiter, AString *s1, AString *s2);
 
 // profile codecs and save the result to xml file named kProfilingResults.
diff --git a/media/libstagefright/tests/MediaCodecListOverrides_test.cpp b/media/libstagefright/tests/MediaCodecListOverrides_test.cpp
index cee62a3..ab547be 100644
--- a/media/libstagefright/tests/MediaCodecListOverrides_test.cpp
+++ b/media/libstagefright/tests/MediaCodecListOverrides_test.cpp
@@ -150,7 +150,11 @@
     fclose(f);
     free(buf);
 
-    EXPECT_TRUE(overrides == kTestOverridesStr);
+    AString expected;
+    expected.append(getProfilingVersionString());
+    expected.append("\n");
+    expected.append(kTestOverridesStr);
+    EXPECT_TRUE(overrides == expected);
 
     remove(fileName);
 }