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

Commit a601f4ae authored by Robert Shih's avatar Robert Shih
Browse files

Improve NDK to framework DataSource adaptor

+ propagate DataSource::flags values
+ keep reference to internal DataSource to avoid use-after-free

Bug: 109928575
Test: android.media.cts.NativeDecoderTest#testExtractor
Change-Id: I8c696fa510195ed616b117135aea3911c88e44bd
parent 37013f15
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -48,6 +48,8 @@ struct AMediaDataSource {
    AMediaDataSourceReadAt readAt;
    AMediaDataSourceGetSize getSize;
    AMediaDataSourceClose close;
    sp<DataSource> mImpl;
    uint32_t mFlags;
};

NdkDataSource::NdkDataSource(AMediaDataSource *dataSource)
@@ -56,6 +58,8 @@ NdkDataSource::NdkDataSource(AMediaDataSource *dataSource)
    AMediaDataSource_setGetSize(mDataSource, dataSource->getSize);
    AMediaDataSource_setClose(mDataSource, dataSource->close);
    AMediaDataSource_setUserdata(mDataSource, dataSource->userdata);
    mDataSource->mImpl = dataSource->mImpl;
    mDataSource->mFlags = dataSource->mFlags;
}

NdkDataSource::~NdkDataSource() {
@@ -66,9 +70,13 @@ status_t NdkDataSource::initCheck() const {
    return OK;
}

uint32_t NdkDataSource::flags() {
    return mDataSource->mFlags;
}

ssize_t NdkDataSource::readAt(off64_t offset, void *data, size_t size) {
    Mutex::Autolock l(mLock);
    if (mDataSource->getSize == NULL || mDataSource->userdata == NULL) {
    if (mDataSource->readAt == NULL || mDataSource->userdata == NULL) {
        return -1;
    }
    return mDataSource->readAt(mDataSource->userdata, offset, data, size);
@@ -204,7 +212,10 @@ AMediaDataSource* AMediaDataSource_newUri(
    }

    sp<DataSource> source = DataSourceFactory::CreateFromURI(service, uri, &headers);
    return convertDataSourceToAMediaDataSource(source);
    AMediaDataSource* aSource = convertDataSourceToAMediaDataSource(source);
    aSource->mImpl = source;
    aSource->mFlags = source->flags();
    return aSource;
}

EXPORT
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ struct NdkDataSource : public DataSource {
    NdkDataSource(AMediaDataSource *);

    virtual status_t initCheck() const;
    virtual uint32_t flags();
    virtual ssize_t readAt(off64_t offset, void *data, size_t size);
    virtual status_t getSize(off64_t *);
    virtual String8 toString();