Close MediaDataSource on extractor/retriever release
instead of waiting for garbage collection.
Bug: 26911216
bug: 26741307
Change-Id: I79010066962a1bdb9cb8bf74ba9a7997abb82fd4
diff --git a/include/media/stagefright/DataSource.h b/include/media/stagefright/DataSource.h
index dcde36f..c5e09c0 100644
--- a/include/media/stagefright/DataSource.h
+++ b/include/media/stagefright/DataSource.h
@@ -107,6 +107,8 @@
virtual String8 getMIMEType() const;
+ virtual void close() {};
+
protected:
virtual ~DataSource() {}
diff --git a/media/libstagefright/CallbackDataSource.cpp b/media/libstagefright/CallbackDataSource.cpp
index e6303ba..bcbd78d 100644
--- a/media/libstagefright/CallbackDataSource.cpp
+++ b/media/libstagefright/CallbackDataSource.cpp
@@ -30,14 +30,15 @@
CallbackDataSource::CallbackDataSource(
const sp<IDataSource>& binderDataSource)
- : mIDataSource(binderDataSource) {
+ : mIDataSource(binderDataSource),
+ mIsClosed(false) {
// Set up the buffer to read into.
mMemory = mIDataSource->getIMemory();
}
CallbackDataSource::~CallbackDataSource() {
ALOGV("~CallbackDataSource");
- mIDataSource->close();
+ close();
}
status_t CallbackDataSource::initCheck() const {
@@ -99,6 +100,13 @@
return mIDataSource->getFlags();
}
+void CallbackDataSource::close() {
+ if (!mIsClosed) {
+ mIDataSource->close();
+ mIsClosed = true;
+ }
+}
+
TinyCacheSource::TinyCacheSource(const sp<DataSource>& source)
: mSource(source), mCachedOffset(0), mCachedSize(0) {
}
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp
index 5d762d8..5e0baa4 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -67,7 +67,7 @@
FileSource::~FileSource() {
if (mFd >= 0) {
- close(mFd);
+ ::close(mFd);
mFd = -1;
}
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index 6d1a460..cc38a12 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -55,6 +55,7 @@
}
mSelectedTracks.clear();
+ mDataSource->close();
}
status_t NuMediaExtractor::setDataSource(
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index 7027780..c6e3571 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -61,6 +61,7 @@
StagefrightMetadataRetriever::~StagefrightMetadataRetriever() {
ALOGV("~StagefrightMetadataRetriever()");
clearMetadata();
+ mSource->close();
}
status_t StagefrightMetadataRetriever::setDataSource(
diff --git a/media/libstagefright/include/CallbackDataSource.h b/media/libstagefright/include/CallbackDataSource.h
index 8c6fd8f..9b33810 100644
--- a/media/libstagefright/include/CallbackDataSource.h
+++ b/media/libstagefright/include/CallbackDataSource.h
@@ -37,10 +37,12 @@
virtual ssize_t readAt(off64_t offset, void *data, size_t size);
virtual status_t getSize(off64_t *size);
virtual uint32_t flags();
+ virtual void close();
private:
sp<IDataSource> mIDataSource;
sp<IMemory> mMemory;
+ bool mIsClosed;
DISALLOW_EVIL_CONSTRUCTORS(CallbackDataSource);
};
@@ -58,6 +60,7 @@
virtual ssize_t readAt(off64_t offset, void* data, size_t size);
virtual status_t getSize(off64_t* size);
virtual uint32_t flags();
+ virtual void close() { mSource->close(); }
private:
// 2kb comes from experimenting with the time-to-first-frame from a MediaPlayer