Fix and simplify cached datasource handling.

This fixes random CTS failures due to bad frees.

Bug: 111407253
Test: CTS

Change-Id: If8bdb92b735f83aa3b4d54035fdb0729a9c4ba61
gugelfrei
Marco Nelissen 6 years ago
parent 5a855fee64
commit c2b10b3dbe

@ -129,11 +129,13 @@ public:
mSource = source->mSource; mSource = source->mSource;
} }
ssize_t readAt(off64_t offset, void *data, size_t size) { virtual ~DataSourceHelper() {}
virtual ssize_t readAt(off64_t offset, void *data, size_t size) {
return mSource->readAt(mSource->handle, offset, data, size); return mSource->readAt(mSource->handle, offset, data, size);
} }
status_t getSize(off64_t *size) { virtual status_t getSize(off64_t *size) {
return mSource->getSize(mSource->handle, size); return mSource->getSize(mSource->handle, size);
} }
@ -141,7 +143,7 @@ public:
return mSource->getUri(mSource->handle, uriString, bufferSize); return mSource->getUri(mSource->handle, uriString, bufferSize);
} }
uint32_t flags() { virtual uint32_t flags() {
return mSource->flags(mSource->handle); return mSource->flags(mSource->handle);
} }

@ -198,13 +198,14 @@ private:
// possibly wrapping multiple times to cover all tracks, i.e. // possibly wrapping multiple times to cover all tracks, i.e.
// Each CachedRangedDataSource caches the sampletable metadata for a single track. // Each CachedRangedDataSource caches the sampletable metadata for a single track.
struct CachedRangedDataSource : public DataSourceHelper { class CachedRangedDataSource : public DataSourceHelper {
public:
explicit CachedRangedDataSource(DataSourceHelper *source); explicit CachedRangedDataSource(DataSourceHelper *source);
virtual ~CachedRangedDataSource(); virtual ~CachedRangedDataSource();
virtual ssize_t readAt(off64_t offset, void *data, size_t size); ssize_t readAt(off64_t offset, void *data, size_t size) override;
virtual status_t getSize(off64_t *size); status_t getSize(off64_t *size) override;
virtual uint32_t flags(); uint32_t flags() override;
status_t setCachedRange(off64_t offset, size_t size, bool assumeSourceOwnershipOnSuccess); status_t setCachedRange(off64_t offset, size_t size, bool assumeSourceOwnershipOnSuccess);
@ -236,7 +237,7 @@ CachedRangedDataSource::CachedRangedDataSource(DataSourceHelper *source)
CachedRangedDataSource::~CachedRangedDataSource() { CachedRangedDataSource::~CachedRangedDataSource() {
clearCache(); clearCache();
if (mOwnsDataSource) { if (mOwnsDataSource) {
delete (CachedRangedDataSource*)mSource; delete mSource;
} }
} }
@ -366,7 +367,6 @@ MPEG4Extractor::MPEG4Extractor(DataSourceHelper *source, const char *mime)
mMoofFound(false), mMoofFound(false),
mMdatFound(false), mMdatFound(false),
mDataSource(source), mDataSource(source),
mCachedSource(NULL),
mInitCheck(NO_INIT), mInitCheck(NO_INIT),
mHeaderTimescale(0), mHeaderTimescale(0),
mIsQT(false), mIsQT(false),
@ -393,9 +393,6 @@ MPEG4Extractor::~MPEG4Extractor() {
} }
mPssh.clear(); mPssh.clear();
if (mCachedSource != mDataSource) {
delete mCachedSource;
}
delete mDataSource; delete mDataSource;
} }
@ -909,8 +906,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
if (cachedSource->setCachedRange( if (cachedSource->setCachedRange(
*offset, chunk_size, *offset, chunk_size,
mCachedSource != NULL /* assume ownership on success */) == OK) { true /* assume ownership on success */) == OK) {
mDataSource = mCachedSource = cachedSource; mDataSource = cachedSource;
} else { } else {
delete cachedSource; delete cachedSource;
} }

@ -33,7 +33,6 @@ namespace android {
struct AMessage; struct AMessage;
struct CDataSource; struct CDataSource;
class DataSourceHelper; class DataSourceHelper;
struct CachedRangedDataSource;
class SampleTable; class SampleTable;
class String8; class String8;
namespace heif { namespace heif {
@ -99,7 +98,6 @@ private:
Vector<Trex> mTrex; Vector<Trex> mTrex;
DataSourceHelper *mDataSource; DataSourceHelper *mDataSource;
CachedRangedDataSource *mCachedSource;
status_t mInitCheck; status_t mInitCheck;
uint32_t mHeaderTimescale; uint32_t mHeaderTimescale;
bool mIsQT; bool mIsQT;

Loading…
Cancel
Save