am b450d96b: am 537fa17f: Merge "Disconnect HTTP live sessions as soon as the request comes in." into honeycomb

* commit 'b450d96b3d13cd341ef7aa4483c2223ddfecce3c':
  Disconnect HTTP live sessions as soon as the request comes in.
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp
index c6c36e3..0bed3ca 100644
--- a/media/libstagefright/httplive/LiveSession.cpp
+++ b/media/libstagefright/httplive/LiveSession.cpp
@@ -51,6 +51,7 @@
       mNumRetries(0),
       mDurationUs(-1),
       mSeekDone(false),
+      mDisconnectPending(false),
       mMonitorQueueGeneration(0) {
 }
 
@@ -68,6 +69,11 @@
 }
 
 void LiveSession::disconnect() {
+    Mutex::Autolock autoLock(mLock);
+    mDisconnectPending = true;
+
+    mHTTPDataSource->disconnect();
+
     (new AMessage(kWhatDisconnect, id()))->post();
 }
 
@@ -138,7 +144,13 @@
     mMasterURL = url;
 
     sp<M3UParser> playlist = fetchPlaylist(url.c_str());
-    CHECK(playlist != NULL);
+
+    if (playlist == NULL) {
+        LOGE("unable to fetch master playlist '%s'.", url.c_str());
+
+        mDataSource->queueEOS(ERROR_IO);
+        return;
+    }
 
     if (playlist->isVariantPlaylist()) {
         for (size_t i = 0; i < playlist->size(); ++i) {
@@ -177,6 +189,9 @@
     LOGI("onDisconnect");
 
     mDataSource->queueEOS(ERROR_END_OF_STREAM);
+
+    Mutex::Autolock autoLock(mLock);
+    mDisconnectPending = false;
 }
 
 status_t LiveSession::fetchFile(const char *url, sp<ABuffer> *out) {
@@ -189,6 +204,14 @@
     } else if (strncasecmp(url, "http://", 7)) {
         return ERROR_UNSUPPORTED;
     } else {
+        {
+            Mutex::Autolock autoLock(mLock);
+
+            if (mDisconnectPending) {
+                return ERROR_IO;
+            }
+        }
+
         status_t err = mHTTPDataSource->connect(url);
 
         if (err != OK) {
diff --git a/media/libstagefright/include/LiveSession.h b/media/libstagefright/include/LiveSession.h
index 41f5ad0..f1188c4 100644
--- a/media/libstagefright/include/LiveSession.h
+++ b/media/libstagefright/include/LiveSession.h
@@ -87,6 +87,7 @@
     Condition mCondition;
     int64_t mDurationUs;
     bool mSeekDone;
+    bool mDisconnectPending;
 
     int32_t mMonitorQueueGeneration;