Merge changes I1c8b2990,Iba947381
* changes:
C-ify DataSource
C API for extractor plugins
diff --git a/include/media/MediaExtractorPluginApi.h b/include/media/MediaExtractorPluginApi.h
new file mode 100644
index 0000000..930b6e2
--- /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 <utils/Errors.h> // 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 0000000..c817b30
--- /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 <arpa/inet.h>
+#include <stdio.h>
+#include <vector>
+
+#include <utils/Errors.h>
+#include <utils/Log.h>
+#include <utils/RefBase.h>
+#include <media/MediaExtractorPluginApi.h>
+
+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 "<unspecified>"; }
+
+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<N> 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 <typename T, size_t N>
+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 <typename T, size_t N>
+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 <size_t N>
+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 9fc5a76..955a588 100644
--- a/media/extractors/aac/AACExtractor.cpp
+++ b/media/extractors/aac/AACExtractor.cpp
@@ -19,7 +19,7 @@
#include <utils/Log.h>
#include "AACExtractor.h"
-#include <media/DataSourceBase.h>
+#include <media/MediaExtractorPluginApi.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -36,7 +36,7 @@
class AACSource : public MediaTrack {
public:
AACSource(
- DataSourceBase *source,
+ DataSourceHelper *source,
MetaDataBase &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us);
@@ -54,7 +54,7 @@
private:
static const size_t kMaxFrameSize;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase mMeta;
off64_t mOffset;
@@ -92,7 +92,7 @@
// The returned value is the AAC frame size with the ADTS header length (regardless of
// the presence of the CRC).
// If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame.
-static size_t getAdtsFrameLength(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 @@
}
AACExtractor::AACExtractor(
- DataSourceBase *source, off64_t offset)
+ DataSourceHelper *source, off64_t offset)
: mDataSource(source),
mInitCheck(NO_INIT),
mFrameDurationUs(0) {
@@ -219,7 +219,7 @@
const size_t AACSource::kMaxFrameSize = 8192;
AACSource::AACSource(
- DataSourceBase *source,
+ DataSourceHelper *source,
MetaDataBase &meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us)
@@ -323,21 +323,22 @@
////////////////////////////////////////////////////////////////////////////////
-static MediaExtractor* CreateExtractor(
- DataSourceBase *source,
+static CMediaExtractor* CreateExtractor(
+ CDataSource *source,
void *meta) {
off64_t offset = *static_cast<off64_t*>(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 @@
uint8_t header[2];
- if (source->readAt(pos, &header, 2) != 2) {
+ if (helper.readAt(pos, &header, 2) != 2) {
return NULL;
}
@@ -387,9 +388,9 @@
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 9dadbed..3f20461 100644
--- a/media/extractors/aac/AACExtractor.h
+++ b/media/extractors/aac/AACExtractor.h
@@ -18,7 +18,8 @@
#define AAC_EXTRACTOR_H_
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <utils/Vector.h>
@@ -28,9 +29,9 @@
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 @@
virtual ~AACExtractor();
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase mMeta;
status_t mInitCheck;
@@ -55,7 +56,7 @@
};
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 f56d5ef..e109fb3 100644
--- a/media/extractors/amr/AMRExtractor.cpp
+++ b/media/extractors/amr/AMRExtractor.cpp
@@ -20,7 +20,6 @@
#include "AMRExtractor.h"
-#include <media/DataSourceBase.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/MediaBufferGroup.h>
@@ -34,7 +33,7 @@
class AMRSource : public MediaTrack {
public:
AMRSource(
- DataSourceBase *source,
+ DataSourceHelper *source,
MetaDataBase &meta,
bool isWide,
const off64_t *offset_table,
@@ -52,7 +51,7 @@
virtual ~AMRSource();
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase mMeta;
bool mIsWide;
@@ -98,7 +97,7 @@
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 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 @@
return false;
}
-AMRExtractor::AMRExtractor(DataSourceBase *source)
+AMRExtractor::AMRExtractor(DataSourceHelper *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mOffsetTableLength(0) {
@@ -192,6 +191,7 @@
}
AMRExtractor::~AMRExtractor() {
+ delete mDataSource;
}
status_t AMRExtractor::getMetaData(MetaDataBase &meta) {
@@ -229,7 +229,7 @@
////////////////////////////////////////////////////////////////////////////////
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 @@
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 c90b325..499ca67 100644
--- a/media/extractors/amr/AMRExtractor.h
+++ b/media/extractors/amr/AMRExtractor.h
@@ -19,7 +19,8 @@
#define AMR_EXTRACTOR_H_
#include <utils/Errors.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
namespace android {
@@ -28,9 +29,9 @@
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 @@
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 a721b65..1efaa0c 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 <media/DataSourceBase.h>
+#include <media/MediaExtractorPluginApi.h>
#include <media/MediaTrack.h>
#include <media/VorbisComment.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -43,7 +43,7 @@
public:
FLACSource(
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
MetaDataBase &meta);
virtual status_t start(MetaDataBase *params);
@@ -57,7 +57,7 @@
virtual ~FLACSource();
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase mTrackMetadata;
FLACParser *mParser;
bool mInitCheck;
@@ -79,7 +79,7 @@
};
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 @@
}
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase *mFileMetadata;
MetaDataBase *mTrackMetadata;
bool mInitCheck;
@@ -487,7 +487,7 @@
// FLACParser
FLACParser::FLACParser(
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata)
: mDataSource(dataSource),
@@ -708,7 +708,7 @@
// FLACsource
FLACSource::FLACSource(
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
MetaDataBase &trackMetadata)
: mDataSource(dataSource),
mTrackMetadata(trackMetadata),
@@ -789,7 +789,7 @@
// FLACExtractor
FLACExtractor::FLACExtractor(
- DataSourceBase *dataSource)
+ DataSourceHelper *dataSource)
: mDataSource(dataSource),
mParser(nullptr),
mInitCheck(false)
@@ -804,6 +804,7 @@
{
ALOGV("~FLACExtractor::FLACExtractor");
delete mParser;
+ delete mDataSource;
}
size_t FLACExtractor::countTracks()
@@ -837,7 +838,7 @@
// 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 @@
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 7fb6ec6..1ddff43 100644
--- a/media/extractors/flac/FLACExtractor.h
+++ b/media/extractors/flac/FLACExtractor.h
@@ -18,7 +18,8 @@
#define FLAC_EXTRACTOR_H_
#include <media/DataSourceBase.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <utils/String8.h>
@@ -26,10 +27,10 @@
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 @@
virtual ~FLACExtractor();
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
FLACParser *mParser;
status_t mInitCheck;
MetaDataBase mFileMetadata;
@@ -55,8 +56,6 @@
};
-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 a30b6f8..233033e 100644
--- a/media/extractors/midi/MidiExtractor.cpp
+++ b/media/extractors/midi/MidiExtractor.cpp
@@ -142,7 +142,7 @@
// MidiEngine
-MidiEngine::MidiEngine(DataSourceBase *dataSource,
+MidiEngine::MidiEngine(CDataSource *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata) :
mGroup(NULL),
@@ -263,7 +263,7 @@
// MidiExtractor
MidiExtractor::MidiExtractor(
- DataSourceBase *dataSource)
+ CDataSource *dataSource)
: mDataSource(dataSource),
mInitCheck(false)
{
@@ -310,7 +310,7 @@
// 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 @@
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 244dd0f..fbbe93e 100644
--- a/media/extractors/midi/MidiExtractor.h
+++ b/media/extractors/midi/MidiExtractor.h
@@ -18,7 +18,8 @@
#define MIDI_EXTRACTOR_H_
#include <media/DataSourceBase.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MediaBufferBase.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MetaDataBase.h>
@@ -30,7 +31,7 @@
class MidiEngine {
public:
- explicit MidiEngine(DataSourceBase *dataSource,
+ explicit MidiEngine(CDataSource *dataSource,
MetaDataBase *fileMetadata,
MetaDataBase *trackMetadata);
~MidiEngine();
@@ -50,10 +51,10 @@
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 @@
virtual ~MidiExtractor();
private:
- DataSourceBase *mDataSource;
+ CDataSource *mDataSource;
status_t mInitCheck;
MetaDataBase mFileMetadata;
@@ -88,7 +89,7 @@
};
-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 d657582..a387970 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 @@
}
private:
- DataSourceBase *mSource;
+ DataSourceHelper *mSource;
DataSourceBaseReader(const DataSourceBaseReader &);
DataSourceBaseReader &operator=(const DataSourceBaseReader &);
@@ -921,7 +921,7 @@
////////////////////////////////////////////////////////////////////////////////
-MatroskaExtractor::MatroskaExtractor(DataSourceBase *source)
+MatroskaExtractor::MatroskaExtractor(DataSourceHelper *source)
: mDataSource(source),
mReader(new DataSourceBaseReader(mDataSource)),
mSegment(NULL),
@@ -994,6 +994,8 @@
delete mReader;
mReader = NULL;
+
+ delete mDataSource;
}
size_t MatroskaExtractor::countTracks() {
@@ -1621,7 +1623,7 @@
}
bool SniffMatroska(
- DataSourceBase *source, float *confidence) {
+ DataSourceHelper *source, float *confidence) {
DataSourceBaseReader reader(source);
mkvparser::EBMLHeader ebmlHeader;
long long pos;
@@ -1638,22 +1640,23 @@
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 3568ea1..2c6ca85 100644
--- a/media/extractors/mkv/MatroskaExtractor.h
+++ b/media/extractors/mkv/MatroskaExtractor.h
@@ -20,7 +20,8 @@
#include "mkvparser/mkvparser.h"
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <utils/Vector.h>
#include <utils/threads.h>
@@ -34,8 +35,8 @@
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 @@
Mutex mLock;
Vector<TrackInfo> 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 33cff96..a1e5593 100644
--- a/media/extractors/mp3/MP3Extractor.cpp
+++ b/media/extractors/mp3/MP3Extractor.cpp
@@ -24,7 +24,6 @@
#include "VBRISeeker.h"
#include "XINGSeeker.h"
-#include <media/DataSourceBase.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -46,7 +45,7 @@
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 @@
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 @@
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 @@
};
MP3Extractor::MP3Extractor(
- DataSourceBase *source, Mp3Meta *meta)
+ DataSourceHelper *source, Mp3Meta *meta)
: mInitCheck(NO_INIT),
mDataSource(source),
mFirstFramePos(-1),
@@ -371,7 +370,8 @@
// 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() {
delete mSeeker;
+ delete mDataSource;
}
size_t MP3Extractor::countTracks() {
@@ -440,7 +441,7 @@
// Set our max frame size to the nearest power of 2 above this size (aka, 4kB)
const size_t MP3Source::kMaxFrameSize = (1 << 12); /* 4096 bytes */
MP3Source::MP3Source(
- 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 @@
}
meta.setCString(kKeyMIMEType, "audio/mpeg");
- ID3 id3(mDataSource);
+ DataSourceHelper helper(mDataSource);
+ ID3 id3(&helper);
if (!id3.isValid()) {
return OK;
@@ -669,21 +671,22 @@
return OK;
}
-static MediaExtractor* CreateExtractor(
- DataSourceBase *source,
+static CMediaExtractor* CreateExtractor(
+ CDataSource *source,
void *meta) {
Mp3Meta *metaData = static_cast<Mp3Meta *>(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 @@
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 @@
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 485b0ca..585d9f6 100644
--- a/media/extractors/mp3/MP3Extractor.h
+++ b/media/extractors/mp3/MP3Extractor.h
@@ -19,20 +19,22 @@
#define MP3_EXTRACTOR_H_
#include <utils/Errors.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
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 @@
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 523f14c..9eb72a7 100644
--- a/media/extractors/mp3/VBRISeeker.cpp
+++ b/media/extractors/mp3/VBRISeeker.cpp
@@ -27,7 +27,9 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSourceBase.h>
+
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
namespace android {
@@ -37,7 +39,7 @@
// 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 9213f6e..507899c 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 01e06ca..9f1fd7a 100644
--- a/media/extractors/mp3/XINGSeeker.cpp
+++ b/media/extractors/mp3/XINGSeeker.cpp
@@ -21,7 +21,9 @@
#include <media/stagefright/foundation/avc_utils.h>
#include <media/stagefright/foundation/ByteUtils.h>
-#include <media/DataSourceBase.h>
+
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
namespace android {
@@ -79,7 +81,7 @@
// 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 5867eae..9acee38 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 be442e6..a61e60a 100644
--- a/media/extractors/mp4/ItemTable.cpp
+++ b/media/extractors/mp4/ItemTable.cpp
@@ -18,7 +18,8 @@
#define LOG_TAG "ItemTable"
#include <ItemTable.h>
-#include <media/DataSourceBase.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -92,7 +93,7 @@
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 @@
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 @@
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 @@
//
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 IlocBox : public FullBox {
- IlocBox(DataSourceBase *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
+ IlocBox(DataSourceHelper *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
FullBox(source, FOURCC('i', 'l', 'o', 'c')),
mItemLocs(itemLocs), mHasConstructMethod1(false) {}
@@ -471,7 +472,7 @@
//
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 @@
}
struct IrefBox : public FullBox {
- IrefBox(DataSourceBase *source, Vector<sp<ItemReference> > *itemRefs) :
+ IrefBox(DataSourceHelper *source, Vector<sp<ItemReference> > *itemRefs) :
FullBox(source, FOURCC('i', 'r', 'e', 'f')), mRefIdSize(0), mItemRefs(itemRefs) {}
status_t parse(off64_t offset, size_t size);
@@ -688,7 +689,7 @@
};
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 @@
}
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 @@
}
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 @@
}
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 @@
}
struct IpmaBox : public FullBox {
- IpmaBox(DataSourceBase *source, Vector<AssociationEntry> *associations) :
+ IpmaBox(DataSourceHelper *source, Vector<AssociationEntry> *associations) :
FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {}
status_t parse(off64_t offset, size_t size);
@@ -908,7 +909,7 @@
}
struct IpcoBox : public Box {
- IpcoBox(DataSourceBase *source, Vector<sp<ItemProperty> > *properties) :
+ IpcoBox(DataSourceHelper *source, Vector<sp<ItemProperty> > *properties) :
Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {}
status_t parse(off64_t offset, size_t size);
@@ -965,7 +966,7 @@
}
struct IprpBox : public Box {
- IprpBox(DataSourceBase *source,
+ IprpBox(DataSourceHelper *source,
Vector<sp<ItemProperty> > *properties,
Vector<AssociationEntry> *associations) :
Box(source, FOURCC('i', 'p', 'r', 'p')),
@@ -1022,7 +1023,7 @@
};
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 @@
}
struct IinfBox : public FullBox {
- IinfBox(DataSourceBase *source, Vector<ItemInfo> *itemInfos) :
+ IinfBox(DataSourceHelper *source, Vector<ItemInfo> *itemInfos) :
FullBox(source, FOURCC('i', 'i', 'n', 'f')),
mItemInfos(itemInfos), mHasGrids(false) {}
@@ -1196,7 +1197,7 @@
//////////////////////////////////////////////////////////////////
-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 536dcb0..650b3f3 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 @@
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 @@
~ItemTable();
private:
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
KeyedVector<uint32_t, ItemLoc> mItemLocs;
Vector<ItemInfo> mItemInfos;
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 251a4cd..b6b0ae2 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 <media/DataSourceBase.h>
#include <media/ExtractorUtils.h>
#include <media/MediaTrack.h>
#include <media/stagefright/foundation/ABitReader.h>
@@ -72,7 +73,7 @@
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
MPEG4Source(MetaDataBase &format,
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -96,7 +97,7 @@
Mutex mLock;
MetaDataBase &mFormat;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
int32_t mTimescale;
sp<SampleTable> mSampleTable;
uint32_t mCurrentSampleIndex;
@@ -197,11 +198,10 @@
// 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 @@
private:
Mutex mLock;
- DataSourceBase *mSource;
+ DataSourceHelper *mSource;
bool mOwnsDataSource;
off64_t mCachedOffset;
size_t mCachedSize;
@@ -224,8 +224,9 @@
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 @@
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 @@
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 @@
mPssh.clear();
delete mCachedSource;
+ delete mDataSource;
}
uint32_t MPEG4Extractor::flags() const {
@@ -4093,7 +4091,7 @@
MPEG4Source::MPEG4Source(
MetaDataBase &format,
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -5772,7 +5770,7 @@
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 @@
// 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 @@
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 @@
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 a4a5684..ca273e0 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -20,8 +20,8 @@
#include <arpa/inet.h>
-#include <media/DataSourceBase.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/KeyedVector.h>
@@ -31,7 +31,8 @@
namespace android {
struct AMessage;
-class DataSourceBase;
+struct CDataSource;
+class DataSourceHelper;
struct CachedRangedDataSource;
class SampleTable;
class String8;
@@ -53,9 +54,9 @@
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 @@
Vector<Trex> mTrex;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
CachedRangedDataSource *mCachedSource;
status_t mInitCheck;
uint32_t mHeaderTimescale;
@@ -149,10 +150,6 @@
MPEG4Extractor &operator=(const MPEG4Extractor &);
};
-bool SniffMPEG4(
- DataSourceBase *source, String8 *mimeType, float *confidence,
- sp<AMessage> *);
-
} // namespace android
#endif // MPEG4_EXTRACTOR_H_
diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp
index 28fe717..d242798 100644
--- a/media/extractors/mp4/SampleTable.cpp
+++ b/media/extractors/mp4/SampleTable.cpp
@@ -25,7 +25,7 @@
#include <arpa/inet.h>
-#include <media/DataSourceBase.h>
+#include <media/MediaExtractorPluginApi.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
@@ -114,7 +114,7 @@
////////////////////////////////////////////////////////////////////////////////
-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 dd68860..d4b5dc8 100644
--- a/media/extractors/mp4/SampleTable.h
+++ b/media/extractors/mp4/SampleTable.h
@@ -21,18 +21,19 @@
#include <sys/types.h>
#include <stdint.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
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 @@
// 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 8a0fa03..ff40ed4 100644
--- a/media/extractors/mpeg2/ExtractorBundle.cpp
+++ b/media/extractors/mpeg2/ExtractorBundle.cpp
@@ -19,35 +19,39 @@
#include <utils/Log.h>
#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginHelper.h>
#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 6980b82..ae1e6ba 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
@@ -94,7 +94,7 @@
////////////////////////////////////////////////////////////////////////////////
-MPEG2PSExtractor::MPEG2PSExtractor(DataSourceBase *source)
+MPEG2PSExtractor::MPEG2PSExtractor(DataSourceHelper *source)
: mDataSource(source),
mOffset(0),
mFinalResult(OK),
@@ -120,6 +120,7 @@
}
MPEG2PSExtractor::~MPEG2PSExtractor() {
+ delete mDataSource;
}
size_t MPEG2PSExtractor::countTracks() {
@@ -754,7 +755,7 @@
////////////////////////////////////////////////////////////////////////////////
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 8b9dad9..7689910 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.h
@@ -19,7 +19,8 @@
#define MPEG2_PS_EXTRACTOR_H_
#include <media/stagefright/foundation/ABase.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <utils/threads.h>
#include <utils/KeyedVector.h>
@@ -31,8 +32,8 @@
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 @@
struct WrappedTrack;
mutable Mutex mLock;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
off64_t mOffset;
status_t mFinalResult;
@@ -72,7 +73,7 @@
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 c83f7ce..cbe8556 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -123,7 +123,7 @@
////////////////////////////////////////////////////////////////////////////////
-MPEG2TSExtractor::MPEG2TSExtractor(DataSourceBase *source)
+MPEG2TSExtractor::MPEG2TSExtractor(DataSourceHelper *source)
: mDataSource(source),
mParser(new ATSParser),
mLastSyncEvent(0),
@@ -131,6 +131,10 @@
init();
}
+MPEG2TSExtractor::~MPEG2TSExtractor() {
+ delete mDataSource;
+}
+
size_t MPEG2TSExtractor::countTracks() {
return mSourceImpls.size();
}
@@ -652,7 +656,7 @@
////////////////////////////////////////////////////////////////////////////////
-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 cbdd3cb..cdaede3 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.h
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.h
@@ -20,7 +20,8 @@
#define MPEG2_TS_EXTRACTOR_H_
#include <media/stagefright/foundation/ABase.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/MediaTrack.h>
#include <media/stagefright/MetaDataBase.h>
#include <utils/threads.h>
@@ -34,12 +35,12 @@
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 @@
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<ATSParser> mParser;
@@ -81,9 +85,9 @@
// Try to feed more data from source to parser.
// |isInit| means this function is called inside init(). This is a signal to
// save SyncEvent so that init() can add SyncPoint after it updates |mSourceImpls|.
- // This function returns OK if expected amount of data is fed from 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 @@
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 b2fe69c..d46ace4 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -71,7 +71,7 @@
struct MyOggExtractor {
MyOggExtractor(
- DataSourceBase *source,
+ DataSourceHelper *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs);
@@ -110,7 +110,7 @@
int64_t mTimeUs;
};
- DataSourceBase *mSource;
+ DataSourceHelper *mSource;
off64_t mOffset;
Page mCurrentPage;
uint64_t mCurGranulePosition;
@@ -169,7 +169,7 @@
};
struct MyVorbisExtractor : public MyOggExtractor {
- explicit MyVorbisExtractor(DataSourceBase *source)
+ explicit MyVorbisExtractor(DataSourceHelper *source)
: MyOggExtractor(source,
MEDIA_MIMETYPE_AUDIO_VORBIS,
/* numHeaders */ 3,
@@ -197,7 +197,7 @@
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 @@
////////////////////////////////////////////////////////////////////////////////
MyOggExtractor::MyOggExtractor(
- DataSourceBase *source,
+ DataSourceHelper *source,
const char *mimeType,
size_t numHeaders,
int64_t seekPreRollUs)
@@ -1193,7 +1193,7 @@
////////////////////////////////////////////////////////////////////////////////
-OggExtractor::OggExtractor(DataSourceBase *source)
+OggExtractor::OggExtractor(DataSourceHelper *source)
: mDataSource(source),
mInitCheck(NO_INIT),
mImpl(NULL) {
@@ -1248,19 +1248,20 @@
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 @@
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 9fe2944..fbd4663 100644
--- a/media/extractors/ogg/OggExtractor.h
+++ b/media/extractors/ogg/OggExtractor.h
@@ -19,19 +19,19 @@
#define OGG_EXTRACTOR_H_
#include <utils/Errors.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
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 @@
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 f5a1b01..80dc9c8 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -57,7 +57,7 @@
struct WAVSource : public MediaTrack {
WAVSource(
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
MetaDataBase &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@@ -78,7 +78,7 @@
private:
static const size_t kMaxFrameSize;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
MetaDataBase &mMeta;
uint16_t mWaveFormat;
int32_t mSampleRate;
@@ -94,7 +94,7 @@
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() {
+ delete mDataSource;
}
status_t WAVExtractor::getMetaData(MetaDataBase &meta) {
@@ -347,7 +348,7 @@
const size_t WAVSource::kMaxFrameSize = 32768;
WAVSource::WAVSource(
- DataSourceBase *dataSource,
+ DataSourceHelper *dataSource,
MetaDataBase &meta,
uint16_t waveFormat,
int32_t bitsPerSample,
@@ -544,34 +545,39 @@
////////////////////////////////////////////////////////////////////////////////
-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 @@
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 467d0b7..5136aa8 100644
--- a/media/extractors/wav/WAVExtractor.h
+++ b/media/extractors/wav/WAVExtractor.h
@@ -19,18 +19,19 @@
#define WAV_EXTRACTOR_H_
#include <utils/Errors.h>
-#include <media/MediaExtractor.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
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 @@
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 5ca3b48..1150d61 100644
--- a/media/libmedia/MidiIoWrapper.cpp
+++ b/media/libmedia/MidiIoWrapper.cpp
@@ -23,6 +23,7 @@
#include <fcntl.h>
#include <media/MidiIoWrapper.h>
+#include <media/MediaExtractorPluginApi.h>
static int readAt(void *handle, void *buffer, int pos, int size) {
return ((android::MidiIoWrapper*)handle)->readAt(buffer, pos, size);
@@ -61,6 +62,51 @@
}
}
+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 b5e565e..6309dda 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 a6b3dc9..8bf44c8 100644
--- a/media/libmediaextractor/MediaExtractor.cpp
+++ b/media/libmediaextractor/MediaExtractor.cpp
@@ -39,4 +39,43 @@
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 0e59f39..cb96ff5 100644
--- a/media/libmediaextractor/include/media/DataSource.h
+++ b/media/libmediaextractor/include/media/DataSource.h
@@ -22,6 +22,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/DataSourceBase.h>
#include <media/IDataSource.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
@@ -34,7 +35,7 @@
class DataSource : public DataSourceBase, public virtual RefBase {
public:
- DataSource() {}
+ DataSource() : mWrapper(NULL) {}
// returns a pointer to IDataSource if it is wrapped.
virtual sp<IDataSource> getIDataSource() const {
@@ -69,10 +70,35 @@
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 4ba98da..d9456ab 100644
--- a/media/libmediaextractor/include/media/MediaExtractor.h
+++ b/media/libmediaextractor/include/media/MediaExtractor.h
@@ -24,6 +24,8 @@
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/RefBase.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
namespace android {
@@ -42,7 +44,6 @@
}
};
-
class MediaExtractor
// : public ExtractorAllocTracker
{
@@ -79,46 +80,6 @@
virtual const char * name() { return "<unspecified>"; }
- 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 @@
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 <typename T, size_t N>
-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 <typename T, size_t N>
-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 <size_t N>
-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 2d4bd39..6e36149 100644
--- a/media/libstagefright/MediaExtractorFactory.cpp
+++ b/media/libstagefright/MediaExtractorFactory.cpp
@@ -74,25 +74,26 @@
source->DrmInitialization(nullptr /* mime */);
void *meta = nullptr;
- MediaExtractor::CreatorFunc creator = NULL;
- MediaExtractor::FreeMetaFunc freeMeta = nullptr;
+ CreatorFunc creator = NULL;
+ FreeMetaFunc freeMeta = nullptr;
float confidence;
sp<ExtractorPlugin> 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() : "<null>", confidence);
+ ex != nullptr ? ex->name() : "<null>", confidence);
- return CreateIMediaExtractorFromMediaExtractor(ret, source, plugin);
+ return CreateIMediaExtractorFromMediaExtractor(ex, source, plugin);
}
//static
@@ -103,14 +104,14 @@
}
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 @@
bool MediaExtractorFactory::gPluginsRegistered = false;
// static
-MediaExtractor::CreatorFunc MediaExtractorFactory::sniff(
- DataSourceBase *source, float *confidence, void **meta,
- MediaExtractor::FreeMetaFunc *freeMeta, sp<ExtractorPlugin> &plugin) {
+CreatorFunc MediaExtractorFactory::sniff(
+ const sp<DataSource> &source, float *confidence, void **meta,
+ FreeMetaFunc *freeMeta, sp<ExtractorPlugin> &plugin) {
*confidence = 0.0f;
*meta = nullptr;
@@ -142,14 +143,14 @@
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 @@
std::list<sp<ExtractorPlugin>> &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 @@
// 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 @@
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 a0a62f4..b489183 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -21,6 +21,8 @@
#include "../include/ID3.h"
#include <media/DataSource.h>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
#include <utils/String8.h>
@@ -56,6 +58,55 @@
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 7c2391e..5e433ea 100644
--- a/media/libstagefright/include/ID3.h
+++ b/media/libstagefright/include/ID3.h
@@ -24,6 +24,7 @@
class DataSourceBase;
class String8;
+class DataSourceHelper;
struct ID3 {
enum Version {
@@ -35,6 +36,7 @@
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 d5f4b35..4ee5556 100644
--- a/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
+++ b/media/libstagefright/include/media/stagefright/MediaExtractorFactory.h
@@ -49,8 +49,8 @@
static void RegisterExtractor(
const sp<ExtractorPlugin> &plugin, std::list<sp<ExtractorPlugin>> &pluginList);
- static MediaExtractor::CreatorFunc sniff(DataSourceBase *source,
- float *confidence, void **meta, MediaExtractor::FreeMetaFunc *freeMeta,
+ static CreatorFunc sniff(const sp<DataSource> &source,
+ float *confidence, void **meta, FreeMetaFunc *freeMeta,
sp<ExtractorPlugin> &plugin);
static void UpdateExtractors(const char *newUpdateApkPath);