Merge "Make mediascanner use filedescriptors instead of paths"
diff --git a/include/media/stagefright/timedtext/TimedTextDriver.h b/include/media/stagefright/timedtext/TimedTextDriver.h
index b9752df..e3ca536 100644
--- a/include/media/stagefright/timedtext/TimedTextDriver.h
+++ b/include/media/stagefright/timedtext/TimedTextDriver.h
@@ -30,6 +30,7 @@
 class Parcel;
 class TimedTextPlayer;
 class TimedTextSource;
+class DataSource;
 
 class TimedTextDriver {
 public:
@@ -48,7 +49,7 @@
     status_t addOutOfBandTextSource(const char *uri, const char *mimeType);
     // Caller owns the file desriptor and caller is responsible for closing it.
     status_t addOutOfBandTextSource(
-            int fd, off64_t offset, size_t length, const char *mimeType);
+            int fd, off64_t offset, off64_t length, const char *mimeType);
 
     void getTrackInfo(Parcel *parcel);
 
@@ -72,6 +73,8 @@
     // -- End of variables to be guarded by mLock
 
     status_t selectTrack_l(int32_t index);
+    status_t createOutOfBandTextSource(
+            const char *mimeType, const sp<DataSource>& dataSource);
 
     DISALLOW_EVIL_CONSTRUCTORS(TimedTextDriver);
 };
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index f96a4df..120a410 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -2292,7 +2292,7 @@
             }
             int fd         = request.readFileDescriptor();
             off64_t offset = request.readInt64();
-            size_t length  = request.readInt64();
+            off64_t length  = request.readInt64();
             String8 mimeType(request.readString16());
             return mTextDriver->addOutOfBandTextSource(
                     fd, offset, length, mimeType);
diff --git a/media/libstagefright/timedtext/TimedTextDriver.cpp b/media/libstagefright/timedtext/TimedTextDriver.cpp
index 8ee15f8..a99d882 100644
--- a/media/libstagefright/timedtext/TimedTextDriver.cpp
+++ b/media/libstagefright/timedtext/TimedTextDriver.cpp
@@ -23,6 +23,7 @@
 #include <media/mediaplayer.h>
 #include <media/MediaPlayerInterface.h>
 #include <media/stagefright/DataSource.h>
+#include <media/stagefright/FileSource.h>
 #include <media/stagefright/MediaDefs.h>
 #include <media/stagefright/MediaErrors.h>
 #include <media/stagefright/MediaSource.h>
@@ -161,15 +162,32 @@
 
 status_t TimedTextDriver::addOutOfBandTextSource(
         const char *uri, const char *mimeType) {
-    // TODO: Define "TimedTextSource::CreateFromURI(uri)"
-    // and move below lines there..?
-
     // To support local subtitle file only for now
     if (strncasecmp("file://", uri, 7)) {
+        ALOGE("uri('%s') is not a file", uri);
         return ERROR_UNSUPPORTED;
     }
+
     sp<DataSource> dataSource =
             DataSource::CreateFromURI(uri);
+    return createOutOfBandTextSource(mimeType, dataSource);
+}
+
+status_t TimedTextDriver::addOutOfBandTextSource(
+        int fd, off64_t offset, off64_t length, const char *mimeType) {
+
+    if (fd < 0) {
+        ALOGE("Invalid file descriptor: %d", fd);
+        return ERROR_UNSUPPORTED;
+    }
+
+    sp<DataSource> dataSource = new FileSource(dup(fd), offset, length);
+    return createOutOfBandTextSource(mimeType, dataSource);
+}
+
+status_t TimedTextDriver::createOutOfBandTextSource(
+        const char *mimeType, const sp<DataSource>& dataSource) {
+
     if (dataSource == NULL) {
         return ERROR_UNSUPPORTED;
     }
@@ -189,13 +207,6 @@
     return OK;
 }
 
-status_t TimedTextDriver::addOutOfBandTextSource(
-        int fd, off64_t offset, size_t length, const char *mimeType) {
-    // Not supported yet. This requires DataSource::sniff to detect various text
-    // formats such as srt/smi/ttml.
-    return ERROR_UNSUPPORTED;
-}
-
 void TimedTextDriver::getTrackInfo(Parcel *parcel) {
     Mutex::Autolock autoLock(mLock);
     Vector<sp<TimedTextSource> >::const_iterator iter;
@@ -203,19 +214,18 @@
     for (iter = mTextSourceVector.begin();
          iter != mTextSourceVector.end(); ++iter) {
         sp<MetaData> meta = (*iter)->getFormat();
+
+        // There are two fields.
+        parcel->writeInt32(2);
+
+        // track type.
+        parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT);
+
+        const char *lang = "und";
         if (meta != NULL) {
-            // There are two fields.
-            parcel->writeInt32(2);
-
-            // track type.
-            parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT);
-
-            const char *lang = "und";
             meta->findCString(kKeyMediaLanguage, &lang);
-            parcel->writeString16(String16(lang));
-        } else {
-            parcel->writeInt32(0);
         }
+        parcel->writeString16(String16(lang));
     }
 }