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;
}
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);
}
status_t getSize(off64_t *size) {
virtual status_t getSize(off64_t *size) {
return mSource->getSize(mSource->handle, size);
}
@ -141,7 +143,7 @@ public:
return mSource->getUri(mSource->handle, uriString, bufferSize);
}
uint32_t flags() {
virtual uint32_t flags() {
return mSource->flags(mSource->handle);
}

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

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

Loading…
Cancel
Save