C-ify DataSource
Add a C API for DataSource/Base, and a helper so extractors
can continue using a C++ API.
Bug: 111407253
Test: build, boot, play some files
Change-Id: I1c8b2990e17d18eee53c9abf7ebef2ced0e8b7fd
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 0cb4e6b..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 CMediaExtractor* CreateExtractor(DataSourceBase *source, void *) {
- return wrap(new MPEG4Extractor(source));
+static CMediaExtractor* CreateExtractor(CDataSource *source, void *) {
+ return wrap(new MPEG4Extractor(new DataSourceHelper(source)));
}
static CreatorFunc Sniff(
- DataSourceBase *source, float *confidence, void **,
+ CDataSource *source, float *confidence, void **,
FreeMetaFunc *) {
- if (BetterSniffMPEG4(source, confidence)) {
+ DataSourceHelper helper(source);
+ if (BetterSniffMPEG4(&helper, confidence)) {
return CreateExtractor;
}
- if (LegacySniffMPEG4(source, confidence)) {
+ if (LegacySniffMPEG4(&helper, confidence)) {
ALOGW("Identified supported mpeg4 through LegacySniffMPEG4.");
return CreateExtractor;
}
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index 561b567..ca273e0 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -20,7 +20,6 @@
#include <arpa/inet.h>
-#include <media/DataSourceBase.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
@@ -32,7 +31,8 @@
namespace android {
struct AMessage;
-class DataSourceBase;
+struct CDataSource;
+class DataSourceHelper;
struct CachedRangedDataSource;
class SampleTable;
class String8;
@@ -56,7 +56,7 @@
class MPEG4Extractor : public MediaExtractorPluginHelper {
public:
- explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL);
+ explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL);
virtual size_t countTracks();
virtual MediaTrack *getTrack(size_t index);
@@ -98,7 +98,7 @@
Vector<Trex> mTrex;
- DataSourceBase *mDataSource;
+ DataSourceHelper *mDataSource;
CachedRangedDataSource *mCachedSource;
status_t mInitCheck;
uint32_t mHeaderTimescale;
@@ -150,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;