Merge "Add option to stagefright for writing decoded PCM" into jb-dev
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index 5f3f63f..78b2469 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -98,6 +98,20 @@
         return ERROR_UNSUPPORTED;
     }
 
+    sp<MetaData> fileMeta = mImpl->getMetaData();
+    const char *containerMime;
+    if (fileMeta != NULL
+            && fileMeta->findCString(kKeyMIMEType, &containerMime)
+            && !strcasecmp(containerMime, "video/wvm")) {
+        // We always want to use "cryptoPluginMode" when using the wvm
+        // extractor. We can tell that it is this extractor by looking
+        // at the container mime type.
+        // The cryptoPluginMode ensures that the extractor will actually
+        // give us data in a call to MediaSource::read(), unlike its
+        // default mode that we use from AwesomePlayer.
+        static_cast<WVMExtractor *>(mImpl.get())->setCryptoPluginMode(true);
+    }
+
     mDataSource = dataSource;
 
     updateDurationAndBitrate();
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp
index effe336..08d2ae2 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -127,6 +127,12 @@
     }
 }
 
+void WVMExtractor::setCryptoPluginMode(bool cryptoPluginMode) {
+    if (mImpl != NULL) {
+        mImpl->setCryptoPluginMode(cryptoPluginMode);
+    }
+}
+
 void WVMExtractor::setUID(uid_t uid) {
     if (mImpl != NULL) {
         mImpl->setUID(uid);
diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h
index 3c3ca89..2b952e2 100644
--- a/media/libstagefright/include/WVMExtractor.h
+++ b/media/libstagefright/include/WVMExtractor.h
@@ -34,6 +34,7 @@
 
     virtual int64_t getCachedDurationUs(status_t *finalStatus) = 0;
     virtual void setAdaptiveStreamingMode(bool adaptive) = 0;
+    virtual void setCryptoPluginMode(bool cryptoPluginMode) = 0;
     virtual void setUID(uid_t uid) = 0;
 };
 
@@ -61,6 +62,12 @@
     // is used.
     void setAdaptiveStreamingMode(bool adaptive);
 
+    // setCryptoPluginMode(true) to select crypto plugin mode.
+    // In this mode, the extractor returns encrypted data for use
+    // with the MediaCodec model, which handles the decryption in the
+    // codec.
+    void setCryptoPluginMode(bool cryptoPluginMode);
+
     void setUID(uid_t uid);
 
     static bool getVendorLibHandle();
diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp
index dc5f6b8..f855d90 100644
--- a/media/libstagefright/timedtext/TimedTextPlayer.cpp
+++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp
@@ -112,15 +112,14 @@
               break;
             }
             sp<RefBase> obj;
-            msg->findObject("subtitle", &obj);
-            if (obj != NULL) {
+            if (msg->findObject("subtitle", &obj)) {
                 sp<ParcelEvent> parcelEvent;
                 parcelEvent = static_cast<ParcelEvent*>(obj.get());
                 notifyListener(&(parcelEvent->parcel));
+                doRead();
             } else {
                 notifyListener();
             }
-            doRead();
             break;
         }
         case kWhatSetSource: {