diff --git a/include/media/MediaExtractorPluginApi.h b/include/media/MediaExtractorPluginApi.h new file mode 100644 index 0000000000..930b6e27e1 --- /dev/null +++ b/include/media/MediaExtractorPluginApi.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2018 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 MEDIA_EXTRACTOR_PLUGIN_API_H_ +#define MEDIA_EXTRACTOR_PLUGIN_API_H_ + +#include // for status_t + +namespace android { + +struct MediaTrack; +class MetaDataBase; + +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; + + void (*free)(void *data); + size_t (*countTracks)(void *data); + MediaTrack* (*getTrack)(void *data, size_t index); + status_t (*getTrackMetaData)( + void *data, + MetaDataBase& meta, + size_t index, uint32_t flags); + + status_t (*getMetaData)(void *data, MetaDataBase& meta); + uint32_t (*flags)(void *data); + status_t (*setMediaCas)(void *data, const uint8_t* casToken, size_t size); + const char * (*name)(void *data); +}; + +typedef CMediaExtractor* (*CreatorFunc)(CDataSource *source, void *meta); +typedef void (*FreeMetaFunc)(void *meta); + +// The sniffer can optionally fill in an opaque object, "meta", that helps +// the corresponding extractor initialize its state without duplicating +// 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)( + CDataSource *source, float *confidence, + void **meta, FreeMetaFunc *freeMeta); + +typedef struct { + const uint8_t b[16]; +} media_uuid_t; + +typedef struct { + // version number of this structure + const uint32_t def_version; + + // A unique identifier for this extractor. + // See below for a convenience macro to create this from a string. + media_uuid_t extractor_uuid; + + // Version number of this extractor. When two extractors with the same + // uuid are encountered, the one with the largest version number will + // be used. + const uint32_t extractor_version; + + // a human readable name + const char *extractor_name; + + // the sniffer function + const SnifferFunc sniff; +} ExtractorDef; + +const uint32_t EXTRACTORDEF_VERSION = 1; + +// each plugin library exports one function of this type +typedef ExtractorDef (*GetExtractorDef)(); + +} // extern "C" + +} // namespace android + +#endif // MEDIA_EXTRACTOR_PLUGIN_API_H_ diff --git a/include/media/MediaExtractorPluginHelper.h b/include/media/MediaExtractorPluginHelper.h new file mode 100644 index 0000000000..c817b30764 --- /dev/null +++ b/include/media/MediaExtractorPluginHelper.h @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2018 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 MEDIA_EXTRACTOR_PLUGIN_HELPER_H_ + +#define MEDIA_EXTRACTOR_PLUGIN_HELPER_H_ + +#include +#include +#include + +#include +#include +#include +#include + +namespace android { + +class DataSourceBase; +class MetaDataBase; +struct MediaTrack; + +// extractor plugins can derive from this class which looks remarkably +// like MediaExtractor and can be easily wrapped in the required C API +class MediaExtractorPluginHelper +{ +public: + virtual ~MediaExtractorPluginHelper() {} + virtual size_t countTracks() = 0; + virtual MediaTrack *getTrack(size_t index) = 0; + + enum GetTrackMetaDataFlags { + kIncludeExtensiveMetaData = 1 + }; + virtual status_t getTrackMetaData( + MetaDataBase& meta, + size_t index, uint32_t flags = 0) = 0; + + // Return container specific meta-data. The default implementation + // returns an empty metadata object. + virtual status_t getMetaData(MetaDataBase& meta) = 0; + + enum Flags { + CAN_SEEK_BACKWARD = 1, // the "seek 10secs back button" + CAN_SEEK_FORWARD = 2, // the "seek 10secs forward button" + CAN_PAUSE = 4, + CAN_SEEK = 8, // the "seek bar" + }; + + // If subclasses do _not_ override this, the default is + // CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_SEEK | CAN_PAUSE + virtual uint32_t flags() const { + return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_SEEK | CAN_PAUSE; + }; + + virtual status_t setMediaCas(const uint8_t* /*casToken*/, size_t /*size*/) { + return INVALID_OPERATION; + } + + virtual const char * name() { return ""; } + +protected: + MediaExtractorPluginHelper() {} + +private: + MediaExtractorPluginHelper(const MediaExtractorPluginHelper &); + MediaExtractorPluginHelper &operator=(const MediaExtractorPluginHelper &); +}; + +inline CMediaExtractor *wrap(MediaExtractorPluginHelper *extractor) { + CMediaExtractor *wrapper = (CMediaExtractor*) malloc(sizeof(CMediaExtractor)); + wrapper->data = extractor; + wrapper->free = [](void *data) -> void { + delete (MediaExtractorPluginHelper*)(data); + }; + wrapper->countTracks = [](void *data) -> size_t { + return ((MediaExtractorPluginHelper*)data)->countTracks(); + }; + wrapper->getTrack = [](void *data, size_t index) -> MediaTrack* { + return ((MediaExtractorPluginHelper*)data)->getTrack(index); + }; + wrapper->getTrackMetaData = []( + void *data, + MetaDataBase& meta, + size_t index, uint32_t flags) -> status_t { + return ((MediaExtractorPluginHelper*)data)->getTrackMetaData(meta, index, flags); + }; + wrapper->getMetaData = []( + void *data, + MetaDataBase& meta) -> status_t { + return ((MediaExtractorPluginHelper*)data)->getMetaData(meta); + }; + wrapper->flags = []( + void *data) -> uint32_t { + return ((MediaExtractorPluginHelper*)data)->flags(); + }; + wrapper->setMediaCas = []( + void *data, const uint8_t *casToken, size_t size) -> status_t { + return ((MediaExtractorPluginHelper*)data)->setMediaCas(casToken, size); + }; + wrapper->name = []( + void *data) -> const char * { + return ((MediaExtractorPluginHelper*)data)->name(); + }; + 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 +// expressions below are not evaluated at compile time +int invalid_uuid_string(const char *); + +template +constexpr uint8_t _digitAt_(const T (&s)[N], const size_t n) { + return s[n] >= '0' && s[n] <= '9' ? s[n] - '0' + : s[n] >= 'a' && s[n] <= 'f' ? s[n] - 'a' + 10 + : s[n] >= 'A' && s[n] <= 'F' ? s[n] - 'A' + 10 + : invalid_uuid_string("uuid: bad digits"); +} + +template +constexpr uint8_t _hexByteAt_(const T (&s)[N], size_t n) { + return (_digitAt_(s, n) << 4) + _digitAt_(s, n + 1); +} + +constexpr bool _assertIsDash_(char c) { + return c == '-' ? true : invalid_uuid_string("Wrong format"); +} + +template +constexpr media_uuid_t constUUID(const char (&s) [N]) { + static_assert(N == 37, "uuid: wrong length"); + return + _assertIsDash_(s[8]), + _assertIsDash_(s[13]), + _assertIsDash_(s[18]), + _assertIsDash_(s[23]), + media_uuid_t {{ + _hexByteAt_(s, 0), + _hexByteAt_(s, 2), + _hexByteAt_(s, 4), + _hexByteAt_(s, 6), + _hexByteAt_(s, 9), + _hexByteAt_(s, 11), + _hexByteAt_(s, 14), + _hexByteAt_(s, 16), + _hexByteAt_(s, 19), + _hexByteAt_(s, 21), + _hexByteAt_(s, 24), + _hexByteAt_(s, 26), + _hexByteAt_(s, 28), + _hexByteAt_(s, 30), + _hexByteAt_(s, 32), + _hexByteAt_(s, 34), + }}; +} +// Convenience macro to create a media_uuid_t from a string literal, which should +// be formatted as "12345678-1234-1234-1234-123456789abc", as generated by +// e.g. https://www.uuidgenerator.net/ or the 'uuidgen' linux command. +// Hex digits may be upper or lower case. +// +// The macro call is otherwise equivalent to specifying the structure directly +// (e.g. UUID("7d613858-5837-4a38-84c5-332d1cddee27") is the same as +// {{0x7d, 0x61, 0x38, 0x58, 0x58, 0x37, 0x4a, 0x38, +// 0x84, 0xc5, 0x33, 0x2d, 0x1c, 0xdd, 0xee, 0x27}}) + +#define UUID(str) []{ constexpr media_uuid_t uuid = constUUID(str); return uuid; }() + +} // namespace android + +#endif // MEDIA_EXTRACTOR_PLUGIN_HELPER_H_ diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp index 9fc5a76462..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) @@ -323,21 +323,22 @@ status_t AACSource::read( //////////////////////////////////////////////////////////////////////////////// -static MediaExtractor* CreateExtractor( - DataSourceBase *source, +static CMediaExtractor* CreateExtractor( + CDataSource *source, void *meta) { off64_t offset = *static_cast(meta); - return new AACExtractor(source, offset); + return wrap(new AACExtractor(new DataSourceHelper(source), offset)); } -static MediaExtractor::CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **meta, - MediaExtractor::FreeMetaFunc *freeMeta) { +static CreatorFunc Sniff( + 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 MediaExtractor::CreatorFunc Sniff( uint8_t header[2]; - if (source->readAt(pos, &header, 2) != 2) { + if (helper.readAt(pos, &header, 2) != 2) { return NULL; } @@ -387,9 +388,9 @@ static MediaExtractor::CreatorFunc Sniff( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("4fd80eae-03d2-4d72-9eb9-48fa6bb54613"), 1, // version "AAC Extractor", diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h index 9dadbed2ec..3f2046131b 100644 --- a/media/extractors/aac/AACExtractor.h +++ b/media/extractors/aac/AACExtractor.h @@ -18,7 +18,8 @@ #define AAC_EXTRACTOR_H_ -#include +#include +#include #include #include @@ -28,9 +29,9 @@ namespace android { struct AMessage; class String8; -class AACExtractor : public MediaExtractor { +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); @@ -43,7 +44,7 @@ protected: virtual ~AACExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; MetaDataBase mMeta; status_t mInitCheck; @@ -55,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 f56d5ef656..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), @@ -365,22 +365,23 @@ status_t AMRSource::read( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("c86639c9-2f31-40ac-a715-fa01b4493aaf"), 1, "AMR Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc { - if (SniffAMR(source, nullptr, confidence)) { + FreeMetaFunc *) -> CreatorFunc { + DataSourceHelper helper(source); + if (SniffAMR(&helper, nullptr, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new AMRExtractor(source);}; + CDataSource *source, + void *) -> CMediaExtractor* { + return wrap(new AMRExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h index c90b32510e..499ca67da3 100644 --- a/media/extractors/amr/AMRExtractor.h +++ b/media/extractors/amr/AMRExtractor.h @@ -19,7 +19,8 @@ #define AMR_EXTRACTOR_H_ #include -#include +#include +#include #include namespace android { @@ -28,9 +29,9 @@ struct AMessage; class String8; #define OFFSET_TABLE_LEN 300 -class AMRExtractor : public MediaExtractor { +class AMRExtractor : public MediaExtractorPluginHelper { public: - explicit AMRExtractor(DataSourceBase *source); + explicit AMRExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -43,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 a721b6530d..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 @@ -859,22 +860,23 @@ bool SniffFLAC(DataSourceBase *source, float *confidence) extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("1364b048-cc45-4fda-9934-327d0ebf9829"), 1, "FLAC Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc { - if (SniffFLAC(source, confidence)) { + FreeMetaFunc *) -> CreatorFunc { + DataSourceHelper helper(source); + if (SniffFLAC(&helper, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new FLACExtractor(source);}; + CDataSource *source, + void *) -> CMediaExtractor* { + return wrap(new FLACExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h index 7fb6ec612d..1ddff436da 100644 --- a/media/extractors/flac/FLACExtractor.h +++ b/media/extractors/flac/FLACExtractor.h @@ -18,7 +18,8 @@ #define FLAC_EXTRACTOR_H_ #include -#include +#include +#include #include #include @@ -26,10 +27,10 @@ namespace android { class FLACParser; -class FLACExtractor : public MediaExtractor { +class FLACExtractor : public MediaExtractorPluginHelper { public: - explicit FLACExtractor(DataSourceBase *source); + explicit FLACExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -42,7 +43,7 @@ protected: virtual ~FLACExtractor(); private: - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; FLACParser *mParser; status_t mInitCheck; MetaDataBase mFileMetadata; @@ -55,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 a30b6f8109..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) { @@ -326,22 +326,22 @@ bool SniffMidi(DataSourceBase *source, float *confidence) extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("ef6cca0a-f8a2-43e6-ba5f-dfcd7c9a7ef2"), 1, "MIDI Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc { + FreeMetaFunc *) -> CreatorFunc { if (SniffMidi(source, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new MidiExtractor(source);}; + CDataSource *source, + void *) -> CMediaExtractor* { + return wrap(new MidiExtractor(source));}; } return NULL; } diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h index 244dd0f8ad..fbbe93ed5c 100644 --- a/media/extractors/midi/MidiExtractor.h +++ b/media/extractors/midi/MidiExtractor.h @@ -18,7 +18,8 @@ #define MIDI_EXTRACTOR_H_ #include -#include +#include +#include #include #include #include @@ -30,7 +31,7 @@ namespace android { class MidiEngine { public: - explicit MidiEngine(DataSourceBase *dataSource, + explicit MidiEngine(CDataSource *dataSource, MetaDataBase *fileMetadata, MetaDataBase *trackMetadata); ~MidiEngine(); @@ -50,10 +51,10 @@ private: bool mIsInitialized; }; -class MidiExtractor : public MediaExtractor { +class MidiExtractor : public MediaExtractorPluginHelper { public: - explicit MidiExtractor(DataSourceBase *source); + explicit MidiExtractor(CDataSource *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -66,7 +67,7 @@ protected: virtual ~MidiExtractor(); private: - DataSourceBase *mDataSource; + CDataSource *mDataSource; status_t mInitCheck; MetaDataBase mFileMetadata; @@ -88,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 d6575822c7..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; @@ -1638,22 +1640,23 @@ bool SniffMatroska( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("abbedd92-38c4-4904-a4c1-b3f45f899980"), 1, "Matroska Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc { - if (SniffMatroska(source, confidence)) { + FreeMetaFunc *) -> CreatorFunc { + DataSourceHelper helper(source); + if (SniffMatroska(&helper, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new MatroskaExtractor(source);}; + CDataSource *source, + void *) -> CMediaExtractor* { + return wrap(new MatroskaExtractor(new DataSourceHelper(source)));}; } return NULL; } diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h index 3568ea19e8..2c6ca850b2 100644 --- a/media/extractors/mkv/MatroskaExtractor.h +++ b/media/extractors/mkv/MatroskaExtractor.h @@ -20,7 +20,8 @@ #include "mkvparser/mkvparser.h" -#include +#include +#include #include #include #include @@ -34,8 +35,8 @@ class MetaData; struct DataSourceBaseReader; struct MatroskaSource; -struct MatroskaExtractor : public MediaExtractor { - explicit MatroskaExtractor(DataSourceBase *source); +struct MatroskaExtractor : public MediaExtractorPluginHelper { + explicit MatroskaExtractor(DataSourceHelper *source); virtual size_t countTracks(); @@ -76,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 33cff96cd3..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; @@ -669,21 +671,22 @@ status_t MP3Extractor::getMetaData(MetaDataBase &meta) { return OK; } -static MediaExtractor* CreateExtractor( - DataSourceBase *source, +static CMediaExtractor* CreateExtractor( + CDataSource *source, void *meta) { Mp3Meta *metaData = static_cast(meta); - return new MP3Extractor(source, metaData); + return wrap(new MP3Extractor(new DataSourceHelper(source), metaData)); } -static MediaExtractor::CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **meta, - MediaExtractor::FreeMetaFunc *freeMeta) { +static CreatorFunc Sniff( + 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 MediaExtractor::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; } @@ -710,9 +713,9 @@ static MediaExtractor::CreatorFunc Sniff( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("812a3f6c-c8cf-46de-b529-3774b14103d4"), 1, // version "MP3 Extractor", diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h index 485b0ca90b..585d9f6629 100644 --- a/media/extractors/mp3/MP3Extractor.h +++ b/media/extractors/mp3/MP3Extractor.h @@ -19,20 +19,22 @@ #define MP3_EXTRACTOR_H_ #include -#include +#include +#include #include namespace android { +class DataSourceHelper; + struct AMessage; -class DataSourceBase; struct MP3Seeker; class String8; struct Mp3Meta; -class MP3Extractor : public MediaExtractor { +class MP3Extractor : public MediaExtractorPluginHelper { public: - MP3Extractor(DataSourceBase *source, Mp3Meta *meta); + MP3Extractor(DataSourceHelper *source, Mp3Meta *meta); ~MP3Extractor(); virtual size_t countTracks(); @@ -45,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 251a4cde2b..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 MediaExtractor* CreateExtractor(DataSourceBase *source, void *) { - return new MPEG4Extractor(source); +static CMediaExtractor* CreateExtractor(CDataSource *source, void *) { + return wrap(new MPEG4Extractor(new DataSourceHelper(source))); } -static MediaExtractor::CreatorFunc Sniff( - DataSourceBase *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) { - if (BetterSniffMPEG4(source, confidence)) { +static CreatorFunc Sniff( + CDataSource *source, float *confidence, void **, + FreeMetaFunc *) { + 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; } @@ -5966,9 +5965,9 @@ static MediaExtractor::CreatorFunc Sniff( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("27575c67-4417-4c54-8d3d-8e626985a164"), 1, // version "MP4 Extractor", diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index a4a5684f9c..ca273e082c 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -20,8 +20,8 @@ #include -#include -#include +#include +#include #include #include #include @@ -31,7 +31,8 @@ namespace android { struct AMessage; -class DataSourceBase; +struct CDataSource; +class DataSourceHelper; struct CachedRangedDataSource; class SampleTable; class String8; @@ -53,9 +54,9 @@ struct Trex { uint32_t default_sample_flags; }; -class MPEG4Extractor : public MediaExtractor { +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); @@ -97,7 +98,7 @@ private: Vector mTrex; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; CachedRangedDataSource *mCachedSource; status_t mInitCheck; uint32_t mHeaderTimescale; @@ -149,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 8a0fa0386c..ff40ed4c18 100644 --- a/media/extractors/mpeg2/ExtractorBundle.cpp +++ b/media/extractors/mpeg2/ExtractorBundle.cpp @@ -19,35 +19,39 @@ #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"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("3d1dcfeb-e40a-436d-a574-c2438a555e5f"), 1, "MPEG2-PS/TS Extractor", []( - DataSourceBase *source, + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) -> MediaExtractor::CreatorFunc { - if (SniffMPEG2TS(source, confidence)) { + FreeMetaFunc *) -> CreatorFunc { + DataSourceHelper helper(source); + if (SniffMPEG2TS(&helper, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new MPEG2TSExtractor(source);}; - } else if (SniffMPEG2PS(source, confidence)) { + CDataSource *source, + void *) -> CMediaExtractor* { + return wrap(new MPEG2TSExtractor(new DataSourceHelper(source)));}; + } else if (SniffMPEG2PS(&helper, confidence)) { return []( - DataSourceBase *source, - void *) -> MediaExtractor* { - return new MPEG2PSExtractor(source);}; + CDataSource *source, + void *) -> CMediaExtractor* { + 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 8b9dad9c06..7689910022 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.h +++ b/media/extractors/mpeg2/MPEG2PSExtractor.h @@ -19,7 +19,8 @@ #define MPEG2_PS_EXTRACTOR_H_ #include -#include +#include +#include #include #include #include @@ -31,8 +32,8 @@ struct AMessage; struct Track; class String8; -struct MPEG2PSExtractor : public MediaExtractor { - explicit MPEG2PSExtractor(DataSourceBase *source); +struct MPEG2PSExtractor : public MediaExtractorPluginHelper { + explicit MPEG2PSExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -51,7 +52,7 @@ private: struct WrappedTrack; mutable Mutex mLock; - DataSourceBase *mDataSource; + DataSourceHelper *mDataSource; off64_t mOffset; status_t mFinalResult; @@ -72,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 cbdd3cb847..cdaede326c 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.h +++ b/media/extractors/mpeg2/MPEG2TSExtractor.h @@ -20,7 +20,8 @@ #define MPEG2_TS_EXTRACTOR_H_ #include -#include +#include +#include #include #include #include @@ -34,12 +35,12 @@ namespace android { struct AMessage; struct AnotherPacketSource; struct ATSParser; -class DataSourceBase; +struct CDataSource; struct MPEG2TSSource; class String8; -struct MPEG2TSExtractor : public MediaExtractor { - explicit MPEG2TSExtractor(DataSourceBase *source); +struct MPEG2TSExtractor : public MediaExtractorPluginHelper { + explicit MPEG2TSExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -52,12 +53,15 @@ struct MPEG2TSExtractor : public MediaExtractor { 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; @@ -81,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, @@ -101,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 b2fe69cd07..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) { @@ -1248,19 +1248,20 @@ status_t OggExtractor::getMetaData(MetaDataBase &meta) { return mImpl->getFileMetaData(meta); } -static MediaExtractor* CreateExtractor( - DataSourceBase *source, +static CMediaExtractor* CreateExtractor( + CDataSource *source, void *) { - return new OggExtractor(source); + return wrap(new OggExtractor(new DataSourceHelper(source))); } -static MediaExtractor::CreatorFunc Sniff( - DataSourceBase *source, +static CreatorFunc Sniff( + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) { + 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; } @@ -1272,9 +1273,9 @@ static MediaExtractor::CreatorFunc Sniff( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("8cc5cd06-f772-495e-8a62-cba9649374e9"), 1, // version "Ogg Extractor", diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h index 9fe2944de7..fbd466362d 100644 --- a/media/extractors/ogg/OggExtractor.h +++ b/media/extractors/ogg/OggExtractor.h @@ -19,19 +19,19 @@ #define OGG_EXTRACTOR_H_ #include -#include +#include +#include namespace android { struct AMessage; -class DataSourceBase; class String8; struct MyOggExtractor; struct OggSource; -struct OggExtractor : public MediaExtractor { - explicit OggExtractor(DataSourceBase *source); +struct OggExtractor : public MediaExtractorPluginHelper { + explicit OggExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -46,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 f5a1b01669..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, @@ -544,34 +545,39 @@ status_t WAVSource::read( //////////////////////////////////////////////////////////////////////////////// -static MediaExtractor* CreateExtractor( - DataSourceBase *source, +static CMediaExtractor* CreateExtractor( + CDataSource *source, void *) { - return new WAVExtractor(source); + return wrap(new WAVExtractor(new DataSourceHelper(source))); } -static MediaExtractor::CreatorFunc Sniff( - DataSourceBase *source, +static CreatorFunc Sniff( + CDataSource *source, float *confidence, void **, - MediaExtractor::FreeMetaFunc *) { + 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; } - MediaExtractor *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; } @@ -579,9 +585,9 @@ static MediaExtractor::CreatorFunc Sniff( extern "C" { // This is the only symbol that needs to be exported __attribute__ ((visibility ("default"))) -MediaExtractor::ExtractorDef GETEXTRACTORDEF() { +ExtractorDef GETEXTRACTORDEF() { return { - MediaExtractor::EXTRACTORDEF_VERSION, + EXTRACTORDEF_VERSION, UUID("7d613858-5837-4a38-84c5-332d1cddee27"), 1, // version "WAV Extractor", diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h index 467d0b7d96..5136aa8684 100644 --- a/media/extractors/wav/WAVExtractor.h +++ b/media/extractors/wav/WAVExtractor.h @@ -19,18 +19,19 @@ #define WAV_EXTRACTOR_H_ #include -#include +#include +#include #include namespace android { struct AMessage; -class DataSourceBase; +struct CDataSource; class String8; -class WAVExtractor : public MediaExtractor { +class WAVExtractor : public MediaExtractorPluginHelper { public: - explicit WAVExtractor(DataSourceBase *source); + explicit WAVExtractor(DataSourceHelper *source); virtual size_t countTracks(); virtual MediaTrack *getTrack(size_t index); @@ -42,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/MediaExtractor.cpp b/media/libmediaextractor/MediaExtractor.cpp index a6b3dc96d5..8bf44c84b9 100644 --- a/media/libmediaextractor/MediaExtractor.cpp +++ b/media/libmediaextractor/MediaExtractor.cpp @@ -39,4 +39,43 @@ uint32_t MediaExtractor::flags() const { return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK; } +// -------------------------------------------------------------------------------- +MediaExtractorCUnwrapper::MediaExtractorCUnwrapper(CMediaExtractor *wrapper) { + this->wrapper = wrapper; +} + +MediaExtractorCUnwrapper::~MediaExtractorCUnwrapper() { + wrapper->free(wrapper->data); + free(wrapper); +} + +size_t MediaExtractorCUnwrapper::countTracks() { + return wrapper->countTracks(wrapper->data); +} + +MediaTrack *MediaExtractorCUnwrapper::getTrack(size_t index) { + return wrapper->getTrack(wrapper->data, index); +} + +status_t MediaExtractorCUnwrapper::getTrackMetaData( + MetaDataBase& meta, size_t index, uint32_t flags) { + return wrapper->getTrackMetaData(wrapper->data, meta, index, flags); +} + +status_t MediaExtractorCUnwrapper::getMetaData(MetaDataBase& meta) { + return wrapper->getMetaData(wrapper->data, meta); +} + +const char * MediaExtractorCUnwrapper::name() { + return wrapper->name(wrapper->data); +} + +uint32_t MediaExtractorCUnwrapper::flags() const { + return wrapper->flags(wrapper->data); +} + +status_t MediaExtractorCUnwrapper::setMediaCas(const uint8_t* casToken, size_t size) { + return wrapper->setMediaCas(wrapper->data, casToken, size); +} + } // namespace android 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/libmediaextractor/include/media/MediaExtractor.h b/media/libmediaextractor/include/media/MediaExtractor.h index 4ba98da533..d9456ab0a4 100644 --- a/media/libmediaextractor/include/media/MediaExtractor.h +++ b/media/libmediaextractor/include/media/MediaExtractor.h @@ -24,6 +24,8 @@ #include #include #include +#include +#include namespace android { @@ -42,7 +44,6 @@ public: } }; - class MediaExtractor // : public ExtractorAllocTracker { @@ -79,46 +80,6 @@ public: virtual const char * name() { return ""; } - typedef MediaExtractor* (*CreatorFunc)( - DataSourceBase *source, void *meta); - typedef void (*FreeMetaFunc)(void *meta); - - // The sniffer can optionally fill in an opaque object, "meta", that helps - // the corresponding extractor initialize its state without duplicating - // 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, - void **meta, FreeMetaFunc *freeMeta); - - typedef struct { - const uint8_t b[16]; - } uuid_t; - - typedef struct { - // version number of this structure - const uint32_t def_version; - - // A unique identifier for this extractor. - // See below for a convenience macro to create this from a string. - uuid_t extractor_uuid; - - // Version number of this extractor. When two extractors with the same - // uuid are encountered, the one with the largest version number will - // be used. - const uint32_t extractor_version; - - // a human readable name - const char *extractor_name; - - // the sniffer function - const SnifferFunc sniff; - } ExtractorDef; - - static const uint32_t EXTRACTORDEF_VERSION = 1; - - typedef ExtractorDef (*GetExtractorDef)(); - protected: MediaExtractor(); @@ -127,66 +88,21 @@ private: MediaExtractor &operator=(const MediaExtractor &); }; -// purposely not defined anywhere so that this will fail to link if -// expressions below are not evaluated at compile time -int invalid_uuid_string(const char *); - -template -constexpr uint8_t _digitAt_(const T (&s)[N], const size_t n) { - return s[n] >= '0' && s[n] <= '9' ? s[n] - '0' - : s[n] >= 'a' && s[n] <= 'f' ? s[n] - 'a' + 10 - : s[n] >= 'A' && s[n] <= 'F' ? s[n] - 'A' + 10 - : invalid_uuid_string("uuid: bad digits"); -} - -template -constexpr uint8_t _hexByteAt_(const T (&s)[N], size_t n) { - return (_digitAt_(s, n) << 4) + _digitAt_(s, n + 1); -} - -constexpr bool _assertIsDash_(char c) { - return c == '-' ? true : invalid_uuid_string("Wrong format"); -} - -template -constexpr MediaExtractor::uuid_t constUUID(const char (&s) [N]) { - static_assert(N == 37, "uuid: wrong length"); - return - _assertIsDash_(s[8]), - _assertIsDash_(s[13]), - _assertIsDash_(s[18]), - _assertIsDash_(s[23]), - MediaExtractor::uuid_t {{ - _hexByteAt_(s, 0), - _hexByteAt_(s, 2), - _hexByteAt_(s, 4), - _hexByteAt_(s, 6), - _hexByteAt_(s, 9), - _hexByteAt_(s, 11), - _hexByteAt_(s, 14), - _hexByteAt_(s, 16), - _hexByteAt_(s, 19), - _hexByteAt_(s, 21), - _hexByteAt_(s, 24), - _hexByteAt_(s, 26), - _hexByteAt_(s, 28), - _hexByteAt_(s, 30), - _hexByteAt_(s, 32), - _hexByteAt_(s, 34), - }}; -} -// Convenience macro to create a uuid_t from a string literal, which should -// be formatted as "12345678-1234-1234-1234-123456789abc", as generated by -// e.g. https://www.uuidgenerator.net/ or the 'uuidgen' linux command. -// Hex digits may be upper or lower case. -// -// The macro call is otherwise equivalent to specifying the structure directly -// (e.g. UUID("7d613858-5837-4a38-84c5-332d1cddee27") is the same as -// {{0x7d, 0x61, 0x38, 0x58, 0x58, 0x37, 0x4a, 0x38, -// 0x84, 0xc5, 0x33, 0x2d, 0x1c, 0xdd, 0xee, 0x27}}) - -#define UUID(str) []{ constexpr MediaExtractor::uuid_t uuid = constUUID(str); return uuid; }() - +class MediaExtractorCUnwrapper : public MediaExtractor { +public: + explicit MediaExtractorCUnwrapper(CMediaExtractor *wrapper); + virtual size_t countTracks(); + virtual MediaTrack *getTrack(size_t index); + virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags = 0); + virtual status_t getMetaData(MetaDataBase& meta); + virtual const char * name(); + virtual uint32_t flags() const; + virtual status_t setMediaCas(const uint8_t* casToken, size_t size); +protected: + virtual ~MediaExtractorCUnwrapper(); +private: + CMediaExtractor *wrapper; +}; } // namespace android diff --git a/media/libstagefright/MediaExtractorFactory.cpp b/media/libstagefright/MediaExtractorFactory.cpp index 2d4bd39da1..6e361497e8 100644 --- a/media/libstagefright/MediaExtractorFactory.cpp +++ b/media/libstagefright/MediaExtractorFactory.cpp @@ -74,25 +74,26 @@ sp MediaExtractorFactory::CreateFromService( source->DrmInitialization(nullptr /* mime */); void *meta = nullptr; - MediaExtractor::CreatorFunc creator = NULL; - MediaExtractor::FreeMetaFunc freeMeta = nullptr; + CreatorFunc creator = NULL; + 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; } - MediaExtractor *ret = creator(source.get(), meta); + CMediaExtractor *ret = creator(source->wrap(), meta); if (meta != nullptr && freeMeta != nullptr) { freeMeta(meta); } + MediaExtractor *ex = ret != nullptr ? new MediaExtractorCUnwrapper(ret) : nullptr; ALOGV("Created an extractor '%s' with confidence %.2f", - ret != nullptr ? ret->name() : "", confidence); + ex != nullptr ? ex->name() : "", confidence); - return CreateIMediaExtractorFromMediaExtractor(ret, source, plugin); + return CreateIMediaExtractorFromMediaExtractor(ex, source, plugin); } //static @@ -103,14 +104,14 @@ void MediaExtractorFactory::LoadPlugins(const ::std::string& apkPath) { } struct ExtractorPlugin : public RefBase { - MediaExtractor::ExtractorDef def; + ExtractorDef def; void *libHandle; String8 libPath; String8 uuidString; - ExtractorPlugin(MediaExtractor::ExtractorDef definition, void *handle, String8 &path) + ExtractorPlugin(ExtractorDef definition, void *handle, String8 &path) : def(definition), libHandle(handle), libPath(path) { - for (size_t i = 0; i < sizeof MediaExtractor::ExtractorDef::extractor_uuid; i++) { + for (size_t i = 0; i < sizeof ExtractorDef::extractor_uuid; i++) { uuidString.appendFormat("%02x", def.extractor_uuid.b[i]); } } @@ -127,9 +128,9 @@ std::shared_ptr>> MediaExtractorFactory::gPlugins; bool MediaExtractorFactory::gPluginsRegistered = false; // static -MediaExtractor::CreatorFunc MediaExtractorFactory::sniff( - DataSourceBase *source, float *confidence, void **meta, - MediaExtractor::FreeMetaFunc *freeMeta, sp &plugin) { +CreatorFunc MediaExtractorFactory::sniff( + const sp &source, float *confidence, void **meta, + FreeMetaFunc *freeMeta, sp &plugin) { *confidence = 0.0f; *meta = nullptr; @@ -142,14 +143,14 @@ MediaExtractor::CreatorFunc MediaExtractorFactory::sniff( plugins = gPlugins; } - MediaExtractor::CreatorFunc curCreator = NULL; - MediaExtractor::CreatorFunc bestCreator = NULL; + CreatorFunc curCreator = NULL; + CreatorFunc bestCreator = NULL; for (auto it = plugins->begin(); it != plugins->end(); ++it) { ALOGV("sniffing %s", (*it)->def.extractor_name); float newConfidence; void *newMeta = nullptr; - MediaExtractor::FreeMetaFunc newFreeMeta = nullptr; - if ((curCreator = (*it)->def.sniff(source, &newConfidence, &newMeta, &newFreeMeta))) { + FreeMetaFunc newFreeMeta = nullptr; + if ((curCreator = (*it)->def.sniff(source->wrap(), &newConfidence, &newMeta, &newFreeMeta))) { if (newConfidence > *confidence) { *confidence = newConfidence; if (*meta != nullptr && *freeMeta != nullptr) { @@ -175,7 +176,7 @@ void MediaExtractorFactory::RegisterExtractor(const sp &plugin, std::list> &pluginList) { // sanity check check struct version, uuid, name if (plugin->def.def_version == 0 - || plugin->def.def_version > MediaExtractor::EXTRACTORDEF_VERSION) { + || plugin->def.def_version > EXTRACTORDEF_VERSION) { ALOGE("don't understand extractor format %u, ignoring.", plugin->def.def_version); return; } @@ -236,8 +237,8 @@ void MediaExtractorFactory::RegisterExtractorsInApk( // within the apk instead of system libraries already loaded. void *libHandle = dlopen(libPath.string(), RTLD_NOW | RTLD_LOCAL); if (libHandle) { - MediaExtractor::GetExtractorDef getDef = - (MediaExtractor::GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); + GetExtractorDef getDef = + (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); if (getDef) { ALOGV("registering sniffer for %s", libPath.string()); RegisterExtractor( @@ -271,8 +272,8 @@ void MediaExtractorFactory::RegisterExtractorsInSystem( String8 libPath = String8(libDirPath) + "/" + libEntry->d_name; void *libHandle = dlopen(libPath.string(), RTLD_NOW | RTLD_LOCAL); if (libHandle) { - MediaExtractor::GetExtractorDef getDef = - (MediaExtractor::GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); + GetExtractorDef getDef = + (GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF"); if (getDef) { ALOGV("registering sniffer for %s", libPath.string()); RegisterExtractor( 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 d5f4b35446..4ee55565e3 100644 --- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h +++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h @@ -49,8 +49,8 @@ private: static void RegisterExtractor( const sp &plugin, std::list> &pluginList); - static MediaExtractor::CreatorFunc sniff(DataSourceBase *source, - float *confidence, void **meta, MediaExtractor::FreeMetaFunc *freeMeta, + static CreatorFunc sniff(const sp &source, + float *confidence, void **meta, FreeMetaFunc *freeMeta, sp &plugin); static void UpdateExtractors(const char *newUpdateApkPath);