Remove RefBase from plugin-side DataSource
Extractor plugins now use DataSourceBase, which is not refcounted.
Framework-side DataSource derives from DataSourceBase and RefBase.
Also remove MediaExtractor::release, because it is not needed
anymore due to the way the extractor/track/datasource lifecycle
is managed now.
Also add source and target pid to CallbackDataSource name, to
make the extractor dumpsys more useful.
Bug: 67908556
Test: build, boot, CTS, skia test app for heif
Change-Id: I6b9cbe903f76b0cf27ba87f4a456f424803efd08
diff --git a/media/extractors/mp4/ItemTable.cpp b/media/extractors/mp4/ItemTable.cpp
index 85c66b2..cef5f4a 100644
--- a/media/extractors/mp4/ItemTable.cpp
+++ b/media/extractors/mp4/ItemTable.cpp
@@ -18,7 +18,7 @@
#define LOG_TAG "ItemTable"
#include <ItemTable.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -87,7 +87,7 @@
struct Box {
protected:
- Box(const sp<DataSource> source, uint32_t type) :
+ Box(DataSourceBase *source, uint32_t type) :
mDataSource(source), mType(type) {}
virtual ~Box() {}
@@ -99,14 +99,14 @@
inline uint32_t type() const { return mType; }
- inline sp<DataSource> source() const { return mDataSource; }
+ inline DataSourceBase *source() const { return mDataSource; }
status_t parseChunk(off64_t *offset);
status_t parseChunks(off64_t offset, size_t size);
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
uint32_t mType;
};
@@ -181,7 +181,7 @@
struct FullBox : public Box {
protected:
- FullBox(const sp<DataSource> source, uint32_t type) :
+ FullBox(DataSourceBase *source, uint32_t type) :
Box(source, type), mVersion(0), mFlags(0) {}
inline uint8_t version() const { return mVersion; }
@@ -216,7 +216,7 @@
//
struct PitmBox : public FullBox {
- PitmBox(const sp<DataSource> source) :
+ PitmBox(DataSourceBase *source) :
FullBox(source, FOURCC('p', 'i', 't', 'm')) {}
status_t parse(off64_t offset, size_t size, uint32_t *primaryItemId);
@@ -296,7 +296,7 @@
};
struct IlocBox : public FullBox {
- IlocBox(const sp<DataSource> source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
+ IlocBox(DataSourceBase *source, KeyedVector<uint32_t, ItemLoc> *itemLocs) :
FullBox(source, FOURCC('i', 'l', 'o', 'c')),
mItemLocs(itemLocs), mHasConstructMethod1(false) {}
@@ -466,7 +466,7 @@
//
struct ItemReference : public Box, public RefBase {
- ItemReference(const sp<DataSource> source, uint32_t type, uint32_t itemIdSize) :
+ ItemReference(DataSourceBase *source, uint32_t type, uint32_t itemIdSize) :
Box(source, type), mItemId(0), mRefIdSize(itemIdSize) {}
status_t parse(off64_t offset, size_t size);
@@ -575,7 +575,7 @@
}
struct IrefBox : public FullBox {
- IrefBox(const sp<DataSource> source, Vector<sp<ItemReference> > *itemRefs) :
+ IrefBox(DataSourceBase *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);
@@ -637,7 +637,7 @@
};
struct IspeBox : public FullBox, public ItemProperty {
- IspeBox(const sp<DataSource> source) :
+ IspeBox(DataSourceBase *source) :
FullBox(source, FOURCC('i', 's', 'p', 'e')), mWidth(0), mHeight(0) {}
status_t parse(off64_t offset, size_t size) override;
@@ -673,7 +673,7 @@
}
struct HvccBox : public Box, public ItemProperty {
- HvccBox(const sp<DataSource> source) :
+ HvccBox(DataSourceBase *source) :
Box(source, FOURCC('h', 'v', 'c', 'C')) {}
status_t parse(off64_t offset, size_t size) override;
@@ -706,7 +706,7 @@
}
struct IrotBox : public Box, public ItemProperty {
- IrotBox(const sp<DataSource> source) :
+ IrotBox(DataSourceBase *source) :
Box(source, FOURCC('i', 'r', 'o', 't')), mAngle(0) {}
status_t parse(off64_t offset, size_t size) override;
@@ -735,7 +735,7 @@
}
struct ColrBox : public Box, public ItemProperty {
- ColrBox(const sp<DataSource> source) :
+ ColrBox(DataSourceBase *source) :
Box(source, FOURCC('c', 'o', 'l', 'r')) {}
status_t parse(off64_t offset, size_t size) override;
@@ -783,7 +783,7 @@
}
struct IpmaBox : public FullBox {
- IpmaBox(const sp<DataSource> source, Vector<AssociationEntry> *associations) :
+ IpmaBox(DataSourceBase *source, Vector<AssociationEntry> *associations) :
FullBox(source, FOURCC('i', 'p', 'm', 'a')), mAssociations(associations) {}
status_t parse(off64_t offset, size_t size);
@@ -857,7 +857,7 @@
}
struct IpcoBox : public Box {
- IpcoBox(const sp<DataSource> source, Vector<sp<ItemProperty> > *properties) :
+ IpcoBox(DataSourceBase *source, Vector<sp<ItemProperty> > *properties) :
Box(source, FOURCC('i', 'p', 'c', 'o')), mItemProperties(properties) {}
status_t parse(off64_t offset, size_t size);
@@ -914,7 +914,7 @@
}
struct IprpBox : public Box {
- IprpBox(const sp<DataSource> source,
+ IprpBox(DataSourceBase *source,
Vector<sp<ItemProperty> > *properties,
Vector<AssociationEntry> *associations) :
Box(source, FOURCC('i', 'p', 'r', 'p')),
@@ -971,7 +971,7 @@
};
struct InfeBox : public FullBox {
- InfeBox(const sp<DataSource> source) :
+ InfeBox(DataSourceBase *source) :
FullBox(source, FOURCC('i', 'n', 'f', 'e')) {}
status_t parse(off64_t offset, size_t size, ItemInfo *itemInfo);
@@ -1075,7 +1075,7 @@
}
struct IinfBox : public FullBox {
- IinfBox(const sp<DataSource> source, Vector<ItemInfo> *itemInfos) :
+ IinfBox(DataSourceBase *source, Vector<ItemInfo> *itemInfos) :
FullBox(source, FOURCC('i', 'i', 'n', 'f')),
mItemInfos(itemInfos), mHasGrids(false) {}
@@ -1144,7 +1144,7 @@
//////////////////////////////////////////////////////////////////
-ItemTable::ItemTable(const sp<DataSource> &source)
+ItemTable::ItemTable(DataSourceBase *source)
: mDataSource(source),
mPrimaryItemId(0),
mIdatOffset(0),
diff --git a/media/extractors/mp4/ItemTable.h b/media/extractors/mp4/ItemTable.h
index 3d2e2ae..f4a69cc 100644
--- a/media/extractors/mp4/ItemTable.h
+++ b/media/extractors/mp4/ItemTable.h
@@ -25,7 +25,7 @@
namespace android {
-class DataSource;
+class DataSourceBase;
class MetaData;
namespace heif {
@@ -44,7 +44,7 @@
class ItemTable : public RefBase {
public:
- explicit ItemTable(const sp<DataSource> &source);
+ explicit ItemTable(DataSourceBase *source);
status_t parse(uint32_t type, off64_t offset, size_t size);
@@ -60,7 +60,7 @@
~ItemTable();
private:
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
KeyedVector<uint32_t, ItemLoc> mItemLocs;
Vector<ItemInfo> mItemInfos;
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 9f21db6..30dda13 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -69,7 +69,7 @@
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
MPEG4Source(const sp<MetaData> &format,
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -93,7 +93,7 @@
Mutex mLock;
sp<MetaData> mFormat;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
int32_t mTimescale;
sp<SampleTable> mSampleTable;
uint32_t mCurrentSampleIndex;
@@ -186,47 +186,51 @@
// all remaining requests to the wrapped datasource.
// This is used to cache the full sampletable metadata for a single track,
// possibly wrapping multiple times to cover all tracks, i.e.
-// Each MPEG4DataSource caches the sampletable metadata for a single track.
+// Each CachedRangedDataSource caches the sampletable metadata for a single track.
-struct MPEG4DataSource : public DataSource {
- explicit MPEG4DataSource(const sp<DataSource> &source);
+struct CachedRangedDataSource : public DataSourceBase {
+ explicit CachedRangedDataSource(DataSourceBase *source);
+ virtual ~CachedRangedDataSource();
virtual status_t initCheck() const;
virtual ssize_t readAt(off64_t offset, void *data, size_t size);
virtual status_t getSize(off64_t *size);
virtual uint32_t flags();
- status_t setCachedRange(off64_t offset, size_t size);
+ status_t setCachedRange(off64_t offset, size_t size, bool assumeSourceOwnershipOnSuccess);
-protected:
- virtual ~MPEG4DataSource();
private:
Mutex mLock;
- sp<DataSource> mSource;
+ DataSourceBase *mSource;
+ bool mOwnsDataSource;
off64_t mCachedOffset;
size_t mCachedSize;
uint8_t *mCache;
void clearCache();
- MPEG4DataSource(const MPEG4DataSource &);
- MPEG4DataSource &operator=(const MPEG4DataSource &);
+ CachedRangedDataSource(const CachedRangedDataSource &);
+ CachedRangedDataSource &operator=(const CachedRangedDataSource &);
};
-MPEG4DataSource::MPEG4DataSource(const sp<DataSource> &source)
+CachedRangedDataSource::CachedRangedDataSource(DataSourceBase *source)
: mSource(source),
+ mOwnsDataSource(false),
mCachedOffset(0),
mCachedSize(0),
mCache(NULL) {
}
-MPEG4DataSource::~MPEG4DataSource() {
+CachedRangedDataSource::~CachedRangedDataSource() {
clearCache();
+ if (mOwnsDataSource) {
+ delete (CachedRangedDataSource*)mSource;
+ }
}
-void MPEG4DataSource::clearCache() {
+void CachedRangedDataSource::clearCache() {
if (mCache) {
free(mCache);
mCache = NULL;
@@ -236,11 +240,11 @@
mCachedSize = 0;
}
-status_t MPEG4DataSource::initCheck() const {
+status_t CachedRangedDataSource::initCheck() const {
return mSource->initCheck();
}
-ssize_t MPEG4DataSource::readAt(off64_t offset, void *data, size_t size) {
+ssize_t CachedRangedDataSource::readAt(off64_t offset, void *data, size_t size) {
Mutex::Autolock autoLock(mLock);
if (isInRange(mCachedOffset, mCachedSize, offset, size)) {
@@ -251,15 +255,17 @@
return mSource->readAt(offset, data, size);
}
-status_t MPEG4DataSource::getSize(off64_t *size) {
+status_t CachedRangedDataSource::getSize(off64_t *size) {
return mSource->getSize(size);
}
-uint32_t MPEG4DataSource::flags() {
+uint32_t CachedRangedDataSource::flags() {
return mSource->flags();
}
-status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) {
+status_t CachedRangedDataSource::setCachedRange(off64_t offset,
+ size_t size,
+ bool assumeSourceOwnershipOnSuccess) {
Mutex::Autolock autoLock(mLock);
clearCache();
@@ -280,7 +286,7 @@
return ERROR_IO;
}
-
+ mOwnsDataSource = assumeSourceOwnershipOnSuccess;
return OK;
}
@@ -334,11 +340,12 @@
return false;
}
-MPEG4Extractor::MPEG4Extractor(const sp<DataSource> &source, const char *mime)
+MPEG4Extractor::MPEG4Extractor(DataSourceBase *source, const char *mime)
: mMoofOffset(0),
mMoofFound(false),
mMdatFound(false),
mDataSource(source),
+ mCachedSource(NULL),
mInitCheck(NO_INIT),
mHeaderTimescale(0),
mIsQT(false),
@@ -354,10 +361,6 @@
}
MPEG4Extractor::~MPEG4Extractor() {
- release();
-}
-
-void MPEG4Extractor::release() {
Track *track = mFirstTrack;
while (track) {
Track *next = track->next;
@@ -381,10 +384,7 @@
}
mPssh.clear();
- if (mDataSource != NULL) {
- mDataSource->close();
- mDataSource.clear();
- }
+ delete mCachedSource;
}
uint32_t MPEG4Extractor::flags() const {
@@ -692,14 +692,14 @@
// Reads an encoded integer 7 bits at a time until it encounters the high bit clear.
static int32_t readSize(off64_t offset,
- const sp<DataSource> &DataSource, uint8_t *numOfBytes) {
+ DataSourceBase *DataSourceBase, uint8_t *numOfBytes) {
uint32_t size = 0;
uint8_t data;
bool moreData = true;
*numOfBytes = 0;
while (moreData) {
- if (DataSource->readAt(offset, &data, 1) < 1) {
+ if (DataSourceBase->readAt(offset, &data, 1) < 1) {
return -1;
}
offset ++;
@@ -1045,13 +1045,17 @@
ALOGV("sampleTable chunk is %" PRIu64 " bytes long.", chunk_size);
if (mDataSource->flags()
- & (DataSource::kWantsPrefetching
- | DataSource::kIsCachingDataSource)) {
- sp<MPEG4DataSource> cachedSource =
- new MPEG4DataSource(mDataSource);
+ & (DataSourceBase::kWantsPrefetching
+ | DataSourceBase::kIsCachingDataSource)) {
+ CachedRangedDataSource *cachedSource =
+ new CachedRangedDataSource(mDataSource);
- if (cachedSource->setCachedRange(*offset, chunk_size) == OK) {
- mDataSource = cachedSource;
+ if (cachedSource->setCachedRange(
+ *offset, chunk_size,
+ mCachedSource != NULL /* assume ownership on success */) == OK) {
+ mDataSource = mCachedSource = cachedSource;
+ } else {
+ delete cachedSource;
}
}
@@ -3890,7 +3894,7 @@
MPEG4Source::MPEG4Source(
const sp<MetaData> &format,
- const sp<DataSource> &dataSource,
+ DataSourceBase *dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
Vector<SidxEntry> &sidx,
@@ -5379,7 +5383,7 @@
}
static bool LegacySniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence) {
+ DataSourceBase *source, String8 *mimeType, float *confidence) {
uint8_t header[8];
ssize_t n = source->readAt(4, header, sizeof(header));
@@ -5446,7 +5450,7 @@
// (end of the 'moov' atom) and report it to the caller as part of
// the metadata.
static bool BetterSniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *meta) {
// We scan up to 128 bytes to identify this file as an MP4.
static const off64_t kMaxScanOffset = 128ll;
@@ -5563,13 +5567,13 @@
}
static MediaExtractor* CreateExtractor(
- const sp<DataSource> &source,
+ DataSourceBase *source,
const sp<AMessage>& meta __unused) {
return new MPEG4Extractor(source);
}
static MediaExtractor::CreatorFunc Sniff(
- const sp<DataSource> &source,
+ DataSourceBase *source,
String8 *mimeType,
float *confidence,
sp<AMessage> *meta) {
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index e947b87..644c430 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -20,7 +20,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/MediaExtractor.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/List.h>
@@ -29,7 +29,8 @@
namespace android {
struct AMessage;
-class DataSource;
+class DataSourceBase;
+struct CachedRangedDataSource;
class SampleTable;
class String8;
namespace heif {
@@ -52,8 +53,7 @@
class MPEG4Extractor : public MediaExtractor {
public:
- // Extractor assumes ownership of "source".
- explicit MPEG4Extractor(const sp<DataSource> &source, const char *mime = NULL);
+ explicit MPEG4Extractor(DataSourceBase *source, const char *mime = NULL);
virtual size_t countTracks();
virtual MediaSourceBase *getTrack(size_t index);
@@ -62,7 +62,6 @@
virtual sp<MetaData> getMetaData();
virtual uint32_t flags() const;
virtual const char * name() { return "MPEG4Extractor"; }
- virtual void release();
// for DRM
virtual char* getDrmTrackInfo(size_t trackID, int *len);
@@ -98,7 +97,8 @@
Vector<Trex> mTrex;
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
+ CachedRangedDataSource *mCachedSource;
status_t mInitCheck;
uint32_t mHeaderTimescale;
bool mIsQT;
@@ -160,7 +160,7 @@
};
bool SniffMPEG4(
- const sp<DataSource> &source, String8 *mimeType, float *confidence,
+ DataSourceBase *source, String8 *mimeType, float *confidence,
sp<AMessage> *);
} // namespace android
diff --git a/media/extractors/mp4/SampleIterator.cpp b/media/extractors/mp4/SampleIterator.cpp
index c194397..93ee7c6 100644
--- a/media/extractors/mp4/SampleIterator.cpp
+++ b/media/extractors/mp4/SampleIterator.cpp
@@ -22,7 +22,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
diff --git a/media/extractors/mp4/SampleTable.cpp b/media/extractors/mp4/SampleTable.cpp
index 378d63a..81c353e 100644
--- a/media/extractors/mp4/SampleTable.cpp
+++ b/media/extractors/mp4/SampleTable.cpp
@@ -25,7 +25,7 @@
#include <arpa/inet.h>
-#include <media/DataSource.h>
+#include <media/DataSourceBase.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ByteUtils.h>
@@ -114,7 +114,7 @@
////////////////////////////////////////////////////////////////////////////////
-SampleTable::SampleTable(const sp<DataSource> &source)
+SampleTable::SampleTable(DataSourceBase *source)
: mDataSource(source),
mChunkOffsetOffset(-1),
mChunkOffsetType(0),
diff --git a/media/extractors/mp4/SampleTable.h b/media/extractors/mp4/SampleTable.h
index 466e26b..e4e974b 100644
--- a/media/extractors/mp4/SampleTable.h
+++ b/media/extractors/mp4/SampleTable.h
@@ -27,12 +27,12 @@
namespace android {
-class DataSource;
+class DataSourceBase;
struct SampleIterator;
class SampleTable : public RefBase {
public:
- explicit SampleTable(const sp<DataSource> &source);
+ explicit SampleTable(DataSourceBase *source);
bool isValid() const;
@@ -99,7 +99,7 @@
// Limit the total size of all internal tables to 200MiB.
static const size_t kMaxTotalSize = 200 * (1 << 20);
- sp<DataSource> mDataSource;
+ DataSourceBase *mDataSource;
Mutex mLock;
off64_t mChunkOffsetOffset;