Remove RefBase from plugin-side DataSource

Extractor plugins now use DataSourceBase, which is not refcounted.
Framework-side DataSource derives from DataSourceBase and RefBase.
Also remove MediaExtractor::release, because it is not needed
anymore due to the way the extractor/track/datasource lifecycle
is managed now.
Also add source and target pid to CallbackDataSource name, to
make the extractor dumpsys more useful.

Bug: 67908556
Test: build, boot, CTS, skia test app for heif
Change-Id: I6b9cbe903f76b0cf27ba87f4a456f424803efd08
diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp
index 6f28374..1614ca4 100644
--- a/media/extractors/aac/AACExtractor.cpp
+++ b/media/extractors/aac/AACExtractor.cpp
@@ -19,7 +19,7 @@
 #include <utils/Log.h>
 
 #include "AACExtractor.h"
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/AMessage.h>
@@ -35,7 +35,7 @@
 
 class AACSource : public MediaSourceBase {
 public:
-    AACSource(const sp<DataSource> &source,
+    AACSource(DataSourceBase *source,
               const sp<MetaData> &meta,
               const Vector<uint64_t> &offset_vector,
               int64_t frame_duration_us);
@@ -53,7 +53,7 @@
 
 private:
     static const size_t kMaxFrameSize;
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mMeta;
 
     off64_t mOffset;
@@ -91,7 +91,7 @@
 // The returned value is the AAC frame size with the ADTS header length (regardless of
 //     the presence of the CRC).
 // If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame.
-static size_t getAdtsFrameLength(const sp<DataSource> &source, off64_t offset, size_t* headerSize) {
+static size_t getAdtsFrameLength(DataSourceBase *source, off64_t offset, size_t* headerSize) {
 
     const size_t kAdtsHeaderLengthNoCrc = 7;
     const size_t kAdtsHeaderLengthWithCrc = 9;
@@ -132,7 +132,7 @@
 }
 
 AACExtractor::AACExtractor(
-        const sp<DataSource> &source, const sp<AMessage> &_meta)
+        DataSourceBase *source, const sp<AMessage> &_meta)
     : mDataSource(source),
       mInitCheck(NO_INIT),
       mFrameDurationUs(0) {
@@ -229,7 +229,7 @@
 const size_t AACSource::kMaxFrameSize = 8192;
 
 AACSource::AACSource(
-        const sp<DataSource> &source, const sp<MetaData> &meta,
+        DataSourceBase *source, const sp<MetaData> &meta,
         const Vector<uint64_t> &offset_vector,
         int64_t frame_duration_us)
     : mDataSource(source),
@@ -332,13 +332,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 static MediaExtractor* CreateExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const sp<AMessage>& meta) {
     return new AACExtractor(source, meta);
 }
 
 static MediaExtractor::CreatorFunc Sniff(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *meta) {
     off64_t pos = 0;
 
diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h
index 33fbba7..e99699c 100644
--- a/media/extractors/aac/AACExtractor.h
+++ b/media/extractors/aac/AACExtractor.h
@@ -29,7 +29,7 @@
 
 class AACExtractor : public MediaExtractor {
 public:
-    AACExtractor(const sp<DataSource> &source, const sp<AMessage> &meta);
+    AACExtractor(DataSourceBase *source, const sp<AMessage> &meta);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +42,7 @@
     virtual ~AACExtractor();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mMeta;
     status_t mInitCheck;
 
@@ -54,7 +54,7 @@
 };
 
 bool SniffAAC(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp
index 10be50c..547e3f5 100644
--- a/media/extractors/amr/AMRExtractor.cpp
+++ b/media/extractors/amr/AMRExtractor.cpp
@@ -20,7 +20,7 @@
 
 #include "AMRExtractor.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/MediaBufferGroup.h>
@@ -33,7 +33,7 @@
 
 class AMRSource : public MediaSourceBase {
 public:
-    AMRSource(const sp<DataSource> &source,
+    AMRSource(DataSourceBase *source,
               const sp<MetaData> &meta,
               bool isWide,
               const off64_t *offset_table,
@@ -51,7 +51,7 @@
     virtual ~AMRSource();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mMeta;
     bool mIsWide;
 
@@ -97,7 +97,7 @@
     return frameSize;
 }
 
-static status_t getFrameSizeByOffset(const sp<DataSource> &source,
+static status_t getFrameSizeByOffset(DataSourceBase *source,
         off64_t offset, bool isWide, size_t *frameSize) {
     uint8_t header;
     ssize_t count = source->readAt(offset, &header, 1);
@@ -116,7 +116,7 @@
     return OK;
 }
 
-AMRExtractor::AMRExtractor(const sp<DataSource> &source)
+AMRExtractor::AMRExtractor(DataSourceBase *source)
     : mDataSource(source),
       mInitCheck(NO_INIT),
       mOffsetTableLength(0) {
@@ -206,7 +206,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 AMRSource::AMRSource(
-        const sp<DataSource> &source, const sp<MetaData> &meta,
+        DataSourceBase *source, const sp<MetaData> &meta,
         bool isWide, const off64_t *offset_table, size_t offset_table_length)
     : mDataSource(source),
       mMeta(meta),
@@ -339,7 +339,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 bool SniffAMR(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *) {
     char header[9];
 
@@ -372,13 +372,13 @@
         1,
         "AMR Extractor",
         [](
-                const sp<DataSource> &source,
+                DataSourceBase *source,
                 String8 *mimeType,
                 float *confidence,
                 sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
             if (SniffAMR(source, mimeType, confidence, meta)) {
                 return [](
-                        const sp<DataSource> &source,
+                        DataSourceBase *source,
                         const sp<AMessage>& meta __unused) -> MediaExtractor* {
                     return new AMRExtractor(source);};
             }
diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h
index 56883e3..d6d49f2 100644
--- a/media/extractors/amr/AMRExtractor.h
+++ b/media/extractors/amr/AMRExtractor.h
@@ -29,7 +29,7 @@
 
 class AMRExtractor : public MediaExtractor {
 public:
-    explicit AMRExtractor(const sp<DataSource> &source);
+    explicit AMRExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +42,7 @@
     virtual ~AMRExtractor();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mMeta;
     status_t mInitCheck;
     bool mIsWide;
@@ -55,7 +55,7 @@
 };
 
 bool SniffAMR(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp
index ba28e86..8dbb5a1 100644
--- a/media/extractors/flac/FLACExtractor.cpp
+++ b/media/extractors/flac/FLACExtractor.cpp
@@ -22,7 +22,7 @@
 // libFLAC parser
 #include "FLAC/stream_decoder.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
@@ -165,7 +165,7 @@
 
 public:
     FLACSource(
-            const sp<DataSource> &dataSource,
+            DataSourceBase *dataSource,
             const sp<MetaData> &trackMetadata);
 
     virtual status_t start(MetaData *params);
@@ -179,7 +179,7 @@
     virtual ~FLACSource();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mTrackMetadata;
     sp<FLACParser> mParser;
     bool mInitCheck;
@@ -203,7 +203,7 @@
     };
 
     explicit FLACParser(
-        const sp<DataSource> &dataSource,
+        DataSourceBase *dataSource,
         // If metadata pointers aren't provided, we don't fill them
         const sp<MetaData> &fileMetadata = 0,
         const sp<MetaData> &trackMetadata = 0);
@@ -243,7 +243,7 @@
     virtual ~FLACParser();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mFileMetadata;
     sp<MetaData> mTrackMetadata;
     bool mInitCheck;
@@ -612,7 +612,7 @@
 // FLACParser
 
 FLACParser::FLACParser(
-        const sp<DataSource> &dataSource,
+        DataSourceBase *dataSource,
         const sp<MetaData> &fileMetadata,
         const sp<MetaData> &trackMetadata)
     : mDataSource(dataSource),
@@ -833,7 +833,7 @@
 // FLACsource
 
 FLACSource::FLACSource(
-        const sp<DataSource> &dataSource,
+        DataSourceBase *dataSource,
         const sp<MetaData> &trackMetadata)
     : mDataSource(dataSource),
       mTrackMetadata(trackMetadata),
@@ -918,7 +918,7 @@
 // FLACExtractor
 
 FLACExtractor::FLACExtractor(
-        const sp<DataSource> &dataSource)
+        DataSourceBase *dataSource)
     : mDataSource(dataSource),
       mInitCheck(false)
 {
@@ -969,7 +969,7 @@
 // Sniffer
 
 bool SniffFLAC(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *)
 {
     // first 4 is the signature word
@@ -1000,13 +1000,13 @@
             1,
             "FLAC Extractor",
             [](
-                    const sp<DataSource> &source,
+                    DataSourceBase *source,
                     String8 *mimeType,
                     float *confidence,
                     sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
                 if (SniffFLAC(source, mimeType, confidence, meta)) {
                     return [](
-                            const sp<DataSource> &source,
+                            DataSourceBase *source,
                             const sp<AMessage>& meta __unused) -> MediaExtractor* {
                         return new FLACExtractor(source);};
                 }
diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h
index 2e7ee3b..ef07212 100644
--- a/media/extractors/flac/FLACExtractor.h
+++ b/media/extractors/flac/FLACExtractor.h
@@ -17,7 +17,7 @@
 #ifndef FLAC_EXTRACTOR_H_
 #define FLAC_EXTRACTOR_H_
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaExtractor.h>
 #include <utils/String8.h>
 
@@ -28,8 +28,7 @@
 class FLACExtractor : public MediaExtractor {
 
 public:
-    // Extractor assumes ownership of source
-    explicit FLACExtractor(const sp<DataSource> &source);
+    explicit FLACExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +41,7 @@
     virtual ~FLACExtractor();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<FLACParser> mParser;
     status_t mInitCheck;
     sp<MetaData> mFileMetadata;
@@ -57,7 +56,7 @@
 
 };
 
-bool SniffFLAC(const sp<DataSource> &source, String8 *mimeType,
+bool SniffFLAC(DataSourceBase *source, String8 *mimeType,
         float *confidence, sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp
index 18b1d23..711c6a5 100644
--- a/media/extractors/midi/MidiExtractor.cpp
+++ b/media/extractors/midi/MidiExtractor.cpp
@@ -141,7 +141,7 @@
 
 // MidiEngine
 
-MidiEngine::MidiEngine(const sp<DataSource> &dataSource,
+MidiEngine::MidiEngine(DataSourceBase *dataSource,
         const sp<MetaData> &fileMetadata,
         const sp<MetaData> &trackMetadata) :
             mGroup(NULL),
@@ -261,7 +261,7 @@
 // MidiExtractor
 
 MidiExtractor::MidiExtractor(
-        const sp<DataSource> &dataSource)
+        DataSourceBase *dataSource)
     : mDataSource(dataSource),
       mInitCheck(false)
 {
@@ -308,7 +308,7 @@
 // Sniffer
 
 bool SniffMidi(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *)
 {
     sp<MidiEngine> p = new MidiEngine(source, NULL, NULL);
@@ -333,13 +333,13 @@
         1,
         "MIDI Extractor",
         [](
-                const sp<DataSource> &source,
+                DataSourceBase *source,
                 String8 *mimeType,
                 float *confidence,
                 sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
             if (SniffMidi(source, mimeType, confidence, meta)) {
                 return [](
-                        const sp<DataSource> &source,
+                        DataSourceBase *source,
                         const sp<AMessage>& meta __unused) -> MediaExtractor* {
                     return new MidiExtractor(source);};
             }
diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h
index 87e4654..91efd06 100644
--- a/media/extractors/midi/MidiExtractor.h
+++ b/media/extractors/midi/MidiExtractor.h
@@ -17,7 +17,7 @@
 #ifndef MIDI_EXTRACTOR_H_
 #define MIDI_EXTRACTOR_H_
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaExtractor.h>
 #include <media/stagefright/MediaBuffer.h>
 #include <media/stagefright/MediaBufferGroup.h>
@@ -29,7 +29,7 @@
 
 class MidiEngine : public RefBase {
 public:
-    MidiEngine(const sp<DataSource> &dataSource,
+    MidiEngine(DataSourceBase *dataSource,
             const sp<MetaData> &fileMetadata,
             const sp<MetaData> &trackMetadata);
     ~MidiEngine();
@@ -52,8 +52,7 @@
 class MidiExtractor : public MediaExtractor {
 
 public:
-    // Extractor assumes ownership of source
-    explicit MidiExtractor(const sp<DataSource> &source);
+    explicit MidiExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -66,7 +65,7 @@
     virtual ~MidiExtractor();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     status_t mInitCheck;
     sp<MetaData> mFileMetadata;
 
@@ -88,7 +87,7 @@
 
 };
 
-bool SniffMidi(const sp<DataSource> &source, String8 *mimeType,
+bool SniffMidi(DataSourceBase *source, String8 *mimeType,
         float *confidence, sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp
index 6df0012..f61f7c7 100644
--- a/media/extractors/mkv/MatroskaExtractor.cpp
+++ b/media/extractors/mkv/MatroskaExtractor.cpp
@@ -21,7 +21,7 @@
 #include "FLACDecoder.h"
 #include "MatroskaExtractor.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AUtils.h>
@@ -40,8 +40,8 @@
 
 namespace android {
 
-struct DataSourceReader : public mkvparser::IMkvReader {
-    explicit DataSourceReader(const sp<DataSource> &source)
+struct DataSourceBaseReader : public mkvparser::IMkvReader {
+    explicit DataSourceBaseReader(DataSourceBase *source)
         : mSource(source) {
     }
 
@@ -83,10 +83,10 @@
     }
 
 private:
-    sp<DataSource> mSource;
+    DataSourceBase *mSource;
 
-    DataSourceReader(const DataSourceReader &);
-    DataSourceReader &operator=(const DataSourceReader &);
+    DataSourceBaseReader(const DataSourceBaseReader &);
+    DataSourceBaseReader &operator=(const DataSourceBaseReader &);
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -852,9 +852,9 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-MatroskaExtractor::MatroskaExtractor(const sp<DataSource> &source)
+MatroskaExtractor::MatroskaExtractor(DataSourceBase *source)
     : mDataSource(source),
-      mReader(new DataSourceReader(mDataSource)),
+      mReader(new DataSourceBaseReader(mDataSource)),
       mSegment(NULL),
       mExtractedThumbnails(false),
       mIsWebm(false),
@@ -862,8 +862,8 @@
     off64_t size;
     mIsLiveStreaming =
         (mDataSource->flags()
-            & (DataSource::kWantsPrefetching
-                | DataSource::kIsCachingDataSource))
+            & (DataSourceBase::kWantsPrefetching
+                | DataSourceBase::kIsCachingDataSource))
         && mDataSource->getSize(&size) != OK;
 
     mkvparser::EBMLHeader ebmlHeader;
@@ -1548,9 +1548,9 @@
 }
 
 bool SniffMatroska(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *) {
-    DataSourceReader reader(source);
+    DataSourceBaseReader reader(source);
     mkvparser::EBMLHeader ebmlHeader;
     long long pos;
     if (ebmlHeader.Parse(&reader, pos) < 0) {
@@ -1574,13 +1574,13 @@
         1,
         "Matroska Extractor",
         [](
-                const sp<DataSource> &source,
+                DataSourceBase *source,
                 String8 *mimeType,
                 float *confidence,
                 sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
             if (SniffMatroska(source, mimeType, confidence, meta)) {
                 return [](
-                        const sp<DataSource> &source,
+                        DataSourceBase *source,
                         const sp<AMessage>& meta __unused) -> MediaExtractor* {
                     return new MatroskaExtractor(source);};
             }
diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h
index 54419bf..095452b 100644
--- a/media/extractors/mkv/MatroskaExtractor.h
+++ b/media/extractors/mkv/MatroskaExtractor.h
@@ -30,11 +30,11 @@
 class String8;
 
 class MetaData;
-struct DataSourceReader;
+struct DataSourceBaseReader;
 struct MatroskaSource;
 
 struct MatroskaExtractor : public MediaExtractor {
-    explicit MatroskaExtractor(const sp<DataSource> &source);
+    explicit MatroskaExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
 
@@ -76,8 +76,8 @@
     Mutex mLock;
     Vector<TrackInfo> mTracks;
 
-    sp<DataSource> mDataSource;
-    DataSourceReader *mReader;
+    DataSourceBase *mDataSource;
+    DataSourceBaseReader *mReader;
     mkvparser::Segment *mSegment;
     bool mExtractedThumbnails;
     bool mIsLiveStreaming;
@@ -96,7 +96,7 @@
 };
 
 bool SniffMatroska(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp
index 7e27fd8..25d4deb 100644
--- a/media/extractors/mp3/MP3Extractor.cpp
+++ b/media/extractors/mp3/MP3Extractor.cpp
@@ -24,7 +24,7 @@
 #include "VBRISeeker.h"
 #include "XINGSeeker.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/AMessage.h>
@@ -46,7 +46,7 @@
 static const uint32_t kMask = 0xfffe0c00;
 
 static bool Resync(
-        const sp<DataSource> &source, uint32_t match_header,
+        DataSourceBase *source, uint32_t match_header,
         off64_t *inout_pos, off64_t *post_id3_pos, uint32_t *out_header) {
     if (post_id3_pos != NULL) {
         *post_id3_pos = 0;
@@ -212,7 +212,7 @@
 class MP3Source : public MediaSourceBase {
 public:
     MP3Source(
-            const sp<MetaData> &meta, const sp<DataSource> &source,
+            const sp<MetaData> &meta, DataSourceBase *source,
             off64_t first_frame_pos, uint32_t fixed_header,
             const sp<MP3Seeker> &seeker);
 
@@ -230,7 +230,7 @@
 private:
     static const size_t kMaxFrameSize;
     sp<MetaData> mMeta;
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     off64_t mFirstFramePos;
     uint32_t mFixedHeader;
     off64_t mCurrentPos;
@@ -247,7 +247,7 @@
 };
 
 MP3Extractor::MP3Extractor(
-        const sp<DataSource> &source, const sp<AMessage> &meta)
+        DataSourceBase *source, const sp<AMessage> &meta)
     : mInitCheck(NO_INIT),
       mDataSource(source),
       mFirstFramePos(-1),
@@ -436,7 +436,7 @@
 // Set our max frame size to the nearest power of 2 above this size (aka, 4kB)
 const size_t MP3Source::kMaxFrameSize = (1 << 12); /* 4096 bytes */
 MP3Source::MP3Source(
-        const sp<MetaData> &meta, const sp<DataSource> &source,
+        const sp<MetaData> &meta, DataSourceBase *source,
         off64_t first_frame_pos, uint32_t fixed_header,
         const sp<MP3Seeker> &seeker)
     : mMeta(meta),
@@ -667,13 +667,13 @@
 }
 
 static MediaExtractor* CreateExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const sp<AMessage>& meta) {
     return new MP3Extractor(source, meta);
 }
 
 static MediaExtractor::CreatorFunc Sniff(
-        const sp<DataSource> &source, String8 *mimeType,
+        DataSourceBase *source, String8 *mimeType,
         float *confidence, sp<AMessage> *meta) {
     off64_t pos = 0;
     off64_t post_id3_pos;
diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h
index 3b3387d..6257112 100644
--- a/media/extractors/mp3/MP3Extractor.h
+++ b/media/extractors/mp3/MP3Extractor.h
@@ -24,14 +24,13 @@
 namespace android {
 
 struct AMessage;
-class DataSource;
+class DataSourceBase;
 struct MP3Seeker;
 class String8;
 
 class MP3Extractor : public MediaExtractor {
 public:
-    // Extractor assumes ownership of "source".
-    MP3Extractor(const sp<DataSource> &source, const sp<AMessage> &meta);
+    MP3Extractor(DataSourceBase *source, const sp<AMessage> &meta);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -43,7 +42,7 @@
 private:
     status_t mInitCheck;
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     off64_t mFirstFramePos;
     sp<MetaData> mMeta;
     uint32_t mFixedHeader;
@@ -54,7 +53,7 @@
 };
 
 bool SniffMP3(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *meta);
 
 }  // namespace android
diff --git a/media/extractors/mp3/VBRISeeker.cpp b/media/extractors/mp3/VBRISeeker.cpp
index e7db6fd..51c5d1f 100644
--- a/media/extractors/mp3/VBRISeeker.cpp
+++ b/media/extractors/mp3/VBRISeeker.cpp
@@ -27,7 +27,7 @@
 
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 
 namespace android {
 
@@ -37,7 +37,7 @@
 
 // static
 sp<VBRISeeker> VBRISeeker::CreateFromSource(
-        const sp<DataSource> &source, off64_t post_id3_pos) {
+        DataSourceBase *source, off64_t post_id3_pos) {
     off64_t pos = post_id3_pos;
 
     uint8_t header[4];
diff --git a/media/extractors/mp3/VBRISeeker.h b/media/extractors/mp3/VBRISeeker.h
index 87258b0..e46af36 100644
--- a/media/extractors/mp3/VBRISeeker.h
+++ b/media/extractors/mp3/VBRISeeker.h
@@ -24,11 +24,11 @@
 
 namespace android {
 
-class DataSource;
+class DataSourceBase;
 
 struct VBRISeeker : public MP3Seeker {
     static sp<VBRISeeker> CreateFromSource(
-            const sp<DataSource> &source, off64_t post_id3_pos);
+            DataSourceBase *source, off64_t post_id3_pos);
 
     virtual bool getDuration(int64_t *durationUs);
     virtual bool getOffsetForTime(int64_t *timeUs, off64_t *pos);
diff --git a/media/extractors/mp3/XINGSeeker.cpp b/media/extractors/mp3/XINGSeeker.cpp
index fa59701..adfa8d2 100644
--- a/media/extractors/mp3/XINGSeeker.cpp
+++ b/media/extractors/mp3/XINGSeeker.cpp
@@ -21,7 +21,7 @@
 #include <media/stagefright/foundation/avc_utils.h>
 
 #include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 
 namespace android {
 
@@ -77,7 +77,7 @@
 
 // static
 sp<XINGSeeker> XINGSeeker::CreateFromSource(
-        const sp<DataSource> &source, off64_t first_frame_pos) {
+        DataSourceBase *source, off64_t first_frame_pos) {
     sp<XINGSeeker> seeker = new XINGSeeker;
 
     seeker->mFirstFramePos = first_frame_pos;
diff --git a/media/extractors/mp3/XINGSeeker.h b/media/extractors/mp3/XINGSeeker.h
index 37077c4..db847bc 100644
--- a/media/extractors/mp3/XINGSeeker.h
+++ b/media/extractors/mp3/XINGSeeker.h
@@ -22,11 +22,11 @@
 
 namespace android {
 
-class DataSource;
+class DataSourceBase;
 
 struct XINGSeeker : public MP3Seeker {
     static sp<XINGSeeker> CreateFromSource(
-            const sp<DataSource> &source, off64_t first_frame_pos);
+            DataSourceBase *source, off64_t first_frame_pos);
 
     virtual bool getDuration(int64_t *durationUs);
     virtual bool getOffsetForTime(int64_t *timeUs, off64_t *pos);
diff --git a/media/extractors/mp4/ItemTable.cpp b/media/extractors/mp4/ItemTable.cpp
index 85c66b2..cef5f4a 100644
--- a/media/extractors/mp4/ItemTable.cpp
+++ b/media/extractors/mp4/ItemTable.cpp
@@ -18,7 +18,7 @@
 #define LOG_TAG "ItemTable"
 
 #include <ItemTable.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/stagefright/MetaData.h>
 #include <media/stagefright/MediaErrors.h>
 #include <media/stagefright/foundation/ABuffer.h>
@@ -87,7 +87,7 @@
 
 struct Box {
 protected:
-    Box(const sp<DataSource> source, uint32_t type) :
+    Box(DataSourceBase *source, uint32_t type) :
         mDataSource(source), mType(type) {}
 
     virtual ~Box() {}
@@ -99,14 +99,14 @@
 
     inline uint32_t type() const { return mType; }
 
-    inline sp<DataSource> source() const { return mDataSource; }
+    inline DataSourceBase *source() const { return mDataSource; }
 
     status_t parseChunk(off64_t *offset);
 
     status_t parseChunks(off64_t offset, size_t size);
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     uint32_t mType;
 };
 
@@ -181,7 +181,7 @@
 
 struct FullBox : public Box {
 protected:
-    FullBox(const sp<DataSource> source, uint32_t type) :
+    FullBox(DataSourceBase *source, uint32_t type) :
         Box(source, type), mVersion(0), mFlags(0) {}
 
     inline uint8_t version() const { return mVersion; }
@@ -216,7 +216,7 @@
 //
 
 struct PitmBox : public FullBox {
-    PitmBox(const sp<DataSource> source) :
+    PitmBox(DataSourceBase *source) :
         FullBox(source, FOURCC('p', 'i', 't', 'm')) {}
 
     status_t parse(off64_t offset, size_t size, uint32_t *primaryItemId);
@@ -296,7 +296,7 @@
 };
 
 struct IlocBox : public FullBox {
-    IlocBox(const sp<DataSource> source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
+    IlocBox(DataSourceBase *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
         FullBox(source, FOURCC('i', 'l', 'o', 'c')),
         mItemLocs(itemLocs), mHasConstructMethod1(false) {}
 
@@ -466,7 +466,7 @@
 //
 
 struct ItemReference : public Box, public RefBase {
-    ItemReference(const sp<DataSource> source, uint32_t type, uint32_t itemIdSize) :
+    ItemReference(DataSourceBase *source, uint32_t type, uint32_t itemIdSize) :
         Box(source, type), mItemId(0), mRefIdSize(itemIdSize) {}
 
     status_t parse(off64_t offset, size_t size);
@@ -575,7 +575,7 @@
 }
 
 struct IrefBox : public FullBox {
-    IrefBox(const sp<DataSource> source, Vector<sp<ItemReference> > *itemRefs) :
+    IrefBox(DataSourceBase *source, Vector<sp<ItemReference> > *itemRefs) :
         FullBox(source, FOURCC('i', 'r', 'e', 'f')), mRefIdSize(0), mItemRefs(itemRefs) {}
 
     status_t parse(off64_t offset, size_t size);
@@ -637,7 +637,7 @@
 };
 
 struct IspeBox : public FullBox, public ItemProperty {
-    IspeBox(const sp<DataSource> source) :
+    IspeBox(DataSourceBase *source) :
         FullBox(source, FOURCC('i', 's', 'p', 'e')), mWidth(0), mHeight(0) {}
 
     status_t parse(off64_t offset, size_t size) override;
@@ -673,7 +673,7 @@
 }
 
 struct HvccBox : public Box, public ItemProperty {
-    HvccBox(const sp<DataSource> source) :
+    HvccBox(DataSourceBase *source) :
         Box(source, FOURCC('h', 'v', 'c', 'C')) {}
 
     status_t parse(off64_t offset, size_t size) override;
@@ -706,7 +706,7 @@
 }
 
 struct IrotBox : public Box, public ItemProperty {
-    IrotBox(const sp<DataSource> source) :
+    IrotBox(DataSourceBase *source) :
         Box(source, FOURCC('i', 'r', 'o', 't')), mAngle(0) {}
 
     status_t parse(off64_t offset, size_t size) override;
@@ -735,7 +735,7 @@
 }
 
 struct ColrBox : public Box, public ItemProperty {
-    ColrBox(const sp<DataSource> source) :
+    ColrBox(DataSourceBase *source) :
         Box(source, FOURCC('c', 'o', 'l', 'r')) {}
 
     status_t parse(off64_t offset, size_t size) override;
@@ -783,7 +783,7 @@
 }
 
 struct IpmaBox : public FullBox {
-    IpmaBox(const sp<DataSource> source, Vector<AssociationEntry> *associations) :
+    IpmaBox(DataSourceBase *source, Vector<AssociationEntry> *associations) :
         FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {}
 
     status_t parse(off64_t offset, size_t size);
@@ -857,7 +857,7 @@
 }
 
 struct IpcoBox : public Box {
-    IpcoBox(const sp<DataSource> source, Vector<sp<ItemProperty> > *properties) :
+    IpcoBox(DataSourceBase *source, Vector<sp<ItemProperty> > *properties) :
         Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {}
 
     status_t parse(off64_t offset, size_t size);
@@ -914,7 +914,7 @@
 }
 
 struct IprpBox : public Box {
-    IprpBox(const sp<DataSource> source,
+    IprpBox(DataSourceBase *source,
             Vector<sp<ItemProperty> > *properties,
             Vector<AssociationEntry> *associations) :
         Box(source, FOURCC('i', 'p', 'r', 'p')),
@@ -971,7 +971,7 @@
 };
 
 struct InfeBox : public FullBox {
-    InfeBox(const sp<DataSource> source) :
+    InfeBox(DataSourceBase *source) :
         FullBox(source, FOURCC('i', 'n', 'f', 'e')) {}
 
     status_t parse(off64_t offset, size_t size, ItemInfo *itemInfo);
@@ -1075,7 +1075,7 @@
 }
 
 struct IinfBox : public FullBox {
-    IinfBox(const sp<DataSource> source, Vector<ItemInfo> *itemInfos) :
+    IinfBox(DataSourceBase *source, Vector<ItemInfo> *itemInfos) :
         FullBox(source, FOURCC('i', 'i', 'n', 'f')),
         mItemInfos(itemInfos), mHasGrids(false) {}
 
@@ -1144,7 +1144,7 @@
 
 //////////////////////////////////////////////////////////////////
 
-ItemTable::ItemTable(const sp<DataSource> &source)
+ItemTable::ItemTable(DataSourceBase *source)
     : mDataSource(source),
       mPrimaryItemId(0),
       mIdatOffset(0),
diff --git a/media/extractors/mp4/ItemTable.h b/media/extractors/mp4/ItemTable.h
index 3d2e2ae..f4a69cc 100644
--- a/media/extractors/mp4/ItemTable.h
+++ b/media/extractors/mp4/ItemTable.h
@@ -25,7 +25,7 @@
 
 namespace android {
 
-class DataSource;
+class DataSourceBase;
 class MetaData;
 
 namespace heif {
@@ -44,7 +44,7 @@
 
 class ItemTable : public RefBase {
 public:
-    explicit ItemTable(const sp<DataSource> &source);
+    explicit ItemTable(DataSourceBase *source);
 
     status_t parse(uint32_t type, off64_t offset, size_t size);
 
@@ -60,7 +60,7 @@
     ~ItemTable();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
 
     KeyedVector<uint32_t, ItemLoc> mItemLocs;
     Vector<ItemInfo> mItemInfos;
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 9f21db6..30dda13 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -69,7 +69,7 @@
 public:
     // Caller retains ownership of both "dataSource" and "sampleTable".
     MPEG4Source(const sp<MetaData> &format,
-                const sp<DataSource> &dataSource,
+                DataSourceBase *dataSource,
                 int32_t timeScale,
                 const sp<SampleTable> &sampleTable,
                 Vector<SidxEntry> &sidx,
@@ -93,7 +93,7 @@
     Mutex mLock;
 
     sp<MetaData> mFormat;
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     int32_t mTimescale;
     sp<SampleTable> mSampleTable;
     uint32_t mCurrentSampleIndex;
@@ -186,47 +186,51 @@
 // all remaining requests to the wrapped datasource.
 // This is used to cache the full sampletable metadata for a single track,
 // possibly wrapping multiple times to cover all tracks, i.e.
-// Each MPEG4DataSource caches the sampletable metadata for a single track.
+// Each CachedRangedDataSource caches the sampletable metadata for a single track.
 
-struct MPEG4DataSource : public DataSource {
-    explicit MPEG4DataSource(const sp<DataSource> &source);
+struct CachedRangedDataSource : public DataSourceBase {
+    explicit CachedRangedDataSource(DataSourceBase *source);
+    virtual ~CachedRangedDataSource();
 
     virtual status_t initCheck() const;
     virtual ssize_t readAt(off64_t offset, void *data, size_t size);
     virtual status_t getSize(off64_t *size);
     virtual uint32_t flags();
 
-    status_t setCachedRange(off64_t offset, size_t size);
+    status_t setCachedRange(off64_t offset, size_t size, bool assumeSourceOwnershipOnSuccess);
 
-protected:
-    virtual ~MPEG4DataSource();
 
 private:
     Mutex mLock;
 
-    sp<DataSource> mSource;
+    DataSourceBase *mSource;
+    bool mOwnsDataSource;
     off64_t mCachedOffset;
     size_t mCachedSize;
     uint8_t *mCache;
 
     void clearCache();
 
-    MPEG4DataSource(const MPEG4DataSource &);
-    MPEG4DataSource &operator=(const MPEG4DataSource &);
+    CachedRangedDataSource(const CachedRangedDataSource &);
+    CachedRangedDataSource &operator=(const CachedRangedDataSource &);
 };
 
-MPEG4DataSource::MPEG4DataSource(const sp<DataSource> &source)
+CachedRangedDataSource::CachedRangedDataSource(DataSourceBase *source)
     : mSource(source),
+      mOwnsDataSource(false),
       mCachedOffset(0),
       mCachedSize(0),
       mCache(NULL) {
 }
 
-MPEG4DataSource::~MPEG4DataSource() {
+CachedRangedDataSource::~CachedRangedDataSource() {
     clearCache();
+    if (mOwnsDataSource) {
+        delete (CachedRangedDataSource*)mSource;
+    }
 }
 
-void MPEG4DataSource::clearCache() {
+void CachedRangedDataSource::clearCache() {
     if (mCache) {
         free(mCache);
         mCache = NULL;
@@ -236,11 +240,11 @@
     mCachedSize = 0;
 }
 
-status_t MPEG4DataSource::initCheck() const {
+status_t CachedRangedDataSource::initCheck() const {
     return mSource->initCheck();
 }
 
-ssize_t MPEG4DataSource::readAt(off64_t offset, void *data, size_t size) {
+ssize_t CachedRangedDataSource::readAt(off64_t offset, void *data, size_t size) {
     Mutex::Autolock autoLock(mLock);
 
     if (isInRange(mCachedOffset, mCachedSize, offset, size)) {
@@ -251,15 +255,17 @@
     return mSource->readAt(offset, data, size);
 }
 
-status_t MPEG4DataSource::getSize(off64_t *size) {
+status_t CachedRangedDataSource::getSize(off64_t *size) {
     return mSource->getSize(size);
 }
 
-uint32_t MPEG4DataSource::flags() {
+uint32_t CachedRangedDataSource::flags() {
     return mSource->flags();
 }
 
-status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) {
+status_t CachedRangedDataSource::setCachedRange(off64_t offset,
+        size_t size,
+        bool assumeSourceOwnershipOnSuccess) {
     Mutex::Autolock autoLock(mLock);
 
     clearCache();
@@ -280,7 +286,7 @@
 
         return ERROR_IO;
     }
-
+    mOwnsDataSource = assumeSourceOwnershipOnSuccess;
     return OK;
 }
 
@@ -334,11 +340,12 @@
     return false;
 }
 
-MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source, const char *mime)
+MPEG4Extractor::MPEG4Extractor(DataSourceBase *source, const char *mime)
     : mMoofOffset(0),
       mMoofFound(false),
       mMdatFound(false),
       mDataSource(source),
+      mCachedSource(NULL),
       mInitCheck(NO_INIT),
       mHeaderTimescale(0),
       mIsQT(false),
@@ -354,10 +361,6 @@
 }
 
 MPEG4Extractor::~MPEG4Extractor() {
-    release();
-}
-
-void MPEG4Extractor::release() {
     Track *track = mFirstTrack;
     while (track) {
         Track *next = track->next;
@@ -381,10 +384,7 @@
     }
     mPssh.clear();
 
-    if (mDataSource != NULL) {
-        mDataSource->close();
-        mDataSource.clear();
-    }
+    delete mCachedSource;
 }
 
 uint32_t MPEG4Extractor::flags() const {
@@ -692,14 +692,14 @@
 
 // Reads an encoded integer 7 bits at a time until it encounters the high bit clear.
 static int32_t readSize(off64_t offset,
-        const sp<DataSource> &DataSource, uint8_t *numOfBytes) {
+        DataSourceBase *DataSourceBase, uint8_t *numOfBytes) {
     uint32_t size = 0;
     uint8_t data;
     bool moreData = true;
     *numOfBytes = 0;
 
     while (moreData) {
-        if (DataSource->readAt(offset, &data, 1) < 1) {
+        if (DataSourceBase->readAt(offset, &data, 1) < 1) {
             return -1;
         }
         offset ++;
@@ -1045,13 +1045,17 @@
                 ALOGV("sampleTable chunk is %" PRIu64 " bytes long.", chunk_size);
 
                 if (mDataSource->flags()
-                        & (DataSource::kWantsPrefetching
-                            | DataSource::kIsCachingDataSource)) {
-                    sp<MPEG4DataSource> cachedSource =
-                        new MPEG4DataSource(mDataSource);
+                        & (DataSourceBase::kWantsPrefetching
+                            | DataSourceBase::kIsCachingDataSource)) {
+                    CachedRangedDataSource *cachedSource =
+                        new CachedRangedDataSource(mDataSource);
 
-                    if (cachedSource->setCachedRange(*offset, chunk_size) == OK) {
-                        mDataSource = cachedSource;
+                    if (cachedSource->setCachedRange(
+                            *offset, chunk_size,
+                            mCachedSource != NULL /* assume ownership on success */) == OK) {
+                        mDataSource = mCachedSource = cachedSource;
+                    } else {
+                        delete cachedSource;
                     }
                 }
 
@@ -3890,7 +3894,7 @@
 
 MPEG4Source::MPEG4Source(
         const sp<MetaData> &format,
-        const sp<DataSource> &dataSource,
+        DataSourceBase *dataSource,
         int32_t timeScale,
         const sp<SampleTable> &sampleTable,
         Vector<SidxEntry> &sidx,
@@ -5379,7 +5383,7 @@
 }
 
 static bool LegacySniffMPEG4(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence) {
+        DataSourceBase *source, String8 *mimeType, float *confidence) {
     uint8_t header[8];
 
     ssize_t n = source->readAt(4, header, sizeof(header));
@@ -5446,7 +5450,7 @@
 // (end of the 'moov' atom) and report it to the caller as part of
 // the metadata.
 static bool BetterSniffMPEG4(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *meta) {
     // We scan up to 128 bytes to identify this file as an MP4.
     static const off64_t kMaxScanOffset = 128ll;
@@ -5563,13 +5567,13 @@
 }
 
 static MediaExtractor* CreateExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const sp<AMessage>& meta __unused) {
     return new MPEG4Extractor(source);
 }
 
 static MediaExtractor::CreatorFunc Sniff(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         String8 *mimeType,
         float *confidence,
         sp<AMessage> *meta) {
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index e947b87..644c430 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -20,7 +20,7 @@
 
 #include <arpa/inet.h>
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaExtractor.h>
 #include <media/stagefright/foundation/AString.h>
 #include <utils/List.h>
@@ -29,7 +29,8 @@
 
 namespace android {
 struct AMessage;
-class DataSource;
+class DataSourceBase;
+struct CachedRangedDataSource;
 class SampleTable;
 class String8;
 namespace heif {
@@ -52,8 +53,7 @@
 
 class MPEG4Extractor : public MediaExtractor {
 public:
-    // Extractor assumes ownership of "source".
-    explicit MPEG4Extractor(const sp<DataSource> &source, const char *mime = NULL);
+    explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -62,7 +62,6 @@
     virtual sp<MetaData> getMetaData();
     virtual uint32_t flags() const;
     virtual const char * name() { return "MPEG4Extractor"; }
-    virtual void release();
 
     // for DRM
     virtual char* getDrmTrackInfo(size_t trackID, int *len);
@@ -98,7 +97,8 @@
 
     Vector<Trex> mTrex;
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
+    CachedRangedDataSource *mCachedSource;
     status_t mInitCheck;
     uint32_t mHeaderTimescale;
     bool mIsQT;
@@ -160,7 +160,7 @@
 };
 
 bool SniffMPEG4(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/mp4/SampleIterator.cpp b/media/extractors/mp4/SampleIterator.cpp
index c194397..93ee7c6 100644
--- a/media/extractors/mp4/SampleIterator.cpp
+++ b/media/extractors/mp4/SampleIterator.cpp
@@ -22,7 +22,7 @@
 
 #include <arpa/inet.h>
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/ByteUtils.h>
 
diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp
index 378d63a..81c353e 100644
--- a/media/extractors/mp4/SampleTable.cpp
+++ b/media/extractors/mp4/SampleTable.cpp
@@ -25,7 +25,7 @@
 
 #include <arpa/inet.h>
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/foundation/ByteUtils.h>
 
@@ -114,7 +114,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-SampleTable::SampleTable(const sp<DataSource> &source)
+SampleTable::SampleTable(DataSourceBase *source)
     : mDataSource(source),
       mChunkOffsetOffset(-1),
       mChunkOffsetType(0),
diff --git a/media/extractors/mp4/SampleTable.h b/media/extractors/mp4/SampleTable.h
index 466e26b..e4e974b 100644
--- a/media/extractors/mp4/SampleTable.h
+++ b/media/extractors/mp4/SampleTable.h
@@ -27,12 +27,12 @@
 
 namespace android {
 
-class DataSource;
+class DataSourceBase;
 struct SampleIterator;
 
 class SampleTable : public RefBase {
 public:
-    explicit SampleTable(const sp<DataSource> &source);
+    explicit SampleTable(DataSourceBase *source);
 
     bool isValid() const;
 
@@ -99,7 +99,7 @@
     // Limit the total size of all internal tables to 200MiB.
     static const size_t kMaxTotalSize = 200 * (1 << 20);
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     Mutex mLock;
 
     off64_t mChunkOffsetOffset;
diff --git a/media/extractors/mpeg2/ExtractorBundle.cpp b/media/extractors/mpeg2/ExtractorBundle.cpp
index d5682e9..443d685 100644
--- a/media/extractors/mpeg2/ExtractorBundle.cpp
+++ b/media/extractors/mpeg2/ExtractorBundle.cpp
@@ -34,18 +34,18 @@
         1,
         "MPEG2-PS/TS Extractor",
         [](
-                const sp<DataSource> &source,
+                DataSourceBase *source,
                 String8 *mimeType,
                 float *confidence,
                 sp<AMessage> *meta __unused) -> MediaExtractor::CreatorFunc {
             if (SniffMPEG2TS(source, mimeType, confidence, meta)) {
                 return [](
-                        const sp<DataSource> &source,
+                        DataSourceBase *source,
                         const sp<AMessage>& meta __unused) -> MediaExtractor* {
                     return new MPEG2TSExtractor(source);};
             } else if (SniffMPEG2PS(source, mimeType, confidence, meta)) {
                         return [](
-                                const sp<DataSource> &source,
+                                DataSourceBase *source,
                                 const sp<AMessage>& meta __unused) -> MediaExtractor* {
                             return new MPEG2PSExtractor(source);};
             }
diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
index 0978387..697e44f 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
@@ -23,7 +23,7 @@
 #include "mpeg2ts/AnotherPacketSource.h"
 #include "mpeg2ts/ESQueue.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ABitReader.h>
 #include <media/stagefright/foundation/ABuffer.h>
@@ -94,7 +94,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-MPEG2PSExtractor::MPEG2PSExtractor(const sp<DataSource> &source)
+MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source)
     : mDataSource(source),
       mOffset(0),
       mFinalResult(OK),
@@ -751,7 +751,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 bool SniffMPEG2PS(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *) {
     uint8_t header[5];
     if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) {
diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.h b/media/extractors/mpeg2/MPEG2PSExtractor.h
index f8a97ef..adf719a 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.h
@@ -31,7 +31,7 @@
 class String8;
 
 struct MPEG2PSExtractor : public MediaExtractor {
-    explicit MPEG2PSExtractor(const sp<DataSource> &source);
+    explicit MPEG2PSExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -50,7 +50,7 @@
     struct WrappedTrack;
 
     mutable Mutex mLock;
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
 
     off64_t mOffset;
     status_t mFinalResult;
@@ -72,7 +72,7 @@
 };
 
 bool SniffMPEG2PS(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
index b24e8db..6d0b1cc 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -22,7 +22,7 @@
 
 #include "MPEG2TSExtractor.h"
 
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/IStreamSource.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ABuffer.h>
@@ -121,7 +121,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-MPEG2TSExtractor::MPEG2TSExtractor(const sp<DataSource> &source)
+MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source)
     : mDataSource(source),
       mParser(new ATSParser),
       mLastSyncEvent(0),
@@ -367,7 +367,7 @@
 }
 
 status_t MPEG2TSExtractor::estimateDurationsFromTimesUsAtEnd()  {
-    if (!(mDataSource->flags() & DataSource::kIsLocalFileSource)) {
+    if (!(mDataSource->flags() & DataSourceBase::kIsLocalFileSource)) {
         return ERROR_UNSUPPORTED;
     }
 
@@ -646,7 +646,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 bool SniffMPEG2TS(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *) {
     for (int i = 0; i < 5; ++i) {
         char header;
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h
index 362f016..57cb675 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.h
@@ -32,12 +32,12 @@
 struct AMessage;
 struct AnotherPacketSource;
 struct ATSParser;
-class DataSource;
+class DataSourceBase;
 struct MPEG2TSSource;
 class String8;
 
 struct MPEG2TSExtractor : public MediaExtractor {
-    explicit MPEG2TSExtractor(const sp<DataSource> &source);
+    explicit MPEG2TSExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -55,7 +55,7 @@
 
     mutable Mutex mLock;
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
 
     sp<ATSParser> mParser;
 
@@ -79,9 +79,9 @@
     // Try to feed more data from source to parser.
     // |isInit| means this function is called inside init(). This is a signal to
     // save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
-    // This function returns OK if expected amount of data is fed from DataSource to
+    // This function returns OK if expected amount of data is fed from DataSourceBase to
     // parser and is successfully parsed. Otherwise, various error codes could be
-    // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSource, or
+    // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceBase, or
     // the data has syntax error during parsing, etc.
     status_t feedMore(bool isInit = false);
     status_t seek(int64_t seekTimeUs,
@@ -100,7 +100,7 @@
 };
 
 bool SniffMPEG2TS(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp
index f62ec47..1d04bed 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -21,7 +21,7 @@
 #include "OggExtractor.h"
 
 #include <cutils/properties.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ABuffer.h>
 #include <media/stagefright/foundation/ADebug.h>
@@ -69,7 +69,7 @@
 
 struct MyOggExtractor {
     MyOggExtractor(
-            const sp<DataSource> &source,
+            DataSourceBase *source,
             const char *mimeType,
             size_t numHeaders,
             int64_t seekPreRollUs);
@@ -105,7 +105,7 @@
         int64_t mTimeUs;
     };
 
-    sp<DataSource> mSource;
+    DataSourceBase *mSource;
     off64_t mOffset;
     Page mCurrentPage;
     uint64_t mCurGranulePosition;
@@ -164,7 +164,7 @@
 };
 
 struct MyVorbisExtractor : public MyOggExtractor {
-    explicit MyVorbisExtractor(const sp<DataSource> &source)
+    explicit MyVorbisExtractor(DataSourceBase *source)
         : MyOggExtractor(source,
                 MEDIA_MIMETYPE_AUDIO_VORBIS,
                 /* numHeaders */ 3,
@@ -192,7 +192,7 @@
     static const int32_t kOpusSampleRate = 48000;
     static const int64_t kOpusSeekPreRollUs = 80000; // 80 ms
 
-    explicit MyOpusExtractor(const sp<DataSource> &source)
+    explicit MyOpusExtractor(DataSourceBase *source)
         : MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_OPUS, /*numHeaders*/ 2, kOpusSeekPreRollUs),
           mChannelCount(0),
           mCodecDelay(0),
@@ -294,7 +294,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 MyOggExtractor::MyOggExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const char *mimeType,
         size_t numHeaders,
         int64_t seekPreRollUs)
@@ -852,7 +852,7 @@
 
     off64_t size;
     uint64_t lastGranulePosition;
-    if (!(mSource->flags() & DataSource::kIsCachingDataSource)
+    if (!(mSource->flags() & DataSourceBase::kIsCachingDataSource)
             && mSource->getSize(&size) == OK
             && findPrevGranulePosition(size, &lastGranulePosition) == OK) {
         // Let's assume it's cheap to seek to the end.
@@ -1315,7 +1315,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-OggExtractor::OggExtractor(const sp<DataSource> &source)
+OggExtractor::OggExtractor(DataSourceBase *source)
     : mDataSource(source),
       mInitCheck(NO_INIT),
       mImpl(NULL) {
@@ -1370,13 +1370,13 @@
 }
 
 static MediaExtractor* CreateExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const sp<AMessage>& meta __unused) {
     return new OggExtractor(source);
 }
 
 static MediaExtractor::CreatorFunc Sniff(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         String8 *mimeType,
         float *confidence,
         sp<AMessage> *) {
diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h
index 126428c..c9c37eb 100644
--- a/media/extractors/ogg/OggExtractor.h
+++ b/media/extractors/ogg/OggExtractor.h
@@ -24,14 +24,14 @@
 namespace android {
 
 struct AMessage;
-class DataSource;
+class DataSourceBase;
 class String8;
 
 struct MyOggExtractor;
 struct OggSource;
 
 struct OggExtractor : public MediaExtractor {
-    explicit OggExtractor(const sp<DataSource> &source);
+    explicit OggExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -46,7 +46,7 @@
 private:
     friend struct OggSource;
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     status_t mInitCheck;
 
     MyOggExtractor *mImpl;
@@ -56,7 +56,7 @@
 };
 
 bool SniffOgg(
-        const sp<DataSource> &source, String8 *mimeType, float *confidence,
+        DataSourceBase *source, String8 *mimeType, float *confidence,
         sp<AMessage> *);
 
 }  // namespace android
diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp
index cf22c66..105a37f 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -21,7 +21,7 @@
 #include "WAVExtractor.h"
 
 #include <audio_utils/primitives.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
 #include <media/MediaSourceBase.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <media/stagefright/MediaBufferGroup.h>
@@ -57,7 +57,7 @@
 
 struct WAVSource : public MediaSourceBase {
     WAVSource(
-            const sp<DataSource> &dataSource,
+            DataSourceBase *dataSource,
             const sp<MetaData> &meta,
             uint16_t waveFormat,
             int32_t bitsPerSample,
@@ -78,7 +78,7 @@
 private:
     static const size_t kMaxFrameSize;
 
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     sp<MetaData> mMeta;
     uint16_t mWaveFormat;
     int32_t mSampleRate;
@@ -94,7 +94,7 @@
     WAVSource &operator=(const WAVSource &);
 };
 
-WAVExtractor::WAVExtractor(const sp<DataSource> &source)
+WAVExtractor::WAVExtractor(DataSourceBase *source)
     : mDataSource(source),
       mValidFormat(false),
       mChannelMask(CHANNEL_MASK_USE_CHANNEL_ORDER) {
@@ -348,7 +348,7 @@
 const size_t WAVSource::kMaxFrameSize = 32768;
 
 WAVSource::WAVSource(
-        const sp<DataSource> &dataSource,
+        DataSourceBase *dataSource,
         const sp<MetaData> &meta,
         uint16_t waveFormat,
         int32_t bitsPerSample,
@@ -545,13 +545,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 static MediaExtractor* CreateExtractor(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         const sp<AMessage>& meta __unused) {
     return new WAVExtractor(source);
 }
 
 static MediaExtractor::CreatorFunc Sniff(
-        const sp<DataSource> &source,
+        DataSourceBase *source,
         String8 *mimeType,
         float *confidence,
         sp<AMessage> *) {
diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h
index 47c3c40..67661ed 100644
--- a/media/extractors/wav/WAVExtractor.h
+++ b/media/extractors/wav/WAVExtractor.h
@@ -24,13 +24,12 @@
 namespace android {
 
 struct AMessage;
-class DataSource;
+class DataSourceBase;
 class String8;
 
 class WAVExtractor : public MediaExtractor {
 public:
-    // Extractor assumes ownership of "source".
-    explicit WAVExtractor(const sp<DataSource> &source);
+    explicit WAVExtractor(DataSourceBase *source);
 
     virtual size_t countTracks();
     virtual MediaSourceBase *getTrack(size_t index);
@@ -42,7 +41,7 @@
     virtual ~WAVExtractor();
 
 private:
-    sp<DataSource> mDataSource;
+    DataSourceBase *mDataSource;
     status_t mInitCheck;
     bool mValidFormat;
     uint16_t mWaveFormat;