From cec44d0c8dc9703ca87435d95bdcd6ef228784d7 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Sun, 17 Jun 2018 22:21:09 -0700 Subject: [PATCH] C-ify DataSource Add a C API for DataSource/Base, and a helper so extractors can continue using a C++ API. Bug: 111407253 Test: build, boot, play some files Change-Id: I1c8b2990e17d18eee53c9abf7ebef2ced0e8b7fd --- include/media/MediaExtractorPluginApi.h | 13 +- include/media/MediaExtractorPluginHelper.h | 131 ++++++++++++++++++ media/extractors/aac/AACExtractor.cpp | 23 +-- media/extractors/aac/AACExtractor.h | 6 +- media/extractors/amr/AMRExtractor.cpp | 23 +-- media/extractors/amr/AMRExtractor.h | 4 +- media/extractors/flac/FLACExtractor.cpp | 28 ++-- media/extractors/flac/FLACExtractor.h | 6 +- media/extractors/midi/MidiExtractor.cpp | 10 +- media/extractors/midi/MidiExtractor.h | 8 +- media/extractors/mkv/MatroskaExtractor.cpp | 19 +-- media/extractors/mkv/MatroskaExtractor.h | 4 +- media/extractors/mp3/MP3Extractor.cpp | 29 ++-- media/extractors/mp3/MP3Extractor.h | 7 +- media/extractors/mp3/VBRISeeker.cpp | 6 +- media/extractors/mp3/VBRISeeker.h | 4 +- media/extractors/mp3/XINGSeeker.cpp | 6 +- media/extractors/mp3/XINGSeeker.h | 4 +- media/extractors/mp4/ItemTable.cpp | 39 +++--- media/extractors/mp4/ItemTable.h | 6 +- media/extractors/mp4/MPEG4Extractor.cpp | 43 +++--- media/extractors/mp4/MPEG4Extractor.h | 12 +- media/extractors/mp4/SampleTable.cpp | 4 +- media/extractors/mp4/SampleTable.h | 7 +- media/extractors/mpeg2/ExtractorBundle.cpp | 18 ++- media/extractors/mpeg2/MPEG2PSExtractor.cpp | 5 +- media/extractors/mpeg2/MPEG2PSExtractor.h | 6 +- media/extractors/mpeg2/MPEG2TSExtractor.cpp | 8 +- media/extractors/mpeg2/MPEG2TSExtractor.h | 15 +- media/extractors/ogg/OggExtractor.cpp | 21 +-- media/extractors/ogg/OggExtractor.h | 5 +- media/extractors/wav/WAVExtractor.cpp | 24 ++-- media/extractors/wav/WAVExtractor.h | 6 +- media/libmedia/MidiIoWrapper.cpp | 46 ++++++ media/libmedia/include/media/MidiIoWrapper.h | 3 + .../include/media/DataSource.h | 30 +++- .../libstagefright/MediaExtractorFactory.cpp | 8 +- media/libstagefright/id3/ID3.cpp | 51 +++++++ media/libstagefright/include/ID3.h | 2 + .../media/stagefright/MediaExtractorFactory.h | 2 +- 40 files changed, 493 insertions(+), 199 deletions(-) diff --git a/include/media/MediaExtractorPluginApi.h b/include/media/MediaExtractorPluginApi.h index 30c2b05407..930b6e27e1 100644 --- a/include/media/MediaExtractorPluginApi.h +++ b/include/media/MediaExtractorPluginApi.h @@ -23,10 +23,17 @@ namespace android { struct MediaTrack; class MetaDataBase; -class DataSourceBase; extern "C" { +struct CDataSource { + ssize_t (*readAt)(void *handle, off64_t offset, void *data, size_t size); + status_t (*getSize)(void *handle, off64_t *size); + uint32_t (*flags)(void *handle ); + bool (*getUri)(void *handle, char *uriString, size_t bufferSize); + void *handle; +}; + struct CMediaExtractor { void *data; @@ -44,7 +51,7 @@ struct CMediaExtractor { const char * (*name)(void *data); }; -typedef CMediaExtractor* (*CreatorFunc)(DataSourceBase *source, void *meta); +typedef CMediaExtractor* (*CreatorFunc)(CDataSource *source, void *meta); typedef void (*FreeMetaFunc)(void *meta); // The sniffer can optionally fill in an opaque object, "meta", that helps @@ -52,7 +59,7 @@ typedef void (*FreeMetaFunc)(void *meta); // effort already exerted by the sniffer. If "freeMeta" is given, it will be // called against the opaque object when it is no longer used. typedef CreatorFunc (*SnifferFunc)( - DataSourceBase *source, float *confidence, + CDataSource *source, float *confidence, void **meta, FreeMetaFunc *freeMeta); typedef struct { diff --git a/include/media/MediaExtractorPluginHelper.h b/include/media/MediaExtractorPluginHelper.h index 465f76ae29..c817b30764 100644 --- a/include/media/MediaExtractorPluginHelper.h +++ b/include/media/MediaExtractorPluginHelper.h @@ -18,6 +18,7 @@ #define MEDIA_EXTRACTOR_PLUGIN_HELPER_H_ +#include #include #include @@ -117,6 +118,136 @@ inline CMediaExtractor *wrap(MediaExtractorPluginHelper *extractor) { return wrapper; } +/* adds some convience methods */ +class DataSourceHelper { +public: + explicit DataSourceHelper(CDataSource *csource) { + mSource = csource; + } + + explicit DataSourceHelper(DataSourceHelper *source) { + mSource = source->mSource; + } + + ssize_t readAt(off64_t offset, void *data, size_t size) { + return mSource->readAt(mSource->handle, offset, data, size); + } + + status_t getSize(off64_t *size) { + return mSource->getSize(mSource->handle, size); + } + + bool getUri(char *uriString, size_t bufferSize) { + return mSource->getUri(mSource->handle, uriString, bufferSize); + } + + uint32_t flags() { + return mSource->flags(mSource->handle); + } + + // Convenience methods: + bool getUInt16(off64_t offset, uint16_t *x) { + *x = 0; + + uint8_t byte[2]; + if (readAt(offset, byte, 2) != 2) { + return false; + } + + *x = (byte[0] << 8) | byte[1]; + + return true; + } + + // 3 byte int, returned as a 32-bit int + bool getUInt24(off64_t offset, uint32_t *x) { + *x = 0; + + uint8_t byte[3]; + if (readAt(offset, byte, 3) != 3) { + return false; + } + + *x = (byte[0] << 16) | (byte[1] << 8) | byte[2]; + + return true; + } + + bool getUInt32(off64_t offset, uint32_t *x) { + *x = 0; + + uint32_t tmp; + if (readAt(offset, &tmp, 4) != 4) { + return false; + } + + *x = ntohl(tmp); + + return true; + } + + bool getUInt64(off64_t offset, uint64_t *x) { + *x = 0; + + uint64_t tmp; + if (readAt(offset, &tmp, 8) != 8) { + return false; + } + + *x = ((uint64_t)ntohl(tmp & 0xffffffff) << 32) | ntohl(tmp >> 32); + + return true; + } + + // 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) { + if (size == 2) { + return getUInt16(offset, x); + } + if (size == 1) { + uint8_t tmp; + if (readAt(offset, &tmp, 1) == 1) { + *x = tmp; + return true; + } + } + return false; + } + + bool getUInt32Var(off64_t offset, uint32_t *x, size_t size) { + if (size == 4) { + return getUInt32(offset, x); + } + if (size == 2) { + uint16_t tmp; + if (getUInt16(offset, &tmp)) { + *x = tmp; + return true; + } + } + return false; + } + + bool getUInt64Var(off64_t offset, uint64_t *x, size_t size) { + if (size == 8) { + return getUInt64(offset, x); + } + if (size == 4) { + uint32_t tmp; + if (getUInt32(offset, &tmp)) { + *x = tmp; + return true; + } + } + return false; + } + +protected: + CDataSource *mSource; +}; + + + // helpers to create a media_uuid_t from a string literal // purposely not defined anywhere so that this will fail to link if diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp index 7b9da47f9e..955a588c42 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 @@ -36,7 +36,7 @@ namespace android { class AACSource : public MediaTrack { public: AACSource( - DataSourceBase *source, + DataSourceHelper *source, MetaDataBase &meta, const Vector &offset_vector, int64_t frame_duration_us); @@ -54,7 +54,7 @@ protected: private: static const size_t kMaxFrameSize; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mMeta; off64_t mOffset; @@ -92,7 +92,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(DataSourceBase *source, off64_t offset, size_t* headerSize) { +static size_t getAdtsFrameLength(DataSourceHelper *source, off64_t offset, size_t* headerSize) { const size_t kAdtsHeaderLengthNoCrc = 7; const size_t kAdtsHeaderLengthWithCrc = 9; @@ -133,7 +133,7 @@ static size_t getAdtsFrameLength(DataSourceBase *source, off64_t offset, size_t* } AACExtractor::AACExtractor( - DataSourceBase *source, off64_t offset) + DataSourceHelper *source, off64_t offset) : mDataSource(source), mInitCheck(NO_INIT), mFrameDurationUs(0) { @@ -219,7 +219,7 @@ status_t AACExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32 const size_t AACSource::kMaxFrameSize = 8192; AACSource::AACSource( - DataSourceBase *source, + DataSourceHelper *source, MetaDataBase &meta, const Vector &offset_vector, int64_t frame_duration_us) @@ -324,20 +324,21 @@ status_t AACSource::read( //////////////////////////////////////////////////////////////////////////////// static CMediaExtractor* CreateExtractor( - DataSourceBase *source, + CDataSource *source, void *meta) { off64_t offset = *static_cast(meta); - return wrap(new AACExtractor(source, offset)); + return wrap(new AACExtractor(new DataSourceHelper(source), offset)); } static CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **meta, + CDataSource *source, float *confidence, void **meta, FreeMetaFunc *freeMeta) { off64_t pos = 0; + DataSourceHelper helper(source); for (;;) { uint8_t id3header[10]; - if (source->readAt(pos, id3header, sizeof(id3header)) + if (helper.readAt(pos, id3header, sizeof(id3header)) < (ssize_t)sizeof(id3header)) { return NULL; } @@ -364,7 +365,7 @@ static CreatorFunc Sniff( uint8_t header[2]; - if (source->readAt(pos, &header, 2) != 2) { + if (helper.readAt(pos, &header, 2) != 2) { return NULL; } diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h index a48de5c77d..3f2046131b 100644 --- a/media/extractors/aac/AACExtractor.h +++ b/media/extractors/aac/AACExtractor.h @@ -31,7 +31,7 @@ class String8; class AACExtractor : public MediaExtractorPluginHelper { public: - AACExtractor(DataSourceBase *source, off64_t offset); + AACExtractor(DataSourceHelper *source, off64_t offset); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -44,7 +44,7 @@ protected: virtual ~AACExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mMeta; status_t mInitCheck; @@ -56,7 +56,7 @@ private: }; bool SniffAAC( - DataSourceBase *source, String8 *mimeType, float *confidence, off64_t *offset); + DataSourceHelper *source, String8 *mimeType, float *confidence, off64_t *offset); } // namespace android diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp index f1143c4fa5..e109fb3d5a 100644 --- a/media/extractors/amr/AMRExtractor.cpp +++ b/media/extractors/amr/AMRExtractor.cpp @@ -20,7 +20,6 @@ #include "AMRExtractor.h" -#include #include #include #include @@ -34,7 +33,7 @@ namespace android { class AMRSource : public MediaTrack { public: AMRSource( - DataSourceBase *source, + DataSourceHelper *source, MetaDataBase &meta, bool isWide, const off64_t *offset_table, @@ -52,7 +51,7 @@ protected: virtual ~AMRSource(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mMeta; bool mIsWide; @@ -98,7 +97,7 @@ static size_t getFrameSize(bool isWide, unsigned FT) { return frameSize; } -static status_t getFrameSizeByOffset(DataSourceBase *source, +static status_t getFrameSizeByOffset(DataSourceHelper *source, off64_t offset, bool isWide, size_t *frameSize) { uint8_t header; ssize_t count = source->readAt(offset, &header, 1); @@ -118,7 +117,7 @@ static status_t getFrameSizeByOffset(DataSourceBase *source, } static bool SniffAMR( - DataSourceBase *source, bool *isWide, float *confidence) { + DataSourceHelper *source, bool *isWide, float *confidence) { char header[9]; if (source->readAt(0, header, sizeof(header)) != sizeof(header)) { @@ -144,7 +143,7 @@ static bool SniffAMR( return false; } -AMRExtractor::AMRExtractor(DataSourceBase *source) +AMRExtractor::AMRExtractor(DataSourceHelper *source) : mDataSource(source), mInitCheck(NO_INIT), mOffsetTableLength(0) { @@ -192,6 +191,7 @@ AMRExtractor::AMRExtractor(DataSourceBase *source) } AMRExtractor::~AMRExtractor() { + delete mDataSource; } status_t AMRExtractor::getMetaData(MetaDataBase &meta) { @@ -229,7 +229,7 @@ status_t AMRExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32 //////////////////////////////////////////////////////////////////////////////// AMRSource::AMRSource( - DataSourceBase *source, MetaDataBase &meta, + DataSourceHelper *source, MetaDataBase &meta, bool isWide, const off64_t *offset_table, size_t offset_table_length) : mDataSource(source), mMeta(meta), @@ -372,15 +372,16 @@ ExtractorDef GETEXTRACTORDEF() { 1, "AMR Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) -> CreatorFunc { - if (SniffAMR(source, nullptr, confidence)) { + DataSourceHelper helper(source); + if (SniffAMR(&helper, nullptr, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { - return wrap(new AMRExtractor(source));}; + return wrap(new AMRExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h index 1099dbffa0..499ca67da3 100644 --- a/media/extractors/amr/AMRExtractor.h +++ b/media/extractors/amr/AMRExtractor.h @@ -31,7 +31,7 @@ class String8; class AMRExtractor : public MediaExtractorPluginHelper { public: - explicit AMRExtractor(DataSourceBase *source); + explicit AMRExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -44,7 +44,7 @@ protected: virtual ~AMRExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mMeta; status_t mInitCheck; bool mIsWide; diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp index ba4e5ac402..1efaa0c617 100644 --- a/media/extractors/flac/FLACExtractor.cpp +++ b/media/extractors/flac/FLACExtractor.cpp @@ -24,7 +24,7 @@ // libFLAC parser #include "FLAC/stream_decoder.h" -#include +#include #include #include #include @@ -43,7 +43,7 @@ class FLACSource : public MediaTrack { public: FLACSource( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, MetaDataBase &meta); virtual status_t start(MetaDataBase *params); @@ -57,7 +57,7 @@ protected: virtual ~FLACSource(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mTrackMetadata; FLACParser *mParser; bool mInitCheck; @@ -79,7 +79,7 @@ public: }; explicit FLACParser( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, // If metadata pointers aren't provided, we don't fill them MetaDataBase *fileMetadata = 0, MetaDataBase *trackMetadata = 0); @@ -118,7 +118,7 @@ public: } private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase *mFileMetadata; MetaDataBase *mTrackMetadata; bool mInitCheck; @@ -487,7 +487,7 @@ static void copyTrespass( // FLACParser FLACParser::FLACParser( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, MetaDataBase *fileMetadata, MetaDataBase *trackMetadata) : mDataSource(dataSource), @@ -708,7 +708,7 @@ MediaBufferBase *FLACParser::readBuffer(bool doSeek, FLAC__uint64 sample) // FLACsource FLACSource::FLACSource( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, MetaDataBase &trackMetadata) : mDataSource(dataSource), mTrackMetadata(trackMetadata), @@ -789,7 +789,7 @@ status_t FLACSource::read( // FLACExtractor FLACExtractor::FLACExtractor( - DataSourceBase *dataSource) + DataSourceHelper *dataSource) : mDataSource(dataSource), mParser(nullptr), mInitCheck(false) @@ -804,6 +804,7 @@ FLACExtractor::~FLACExtractor() { ALOGV("~FLACExtractor::FLACExtractor"); delete mParser; + delete mDataSource; } size_t FLACExtractor::countTracks() @@ -837,7 +838,7 @@ status_t FLACExtractor::getMetaData(MetaDataBase &meta) // Sniffer -bool SniffFLAC(DataSourceBase *source, float *confidence) +bool SniffFLAC(DataSourceHelper *source, float *confidence) { // first 4 is the signature word // second 4 is the sizeof STREAMINFO @@ -866,15 +867,16 @@ ExtractorDef GETEXTRACTORDEF() { 1, "FLAC Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) -> CreatorFunc { - if (SniffFLAC(source, confidence)) { + DataSourceHelper helper(source); + if (SniffFLAC(&helper, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { - return wrap(new FLACExtractor(source));}; + return wrap(new FLACExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h index 70ba9ac7c4..1ddff436da 100644 --- a/media/extractors/flac/FLACExtractor.h +++ b/media/extractors/flac/FLACExtractor.h @@ -30,7 +30,7 @@ class FLACParser; class FLACExtractor : public MediaExtractorPluginHelper { public: - explicit FLACExtractor(DataSourceBase *source); + explicit FLACExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -43,7 +43,7 @@ protected: virtual ~FLACExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; FLACParser *mParser; status_t mInitCheck; MetaDataBase mFileMetadata; @@ -56,8 +56,6 @@ private: }; -bool SniffFLAC(DataSourceBase *source, float *confidence); - } // namespace android #endif // FLAC_EXTRACTOR_H_ diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp index 1b9cd5e9ef..233033eadc 100644 --- a/media/extractors/midi/MidiExtractor.cpp +++ b/media/extractors/midi/MidiExtractor.cpp @@ -142,7 +142,7 @@ status_t MidiSource::init() // MidiEngine -MidiEngine::MidiEngine(DataSourceBase *dataSource, +MidiEngine::MidiEngine(CDataSource *dataSource, MetaDataBase *fileMetadata, MetaDataBase *trackMetadata) : mGroup(NULL), @@ -263,7 +263,7 @@ MediaBufferBase* MidiEngine::readBuffer() { // MidiExtractor MidiExtractor::MidiExtractor( - DataSourceBase *dataSource) + CDataSource *dataSource) : mDataSource(dataSource), mInitCheck(false) { @@ -310,7 +310,7 @@ status_t MidiExtractor::getMetaData(MetaDataBase &meta) // Sniffer -bool SniffMidi(DataSourceBase *source, float *confidence) +bool SniffMidi(CDataSource *source, float *confidence) { MidiEngine p(source, NULL, NULL); if (p.initCheck() == OK) { @@ -333,13 +333,13 @@ ExtractorDef GETEXTRACTORDEF() { 1, "MIDI Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) -> CreatorFunc { if (SniffMidi(source, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { return wrap(new MidiExtractor(source));}; } diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h index 6ea8781df1..fbbe93ed5c 100644 --- a/media/extractors/midi/MidiExtractor.h +++ b/media/extractors/midi/MidiExtractor.h @@ -31,7 +31,7 @@ namespace android { class MidiEngine { public: - explicit MidiEngine(DataSourceBase *dataSource, + explicit MidiEngine(CDataSource *dataSource, MetaDataBase *fileMetadata, MetaDataBase *trackMetadata); ~MidiEngine(); @@ -54,7 +54,7 @@ private: class MidiExtractor : public MediaExtractorPluginHelper { public: - explicit MidiExtractor(DataSourceBase *source); + explicit MidiExtractor(CDataSource *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -67,7 +67,7 @@ protected: virtual ~MidiExtractor(); private: - DataSourceBase *mDataSource; + CDataSource *mDataSource; status_t mInitCheck; MetaDataBase mFileMetadata; @@ -89,7 +89,7 @@ private: }; -bool SniffMidi(DataSourceBase *source, float *confidence); +bool SniffMidi(CDataSource *source, float *confidence); } // namespace android diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp index 3f703e5474..a387970dc8 100644 --- a/media/extractors/mkv/MatroskaExtractor.cpp +++ b/media/extractors/mkv/MatroskaExtractor.cpp @@ -44,7 +44,7 @@ namespace android { struct DataSourceBaseReader : public mkvparser::IMkvReader { - explicit DataSourceBaseReader(DataSourceBase *source) + explicit DataSourceBaseReader(DataSourceHelper *source) : mSource(source) { } @@ -86,7 +86,7 @@ struct DataSourceBaseReader : public mkvparser::IMkvReader { } private: - DataSourceBase *mSource; + DataSourceHelper *mSource; DataSourceBaseReader(const DataSourceBaseReader &); DataSourceBaseReader &operator=(const DataSourceBaseReader &); @@ -921,7 +921,7 @@ status_t MatroskaSource::read( //////////////////////////////////////////////////////////////////////////////// -MatroskaExtractor::MatroskaExtractor(DataSourceBase *source) +MatroskaExtractor::MatroskaExtractor(DataSourceHelper *source) : mDataSource(source), mReader(new DataSourceBaseReader(mDataSource)), mSegment(NULL), @@ -994,6 +994,8 @@ MatroskaExtractor::~MatroskaExtractor() { delete mReader; mReader = NULL; + + delete mDataSource; } size_t MatroskaExtractor::countTracks() { @@ -1621,7 +1623,7 @@ uint32_t MatroskaExtractor::flags() const { } bool SniffMatroska( - DataSourceBase *source, float *confidence) { + DataSourceHelper *source, float *confidence) { DataSourceBaseReader reader(source); mkvparser::EBMLHeader ebmlHeader; long long pos; @@ -1645,15 +1647,16 @@ ExtractorDef GETEXTRACTORDEF() { 1, "Matroska Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) -> CreatorFunc { - if (SniffMatroska(source, confidence)) { + DataSourceHelper helper(source); + if (SniffMatroska(&helper, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { - return wrap(new MatroskaExtractor(source));}; + return wrap(new MatroskaExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h index 6d6204410d..2c6ca850b2 100644 --- a/media/extractors/mkv/MatroskaExtractor.h +++ b/media/extractors/mkv/MatroskaExtractor.h @@ -36,7 +36,7 @@ struct DataSourceBaseReader; struct MatroskaSource; struct MatroskaExtractor : public MediaExtractorPluginHelper { - explicit MatroskaExtractor(DataSourceBase *source); + explicit MatroskaExtractor(DataSourceHelper *source); virtual size_t countTracks(); @@ -77,7 +77,7 @@ private: Mutex mLock; Vector mTracks; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; DataSourceBaseReader *mReader; mkvparser::Segment *mSegment; bool mExtractedThumbnails; diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp index c86212c1a4..a1e5593cff 100644 --- a/media/extractors/mp3/MP3Extractor.cpp +++ b/media/extractors/mp3/MP3Extractor.cpp @@ -24,7 +24,6 @@ #include "VBRISeeker.h" #include "XINGSeeker.h" -#include #include #include #include @@ -46,7 +45,7 @@ namespace android { static const uint32_t kMask = 0xfffe0c00; static bool Resync( - DataSourceBase *source, uint32_t match_header, + DataSourceHelper *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 +211,7 @@ static bool Resync( class MP3Source : public MediaTrack { public: MP3Source( - MetaDataBase &meta, DataSourceBase *source, + MetaDataBase &meta, DataSourceHelper *source, off64_t first_frame_pos, uint32_t fixed_header, MP3Seeker *seeker); @@ -230,7 +229,7 @@ protected: private: static const size_t kMaxFrameSize; MetaDataBase &mMeta; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; off64_t mFirstFramePos; uint32_t mFixedHeader; off64_t mCurrentPos; @@ -253,7 +252,7 @@ struct Mp3Meta { }; MP3Extractor::MP3Extractor( - DataSourceBase *source, Mp3Meta *meta) + DataSourceHelper *source, Mp3Meta *meta) : mInitCheck(NO_INIT), mDataSource(source), mFirstFramePos(-1), @@ -371,7 +370,8 @@ MP3Extractor::MP3Extractor( // Get iTunes-style gapless info if present. // When getting the id3 tag, skip the V1 tags to prevent the source cache // from being iterated to the end of the file. - ID3 id3(mDataSource, true); + DataSourceHelper helper(mDataSource); + ID3 id3(&helper, true); if (id3.isValid()) { ID3::Iterator *com = new ID3::Iterator(id3, "COM"); if (com->done()) { @@ -404,6 +404,7 @@ MP3Extractor::MP3Extractor( MP3Extractor::~MP3Extractor() { delete mSeeker; + delete mDataSource; } size_t MP3Extractor::countTracks() { @@ -440,7 +441,7 @@ status_t 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( - MetaDataBase &meta, DataSourceBase *source, + MetaDataBase &meta, DataSourceHelper *source, off64_t first_frame_pos, uint32_t fixed_header, MP3Seeker *seeker) : mMeta(meta), @@ -612,7 +613,8 @@ status_t MP3Extractor::getMetaData(MetaDataBase &meta) { } meta.setCString(kKeyMIMEType, "audio/mpeg"); - ID3 id3(mDataSource); + DataSourceHelper helper(mDataSource); + ID3 id3(&helper); if (!id3.isValid()) { return OK; @@ -670,20 +672,21 @@ status_t MP3Extractor::getMetaData(MetaDataBase &meta) { } static CMediaExtractor* CreateExtractor( - DataSourceBase *source, + CDataSource *source, void *meta) { Mp3Meta *metaData = static_cast(meta); - return wrap(new MP3Extractor(source, metaData)); + return wrap(new MP3Extractor(new DataSourceHelper(source), metaData)); } static CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **meta, + CDataSource *source, float *confidence, void **meta, FreeMetaFunc *freeMeta) { off64_t pos = 0; off64_t post_id3_pos; uint32_t header; uint8_t mpeg_header[5]; - if (source->readAt(0, mpeg_header, sizeof(mpeg_header)) < (ssize_t)sizeof(mpeg_header)) { + DataSourceHelper helper(source); + if (helper.readAt(0, mpeg_header, sizeof(mpeg_header)) < (ssize_t)sizeof(mpeg_header)) { return NULL; } @@ -691,7 +694,7 @@ static CreatorFunc Sniff( ALOGV("MPEG1PS container is not supported!"); return NULL; } - if (!Resync(source, 0, &pos, &post_id3_pos, &header)) { + if (!Resync(&helper, 0, &pos, &post_id3_pos, &header)) { return NULL; } diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h index 89573027b2..585d9f6629 100644 --- a/media/extractors/mp3/MP3Extractor.h +++ b/media/extractors/mp3/MP3Extractor.h @@ -25,15 +25,16 @@ namespace android { +class DataSourceHelper; + struct AMessage; -class DataSourceBase; struct MP3Seeker; class String8; struct Mp3Meta; class MP3Extractor : public MediaExtractorPluginHelper { public: - MP3Extractor(DataSourceBase *source, Mp3Meta *meta); + MP3Extractor(DataSourceHelper *source, Mp3Meta *meta); ~MP3Extractor(); virtual size_t countTracks(); @@ -46,7 +47,7 @@ public: private: status_t mInitCheck; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; off64_t mFirstFramePos; MetaDataBase mMeta; uint32_t mFixedHeader; diff --git a/media/extractors/mp3/VBRISeeker.cpp b/media/extractors/mp3/VBRISeeker.cpp index 523f14cff2..9eb72a79b5 100644 --- a/media/extractors/mp3/VBRISeeker.cpp +++ b/media/extractors/mp3/VBRISeeker.cpp @@ -27,7 +27,9 @@ #include #include -#include + +#include +#include namespace android { @@ -37,7 +39,7 @@ static uint32_t U24_AT(const uint8_t *ptr) { // static VBRISeeker *VBRISeeker::CreateFromSource( - DataSourceBase *source, off64_t post_id3_pos) { + DataSourceHelper *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 9213f6e8c8..507899c322 100644 --- a/media/extractors/mp3/VBRISeeker.h +++ b/media/extractors/mp3/VBRISeeker.h @@ -24,11 +24,11 @@ namespace android { -class DataSourceBase; +class DataSourceHelper; struct VBRISeeker : public MP3Seeker { static VBRISeeker *CreateFromSource( - DataSourceBase *source, off64_t post_id3_pos); + DataSourceHelper *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 01e06ca51d..9f1fd7a91b 100644 --- a/media/extractors/mp3/XINGSeeker.cpp +++ b/media/extractors/mp3/XINGSeeker.cpp @@ -21,7 +21,9 @@ #include #include -#include + +#include +#include namespace android { @@ -79,7 +81,7 @@ bool XINGSeeker::getOffsetForTime(int64_t *timeUs, off64_t *pos) { // static XINGSeeker *XINGSeeker::CreateFromSource( - DataSourceBase *source, off64_t first_frame_pos) { + DataSourceHelper *source, off64_t first_frame_pos) { uint8_t buffer[4]; int offset = first_frame_pos; diff --git a/media/extractors/mp3/XINGSeeker.h b/media/extractors/mp3/XINGSeeker.h index 5867eaeb8f..9acee38a36 100644 --- a/media/extractors/mp3/XINGSeeker.h +++ b/media/extractors/mp3/XINGSeeker.h @@ -22,11 +22,11 @@ namespace android { -class DataSourceBase; +class DataSourceHelper; struct XINGSeeker : public MP3Seeker { static XINGSeeker *CreateFromSource( - DataSourceBase *source, off64_t first_frame_pos); + DataSourceHelper *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 be442e6fec..a61e60a8c8 100644 --- a/media/extractors/mp4/ItemTable.cpp +++ b/media/extractors/mp4/ItemTable.cpp @@ -18,7 +18,8 @@ #define LOG_TAG "ItemTable" #include -#include +#include +#include #include #include #include @@ -92,7 +93,7 @@ struct ExifItem { struct Box { protected: - Box(DataSourceBase *source, uint32_t type) : + Box(DataSourceHelper *source, uint32_t type) : mDataSource(source), mType(type) {} virtual ~Box() {} @@ -104,14 +105,14 @@ protected: inline uint32_t type() const { return mType; } - inline DataSourceBase *source() const { return mDataSource; } + inline DataSourceHelper *source() const { return mDataSource; } status_t parseChunk(off64_t *offset); status_t parseChunks(off64_t offset, size_t size); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; uint32_t mType; }; @@ -186,7 +187,7 @@ status_t Box::parseChunks(off64_t offset, size_t size) { struct FullBox : public Box { protected: - FullBox(DataSourceBase *source, uint32_t type) : + FullBox(DataSourceHelper *source, uint32_t type) : Box(source, type), mVersion(0), mFlags(0) {} inline uint8_t version() const { return mVersion; } @@ -221,7 +222,7 @@ status_t FullBox::parseFullBoxHeader(off64_t *offset, size_t *size) { // struct PitmBox : public FullBox { - PitmBox(DataSourceBase *source) : + PitmBox(DataSourceHelper *source) : FullBox(source, FOURCC('p', 'i', 't', 'm')) {} status_t parse(off64_t offset, size_t size, uint32_t *primaryItemId); @@ -301,7 +302,7 @@ struct ItemLoc { }; struct IlocBox : public FullBox { - IlocBox(DataSourceBase *source, KeyedVector *itemLocs) : + IlocBox(DataSourceHelper *source, KeyedVector *itemLocs) : FullBox(source, FOURCC('i', 'l', 'o', 'c')), mItemLocs(itemLocs), mHasConstructMethod1(false) {} @@ -471,7 +472,7 @@ status_t IlocBox::parse(off64_t offset, size_t size) { // struct ItemReference : public Box, public RefBase { - ItemReference(DataSourceBase *source, uint32_t type, uint32_t itemIdSize) : + ItemReference(DataSourceHelper *source, uint32_t type, uint32_t itemIdSize) : Box(source, type), mItemId(0), mRefIdSize(itemIdSize) {} status_t parse(off64_t offset, size_t size); @@ -626,7 +627,7 @@ status_t ItemReference::parse(off64_t offset, size_t size) { } struct IrefBox : public FullBox { - IrefBox(DataSourceBase *source, Vector > *itemRefs) : + IrefBox(DataSourceHelper *source, Vector > *itemRefs) : FullBox(source, FOURCC('i', 'r', 'e', 'f')), mRefIdSize(0), mItemRefs(itemRefs) {} status_t parse(off64_t offset, size_t size); @@ -688,7 +689,7 @@ private: }; struct IspeBox : public FullBox, public ItemProperty { - IspeBox(DataSourceBase *source) : + IspeBox(DataSourceHelper *source) : FullBox(source, FOURCC('i', 's', 'p', 'e')), mWidth(0), mHeight(0) {} status_t parse(off64_t offset, size_t size) override; @@ -724,7 +725,7 @@ status_t IspeBox::parse(off64_t offset, size_t size) { } struct HvccBox : public Box, public ItemProperty { - HvccBox(DataSourceBase *source) : + HvccBox(DataSourceHelper *source) : Box(source, FOURCC('h', 'v', 'c', 'C')) {} status_t parse(off64_t offset, size_t size) override; @@ -757,7 +758,7 @@ status_t HvccBox::parse(off64_t offset, size_t size) { } struct IrotBox : public Box, public ItemProperty { - IrotBox(DataSourceBase *source) : + IrotBox(DataSourceHelper *source) : Box(source, FOURCC('i', 'r', 'o', 't')), mAngle(0) {} status_t parse(off64_t offset, size_t size) override; @@ -786,7 +787,7 @@ status_t IrotBox::parse(off64_t offset, size_t size) { } struct ColrBox : public Box, public ItemProperty { - ColrBox(DataSourceBase *source) : + ColrBox(DataSourceHelper *source) : Box(source, FOURCC('c', 'o', 'l', 'r')) {} status_t parse(off64_t offset, size_t size) override; @@ -834,7 +835,7 @@ status_t ColrBox::parse(off64_t offset, size_t size) { } struct IpmaBox : public FullBox { - IpmaBox(DataSourceBase *source, Vector *associations) : + IpmaBox(DataSourceHelper *source, Vector *associations) : FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {} status_t parse(off64_t offset, size_t size); @@ -908,7 +909,7 @@ status_t IpmaBox::parse(off64_t offset, size_t size) { } struct IpcoBox : public Box { - IpcoBox(DataSourceBase *source, Vector > *properties) : + IpcoBox(DataSourceHelper *source, Vector > *properties) : Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {} status_t parse(off64_t offset, size_t size); @@ -965,7 +966,7 @@ status_t IpcoBox::onChunkData(uint32_t type, off64_t offset, size_t size) { } struct IprpBox : public Box { - IprpBox(DataSourceBase *source, + IprpBox(DataSourceHelper *source, Vector > *properties, Vector *associations) : Box(source, FOURCC('i', 'p', 'r', 'p')), @@ -1022,7 +1023,7 @@ struct ItemInfo { }; struct InfeBox : public FullBox { - InfeBox(DataSourceBase *source) : + InfeBox(DataSourceHelper *source) : FullBox(source, FOURCC('i', 'n', 'f', 'e')) {} status_t parse(off64_t offset, size_t size, ItemInfo *itemInfo); @@ -1127,7 +1128,7 @@ status_t InfeBox::parse(off64_t offset, size_t size, ItemInfo *itemInfo) { } struct IinfBox : public FullBox { - IinfBox(DataSourceBase *source, Vector *itemInfos) : + IinfBox(DataSourceHelper *source, Vector *itemInfos) : FullBox(source, FOURCC('i', 'i', 'n', 'f')), mItemInfos(itemInfos), mHasGrids(false) {} @@ -1196,7 +1197,7 @@ status_t IinfBox::onChunkData(uint32_t type, off64_t offset, size_t size) { ////////////////////////////////////////////////////////////////// -ItemTable::ItemTable(DataSourceBase *source) +ItemTable::ItemTable(DataSourceHelper *source) : mDataSource(source), mPrimaryItemId(0), mIdatOffset(0), diff --git a/media/extractors/mp4/ItemTable.h b/media/extractors/mp4/ItemTable.h index 536dcb0faf..650b3f3be1 100644 --- a/media/extractors/mp4/ItemTable.h +++ b/media/extractors/mp4/ItemTable.h @@ -25,7 +25,7 @@ namespace android { -class DataSourceBase; +class DataSourceHelper; class MetaData; namespace heif { @@ -45,7 +45,7 @@ struct ItemReference; class ItemTable : public RefBase { public: - explicit ItemTable(DataSourceBase *source); + explicit ItemTable(DataSourceHelper *source); status_t parse(uint32_t type, off64_t offset, size_t size); @@ -62,7 +62,7 @@ protected: ~ItemTable(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; KeyedVector mItemLocs; Vector mItemInfos; diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index 0cb4e6b17d..b6b0ae2efc 100644 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -32,6 +32,7 @@ #include "ItemTable.h" #include "include/ESDS.h" +#include #include #include #include @@ -72,7 +73,7 @@ static const size_t kMaxPcmFrameSize = 8192; public: // Caller retains ownership of both "dataSource" and "sampleTable". MPEG4Source(MetaDataBase &format, - DataSourceBase *dataSource, + DataSourceHelper *dataSource, int32_t timeScale, const sp &sampleTable, Vector &sidx, @@ -96,7 +97,7 @@ private: Mutex mLock; MetaDataBase &mFormat; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; int32_t mTimescale; sp mSampleTable; uint32_t mCurrentSampleIndex; @@ -197,11 +198,10 @@ private: // possibly wrapping multiple times to cover all tracks, i.e. // Each CachedRangedDataSource caches the sampletable metadata for a single track. -struct CachedRangedDataSource : public DataSourceBase { - explicit CachedRangedDataSource(DataSourceBase *source); +struct CachedRangedDataSource : public DataSourceHelper { + explicit CachedRangedDataSource(DataSourceHelper *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(); @@ -212,7 +212,7 @@ struct CachedRangedDataSource : public DataSourceBase { private: Mutex mLock; - DataSourceBase *mSource; + DataSourceHelper *mSource; bool mOwnsDataSource; off64_t mCachedOffset; size_t mCachedSize; @@ -224,8 +224,9 @@ private: CachedRangedDataSource &operator=(const CachedRangedDataSource &); }; -CachedRangedDataSource::CachedRangedDataSource(DataSourceBase *source) - : mSource(source), +CachedRangedDataSource::CachedRangedDataSource(DataSourceHelper *source) + : DataSourceHelper(source), + mSource(source), mOwnsDataSource(false), mCachedOffset(0), mCachedSize(0), @@ -249,10 +250,6 @@ void CachedRangedDataSource::clearCache() { mCachedSize = 0; } -status_t CachedRangedDataSource::initCheck() const { - return mSource->initCheck(); -} - ssize_t CachedRangedDataSource::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); @@ -364,11 +361,11 @@ static bool AdjustChannelsAndRate(uint32_t fourcc, uint32_t *channels, uint32_t return false; } -MPEG4Extractor::MPEG4Extractor(DataSourceBase *source, const char *mime) +MPEG4Extractor::MPEG4Extractor(DataSourceHelper *source, const char *mime) : mMoofOffset(0), mMoofFound(false), mMdatFound(false), - mDataSource(source), + mDataSource(new DataSourceHelper(source)), mCachedSource(NULL), mInitCheck(NO_INIT), mHeaderTimescale(0), @@ -397,6 +394,7 @@ MPEG4Extractor::~MPEG4Extractor() { mPssh.clear(); delete mCachedSource; + delete mDataSource; } uint32_t MPEG4Extractor::flags() const { @@ -4093,7 +4091,7 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio( MPEG4Source::MPEG4Source( MetaDataBase &format, - DataSourceBase *dataSource, + DataSourceHelper *dataSource, int32_t timeScale, const sp &sampleTable, Vector &sidx, @@ -5772,7 +5770,7 @@ MPEG4Extractor::Track *MPEG4Extractor::findTrackByMimePrefix( return NULL; } -static bool LegacySniffMPEG4(DataSourceBase *source, float *confidence) { +static bool LegacySniffMPEG4(DataSourceHelper *source, float *confidence) { uint8_t header[8]; ssize_t n = source->readAt(4, header, sizeof(header)); @@ -5837,7 +5835,7 @@ static bool isCompatibleBrand(uint32_t fourcc) { // Also try to identify where this file's metadata ends // (end of the 'moov' atom) and report it to the caller as part of // the metadata. -static bool BetterSniffMPEG4(DataSourceBase *source, float *confidence) { +static bool BetterSniffMPEG4(DataSourceHelper *source, float *confidence) { // We scan up to 128 bytes to identify this file as an MP4. static const off64_t kMaxScanOffset = 128ll; @@ -5944,18 +5942,19 @@ static bool BetterSniffMPEG4(DataSourceBase *source, float *confidence) { return true; } -static CMediaExtractor* CreateExtractor(DataSourceBase *source, void *) { - return wrap(new MPEG4Extractor(source)); +static CMediaExtractor* CreateExtractor(CDataSource *source, void *) { + return wrap(new MPEG4Extractor(new DataSourceHelper(source))); } static CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) { - if (BetterSniffMPEG4(source, confidence)) { + DataSourceHelper helper(source); + if (BetterSniffMPEG4(&helper, confidence)) { return CreateExtractor; } - if (LegacySniffMPEG4(source, confidence)) { + if (LegacySniffMPEG4(&helper, confidence)) { ALOGW("Identified supported mpeg4 through LegacySniffMPEG4."); return CreateExtractor; } diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index 561b567421..ca273e082c 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -20,7 +20,6 @@ #include -#include #include #include #include @@ -32,7 +31,8 @@ namespace android { struct AMessage; -class DataSourceBase; +struct CDataSource; +class DataSourceHelper; struct CachedRangedDataSource; class SampleTable; class String8; @@ -56,7 +56,7 @@ struct Trex { class MPEG4Extractor : public MediaExtractorPluginHelper { public: - explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL); + explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -98,7 +98,7 @@ private: Vector mTrex; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; CachedRangedDataSource *mCachedSource; status_t mInitCheck; uint32_t mHeaderTimescale; @@ -150,10 +150,6 @@ private: MPEG4Extractor &operator=(const MPEG4Extractor &); }; -bool SniffMPEG4( - DataSourceBase *source, String8 *mimeType, float *confidence, - sp *); - } // namespace android #endif // MPEG4_EXTRACTOR_H_ diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp index 28fe7177c3..d242798c73 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(DataSourceBase *source) +SampleTable::SampleTable(DataSourceHelper *source) : mDataSource(source), mChunkOffsetOffset(-1), mChunkOffsetType(0), diff --git a/media/extractors/mp4/SampleTable.h b/media/extractors/mp4/SampleTable.h index dd688601b4..d4b5dc84c1 100644 --- a/media/extractors/mp4/SampleTable.h +++ b/media/extractors/mp4/SampleTable.h @@ -21,18 +21,19 @@ #include #include +#include #include #include #include namespace android { -class DataSourceBase; +class DataSourceHelper; struct SampleIterator; class SampleTable : public RefBase { public: - explicit SampleTable(DataSourceBase *source); + explicit SampleTable(DataSourceHelper *source); bool isValid() const; @@ -102,7 +103,7 @@ private: // Limit the total size of all internal tables to 200MiB. static const size_t kMaxTotalSize = 200 * (1 << 20); - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; Mutex mLock; off64_t mChunkOffsetOffset; diff --git a/media/extractors/mpeg2/ExtractorBundle.cpp b/media/extractors/mpeg2/ExtractorBundle.cpp index 3045aa9293..ff40ed4c18 100644 --- a/media/extractors/mpeg2/ExtractorBundle.cpp +++ b/media/extractors/mpeg2/ExtractorBundle.cpp @@ -19,11 +19,14 @@ #include #include +#include #include "MPEG2PSExtractor.h" #include "MPEG2TSExtractor.h" namespace android { +struct CDataSource; + extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) @@ -34,20 +37,21 @@ ExtractorDef GETEXTRACTORDEF() { 1, "MPEG2-PS/TS Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) -> CreatorFunc { - if (SniffMPEG2TS(source, confidence)) { + DataSourceHelper helper(source); + if (SniffMPEG2TS(&helper, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { - return wrap(new MPEG2TSExtractor(source));}; - } else if (SniffMPEG2PS(source, confidence)) { + return wrap(new MPEG2TSExtractor(new DataSourceHelper(source)));}; + } else if (SniffMPEG2PS(&helper, confidence)) { return []( - DataSourceBase *source, + CDataSource *source, void *) -> CMediaExtractor* { - return wrap(new MPEG2PSExtractor(source));}; + return wrap(new MPEG2PSExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp index 6980b82185..ae1e6ba73c 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp @@ -94,7 +94,7 @@ private: //////////////////////////////////////////////////////////////////////////////// -MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source) +MPEG2PSExtractor::MPEG2PSExtractor(DataSourceHelper *source) : mDataSource(source), mOffset(0), mFinalResult(OK), @@ -120,6 +120,7 @@ MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source) } MPEG2PSExtractor::~MPEG2PSExtractor() { + delete mDataSource; } size_t MPEG2PSExtractor::countTracks() { @@ -754,7 +755,7 @@ status_t MPEG2PSExtractor::WrappedTrack::read( //////////////////////////////////////////////////////////////////////////////// bool SniffMPEG2PS( - DataSourceBase *source, float *confidence) { + DataSourceHelper *source, float *confidence) { uint8_t header[5]; if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { return false; diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.h b/media/extractors/mpeg2/MPEG2PSExtractor.h index 93827faa4b..7689910022 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.h +++ b/media/extractors/mpeg2/MPEG2PSExtractor.h @@ -33,7 +33,7 @@ struct Track; class String8; struct MPEG2PSExtractor : public MediaExtractorPluginHelper { - explicit MPEG2PSExtractor(DataSourceBase *source); + explicit MPEG2PSExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -52,7 +52,7 @@ private: struct WrappedTrack; mutable Mutex mLock; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; off64_t mOffset; status_t mFinalResult; @@ -73,7 +73,7 @@ private: DISALLOW_EVIL_CONSTRUCTORS(MPEG2PSExtractor); }; -bool SniffMPEG2PS(DataSourceBase *source, float *confidence); +bool SniffMPEG2PS(DataSourceHelper *source, float *confidence); } // namespace android diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp index c83f7ce65c..cbe85564c4 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp @@ -123,7 +123,7 @@ status_t MPEG2TSSource::read( //////////////////////////////////////////////////////////////////////////////// -MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source) +MPEG2TSExtractor::MPEG2TSExtractor(DataSourceHelper *source) : mDataSource(source), mParser(new ATSParser), mLastSyncEvent(0), @@ -131,6 +131,10 @@ MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source) init(); } +MPEG2TSExtractor::~MPEG2TSExtractor() { + delete mDataSource; +} + size_t MPEG2TSExtractor::countTracks() { return mSourceImpls.size(); } @@ -652,7 +656,7 @@ status_t MPEG2TSExtractor::feedUntilBufferAvailable( //////////////////////////////////////////////////////////////////////////////// -bool SniffMPEG2TS(DataSourceBase *source, float *confidence) { +bool SniffMPEG2TS(DataSourceHelper *source, float *confidence) { for (int i = 0; i < 5; ++i) { char header; if (source->readAt(kTSPacketSize * i, &header, 1) != 1 diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h index 05e57c50de..cdaede326c 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.h +++ b/media/extractors/mpeg2/MPEG2TSExtractor.h @@ -35,12 +35,12 @@ namespace android { struct AMessage; struct AnotherPacketSource; struct ATSParser; -class DataSourceBase; +struct CDataSource; struct MPEG2TSSource; class String8; struct MPEG2TSExtractor : public MediaExtractorPluginHelper { - explicit MPEG2TSExtractor(DataSourceBase *source); + explicit MPEG2TSExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -53,12 +53,15 @@ struct MPEG2TSExtractor : public MediaExtractorPluginHelper { virtual uint32_t flags() const; virtual const char * name() { return "MPEG2TSExtractor"; } +protected: + virtual ~MPEG2TSExtractor(); + private: friend struct MPEG2TSSource; mutable Mutex mLock; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; sp mParser; @@ -82,9 +85,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 DataSourceBase to + // This function returns OK if expected amount of data is fed from DataSourceHelper to // parser and is successfully parsed. Otherwise, various error codes could be - // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceBase, or + // returned, e.g., ERROR_END_OF_STREAM, or no data availalbe from DataSourceHelper, or // the data has syntax error during parsing, etc. status_t feedMore(bool isInit = false); status_t seek(int64_t seekTimeUs, @@ -102,7 +105,7 @@ private: DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSExtractor); }; -bool SniffMPEG2TS(DataSourceBase *source, float *confidence); +bool SniffMPEG2TS(DataSourceHelper *source, float *confidence); } // namespace android diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp index efacfb3d5d..d46ace4932 100644 --- a/media/extractors/ogg/OggExtractor.cpp +++ b/media/extractors/ogg/OggExtractor.cpp @@ -71,7 +71,7 @@ private: struct MyOggExtractor { MyOggExtractor( - DataSourceBase *source, + DataSourceHelper *source, const char *mimeType, size_t numHeaders, int64_t seekPreRollUs); @@ -110,7 +110,7 @@ protected: int64_t mTimeUs; }; - DataSourceBase *mSource; + DataSourceHelper *mSource; off64_t mOffset; Page mCurrentPage; uint64_t mCurGranulePosition; @@ -169,7 +169,7 @@ protected: }; struct MyVorbisExtractor : public MyOggExtractor { - explicit MyVorbisExtractor(DataSourceBase *source) + explicit MyVorbisExtractor(DataSourceHelper *source) : MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_VORBIS, /* numHeaders */ 3, @@ -197,7 +197,7 @@ struct MyOpusExtractor : public MyOggExtractor { static const int32_t kOpusSampleRate = 48000; static const int64_t kOpusSeekPreRollUs = 80000; // 80 ms - explicit MyOpusExtractor(DataSourceBase *source) + explicit MyOpusExtractor(DataSourceHelper *source) : MyOggExtractor(source, MEDIA_MIMETYPE_AUDIO_OPUS, /*numHeaders*/ 2, kOpusSeekPreRollUs), mChannelCount(0), mCodecDelay(0), @@ -296,7 +296,7 @@ status_t OggSource::read( //////////////////////////////////////////////////////////////////////////////// MyOggExtractor::MyOggExtractor( - DataSourceBase *source, + DataSourceHelper *source, const char *mimeType, size_t numHeaders, int64_t seekPreRollUs) @@ -1193,7 +1193,7 @@ void MyOggExtractor::parseFileMetaData() { //////////////////////////////////////////////////////////////////////////////// -OggExtractor::OggExtractor(DataSourceBase *source) +OggExtractor::OggExtractor(DataSourceHelper *source) : mDataSource(source), mInitCheck(NO_INIT), mImpl(NULL) { @@ -1249,18 +1249,19 @@ status_t OggExtractor::getMetaData(MetaDataBase &meta) { } static CMediaExtractor* CreateExtractor( - DataSourceBase *source, + CDataSource *source, void *) { - return wrap(new OggExtractor(source)); + return wrap(new OggExtractor(new DataSourceHelper(source))); } static CreatorFunc Sniff( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) { + DataSourceHelper helper(source); char tmp[4]; - if (source->readAt(0, tmp, 4) < 4 || memcmp(tmp, "OggS", 4)) { + if (helper.readAt(0, tmp, 4) < 4 || memcmp(tmp, "OggS", 4)) { return NULL; } diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h index 94f857a08d..fbd466362d 100644 --- a/media/extractors/ogg/OggExtractor.h +++ b/media/extractors/ogg/OggExtractor.h @@ -25,14 +25,13 @@ namespace android { struct AMessage; -class DataSourceBase; class String8; struct MyOggExtractor; struct OggSource; struct OggExtractor : public MediaExtractorPluginHelper { - explicit OggExtractor(DataSourceBase *source); + explicit OggExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -47,7 +46,7 @@ protected: private: friend struct OggSource; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; status_t mInitCheck; MyOggExtractor *mImpl; diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp index 903de524ae..80dc9c8ce5 100644 --- a/media/extractors/wav/WAVExtractor.cpp +++ b/media/extractors/wav/WAVExtractor.cpp @@ -57,7 +57,7 @@ static uint16_t U16_LE_AT(const uint8_t *ptr) { struct WAVSource : public MediaTrack { WAVSource( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, MetaDataBase &meta, uint16_t waveFormat, int32_t bitsPerSample, @@ -78,7 +78,7 @@ protected: private: static const size_t kMaxFrameSize; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase &mMeta; uint16_t mWaveFormat; int32_t mSampleRate; @@ -94,7 +94,7 @@ private: WAVSource &operator=(const WAVSource &); }; -WAVExtractor::WAVExtractor(DataSourceBase *source) +WAVExtractor::WAVExtractor(DataSourceHelper *source) : mDataSource(source), mValidFormat(false), mChannelMask(CHANNEL_MASK_USE_CHANNEL_ORDER) { @@ -102,6 +102,7 @@ WAVExtractor::WAVExtractor(DataSourceBase *source) } WAVExtractor::~WAVExtractor() { + delete mDataSource; } status_t WAVExtractor::getMetaData(MetaDataBase &meta) { @@ -347,7 +348,7 @@ status_t WAVExtractor::init() { const size_t WAVSource::kMaxFrameSize = 32768; WAVSource::WAVSource( - DataSourceBase *dataSource, + DataSourceHelper *dataSource, MetaDataBase &meta, uint16_t waveFormat, int32_t bitsPerSample, @@ -545,33 +546,38 @@ status_t WAVSource::read( //////////////////////////////////////////////////////////////////////////////// static CMediaExtractor* CreateExtractor( - DataSourceBase *source, + CDataSource *source, void *) { - return wrap(new WAVExtractor(source)); + return wrap(new WAVExtractor(new DataSourceHelper(source))); } static CreatorFunc Sniff( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, FreeMetaFunc *) { + DataSourceHelper *helper = new DataSourceHelper(source); char header[12]; - if (source->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { + if (helper->readAt(0, header, sizeof(header)) < (ssize_t)sizeof(header)) { + delete helper; return NULL; } if (memcmp(header, "RIFF", 4) || memcmp(&header[8], "WAVE", 4)) { + delete helper; return NULL; } - WAVExtractor *extractor = new WAVExtractor(source); + WAVExtractor *extractor = new WAVExtractor(helper); int numTracks = extractor->countTracks(); delete extractor; if (numTracks == 0) { + delete helper; return NULL; } *confidence = 0.3f; + delete helper; return CreateExtractor; } diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h index 519a730e10..5136aa8684 100644 --- a/media/extractors/wav/WAVExtractor.h +++ b/media/extractors/wav/WAVExtractor.h @@ -26,12 +26,12 @@ namespace android { struct AMessage; -class DataSourceBase; +struct CDataSource; class String8; class WAVExtractor : public MediaExtractorPluginHelper { public: - explicit WAVExtractor(DataSourceBase *source); + explicit WAVExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -43,7 +43,7 @@ public: virtual ~WAVExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; status_t mInitCheck; bool mValidFormat; uint16_t mWaveFormat; diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp index 5ca3b48373..1150d61c77 100644 --- a/media/libmedia/MidiIoWrapper.cpp +++ b/media/libmedia/MidiIoWrapper.cpp @@ -23,6 +23,7 @@ #include #include +#include static int readAt(void *handle, void *buffer, int pos, int size) { return ((android::MidiIoWrapper*)handle)->readAt(buffer, pos, size); @@ -61,6 +62,51 @@ MidiIoWrapper::MidiIoWrapper(DataSourceBase *source) { } } +class DataSourceUnwrapper : public DataSourceBase { + +public: + explicit DataSourceUnwrapper(CDataSource *csource) { + mSource = csource; + } + virtual status_t initCheck() const { return OK; } + + // 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) { + return mSource->readAt(mSource->handle, offset, data, size); + } + + // May return ERROR_UNSUPPORTED. + virtual status_t getSize(off64_t *size) { + return mSource->getSize(mSource->handle, size); + } + + virtual bool getUri(char * /*uriString*/, size_t /*bufferSize*/) { + return false; + } + + virtual uint32_t flags() { + return 0; + } + + virtual void close() {}; +private: + CDataSource *mSource; +}; + +MidiIoWrapper::MidiIoWrapper(CDataSource *csource) { + ALOGV("MidiIoWrapper(CDataSource)"); + mFd = -1; + mDataSource = new DataSourceUnwrapper(csource); + off64_t l; + if (mDataSource->getSize(&l) == OK) { + mLength = l; + } else { + mLength = 0; + } +} + MidiIoWrapper::~MidiIoWrapper() { ALOGV("~MidiIoWrapper"); if (mFd >= 0) { diff --git a/media/libmedia/include/media/MidiIoWrapper.h b/media/libmedia/include/media/MidiIoWrapper.h index b5e565ef60..6309dda53b 100644 --- a/media/libmedia/include/media/MidiIoWrapper.h +++ b/media/libmedia/include/media/MidiIoWrapper.h @@ -23,11 +23,14 @@ namespace android { +struct CDataSource; + class MidiIoWrapper { public: explicit MidiIoWrapper(const char *path); explicit MidiIoWrapper(int fd, off64_t offset, int64_t size); explicit MidiIoWrapper(DataSourceBase *source); + explicit MidiIoWrapper(CDataSource *csource); ~MidiIoWrapper(); diff --git a/media/libmediaextractor/include/media/DataSource.h b/media/libmediaextractor/include/media/DataSource.h index 0e59f39e42..cb96ff5d4c 100644 --- a/media/libmediaextractor/include/media/DataSource.h +++ b/media/libmediaextractor/include/media/DataSource.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -34,7 +35,7 @@ class String8; class DataSource : public DataSourceBase, public virtual RefBase { public: - DataSource() {} + DataSource() : mWrapper(NULL) {} // returns a pointer to IDataSource if it is wrapped. virtual sp getIDataSource() const { @@ -69,10 +70,35 @@ public: return String8("application/octet-stream"); } + CDataSource *wrap() { + if (mWrapper) { + return mWrapper; + } + mWrapper = new CDataSource(); + mWrapper->handle = this; + + mWrapper->readAt = [](void *handle, off64_t offset, void *data, size_t size) -> ssize_t { + return ((DataSource*)handle)->readAt(offset, data, size); + }; + mWrapper->getSize = [](void *handle, off64_t *size) -> status_t { + return ((DataSource*)handle)->getSize(size); + }; + mWrapper->flags = [](void *handle) -> uint32_t { + return ((DataSource*)handle)->flags(); + }; + mWrapper->getUri = [](void *handle, char *uriString, size_t bufferSize) -> bool { + return ((DataSource*)handle)->getUri(uriString, bufferSize); + }; + return mWrapper; + } + protected: - virtual ~DataSource() {} + virtual ~DataSource() { + delete mWrapper; + } private: + CDataSource *mWrapper; DataSource(const DataSource &); DataSource &operator=(const DataSource &); }; diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp index dd98fc0a41..6e361497e8 100644 --- a/media/libstagefright/MediaExtractorFactory.cpp +++ b/media/libstagefright/MediaExtractorFactory.cpp @@ -78,13 +78,13 @@ sp MediaExtractorFactory::CreateFromService( FreeMetaFunc freeMeta = nullptr; float confidence; sp plugin; - creator = sniff(source.get(), &confidence, &meta, &freeMeta, plugin); + creator = sniff(source, &confidence, &meta, &freeMeta, plugin); if (!creator) { ALOGV("FAILED to autodetect media content."); return NULL; } - CMediaExtractor *ret = creator(source.get(), meta); + CMediaExtractor *ret = creator(source->wrap(), meta); if (meta != nullptr && freeMeta != nullptr) { freeMeta(meta); } @@ -129,7 +129,7 @@ bool MediaExtractorFactory::gPluginsRegistered = false; // static CreatorFunc MediaExtractorFactory::sniff( - DataSourceBase *source, float *confidence, void **meta, + const sp &source, float *confidence, void **meta, FreeMetaFunc *freeMeta, sp &plugin) { *confidence = 0.0f; *meta = nullptr; @@ -150,7 +150,7 @@ CreatorFunc MediaExtractorFactory::sniff( float newConfidence; void *newMeta = nullptr; FreeMetaFunc newFreeMeta = nullptr; - if ((curCreator = (*it)->def.sniff(source, &newConfidence, &newMeta, &newFreeMeta))) { + if ((curCreator = (*it)->def.sniff(source->wrap(), &newConfidence, &newMeta, &newFreeMeta))) { if (newConfidence > *confidence) { *confidence = newConfidence; if (*meta != nullptr && *freeMeta != nullptr) { diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index a0a62f4106..b489183a37 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -21,6 +21,8 @@ #include "../include/ID3.h" #include +#include +#include #include #include #include @@ -56,6 +58,55 @@ private: DISALLOW_EVIL_CONSTRUCTORS(MemorySource); }; +class DataSourceUnwrapper : public DataSourceBase { + +public: + explicit DataSourceUnwrapper(DataSourceHelper *sourcehelper) { + mSource = sourcehelper; + } + virtual status_t initCheck() const { return OK; } + + // 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) { + return mSource->readAt(offset, data, size); + } + + // May return ERROR_UNSUPPORTED. + virtual status_t getSize(off64_t *size) { + return mSource->getSize(size); + } + + virtual bool getUri(char * /*uriString*/, size_t /*bufferSize*/) { + return false; + } + + virtual uint32_t flags() { + return 0; + } + + virtual void close() {}; +private: + DataSourceHelper *mSource; +}; + + +ID3::ID3(DataSourceHelper *sourcehelper, bool ignoreV1, off64_t offset) + : mIsValid(false), + mData(NULL), + mSize(0), + mFirstFrameOffset(0), + mVersion(ID3_UNKNOWN), + mRawSize(0) { + DataSourceUnwrapper source(sourcehelper); + mIsValid = parseV2(&source, offset); + + if (!mIsValid && !ignoreV1) { + mIsValid = parseV1(&source); + } +} + ID3::ID3(DataSourceBase *source, bool ignoreV1, off64_t offset) : mIsValid(false), mData(NULL), diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h index 7c2391e1f1..5e433ea699 100644 --- a/media/libstagefright/include/ID3.h +++ b/media/libstagefright/include/ID3.h @@ -24,6 +24,7 @@ namespace android { class DataSourceBase; class String8; +class DataSourceHelper; struct ID3 { enum Version { @@ -35,6 +36,7 @@ struct ID3 { ID3_V2_4, }; + explicit ID3(DataSourceHelper *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(); diff --git a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h index 3920cccef3..4ee55565e3 100644 --- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h +++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h @@ -49,7 +49,7 @@ private: static void RegisterExtractor( const sp &plugin, std::list> &pluginList); - static CreatorFunc sniff(DataSourceBase *source, + static CreatorFunc sniff(const sp &source, float *confidence, void **meta, FreeMetaFunc *freeMeta, sp &plugin);