Merge "Allow directly setting a DataSource for NuMediaExtractor" into jb-mr1-dev
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 8620856..58e4723 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1046,7 +1046,8 @@
     {
         Mutex::Autolock l(client->mLock);
         if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) {
-            client->mAudioOutput->switchToNextOutput();
+            if (client->mAudioOutput != NULL)
+                client->mAudioOutput->switchToNextOutput();
             client->mNextClient->start();
             client->mNextClient->mClient->notify(MEDIA_INFO, MEDIA_INFO_STARTED_AS_NEXT, 0, obj);
         }
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index e18fcbc..04f78eb 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -756,8 +756,8 @@
                       cachedDurationUs / 1E6);
                 pause_l();
                 ensureCacheIsFetching_l();
-                sendCacheStats();
             }
+            sendCacheStats();
             notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
         } else if (eos || cachedDurationUs > kHighWaterMarkUs) {
             if (mFlags & CACHE_UNDERRUN) {
@@ -780,9 +780,14 @@
 
 void AwesomePlayer::sendCacheStats() {
     sp<MediaPlayerBase> listener = mListener.promote();
-    if (listener != NULL && mCachedSource != NULL) {
+    if (listener != NULL) {
         int32_t kbps = 0;
-        status_t err = mCachedSource->getEstimatedBandwidthKbps(&kbps);
+        status_t err = UNKNOWN_ERROR;
+        if (mCachedSource != NULL) {
+            err = mCachedSource->getEstimatedBandwidthKbps(&kbps);
+        } else if (mWVMExtractor != NULL) {
+            err = mWVMExtractor->getEstimatedBandwidthKbps(&kbps);
+        }
         if (err == OK) {
             listener->sendEvent(
                 MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp
index 08d2ae2..d94fc65 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -121,6 +121,15 @@
     return mImpl->getCachedDurationUs(finalStatus);
 }
 
+status_t WVMExtractor::getEstimatedBandwidthKbps(int32_t *kbps) {
+    if (mImpl == NULL) {
+        return UNKNOWN_ERROR;
+    }
+
+    return mImpl->getEstimatedBandwidthKbps(kbps);
+}
+
+
 void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) {
     if (mImpl != NULL) {
         mImpl->setAdaptiveStreamingMode(adaptive);
diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h
index 2b952e2..c43c801 100644
--- a/media/libstagefright/include/WVMExtractor.h
+++ b/media/libstagefright/include/WVMExtractor.h
@@ -33,6 +33,7 @@
     virtual ~WVMLoadableExtractor() {}
 
     virtual int64_t getCachedDurationUs(status_t *finalStatus) = 0;
+    virtual status_t getEstimatedBandwidthKbps(int32_t *kbps) = 0;
     virtual void setAdaptiveStreamingMode(bool adaptive) = 0;
     virtual void setCryptoPluginMode(bool cryptoPluginMode) = 0;
     virtual void setUID(uid_t uid) = 0;
@@ -55,6 +56,9 @@
     // *finalStatus == ERROR_END_OF_STREAM
     int64_t getCachedDurationUs(status_t *finalStatus);
 
+    // Return the current estimated bandwidth
+    status_t getEstimatedBandwidthKbps(int32_t *kbps);
+
     // Set to use adaptive streaming mode by the WV component.
     // If adaptive == true, adaptive streaming mode will be used.
     // Default mode is non-adaptive streaming mode.
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp
index feb8e40..8f7d12b 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -902,8 +902,8 @@
                 ++j;
 
                 size_t blockSize = 0;
-                for (int i = 0; i < iter.block()->GetFrameCount(); ++i) {
-                    blockSize += iter.block()->GetFrame(i).len;
+                for (int k = 0; k < iter.block()->GetFrameCount(); ++k) {
+                    blockSize += iter.block()->GetFrame(k).len;
                 }
 
                 if (blockSize > maxBlockSize) {
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp
index 44988a3..501a970 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -18,6 +18,7 @@
 #define LOG_TAG "ARTPConnection"
 #include <utils/Log.h>
 
+#include "ARTPAssembler.h"
 #include "ARTPConnection.h"
 
 #include "ARTPSource.h"