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
diff --git a/media/ndk/NdkMediaDataSource.cpp b/media/ndk/NdkMediaDataSource.cpp
index 9ea734b..2c44fa3 100644
--- a/media/ndk/NdkMediaDataSource.cpp
+++ b/media/ndk/NdkMediaDataSource.cpp
@@ -48,14 +48,18 @@
AMediaDataSourceReadAt readAt;
AMediaDataSourceGetSize getSize;
AMediaDataSourceClose close;
+ sp<DataSource> mImpl;
+ uint32_t mFlags;
};
NdkDataSource::NdkDataSource(AMediaDataSource *dataSource)
: mDataSource(AMediaDataSource_new()) {
- AMediaDataSource_setReadAt(mDataSource, dataSource->readAt);
- AMediaDataSource_setGetSize(mDataSource, dataSource->getSize);
- AMediaDataSource_setClose(mDataSource, dataSource->close);
- AMediaDataSource_setUserdata(mDataSource, dataSource->userdata);
+ AMediaDataSource_setReadAt(mDataSource, dataSource->readAt);
+ 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 @@
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 @@
}
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
diff --git a/media/ndk/NdkMediaDataSourcePriv.h b/media/ndk/NdkMediaDataSourcePriv.h
index 3b0aa59..8a5423c 100644
--- a/media/ndk/NdkMediaDataSourcePriv.h
+++ b/media/ndk/NdkMediaDataSourcePriv.h
@@ -44,6 +44,7 @@
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();