diff --git a/include/media/DataSourceBase.h b/include/media/DataSourceBase.h new file mode 120000 index 0000000000..54c80476c5 --- /dev/null +++ b/include/media/DataSourceBase.h @@ -0,0 +1 @@ +../../media/libmediaextractor/include/media/DataSourceBase.h \ No newline at end of file diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp index 6f28374725..1614ca4383 100644 --- a/media/extractors/aac/AACExtractor.cpp +++ b/media/extractors/aac/AACExtractor.cpp @@ -19,7 +19,7 @@ #include #include "AACExtractor.h" -#include +#include #include #include #include @@ -35,7 +35,7 @@ namespace android { class AACSource : public MediaSourceBase { public: - AACSource(const sp &source, + AACSource(DataSourceBase *source, const sp &meta, const Vector &offset_vector, int64_t frame_duration_us); @@ -53,7 +53,7 @@ protected: private: static const size_t kMaxFrameSize; - sp mDataSource; + DataSourceBase *mDataSource; sp mMeta; off64_t mOffset; @@ -91,7 +91,7 @@ uint32_t get_sample_rate(const uint8_t sf_index) // 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 &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 @@ static size_t getAdtsFrameLength(const sp &source, off64_t offset, s } AACExtractor::AACExtractor( - const sp &source, const sp &_meta) + DataSourceBase *source, const sp &_meta) : mDataSource(source), mInitCheck(NO_INIT), mFrameDurationUs(0) { @@ -229,7 +229,7 @@ sp AACExtractor::getTrackMetaData(size_t index, uint32_t /* flags */) const size_t AACSource::kMaxFrameSize = 8192; AACSource::AACSource( - const sp &source, const sp &meta, + DataSourceBase *source, const sp &meta, const Vector &offset_vector, int64_t frame_duration_us) : mDataSource(source), @@ -332,13 +332,13 @@ status_t AACSource::read( //////////////////////////////////////////////////////////////////////////////// static MediaExtractor* CreateExtractor( - const sp &source, + DataSourceBase *source, const sp& meta) { return new AACExtractor(source, meta); } static MediaExtractor::CreatorFunc Sniff( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta) { off64_t pos = 0; diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h index 33fbba7dca..e99699c13d 100644 --- a/media/extractors/aac/AACExtractor.h +++ b/media/extractors/aac/AACExtractor.h @@ -29,7 +29,7 @@ class String8; class AACExtractor : public MediaExtractor { public: - AACExtractor(const sp &source, const sp &meta); + AACExtractor(DataSourceBase *source, const sp &meta); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -42,7 +42,7 @@ protected: virtual ~AACExtractor(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mMeta; status_t mInitCheck; @@ -54,7 +54,7 @@ private: }; bool SniffAAC( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp index 10be50cce9..547e3f535d 100644 --- a/media/extractors/amr/AMRExtractor.cpp +++ b/media/extractors/amr/AMRExtractor.cpp @@ -20,7 +20,7 @@ #include "AMRExtractor.h" -#include +#include #include #include #include @@ -33,7 +33,7 @@ namespace android { class AMRSource : public MediaSourceBase { public: - AMRSource(const sp &source, + AMRSource(DataSourceBase *source, const sp &meta, bool isWide, const off64_t *offset_table, @@ -51,7 +51,7 @@ protected: virtual ~AMRSource(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mMeta; bool mIsWide; @@ -97,7 +97,7 @@ static size_t getFrameSize(bool isWide, unsigned FT) { return frameSize; } -static status_t getFrameSizeByOffset(const sp &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 @@ static status_t getFrameSizeByOffset(const sp &source, return OK; } -AMRExtractor::AMRExtractor(const sp &source) +AMRExtractor::AMRExtractor(DataSourceBase *source) : mDataSource(source), mInitCheck(NO_INIT), mOffsetTableLength(0) { @@ -206,7 +206,7 @@ sp AMRExtractor::getTrackMetaData(size_t index, uint32_t /* flags */) //////////////////////////////////////////////////////////////////////////////// AMRSource::AMRSource( - const sp &source, const sp &meta, + DataSourceBase *source, const sp &meta, bool isWide, const off64_t *offset_table, size_t offset_table_length) : mDataSource(source), mMeta(meta), @@ -339,7 +339,7 @@ status_t AMRSource::read( //////////////////////////////////////////////////////////////////////////////// bool SniffAMR( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { char header[9]; @@ -372,13 +372,13 @@ MediaExtractor::ExtractorDef GETEXTRACTORDEF() { 1, "AMR Extractor", []( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta __unused) -> MediaExtractor::CreatorFunc { if (SniffAMR(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new AMRExtractor(source);}; } diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h index 56883e397c..d6d49f2296 100644 --- a/media/extractors/amr/AMRExtractor.h +++ b/media/extractors/amr/AMRExtractor.h @@ -29,7 +29,7 @@ class String8; class AMRExtractor : public MediaExtractor { public: - explicit AMRExtractor(const sp &source); + explicit AMRExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -42,7 +42,7 @@ protected: virtual ~AMRExtractor(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mMeta; status_t mInitCheck; bool mIsWide; @@ -55,7 +55,7 @@ private: }; bool SniffAMR( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp index ba28e86933..8dbb5a15e4 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 +#include #include #include #include @@ -165,7 +165,7 @@ class FLACSource : public MediaSourceBase { public: FLACSource( - const sp &dataSource, + DataSourceBase *dataSource, const sp &trackMetadata); virtual status_t start(MetaData *params); @@ -179,7 +179,7 @@ protected: virtual ~FLACSource(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mTrackMetadata; sp mParser; bool mInitCheck; @@ -203,7 +203,7 @@ public: }; explicit FLACParser( - const sp &dataSource, + DataSourceBase *dataSource, // If metadata pointers aren't provided, we don't fill them const sp &fileMetadata = 0, const sp &trackMetadata = 0); @@ -243,7 +243,7 @@ protected: virtual ~FLACParser(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mFileMetadata; sp mTrackMetadata; bool mInitCheck; @@ -612,7 +612,7 @@ static void copyTrespass( // FLACParser FLACParser::FLACParser( - const sp &dataSource, + DataSourceBase *dataSource, const sp &fileMetadata, const sp &trackMetadata) : mDataSource(dataSource), @@ -833,7 +833,7 @@ MediaBuffer *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample) // FLACsource FLACSource::FLACSource( - const sp &dataSource, + DataSourceBase *dataSource, const sp &trackMetadata) : mDataSource(dataSource), mTrackMetadata(trackMetadata), @@ -918,7 +918,7 @@ status_t FLACSource::init() // FLACExtractor FLACExtractor::FLACExtractor( - const sp &dataSource) + DataSourceBase *dataSource) : mDataSource(dataSource), mInitCheck(false) { @@ -969,7 +969,7 @@ sp FLACExtractor::getMetaData() // Sniffer bool SniffFLAC( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { // first 4 is the signature word @@ -1000,13 +1000,13 @@ MediaExtractor::ExtractorDef GETEXTRACTORDEF() { 1, "FLAC Extractor", []( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta __unused) -> MediaExtractor::CreatorFunc { if (SniffFLAC(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new FLACExtractor(source);}; } diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h index 2e7ee3b98d..ef07212ef9 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 +#include #include #include @@ -28,8 +28,7 @@ class FLACParser; class FLACExtractor : public MediaExtractor { public: - // Extractor assumes ownership of source - explicit FLACExtractor(const sp &source); + explicit FLACExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -42,7 +41,7 @@ protected: virtual ~FLACExtractor(); private: - sp mDataSource; + DataSourceBase *mDataSource; sp mParser; status_t mInitCheck; sp mFileMetadata; @@ -57,7 +56,7 @@ private: }; -bool SniffFLAC(const sp &source, String8 *mimeType, +bool SniffFLAC(DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp index 18b1d23ddd..711c6a569a 100644 --- a/media/extractors/midi/MidiExtractor.cpp +++ b/media/extractors/midi/MidiExtractor.cpp @@ -141,7 +141,7 @@ status_t MidiSource::init() // MidiEngine -MidiEngine::MidiEngine(const sp &dataSource, +MidiEngine::MidiEngine(DataSourceBase *dataSource, const sp &fileMetadata, const sp &trackMetadata) : mGroup(NULL), @@ -261,7 +261,7 @@ MediaBuffer* MidiEngine::readBuffer() { // MidiExtractor MidiExtractor::MidiExtractor( - const sp &dataSource) + DataSourceBase *dataSource) : mDataSource(dataSource), mInitCheck(false) { @@ -308,7 +308,7 @@ sp MidiExtractor::getMetaData() // Sniffer bool SniffMidi( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { sp p = new MidiEngine(source, NULL, NULL); @@ -333,13 +333,13 @@ MediaExtractor::ExtractorDef GETEXTRACTORDEF() { 1, "MIDI Extractor", []( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta __unused) -> MediaExtractor::CreatorFunc { if (SniffMidi(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new MidiExtractor(source);}; } diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h index 87e4654c38..91efd06478 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 +#include #include #include #include @@ -29,7 +29,7 @@ namespace android { class MidiEngine : public RefBase { public: - MidiEngine(const sp &dataSource, + MidiEngine(DataSourceBase *dataSource, const sp &fileMetadata, const sp &trackMetadata); ~MidiEngine(); @@ -52,8 +52,7 @@ private: class MidiExtractor : public MediaExtractor { public: - // Extractor assumes ownership of source - explicit MidiExtractor(const sp &source); + explicit MidiExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -66,7 +65,7 @@ protected: virtual ~MidiExtractor(); private: - sp mDataSource; + DataSourceBase *mDataSource; status_t mInitCheck; sp mFileMetadata; @@ -88,7 +87,7 @@ private: }; -bool SniffMidi(const sp &source, String8 *mimeType, +bool SniffMidi(DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp index 6df0012a3c..f61f7c7e9c 100644 --- a/media/extractors/mkv/MatroskaExtractor.cpp +++ b/media/extractors/mkv/MatroskaExtractor.cpp @@ -21,7 +21,7 @@ #include "FLACDecoder.h" #include "MatroskaExtractor.h" -#include +#include #include #include #include @@ -40,8 +40,8 @@ namespace android { -struct DataSourceReader : public mkvparser::IMkvReader { - explicit DataSourceReader(const sp &source) +struct DataSourceBaseReader : public mkvparser::IMkvReader { + explicit DataSourceBaseReader(DataSourceBase *source) : mSource(source) { } @@ -83,10 +83,10 @@ struct DataSourceReader : public mkvparser::IMkvReader { } private: - sp mSource; + DataSourceBase *mSource; - DataSourceReader(const DataSourceReader &); - DataSourceReader &operator=(const DataSourceReader &); + DataSourceBaseReader(const DataSourceBaseReader &); + DataSourceBaseReader &operator=(const DataSourceBaseReader &); }; //////////////////////////////////////////////////////////////////////////////// @@ -852,9 +852,9 @@ status_t MatroskaSource::read( //////////////////////////////////////////////////////////////////////////////// -MatroskaExtractor::MatroskaExtractor(const sp &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 @@ MatroskaExtractor::MatroskaExtractor(const sp &source) 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 @@ uint32_t MatroskaExtractor::flags() const { } bool SniffMatroska( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { - DataSourceReader reader(source); + DataSourceBaseReader reader(source); mkvparser::EBMLHeader ebmlHeader; long long pos; if (ebmlHeader.Parse(&reader, pos) < 0) { @@ -1574,13 +1574,13 @@ MediaExtractor::ExtractorDef GETEXTRACTORDEF() { 1, "Matroska Extractor", []( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta __unused) -> MediaExtractor::CreatorFunc { if (SniffMatroska(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new MatroskaExtractor(source);}; } diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h index 54419bf62a..095452b036 100644 --- a/media/extractors/mkv/MatroskaExtractor.h +++ b/media/extractors/mkv/MatroskaExtractor.h @@ -30,11 +30,11 @@ struct AMessage; class String8; class MetaData; -struct DataSourceReader; +struct DataSourceBaseReader; struct MatroskaSource; struct MatroskaExtractor : public MediaExtractor { - explicit MatroskaExtractor(const sp &source); + explicit MatroskaExtractor(DataSourceBase *source); virtual size_t countTracks(); @@ -76,8 +76,8 @@ private: Mutex mLock; Vector mTracks; - sp mDataSource; - DataSourceReader *mReader; + DataSourceBase *mDataSource; + DataSourceBaseReader *mReader; mkvparser::Segment *mSegment; bool mExtractedThumbnails; bool mIsLiveStreaming; @@ -96,7 +96,7 @@ private: }; bool SniffMatroska( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp index 7e27fd8088..25d4debeae 100644 --- a/media/extractors/mp3/MP3Extractor.cpp +++ b/media/extractors/mp3/MP3Extractor.cpp @@ -24,7 +24,7 @@ #include "VBRISeeker.h" #include "XINGSeeker.h" -#include +#include #include #include #include @@ -46,7 +46,7 @@ namespace android { static const uint32_t kMask = 0xfffe0c00; static bool Resync( - const sp &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 @@ static bool Resync( class MP3Source : public MediaSourceBase { public: MP3Source( - const sp &meta, const sp &source, + const sp &meta, DataSourceBase *source, off64_t first_frame_pos, uint32_t fixed_header, const sp &seeker); @@ -230,7 +230,7 @@ protected: private: static const size_t kMaxFrameSize; sp mMeta; - sp mDataSource; + DataSourceBase *mDataSource; off64_t mFirstFramePos; uint32_t mFixedHeader; off64_t mCurrentPos; @@ -247,7 +247,7 @@ private: }; MP3Extractor::MP3Extractor( - const sp &source, const sp &meta) + DataSourceBase *source, const sp &meta) : mInitCheck(NO_INIT), mDataSource(source), mFirstFramePos(-1), @@ -436,7 +436,7 @@ sp MP3Extractor::getTrackMetaData( // 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 &meta, const sp &source, + const sp &meta, DataSourceBase *source, off64_t first_frame_pos, uint32_t fixed_header, const sp &seeker) : mMeta(meta), @@ -667,13 +667,13 @@ sp MP3Extractor::getMetaData() { } static MediaExtractor* CreateExtractor( - const sp &source, + DataSourceBase *source, const sp& meta) { return new MP3Extractor(source, meta); } static MediaExtractor::CreatorFunc Sniff( - const sp &source, String8 *mimeType, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *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 3b3387d372..6257112366 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 &source, const sp &meta); + MP3Extractor(DataSourceBase *source, const sp &meta); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -43,7 +42,7 @@ public: private: status_t mInitCheck; - sp mDataSource; + DataSourceBase *mDataSource; off64_t mFirstFramePos; sp mMeta; uint32_t mFixedHeader; @@ -54,7 +53,7 @@ private: }; bool SniffMP3( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta); } // namespace android diff --git a/media/extractors/mp3/VBRISeeker.cpp b/media/extractors/mp3/VBRISeeker.cpp index e7db6fd38f..51c5d1f7cc 100644 --- a/media/extractors/mp3/VBRISeeker.cpp +++ b/media/extractors/mp3/VBRISeeker.cpp @@ -27,7 +27,7 @@ #include #include -#include +#include namespace android { @@ -37,7 +37,7 @@ static uint32_t U24_AT(const uint8_t *ptr) { // static sp VBRISeeker::CreateFromSource( - const sp &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 87258b088c..e46af361ad 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 CreateFromSource( - const sp &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 fa59701916..adfa8d2c5a 100644 --- a/media/extractors/mp3/XINGSeeker.cpp +++ b/media/extractors/mp3/XINGSeeker.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include namespace android { @@ -77,7 +77,7 @@ bool XINGSeeker::getOffsetForTime(int64_t *timeUs, off64_t *pos) { // static sp XINGSeeker::CreateFromSource( - const sp &source, off64_t first_frame_pos) { + DataSourceBase *source, off64_t first_frame_pos) { sp seeker = new XINGSeeker; seeker->mFirstFramePos = first_frame_pos; diff --git a/media/extractors/mp3/XINGSeeker.h b/media/extractors/mp3/XINGSeeker.h index 37077c43d4..db847bcb7f 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 CreateFromSource( - const sp &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 85c66b243e..cef5f4a756 100644 --- a/media/extractors/mp4/ItemTable.cpp +++ b/media/extractors/mp4/ItemTable.cpp @@ -18,7 +18,7 @@ #define LOG_TAG "ItemTable" #include -#include +#include #include #include #include @@ -87,7 +87,7 @@ struct ImageItem { struct Box { protected: - Box(const sp source, uint32_t type) : + Box(DataSourceBase *source, uint32_t type) : mDataSource(source), mType(type) {} virtual ~Box() {} @@ -99,14 +99,14 @@ protected: inline uint32_t type() const { return mType; } - inline sp 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 mDataSource; + DataSourceBase *mDataSource; uint32_t mType; }; @@ -181,7 +181,7 @@ status_t Box::parseChunks(off64_t offset, size_t size) { struct FullBox : public Box { protected: - FullBox(const sp 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 @@ status_t FullBox::parseFullBoxHeader(off64_t *offset, size_t *size) { // struct PitmBox : public FullBox { - PitmBox(const sp 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 ItemLoc { }; struct IlocBox : public FullBox { - IlocBox(const sp source, KeyedVector *itemLocs) : + IlocBox(DataSourceBase *source, KeyedVector *itemLocs) : FullBox(source, FOURCC('i', 'l', 'o', 'c')), mItemLocs(itemLocs), mHasConstructMethod1(false) {} @@ -466,7 +466,7 @@ status_t IlocBox::parse(off64_t offset, size_t size) { // struct ItemReference : public Box, public RefBase { - ItemReference(const sp 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 @@ status_t ItemReference::parse(off64_t offset, size_t size) { } struct IrefBox : public FullBox { - IrefBox(const sp source, Vector > *itemRefs) : + IrefBox(DataSourceBase *source, Vector > *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 @@ private: }; struct IspeBox : public FullBox, public ItemProperty { - IspeBox(const sp 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 @@ status_t IspeBox::parse(off64_t offset, size_t size) { } struct HvccBox : public Box, public ItemProperty { - HvccBox(const sp 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 @@ status_t HvccBox::parse(off64_t offset, size_t size) { } struct IrotBox : public Box, public ItemProperty { - IrotBox(const sp 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 @@ status_t IrotBox::parse(off64_t offset, size_t size) { } struct ColrBox : public Box, public ItemProperty { - ColrBox(const sp 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 @@ status_t ColrBox::parse(off64_t offset, size_t size) { } struct IpmaBox : public FullBox { - IpmaBox(const sp source, Vector *associations) : + IpmaBox(DataSourceBase *source, Vector *associations) : FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {} status_t parse(off64_t offset, size_t size); @@ -857,7 +857,7 @@ status_t IpmaBox::parse(off64_t offset, size_t size) { } struct IpcoBox : public Box { - IpcoBox(const sp source, Vector > *properties) : + IpcoBox(DataSourceBase *source, Vector > *properties) : Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {} status_t parse(off64_t offset, size_t size); @@ -914,7 +914,7 @@ status_t IpcoBox::onChunkData(uint32_t type, off64_t offset, size_t size) { } struct IprpBox : public Box { - IprpBox(const sp source, + IprpBox(DataSourceBase *source, Vector > *properties, Vector *associations) : Box(source, FOURCC('i', 'p', 'r', 'p')), @@ -971,7 +971,7 @@ struct ItemInfo { }; struct InfeBox : public FullBox { - InfeBox(const sp 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 @@ status_t InfeBox::parse(off64_t offset, size_t size, ItemInfo *itemInfo) { } struct IinfBox : public FullBox { - IinfBox(const sp source, Vector *itemInfos) : + IinfBox(DataSourceBase *source, Vector *itemInfos) : FullBox(source, FOURCC('i', 'i', 'n', 'f')), mItemInfos(itemInfos), mHasGrids(false) {} @@ -1144,7 +1144,7 @@ status_t IinfBox::onChunkData(uint32_t type, off64_t offset, size_t size) { ////////////////////////////////////////////////////////////////// -ItemTable::ItemTable(const sp &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 3d2e2ae894..f4a69cc93b 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 @@ struct ItemReference; class ItemTable : public RefBase { public: - explicit ItemTable(const sp &source); + explicit ItemTable(DataSourceBase *source); status_t parse(uint32_t type, off64_t offset, size_t size); @@ -60,7 +60,7 @@ protected: ~ItemTable(); private: - sp mDataSource; + DataSourceBase *mDataSource; KeyedVector mItemLocs; Vector mItemInfos; diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index 9f21db6e6c..30dda13315 100644 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -69,7 +69,7 @@ class MPEG4Source : public MediaSourceBase { public: // Caller retains ownership of both "dataSource" and "sampleTable". MPEG4Source(const sp &format, - const sp &dataSource, + DataSourceBase *dataSource, int32_t timeScale, const sp &sampleTable, Vector &sidx, @@ -93,7 +93,7 @@ private: Mutex mLock; sp mFormat; - sp mDataSource; + DataSourceBase *mDataSource; int32_t mTimescale; sp mSampleTable; uint32_t mCurrentSampleIndex; @@ -186,47 +186,51 @@ private: // 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 &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 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 &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 @@ void MPEG4DataSource::clearCache() { 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 @@ ssize_t MPEG4DataSource::readAt(off64_t offset, void *data, size_t size) { 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 @@ status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) { return ERROR_IO; } - + mOwnsDataSource = assumeSourceOwnershipOnSuccess; return OK; } @@ -334,11 +340,12 @@ static bool AdjustChannelsAndRate(uint32_t fourcc, uint32_t *channels, uint32_t return false; } -MPEG4Extractor::MPEG4Extractor(const sp &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(const sp &source, const char *mime) } MPEG4Extractor::~MPEG4Extractor() { - release(); -} - -void MPEG4Extractor::release() { Track *track = mFirstTrack; while (track) { Track *next = track->next; @@ -381,10 +384,7 @@ void MPEG4Extractor::release() { } mPssh.clear(); - if (mDataSource != NULL) { - mDataSource->close(); - mDataSource.clear(); - } + delete mCachedSource; } uint32_t MPEG4Extractor::flags() const { @@ -692,14 +692,14 @@ char* MPEG4Extractor::getDrmTrackInfo(size_t trackID, int *len) { // 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, 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 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { ALOGV("sampleTable chunk is %" PRIu64 " bytes long.", chunk_size); if (mDataSource->flags() - & (DataSource::kWantsPrefetching - | DataSource::kIsCachingDataSource)) { - sp cachedSource = - new MPEG4DataSource(mDataSource); - - if (cachedSource->setCachedRange(*offset, chunk_size) == OK) { - mDataSource = cachedSource; + & (DataSourceBase::kWantsPrefetching + | DataSourceBase::kIsCachingDataSource)) { + CachedRangedDataSource *cachedSource = + new CachedRangedDataSource(mDataSource); + + if (cachedSource->setCachedRange( + *offset, chunk_size, + mCachedSource != NULL /* assume ownership on success */) == OK) { + mDataSource = mCachedSource = cachedSource; + } else { + delete cachedSource; } } @@ -3890,7 +3894,7 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio( MPEG4Source::MPEG4Source( const sp &format, - const sp &dataSource, + DataSourceBase *dataSource, int32_t timeScale, const sp &sampleTable, Vector &sidx, @@ -5379,7 +5383,7 @@ MPEG4Extractor::Track *MPEG4Extractor::findTrackByMimePrefix( } static bool LegacySniffMPEG4( - const sp &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 @@ static bool isCompatibleBrand(uint32_t fourcc) { // (end of the 'moov' atom) and report it to the caller as part of // the metadata. static bool BetterSniffMPEG4( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *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 bool BetterSniffMPEG4( } static MediaExtractor* CreateExtractor( - const sp &source, + DataSourceBase *source, const sp& meta __unused) { return new MPEG4Extractor(source); } static MediaExtractor::CreatorFunc Sniff( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta) { diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index e947b876b3..644c430f56 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -20,7 +20,7 @@ #include -#include +#include #include #include #include @@ -29,7 +29,8 @@ namespace android { struct AMessage; -class DataSource; +class DataSourceBase; +struct CachedRangedDataSource; class SampleTable; class String8; namespace heif { @@ -52,8 +53,7 @@ struct Trex { class MPEG4Extractor : public MediaExtractor { public: - // Extractor assumes ownership of "source". - explicit MPEG4Extractor(const sp &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 @@ public: virtual sp 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 @@ private: Vector mTrex; - sp mDataSource; + DataSourceBase *mDataSource; + CachedRangedDataSource *mCachedSource; status_t mInitCheck; uint32_t mHeaderTimescale; bool mIsQT; @@ -160,7 +160,7 @@ private: }; bool SniffMPEG4( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/mp4/SampleIterator.cpp b/media/extractors/mp4/SampleIterator.cpp index c19439798e..93ee7c6cb8 100644 --- a/media/extractors/mp4/SampleIterator.cpp +++ b/media/extractors/mp4/SampleIterator.cpp @@ -22,7 +22,7 @@ #include -#include +#include #include #include diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp index 378d63a5e5..81c353e21e 100644 --- a/media/extractors/mp4/SampleTable.cpp +++ b/media/extractors/mp4/SampleTable.cpp @@ -25,7 +25,7 @@ #include -#include +#include #include #include @@ -114,7 +114,7 @@ int32_t SampleTable::CompositionDeltaLookup::getCompositionTimeOffset( //////////////////////////////////////////////////////////////////////////////// -SampleTable::SampleTable(const sp &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 466e26b778..e4e974be94 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 &source); + explicit SampleTable(DataSourceBase *source); bool isValid() const; @@ -99,7 +99,7 @@ private: // Limit the total size of all internal tables to 200MiB. static const size_t kMaxTotalSize = 200 * (1 << 20); - sp mDataSource; + DataSourceBase *mDataSource; Mutex mLock; off64_t mChunkOffsetOffset; diff --git a/media/extractors/mpeg2/ExtractorBundle.cpp b/media/extractors/mpeg2/ExtractorBundle.cpp index d5682e9702..443d685488 100644 --- a/media/extractors/mpeg2/ExtractorBundle.cpp +++ b/media/extractors/mpeg2/ExtractorBundle.cpp @@ -34,18 +34,18 @@ MediaExtractor::ExtractorDef GETEXTRACTORDEF() { 1, "MPEG2-PS/TS Extractor", []( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta __unused) -> MediaExtractor::CreatorFunc { if (SniffMPEG2TS(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new MPEG2TSExtractor(source);}; } else if (SniffMPEG2PS(source, mimeType, confidence, meta)) { return []( - const sp &source, + DataSourceBase *source, const sp& meta __unused) -> MediaExtractor* { return new MPEG2PSExtractor(source);}; } diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp index 0978387795..697e44f0cc 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 +#include #include #include #include @@ -94,7 +94,7 @@ private: //////////////////////////////////////////////////////////////////////////////// -MPEG2PSExtractor::MPEG2PSExtractor(const sp &source) +MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source) : mDataSource(source), mOffset(0), mFinalResult(OK), @@ -751,7 +751,7 @@ status_t MPEG2PSExtractor::WrappedTrack::read( //////////////////////////////////////////////////////////////////////////////// bool SniffMPEG2PS( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { 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 f8a97ef92f..adf719a6db 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.h +++ b/media/extractors/mpeg2/MPEG2PSExtractor.h @@ -31,7 +31,7 @@ struct Track; class String8; struct MPEG2PSExtractor : public MediaExtractor { - explicit MPEG2PSExtractor(const sp &source); + explicit MPEG2PSExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -50,7 +50,7 @@ private: struct WrappedTrack; mutable Mutex mLock; - sp mDataSource; + DataSourceBase *mDataSource; off64_t mOffset; status_t mFinalResult; @@ -72,7 +72,7 @@ private: }; bool SniffMPEG2PS( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp index b24e8db83c..6d0b1ccbe9 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp @@ -22,7 +22,7 @@ #include "MPEG2TSExtractor.h" -#include +#include #include #include #include @@ -121,7 +121,7 @@ status_t MPEG2TSSource::read( //////////////////////////////////////////////////////////////////////////////// -MPEG2TSExtractor::MPEG2TSExtractor(const sp &source) +MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source) : mDataSource(source), mParser(new ATSParser), mLastSyncEvent(0), @@ -367,7 +367,7 @@ void MPEG2TSExtractor::addSyncPoint_l(const ATSParser::SyncEvent &event) { } status_t MPEG2TSExtractor::estimateDurationsFromTimesUsAtEnd() { - if (!(mDataSource->flags() & DataSource::kIsLocalFileSource)) { + if (!(mDataSource->flags() & DataSourceBase::kIsLocalFileSource)) { return ERROR_UNSUPPORTED; } @@ -646,7 +646,7 @@ status_t MPEG2TSExtractor::feedUntilBufferAvailable( //////////////////////////////////////////////////////////////////////////////// bool SniffMPEG2TS( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { for (int i = 0; i < 5; ++i) { char header; diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h index 362f01668e..57cb675501 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.h +++ b/media/extractors/mpeg2/MPEG2TSExtractor.h @@ -32,12 +32,12 @@ namespace android { struct AMessage; struct AnotherPacketSource; struct ATSParser; -class DataSource; +class DataSourceBase; struct MPEG2TSSource; class String8; struct MPEG2TSExtractor : public MediaExtractor { - explicit MPEG2TSExtractor(const sp &source); + explicit MPEG2TSExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -55,7 +55,7 @@ private: mutable Mutex mLock; - sp mDataSource; + DataSourceBase *mDataSource; sp mParser; @@ -79,9 +79,9 @@ private: // 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 @@ private: }; bool SniffMPEG2TS( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp index f62ec47112..1d04bedbce 100644 --- a/media/extractors/ogg/OggExtractor.cpp +++ b/media/extractors/ogg/OggExtractor.cpp @@ -21,7 +21,7 @@ #include "OggExtractor.h" #include -#include +#include #include #include #include @@ -69,7 +69,7 @@ private: struct MyOggExtractor { MyOggExtractor( - const sp &source, + DataSourceBase *source, const char *mimeType, size_t numHeaders, int64_t seekPreRollUs); @@ -105,7 +105,7 @@ protected: int64_t mTimeUs; }; - sp mSource; + DataSourceBase *mSource; off64_t mOffset; Page mCurrentPage; uint64_t mCurGranulePosition; @@ -164,7 +164,7 @@ protected: }; struct MyVorbisExtractor : public MyOggExtractor { - explicit MyVorbisExtractor(const sp &source) + explicit MyVorbisExtractor(DataSourceBase *source) : MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_VORBIS, /* numHeaders */ 3, @@ -192,7 +192,7 @@ struct MyOpusExtractor : public MyOggExtractor { static const int32_t kOpusSampleRate = 48000; static const int64_t kOpusSeekPreRollUs = 80000; // 80 ms - explicit MyOpusExtractor(const sp &source) + explicit MyOpusExtractor(DataSourceBase *source) : MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_OPUS, /*numHeaders*/ 2, kOpusSeekPreRollUs), mChannelCount(0), mCodecDelay(0), @@ -294,7 +294,7 @@ status_t OggSource::read( //////////////////////////////////////////////////////////////////////////////// MyOggExtractor::MyOggExtractor( - const sp &source, + DataSourceBase *source, const char *mimeType, size_t numHeaders, int64_t seekPreRollUs) @@ -852,7 +852,7 @@ status_t MyOggExtractor::init() { 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 @@ void MyOggExtractor::parseFileMetaData() { //////////////////////////////////////////////////////////////////////////////// -OggExtractor::OggExtractor(const sp &source) +OggExtractor::OggExtractor(DataSourceBase *source) : mDataSource(source), mInitCheck(NO_INIT), mImpl(NULL) { @@ -1370,13 +1370,13 @@ sp OggExtractor::getMetaData() { } static MediaExtractor* CreateExtractor( - const sp &source, + DataSourceBase *source, const sp& meta __unused) { return new OggExtractor(source); } static MediaExtractor::CreatorFunc Sniff( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h index 126428c91e..c9c37eb939 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 &source); + explicit OggExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -46,7 +46,7 @@ protected: private: friend struct OggSource; - sp mDataSource; + DataSourceBase *mDataSource; status_t mInitCheck; MyOggExtractor *mImpl; @@ -56,7 +56,7 @@ private: }; bool SniffOgg( - const sp &source, String8 *mimeType, float *confidence, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *); } // namespace android diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp index cf22c66223..105a37f8fd 100644 --- a/media/extractors/wav/WAVExtractor.cpp +++ b/media/extractors/wav/WAVExtractor.cpp @@ -21,7 +21,7 @@ #include "WAVExtractor.h" #include -#include +#include #include #include #include @@ -57,7 +57,7 @@ static uint16_t U16_LE_AT(const uint8_t *ptr) { struct WAVSource : public MediaSourceBase { WAVSource( - const sp &dataSource, + DataSourceBase *dataSource, const sp &meta, uint16_t waveFormat, int32_t bitsPerSample, @@ -78,7 +78,7 @@ protected: private: static const size_t kMaxFrameSize; - sp mDataSource; + DataSourceBase *mDataSource; sp mMeta; uint16_t mWaveFormat; int32_t mSampleRate; @@ -94,7 +94,7 @@ private: WAVSource &operator=(const WAVSource &); }; -WAVExtractor::WAVExtractor(const sp &source) +WAVExtractor::WAVExtractor(DataSourceBase *source) : mDataSource(source), mValidFormat(false), mChannelMask(CHANNEL_MASK_USE_CHANNEL_ORDER) { @@ -348,7 +348,7 @@ status_t WAVExtractor::init() { const size_t WAVSource::kMaxFrameSize = 32768; WAVSource::WAVSource( - const sp &dataSource, + DataSourceBase *dataSource, const sp &meta, uint16_t waveFormat, int32_t bitsPerSample, @@ -545,13 +545,13 @@ status_t WAVSource::read( //////////////////////////////////////////////////////////////////////////////// static MediaExtractor* CreateExtractor( - const sp &source, + DataSourceBase *source, const sp& meta __unused) { return new WAVExtractor(source); } static MediaExtractor::CreatorFunc Sniff( - const sp &source, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *) { diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h index 47c3c40d08..67661ed5db 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 &source); + explicit WAVExtractor(DataSourceBase *source); virtual size_t countTracks(); virtual MediaSourceBase *getTrack(size_t index); @@ -42,7 +41,7 @@ public: virtual ~WAVExtractor(); private: - sp mDataSource; + DataSourceBase *mDataSource; status_t mInitCheck; bool mValidFormat; uint16_t mWaveFormat; diff --git a/media/libmedia/IMediaExtractor.cpp b/media/libmedia/IMediaExtractor.cpp index a8a7b82c01..51ccb5a393 100644 --- a/media/libmedia/IMediaExtractor.cpp +++ b/media/libmedia/IMediaExtractor.cpp @@ -39,8 +39,7 @@ enum { SETMEDIACAS, SETUID, NAME, - GETMETRICS, - RELEASE, + GETMETRICS }; class BpMediaExtractor : public BpInterface { @@ -140,13 +139,6 @@ public: ALOGV("name NOT IMPLEMENTED"); return NULL; } - - virtual void release() { - ALOGV("release"); - Parcel data, reply; - data.writeInterfaceToken(BpMediaExtractor::getInterfaceDescriptor()); - remote()->transact(RELEASE, data, &reply); - } }; IMPLEMENT_META_INTERFACE(MediaExtractor, "android.media.IMediaExtractor"); @@ -224,12 +216,6 @@ status_t BnMediaExtractor::onTransact( reply->writeInt32(setMediaCas(casToken)); return OK; } - case RELEASE: { - ALOGV("release"); - CHECK_INTERFACE(IMediaExtractor, data, reply); - release(); - return OK; - } default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp index 4e5d67f2b0..0896e75cd2 100644 --- a/media/libmedia/MidiIoWrapper.cpp +++ b/media/libmedia/MidiIoWrapper.cpp @@ -47,7 +47,7 @@ MidiIoWrapper::MidiIoWrapper(int fd, off64_t offset, int64_t size) { mLength = size; } -MidiIoWrapper::MidiIoWrapper(const sp &source) { +MidiIoWrapper::MidiIoWrapper(DataSourceBase *source) { ALOGV("MidiIoWrapper(DataSource)"); mFd = -1; mDataSource = source; diff --git a/media/libmedia/include/media/IMediaExtractor.h b/media/libmedia/include/media/IMediaExtractor.h index 44f8c1d9c1..9899429c0c 100644 --- a/media/libmedia/include/media/IMediaExtractor.h +++ b/media/libmedia/include/media/IMediaExtractor.h @@ -68,8 +68,6 @@ public: virtual void setUID(uid_t uid) = 0; virtual const char * name() = 0; - - virtual void release() = 0; }; diff --git a/media/libmedia/include/media/MidiIoWrapper.h b/media/libmedia/include/media/MidiIoWrapper.h index 2754b2c39d..a27b410c56 100644 --- a/media/libmedia/include/media/MidiIoWrapper.h +++ b/media/libmedia/include/media/MidiIoWrapper.h @@ -19,7 +19,7 @@ #include -#include +#include namespace android { @@ -27,7 +27,7 @@ class MidiIoWrapper : public RefBase { public: MidiIoWrapper(const char *path); MidiIoWrapper(int fd, off64_t offset, int64_t size); - MidiIoWrapper(const sp &source); + MidiIoWrapper(DataSourceBase *source); ~MidiIoWrapper(); @@ -40,7 +40,7 @@ private: int mFd; off64_t mBase; int64_t mLength; - sp mDataSource; + DataSourceBase *mDataSource; EAS_FILE mEasFile; }; diff --git a/media/libmediaextractor/Android.bp b/media/libmediaextractor/Android.bp index 4071fbae44..8f4ba70b5b 100644 --- a/media/libmediaextractor/Android.bp +++ b/media/libmediaextractor/Android.bp @@ -23,7 +23,7 @@ cc_library { ], srcs: [ - "DataSource.cpp", + "DataSourceBase.cpp", "MediaBuffer.cpp", "MediaBufferGroup.cpp", "MediaSourceBase.cpp", diff --git a/media/libmediaextractor/DataSource.cpp b/media/libmediaextractor/DataSourceBase.cpp similarity index 77% rename from media/libmediaextractor/DataSource.cpp rename to media/libmediaextractor/DataSourceBase.cpp index 72959c6f61..d3af4eba05 100644 --- a/media/libmediaextractor/DataSource.cpp +++ b/media/libmediaextractor/DataSourceBase.cpp @@ -14,16 +14,16 @@ * limitations under the License. */ //#define LOG_NDEBUG 0 -#define LOG_TAG "DataSource" +#define LOG_TAG "DataSourceBase" -#include +#include #include #include #include namespace android { -bool DataSource::getUInt16(off64_t offset, uint16_t *x) { +bool DataSourceBase::getUInt16(off64_t offset, uint16_t *x) { *x = 0; uint8_t byte[2]; @@ -36,7 +36,7 @@ bool DataSource::getUInt16(off64_t offset, uint16_t *x) { return true; } -bool DataSource::getUInt24(off64_t offset, uint32_t *x) { +bool DataSourceBase::getUInt24(off64_t offset, uint32_t *x) { *x = 0; uint8_t byte[3]; @@ -49,7 +49,7 @@ bool DataSource::getUInt24(off64_t offset, uint32_t *x) { return true; } -bool DataSource::getUInt32(off64_t offset, uint32_t *x) { +bool DataSourceBase::getUInt32(off64_t offset, uint32_t *x) { *x = 0; uint32_t tmp; @@ -62,7 +62,7 @@ bool DataSource::getUInt32(off64_t offset, uint32_t *x) { return true; } -bool DataSource::getUInt64(off64_t offset, uint64_t *x) { +bool DataSourceBase::getUInt64(off64_t offset, uint64_t *x) { *x = 0; uint64_t tmp; @@ -75,7 +75,7 @@ bool DataSource::getUInt64(off64_t offset, uint64_t *x) { return true; } -bool DataSource::getUInt16Var(off64_t offset, uint16_t *x, size_t size) { +bool DataSourceBase::getUInt16Var(off64_t offset, uint16_t *x, size_t size) { if (size == 2) { return getUInt16(offset, x); } @@ -89,7 +89,7 @@ bool DataSource::getUInt16Var(off64_t offset, uint16_t *x, size_t size) { return false; } -bool DataSource::getUInt32Var(off64_t offset, uint32_t *x, size_t size) { +bool DataSourceBase::getUInt32Var(off64_t offset, uint32_t *x, size_t size) { if (size == 4) { return getUInt32(offset, x); } @@ -103,7 +103,7 @@ bool DataSource::getUInt32Var(off64_t offset, uint32_t *x, size_t size) { return false; } -bool DataSource::getUInt64Var(off64_t offset, uint64_t *x, size_t size) { +bool DataSourceBase::getUInt64Var(off64_t offset, uint64_t *x, size_t size) { if (size == 8) { return getUInt64(offset, x); } @@ -117,13 +117,13 @@ bool DataSource::getUInt64Var(off64_t offset, uint64_t *x, size_t size) { return false; } -status_t DataSource::getSize(off64_t *size) { +status_t DataSourceBase::getSize(off64_t *size) { *size = 0; return ERROR_UNSUPPORTED; } -String8 DataSource::getMIMEType() const { +String8 DataSourceBase::getMIMEType() const { return String8("application/octet-stream"); } diff --git a/media/libmediaextractor/include/media/DataSource.h b/media/libmediaextractor/include/media/DataSource.h index 9f00e0a43f..a066183247 100644 --- a/media/libmediaextractor/include/media/DataSource.h +++ b/media/libmediaextractor/include/media/DataSource.h @@ -20,75 +20,21 @@ #include #include +#include #include #include #include #include + namespace android { class String8; -class DataSource : public RefBase { +class DataSource : public DataSourceBase, public virtual RefBase { public: - enum Flags { - kWantsPrefetching = 1, - kStreamedFromLocalHost = 2, - kIsCachingDataSource = 4, - kIsHTTPBasedSource = 8, - kIsLocalFileSource = 16, - }; - DataSource() {} - virtual status_t initCheck() const = 0; - - // Returns the number of bytes read, or -1 on failure. It's not an error if - // this returns zero; it just means the given offset is equal to, or - // beyond, the end of the source. - virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; - - // Convenience methods: - bool getUInt16(off64_t offset, uint16_t *x); - bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int - bool getUInt32(off64_t offset, uint32_t *x); - bool getUInt64(off64_t offset, uint64_t *x); - - // read either int or int<2N> into a uint<2N>_t, size is the int size in bytes. - bool getUInt16Var(off64_t offset, uint16_t *x, size_t size); - bool getUInt32Var(off64_t offset, uint32_t *x, size_t size); - bool getUInt64Var(off64_t offset, uint64_t *x, size_t size); - - // May return ERROR_UNSUPPORTED. - virtual status_t getSize(off64_t *size); - - virtual uint32_t flags() { - return 0; - } - - virtual String8 toString() { - return String8(""); - } - - virtual status_t reconnectAtOffset(off64_t /*offset*/) { - return ERROR_UNSUPPORTED; - } - - //////////////////////////////////////////////////////////////////////////// - - // for DRM - virtual sp DrmInitialization(const char * /*mime*/ = NULL) { - return NULL; - } - - virtual String8 getUri() { - return String8(); - } - - virtual String8 getMIMEType() const; - - virtual void close() {}; - protected: virtual ~DataSource() {} diff --git a/media/libmediaextractor/include/media/DataSourceBase.h b/media/libmediaextractor/include/media/DataSourceBase.h new file mode 100644 index 0000000000..f964137c46 --- /dev/null +++ b/media/libmediaextractor/include/media/DataSourceBase.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DATA_SOURCE_BASE_H_ + +#define DATA_SOURCE_BASE_H_ + +#include +#include +#include +#include +#include + +namespace android { + +class String8; + +class DataSourceBase { +public: + enum Flags { + kWantsPrefetching = 1, + kStreamedFromLocalHost = 2, + kIsCachingDataSource = 4, + kIsHTTPBasedSource = 8, + kIsLocalFileSource = 16, + }; + + DataSourceBase() {} + + virtual status_t initCheck() const = 0; + + // Returns the number of bytes read, or -1 on failure. It's not an error if + // this returns zero; it just means the given offset is equal to, or + // beyond, the end of the source. + virtual ssize_t readAt(off64_t offset, void *data, size_t size) = 0; + + // Convenience methods: + bool getUInt16(off64_t offset, uint16_t *x); + bool getUInt24(off64_t offset, uint32_t *x); // 3 byte int, returned as a 32-bit int + bool getUInt32(off64_t offset, uint32_t *x); + bool getUInt64(off64_t offset, uint64_t *x); + + // read either int or int<2N> into a uint<2N>_t, size is the int size in bytes. + bool getUInt16Var(off64_t offset, uint16_t *x, size_t size); + bool getUInt32Var(off64_t offset, uint32_t *x, size_t size); + bool getUInt64Var(off64_t offset, uint64_t *x, size_t size); + + // Reads in "count" entries of type T into vector *x. + // Returns true if "count" entries can be read. + // If fewer than "count" entries can be read, return false. In this case, + // the output vector *x will still have those entries that were read. Call + // x->size() to obtain the number of entries read. + // The optional parameter chunkSize specifies how many entries should be + // read from the data source at one time into a temporary buffer. Increasing + // chunkSize can improve the performance at the cost of extra memory usage. + // The default value for chunkSize is set to read at least 4k bytes at a + // time, depending on sizeof(T). + template + bool getVector(off64_t offset, Vector* x, size_t count, + size_t chunkSize = (4095 / sizeof(T)) + 1); + + // May return ERROR_UNSUPPORTED. + virtual status_t getSize(off64_t *size); + + virtual uint32_t flags() { + return 0; + } + + virtual String8 toString() { + return String8(""); + } + + virtual status_t reconnectAtOffset(off64_t /*offset*/) { + return ERROR_UNSUPPORTED; + } + + //////////////////////////////////////////////////////////////////////////// + + // for DRM + virtual sp DrmInitialization(const char * /*mime*/ = NULL) { + return NULL; + } + + virtual String8 getUri() { + return String8(); + } + + virtual String8 getMIMEType() const; + + virtual void close() {}; + +protected: + virtual ~DataSourceBase() {} + +private: + DataSourceBase(const DataSourceBase &); + DataSourceBase &operator=(const DataSourceBase &); +}; + +template +bool DataSourceBase::getVector(off64_t offset, Vector* x, size_t count, + size_t chunkSize) +{ + x->clear(); + if (chunkSize == 0) { + return false; + } + if (count == 0) { + return true; + } + + T tmp[chunkSize]; + ssize_t numBytesRead; + size_t numBytesPerChunk = chunkSize * sizeof(T); + size_t i; + + for (i = 0; i + chunkSize < count; i += chunkSize) { + // This loops is executed when more than chunkSize records need to be + // read. + numBytesRead = this->readAt(offset, (void*)&tmp, numBytesPerChunk); + if (numBytesRead == -1) { // If readAt() returns -1, there is an error. + return false; + } + if (static_cast(numBytesRead) < numBytesPerChunk) { + // This case is triggered when the stream ends before the whole + // chunk is read. + x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); + return false; + } + x->appendArray(tmp, chunkSize); + offset += numBytesPerChunk; + } + + // There are (count - i) more records to read. + // Right now, (count - i) <= chunkSize. + // We do the same thing as above, but with chunkSize replaced by count - i. + numBytesRead = this->readAt(offset, (void*)&tmp, (count - i) * sizeof(T)); + if (numBytesRead == -1) { + return false; + } + x->appendArray(tmp, (size_t)numBytesRead / sizeof(T)); + return x->size() == count; +} + +} // namespace android + +#endif // DATA_SOURCE_BASE_H_ diff --git a/media/libmediaextractor/include/media/MediaExtractor.h b/media/libmediaextractor/include/media/MediaExtractor.h index 27581f3c7a..60495ec4e9 100644 --- a/media/libmediaextractor/include/media/MediaExtractor.h +++ b/media/libmediaextractor/include/media/MediaExtractor.h @@ -27,7 +27,7 @@ namespace android { -class DataSource; +class DataSourceBase; class MetaData; class String8; struct AMessage; @@ -87,15 +87,14 @@ public: virtual const char * name() { return ""; } - virtual void release() {} typedef MediaExtractor* (*CreatorFunc)( - const sp &source, const sp &meta); + DataSourceBase *source, const sp &meta); // The sniffer can optionally fill in "meta" with an AMessage containing // a dictionary of values that helps the corresponding extractor initialize // its state without duplicating effort already exerted by the sniffer. typedef CreatorFunc (*SnifferFunc)( - const sp &source, String8 *mimeType, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta); typedef struct { diff --git a/media/libstagefright/CallbackDataSource.cpp b/media/libstagefright/CallbackDataSource.cpp index f47964490c..71b737b8f6 100644 --- a/media/libstagefright/CallbackDataSource.cpp +++ b/media/libstagefright/CallbackDataSource.cpp @@ -21,6 +21,7 @@ #include "include/CallbackDataSource.h" #include +#include #include #include @@ -34,7 +35,10 @@ CallbackDataSource::CallbackDataSource( mIsClosed(false) { // Set up the buffer to read into. mMemory = mIDataSource->getIMemory(); - mName = String8::format("CallbackDataSource(%s)", mIDataSource->toString().string()); + mName = String8::format("CallbackDataSource(%d->%d, %s)", + getpid(), + IPCThreadState::self()->getCallingPid(), + mIDataSource->toString().string()); } diff --git a/media/libstagefright/InterfaceUtils.cpp b/media/libstagefright/InterfaceUtils.cpp index 284e63b380..70fbbd744e 100644 --- a/media/libstagefright/InterfaceUtils.cpp +++ b/media/libstagefright/InterfaceUtils.cpp @@ -38,11 +38,13 @@ sp CreateIDataSourceFromDataSource(const sp &source) { } sp CreateIMediaExtractorFromMediaExtractor( - MediaExtractor *extractor, const sp &plugin) { + MediaExtractor *extractor, + const sp &source, + const sp &plugin) { if (extractor == nullptr) { return nullptr; } - return RemoteMediaExtractor::wrap(extractor, plugin); + return RemoteMediaExtractor::wrap(extractor, source, plugin); } sp CreateMediaSourceFromIMediaSource(const sp &source) { diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp index e79696cb7f..bb72167dae 100644 --- a/media/libstagefright/MediaExtractorFactory.cpp +++ b/media/libstagefright/MediaExtractorFactory.cpp @@ -118,7 +118,7 @@ sp MediaExtractorFactory::CreateFromService( String8 tmp; float confidence; sp plugin; - creator = sniff(source, &tmp, &confidence, &meta, plugin); + creator = sniff(source.get(), &tmp, &confidence, &meta, plugin); if (!creator) { ALOGV("FAILED to autodetect media content."); return NULL; @@ -128,8 +128,8 @@ sp MediaExtractorFactory::CreateFromService( ALOGV("Autodetected media content as '%s' with confidence %.2f", mime, confidence); - MediaExtractor *ret = creator(source, meta); - return CreateIMediaExtractorFromMediaExtractor(ret, plugin); + MediaExtractor *ret = creator(source.get(), meta); + return CreateIMediaExtractorFromMediaExtractor(ret, source, plugin); } //static @@ -165,7 +165,7 @@ bool MediaExtractorFactory::gPluginsRegistered = false; // static MediaExtractor::CreatorFunc MediaExtractorFactory::sniff( - const sp &source, String8 *mimeType, float *confidence, sp *meta, + DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta, sp &plugin) { *mimeType = ""; *confidence = 0.0f; diff --git a/media/libstagefright/RemoteMediaExtractor.cpp b/media/libstagefright/RemoteMediaExtractor.cpp index 3ebee51449..601c9fa9e7 100644 --- a/media/libstagefright/RemoteMediaExtractor.cpp +++ b/media/libstagefright/RemoteMediaExtractor.cpp @@ -37,9 +37,12 @@ static const char *kExtractorTracks = "android.media.mediaextractor.ntrk"; static const char *kExtractorFormat = "android.media.mediaextractor.fmt"; RemoteMediaExtractor::RemoteMediaExtractor( - MediaExtractor *extractor, const sp &plugin) + MediaExtractor *extractor, + const sp &source, + const sp &plugin) :mExtractor(extractor), - mExtractorPlugin(plugin) { + mSource(source), + mExtractorPlugin(plugin) { mAnalyticsItem = nullptr; if (MEDIA_LOG) { @@ -67,6 +70,8 @@ RemoteMediaExtractor::RemoteMediaExtractor( RemoteMediaExtractor::~RemoteMediaExtractor() { delete mExtractor; + mSource->close(); + mSource.clear(); mExtractorPlugin = nullptr; // log the current record, provided it has some information worth recording if (MEDIA_LOG) { @@ -129,19 +134,17 @@ const char * RemoteMediaExtractor::name() { return mExtractor->name(); } -void RemoteMediaExtractor::release() { - return mExtractor->release(); -} - //////////////////////////////////////////////////////////////////////////////// // static sp RemoteMediaExtractor::wrap( - MediaExtractor *extractor, const sp &plugin) { + MediaExtractor *extractor, + const sp &source, + const sp &plugin) { if (extractor == nullptr) { return nullptr; } - return new RemoteMediaExtractor(extractor, plugin); + return new RemoteMediaExtractor(extractor, source, plugin); } } // namespace android diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp index e2db0f5a19..179e0e63da 100644 --- a/media/libstagefright/StagefrightMetadataRetriever.cpp +++ b/media/libstagefright/StagefrightMetadataRetriever.cpp @@ -47,12 +47,6 @@ StagefrightMetadataRetriever::StagefrightMetadataRetriever() StagefrightMetadataRetriever::~StagefrightMetadataRetriever() { ALOGV("~StagefrightMetadataRetriever()"); clearMetadata(); - // Explicitly release extractor before continuing with the destructor, - // some extractors might need to callback to close off the DataSource - // and we need to make sure it's still there. - if (mExtractor != NULL) { - mExtractor->release(); - } if (mSource != NULL) { mSource->close(); } diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index 61403bebef..f4bba59079 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -30,7 +30,7 @@ namespace android { static const size_t kMaxMetadataSize = 3 * 1024 * 1024; -struct MemorySource : public DataSource { +struct MemorySource : public DataSourceBase { MemorySource(const uint8_t *data, size_t size) : mData(data), mSize(size) { @@ -56,7 +56,7 @@ private: DISALLOW_EVIL_CONSTRUCTORS(MemorySource); }; -ID3::ID3(const sp &source, bool ignoreV1, off64_t offset) +ID3::ID3(DataSourceBase *source, bool ignoreV1, off64_t offset) : mIsValid(false), mData(NULL), mSize(0), @@ -77,7 +77,7 @@ ID3::ID3(const uint8_t *data, size_t size, bool ignoreV1) mFirstFrameOffset(0), mVersion(ID3_UNKNOWN), mRawSize(0) { - sp source = new (std::nothrow) MemorySource(data, size); + MemorySource *source = new (std::nothrow) MemorySource(data, size); if (source == NULL) return; @@ -87,6 +87,7 @@ ID3::ID3(const uint8_t *data, size_t size, bool ignoreV1) if (!mIsValid && !ignoreV1) { mIsValid = parseV1(source); } + delete source; } ID3::~ID3() { @@ -118,7 +119,7 @@ bool ID3::ParseSyncsafeInteger(const uint8_t encoded[4], size_t *x) { return true; } -bool ID3::parseV2(const sp &source, off64_t offset) { +bool ID3::parseV2(DataSourceBase *source, off64_t offset) { struct id3_header { char id[3]; uint8_t version_major; @@ -960,7 +961,7 @@ ID3::getAlbumArt(size_t *length, String8 *mime) const { return NULL; } -bool ID3::parseV1(const sp &source) { +bool ID3::parseV1(DataSourceBase *source) { const size_t V1_TAG_SIZE = 128; off64_t size; diff --git a/media/libstagefright/id3/testid3.cpp b/media/libstagefright/id3/testid3.cpp index 442a3ffed9..86e6adf5ba 100644 --- a/media/libstagefright/id3/testid3.cpp +++ b/media/libstagefright/id3/testid3.cpp @@ -72,7 +72,7 @@ void scanFile(const char *path) { sp file = new FileSource(path); CHECK_EQ(file->initCheck(), (status_t)OK); - ID3 tag(file); + ID3 tag(file.get()); if (!tag.isValid()) { printf("FAIL %s\n", path); } else { diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h index 11682f87f6..7c2391e1f1 100644 --- a/media/libstagefright/include/ID3.h +++ b/media/libstagefright/include/ID3.h @@ -22,7 +22,7 @@ namespace android { -class DataSource; +class DataSourceBase; class String8; struct ID3 { @@ -35,7 +35,7 @@ struct ID3 { ID3_V2_4, }; - explicit ID3(const sp &source, bool ignoreV1 = false, off64_t offset = 0); + explicit ID3(DataSourceBase *source, bool ignoreV1 = false, off64_t offset = 0); ID3(const uint8_t *data, size_t size, bool ignoreV1 = false); ~ID3(); @@ -85,8 +85,8 @@ private: // only valid for IDV2+ size_t mRawSize; - bool parseV1(const sp &source); - bool parseV2(const sp &source, off64_t offset); + bool parseV1(DataSourceBase *source); + bool parseV2(DataSourceBase *source, off64_t offset); void removeUnsynchronization(); bool removeUnsynchronizationV2_4(bool iTunesHack); diff --git a/media/libstagefright/include/media/stagefright/InterfaceUtils.h b/media/libstagefright/include/media/stagefright/InterfaceUtils.h index ceeaf319ee..568c7356e4 100644 --- a/media/libstagefright/include/media/stagefright/InterfaceUtils.h +++ b/media/libstagefright/include/media/stagefright/InterfaceUtils.h @@ -41,7 +41,9 @@ sp CreateIDataSourceFromDataSource(const sp &source); // Creates an IMediaExtractor wrapper to the given MediaExtractor. sp CreateIMediaExtractorFromMediaExtractor( - MediaExtractor *extractor, const sp &plugin); + MediaExtractor *extractor, + const sp &source, + const sp &plugin); // Creates a MediaSource which wraps the given IMediaSource object. sp CreateMediaSourceFromIMediaSource(const sp &source); diff --git a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h index 4610359362..4d2f4f0232 100644 --- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h +++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h @@ -56,7 +56,7 @@ private: static void RegisterExtractor( const sp &plugin, List> &pluginList); - static MediaExtractor::CreatorFunc sniff(const sp &source, + static MediaExtractor::CreatorFunc sniff(DataSourceBase *source, String8 *mimeType, float *confidence, sp *meta, sp &plugin); diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h index 78f3a84fd1..22a8210469 100644 --- a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h +++ b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h @@ -28,7 +28,10 @@ class MediaAnalyticsItem; // IMediaExtractor wrapper to the MediaExtractor. class RemoteMediaExtractor : public BnMediaExtractor { public: - static sp wrap(MediaExtractor *extractor, const sp &plugin); + static sp wrap( + MediaExtractor *extractor, + const sp &source, + const sp &plugin); virtual ~RemoteMediaExtractor(); virtual size_t countTracks(); @@ -41,15 +44,18 @@ public: virtual void setUID(uid_t uid); virtual status_t setMediaCas(const HInterfaceToken &casToken); virtual const char * name(); - virtual void release(); private: MediaExtractor *mExtractor; + sp mSource; sp mExtractorPlugin; MediaAnalyticsItem *mAnalyticsItem; - explicit RemoteMediaExtractor(MediaExtractor *extractor, const sp &plugin); + explicit RemoteMediaExtractor( + MediaExtractor *extractor, + const sp &source, + const sp &plugin); DISALLOW_EVIL_CONSTRUCTORS(RemoteMediaExtractor); };