Squashed commit of the following:

commit de99ae4a523ff5ec40b47071f22fdde1a4b2a0bf
Author: Andreas Huber <andih@google.com>
Date:   Thu Dec 2 13:18:40 2010 -0800

    Scan for sync words to find H.264 frame/AAC frame boundaries if PES packets do not start with them.

    Change-Id: If2861982ecb3006fac806105dbfcd1d43c2a4205

commit be23791ff0d037aa7073589cdc8bfc362e1c281d
Author: Andreas Huber <andih@google.com>
Date:   Thu Dec 2 13:12:39 2010 -0800

    Properly expand relative key URLs and strip surrounding quotes in the M3UParser.

    Change-Id: I013a6d83a64f095d090e5c7730298bdac7d03ab4

commit 0f1d8f65effe0cc42a265dd91d8b91dce6534325
Author: Andreas Huber <andih@google.com>
Date:   Thu Dec 2 13:11:27 2010 -0800

    Ugly hack that assumes that any http url containing "m3u8" refers to an httplive stream.

    Change-Id: I05d7bbc5dab0f9822558122b5b9dc2a109ed8518

commit 255f0d5cdb1072ecd66b47ee614bf574f1388e5a
Author: Andreas Huber <andih@google.com>
Date:   Thu Dec 2 13:10:56 2010 -0800

    Add one more mimetype "application/x-mpegurl" to identify httplive playlists.

    Change-Id: I63fd3b8c2539c9ee23c077df533157af78b10863

Change-Id: I135687383009dbe32d690c9ba8dea60159adc616
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index a804866..8ebbe6c 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -426,7 +426,8 @@
         // Hack to support http live.
 
         size_t len = strlen(uri);
-        if (!strcasecmp(&uri[len - 5], ".m3u8")) {
+        if (!strcasecmp(&uri[len - 5], ".m3u8")
+                || strstr(&uri[7], "m3u8") != NULL) {
             mUri = "httplive://";
             mUri.append(&uri[7]);
         }
diff --git a/media/libstagefright/httplive/LiveSource.cpp b/media/libstagefright/httplive/LiveSource.cpp
index 4b4c3d2..4451bd5 100644
--- a/media/libstagefright/httplive/LiveSource.cpp
+++ b/media/libstagefright/httplive/LiveSource.cpp
@@ -359,14 +359,6 @@
             return false;
         }
 
-        if (keyURI.size() >= 2
-                && keyURI.c_str()[0] == '"'
-                && keyURI.c_str()[keyURI.size() - 1] == '"') {
-            // Remove surrounding quotes.
-            AString tmp(keyURI, 1, keyURI.size() - 2);
-            keyURI = tmp;
-        }
-
         ssize_t index = mAESKeyForURI.indexOfKey(keyURI);
 
         sp<ABuffer> key;
diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp
index b166cc3..d4a29c0 100644
--- a/media/libstagefright/httplive/M3UParser.cpp
+++ b/media/libstagefright/httplive/M3UParser.cpp
@@ -162,7 +162,7 @@
                 if (mIsVariantPlaylist) {
                     return ERROR_MALFORMED;
                 }
-                err = parseCipherInfo(line, &itemMeta);
+                err = parseCipherInfo(line, &itemMeta, mBaseURI);
             } else if (line.startsWith("#EXT-X-ENDLIST")) {
                 mIsComplete = true;
             } else if (line.startsWith("#EXTINF")) {
@@ -298,7 +298,7 @@
 
 // static
 status_t M3UParser::parseCipherInfo(
-        const AString &line, sp<AMessage> *meta) {
+        const AString &line, sp<AMessage> *meta, const AString &baseURI) {
     ssize_t colonPos = line.find(":");
 
     if (colonPos < 0) {
@@ -338,6 +338,24 @@
                 *meta = new AMessage;
             }
 
+            if (key == "uri") {
+                if (val.size() >= 2
+                        && val.c_str()[0] == '"'
+                        && val.c_str()[val.size() - 1] == '"') {
+                    // Remove surrounding quotes.
+                    AString tmp(val, 1, val.size() - 2);
+                    val = tmp;
+                }
+
+                AString absURI;
+                if (MakeURL(baseURI.c_str(), val.c_str(), &absURI)) {
+                    val = absURI;
+                } else {
+                    LOGE("failed to make absolute url for '%s'.",
+                         val.c_str());
+                }
+            }
+
             key.insert(AString("cipher-"), 0);
 
             (*meta)->setString(key.c_str(), val.c_str(), val.size());
diff --git a/media/libstagefright/include/M3UParser.h b/media/libstagefright/include/M3UParser.h
index 531d184..63895b4 100644
--- a/media/libstagefright/include/M3UParser.h
+++ b/media/libstagefright/include/M3UParser.h
@@ -67,7 +67,7 @@
             const AString &line, sp<AMessage> *meta);
 
     static status_t parseCipherInfo(
-            const AString &line, sp<AMessage> *meta);
+            const AString &line, sp<AMessage> *meta, const AString &baseURI);
 
     static status_t ParseInt32(const char *s, int32_t *x);
 
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index f06a1bb..a559b21 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -238,10 +238,15 @@
 }
 
 sp<MediaSource> ATSParser::Program::getSource(SourceType type) {
+    size_t index = (type == MPEG2ADTS_AUDIO) ? 0 : 0;
+
     for (size_t i = 0; i < mStreams.size(); ++i) {
         sp<MediaSource> source = mStreams.editValueAt(i)->getSource(type);
         if (source != NULL) {
-            return source;
+            if (index == 0) {
+                return source;
+            }
+            --index;
         }
     }
 
@@ -508,7 +513,10 @@
     int64_t timeUs = mProgram->convertPTSToTimestamp(PTS);
 
     status_t err = mQueue.appendData(data, size, timeUs);
-    CHECK_EQ(err, (status_t)OK);
+
+    if (err != OK) {
+        return;
+    }
 
     sp<ABuffer> accessUnit;
     while ((accessUnit = mQueue.dequeueAccessUnit()) != NULL) {
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index f11b3c3..37bcb23 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -55,9 +55,34 @@
         switch (mMode) {
             case H264:
             {
+#if 0
                 if (size < 4 || memcmp("\x00\x00\x00\x01", data, 4)) {
                     return ERROR_MALFORMED;
                 }
+#else
+                uint8_t *ptr = (uint8_t *)data;
+
+                ssize_t startOffset = -1;
+                for (size_t i = 0; i + 3 < size; ++i) {
+                    if (!memcmp("\x00\x00\x00\x01", &ptr[i], 4)) {
+                        startOffset = i;
+                        break;
+                    }
+                }
+
+                if (startOffset < 0) {
+                    return ERROR_MALFORMED;
+                }
+
+                if (startOffset > 0) {
+                    LOGI("found something resembling an H.264 syncword at "
+                         "offset %ld",
+                         startOffset);
+                }
+
+                data = &ptr[startOffset];
+                size -= startOffset;
+#endif
                 break;
             }
 
@@ -65,9 +90,31 @@
             {
                 uint8_t *ptr = (uint8_t *)data;
 
+#if 0
                 if (size < 2 || ptr[0] != 0xff || (ptr[1] >> 4) != 0x0f) {
                     return ERROR_MALFORMED;
                 }
+#else
+                ssize_t startOffset = -1;
+                for (size_t i = 0; i + 1 < size; ++i) {
+                    if (ptr[i] == 0xff && (ptr[i + 1] >> 4) == 0x0f) {
+                        startOffset = i;
+                        break;
+                    }
+                }
+
+                if (startOffset < 0) {
+                    return ERROR_MALFORMED;
+                }
+
+                if (startOffset > 0) {
+                    LOGI("found something resembling an AAC syncword at offset %ld",
+                         startOffset);
+                }
+
+                data = &ptr[startOffset];
+                size -= startOffset;
+#endif
                 break;
             }