Initial checkin of preliminary support for "http live" streaming in stagefright.

Change-Id: I20399f63d63af86a3ba22641c0e43385a108fb3f
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 274dad9..88c8ee4 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -39,6 +39,8 @@
 
 #include <surfaceflinger/ISurface.h>
 
+#include "include/LiveSource.h"
+
 namespace android {
 
 struct AwesomeEvent : public TimedEventQueue::Event {
@@ -261,6 +263,16 @@
 
 status_t AwesomePlayer::setDataSource(
         int fd, int64_t offset, int64_t length) {
+#if 0
+    // return setDataSource("httplive://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_96.m3u8");
+    // return setDataSource("httplive://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_1500.m3u8");
+    return setDataSource("httplive://iphone.video.hsn.com/iPhone_high.m3u8");
+    // return setDataSource("httplive://iphoned5.akamai.com.edgesuite.net/mhbarron/iphonewebcast/webcast090209_all/webcast090209_all.m3u8");
+    // return setDataSource("httplive://qthttp.akamai.com.edgesuite.net/iphone_demo/Video_Content/usat/tt_062209_iphone/hi/prog_index.m3u8");
+    // return setDataSource("httplive://qthttp.akamai.com.edgesuite.net/iphone_demo/Video_Content/usat/tt_googmaps/hi/prog_index.m3u8");
+    // return setDataSource("httplive://qthttp.akamai.com.edgesuite.net/iphone_demo/Video_Content/mtv/ni_spo_25a_rt74137_clip_syn/hi/prog_index.m3u8");
+#endif
+
     Mutex::Autolock autoLock(mLock);
 
     reset_l();
@@ -438,11 +450,11 @@
         durationUs = mDurationUs;
     }
 
+    int64_t cachedDurationUs = mPrefetcher->getCachedDurationUs();
+
+    LOGI("cache holds %.2f secs worth of data.", cachedDurationUs / 1E6);
+
     if (durationUs >= 0) {
-        int64_t cachedDurationUs = mPrefetcher->getCachedDurationUs();
-
-        LOGV("cache holds %.2f secs worth of data.", cachedDurationUs / 1E6);
-
         int64_t positionUs;
         getPosition(&positionUs);
 
@@ -453,7 +465,8 @@
 
         postBufferingEvent_l();
     } else {
-        LOGE("Not sending buffering status because duration is unknown.");
+        // LOGE("Not sending buffering status because duration is unknown.");
+        postBufferingEvent_l();
     }
 }
 
@@ -1123,6 +1136,20 @@
                 mConnectingDataSource, 64 * 1024, 10);
 
         mConnectingDataSource.clear();
+    } else if (!strncasecmp(mUri.string(), "httplive://", 11)) {
+        String8 uri("http://");
+        uri.append(mUri.string() + 11);
+
+        dataSource = new LiveSource(uri.string());
+
+        if (dataSource->flags() & DataSource::kWantsPrefetching) {
+            mPrefetcher = new Prefetcher;
+        }
+
+        sp<MediaExtractor> extractor =
+            MediaExtractor::Create(dataSource, MEDIA_MIMETYPE_CONTAINER_MPEG2TS);
+
+        return setDataSource_l(extractor);
     } else {
         dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
     }