Merge "SoftAVCEnc: Stop using the u4_strd field in the set dimensions struct" into mnc-dev
diff --git a/media/libmediaplayerservice/nuplayer/Android.mk b/media/libmediaplayerservice/nuplayer/Android.mk
index cc6f743..cd20837 100644
--- a/media/libmediaplayerservice/nuplayer/Android.mk
+++ b/media/libmediaplayerservice/nuplayer/Android.mk
@@ -25,7 +25,12 @@
 	$(TOP)/frameworks/av/media/libmediaplayerservice              \
 	$(TOP)/frameworks/native/include/media/openmax
 
-LOCAL_CFLAGS += -Werror -Wall -DENABLE_STAGEFRIGHT_EXPERIMENTS
+LOCAL_CFLAGS += -Werror -Wall
+
+# enable experiments only in userdebug and eng builds
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_CFLAGS += -DENABLE_STAGEFRIGHT_EXPERIMENTS
+endif
 
 LOCAL_CLANG := true
 
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index e904c49..3e65686 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -6503,6 +6503,11 @@
 
                 mCodec->mSentFormat = false;
 
+                if (mCodec->mTunneled) {
+                    sp<AMessage> dummy = new AMessage(kWhatOutputBufferDrained, mCodec);
+                    mCodec->sendFormatChange(dummy);
+                }
+
                 ALOGV("[%s] Output port now reenabled.", mCodec->mComponentName.c_str());
 
                 if (mCodec->mExecutingState->active()) {
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index b86c749..2529aa7 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -127,8 +127,12 @@
         libdl \
         libRScpp \
 
-LOCAL_CFLAGS += -Wno-multichar -Werror -Wno-error=deprecated-declarations -Wall \
-        -DENABLE_STAGEFRIGHT_EXPERIMENTS
+LOCAL_CFLAGS += -Wno-multichar -Werror -Wno-error=deprecated-declarations -Wall
+
+# enable experiments only in userdebug and eng builds
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_CFLAGS += -DENABLE_STAGEFRIGHT_EXPERIMENTS
+endif
 
 LOCAL_CLANG := true
 
diff --git a/media/libstagefright/foundation/ADebug.cpp b/media/libstagefright/foundation/ADebug.cpp
index 24fa561..2c5f544 100644
--- a/media/libstagefright/foundation/ADebug.cpp
+++ b/media/libstagefright/foundation/ADebug.cpp
@@ -29,6 +29,8 @@
 #include <AStringUtils.h>
 #include <AUtils.h>
 
+#define UNUSED(x) ((void)(x))
+
 namespace android {
 
 //static
@@ -130,7 +132,24 @@
     long level = GetLevelFromProperty(name, "debug.stagefright.experiments", undefined);
     if (level != undefined) {
         ALOGI("experiment '%s': %s from property", name, level ? "ENABLED" : "disabled");
-        return level != 0;
+        return allow && (level != 0);
+    }
+
+#ifndef ENABLE_STAGEFRIGHT_AUTO_EXPERIMENTS
+    UNUSED(modulo);
+    UNUSED(limit);
+    UNUSED(plus);
+    UNUSED(timeDivisor);
+    return false;
+#else
+    // Disable automatic experiments in "non-experimental" builds (that is, _all_ builds
+    // as there is no "experimental" build).
+    // TODO: change build type to enable automatic experiments in the future for some builds
+    char value[PROPERTY_VALUE_MAX];
+    if (property_get("ro.build.type", value, NULL)) {
+        if (strcmp(value, "experimental")) {
+            return false;
+        }
     }
 
     static volatile int32_t haveSerial = 0;
@@ -164,6 +183,7 @@
     bool enable = allow && (counter % modulo < limit);
     ALOGI("experiment '%s': %s", name, enable ? "ENABLED" : "disabled");
     return enable;
+#endif
 }
 
 }  // namespace android
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp
index 2fc5135..1557401 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -1657,7 +1657,16 @@
         mLastDequeuedTimeUs = timeUs;
 
         for (size_t i = 0; i < mPacketSources.size(); i++) {
-            mPacketSources.editValueAt(i)->clear();
+            sp<AnotherPacketSource> packetSource = mPacketSources.editValueAt(i);
+            sp<MetaData> format = packetSource->getFormat();
+            packetSource->clear();
+            // Set a tentative format here such that HTTPLiveSource will always have
+            // a format available when NuPlayer queries. Without an available video
+            // format when setting a surface NuPlayer might disable video decoding
+            // altogether. The tentative format will be overwritten by the
+            // authoritative (and possibly same) format once content from the new
+            // position is dequeued.
+            packetSource->setFormat(format);
         }
 
         for (size_t i = 0; i < kMaxStreams; ++i) {