Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2b10b3d authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Fix and simplify cached datasource handling.

This fixes random CTS failures due to bad frees.

Bug: 111407253
Test: CTS

Change-Id: If8bdb92b735f83aa3b4d54035fdb0729a9c4ba61
parent 5a855fee
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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);
    }

+8 −11
Original line number Diff line number Diff line
@@ -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;
                    }
+0 −2
Original line number Diff line number Diff line
@@ -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;