Remove RefBase from MediaExtractor
Bug: 67908556
Test: build, boot
Change-Id: I9cc0f1bdb89c2da52f89a28471d4b86f30500abb
diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp
index e199f03..b7773a9 100644
--- a/media/extractors/mkv/MatroskaExtractor.cpp
+++ b/media/extractors/mkv/MatroskaExtractor.cpp
@@ -122,8 +122,7 @@
};
struct MatroskaSource : public MediaSource {
- MatroskaSource(
- const sp<MatroskaExtractor> &extractor, size_t index);
+ MatroskaSource(MatroskaExtractor *extractor, size_t index);
virtual status_t start(MetaData *params);
virtual status_t stop();
@@ -144,7 +143,7 @@
OTHER
};
- sp<MatroskaExtractor> mExtractor;
+ MatroskaExtractor *mExtractor;
size_t mTrackIndex;
Type mType;
bool mIsAudio;
@@ -211,12 +210,12 @@
}
MatroskaSource::MatroskaSource(
- const sp<MatroskaExtractor> &extractor, size_t index)
+ MatroskaExtractor *extractor, size_t index)
: mExtractor(extractor),
mTrackIndex(index),
mType(OTHER),
mIsAudio(false),
- mBlockIter(mExtractor.get(),
+ mBlockIter(mExtractor,
mExtractor->mTracks.itemAt(index).mTrackNum,
index),
mNALSizeLen(-1) {
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 938bd5d..6082d29 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -68,8 +68,7 @@
class MPEG4Source : public MediaSource {
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
- MPEG4Source(const sp<MPEG4Extractor> &owner,
- const sp<MetaData> &format,
+ MPEG4Source(const sp<MetaData> &format,
const sp<DataSource> &dataSource,
int32_t timeScale,
const sp<SampleTable> &sampleTable,
@@ -94,8 +93,6 @@
private:
Mutex mLock;
- // keep the MPEG4Extractor around, since we're referencing its data
- sp<MPEG4Extractor> mOwner;
sp<MetaData> mFormat;
sp<DataSource> mDataSource;
int32_t mTimescale;
@@ -3488,7 +3485,7 @@
}
}
- sp<MPEG4Source> source = new MPEG4Source(this,
+ sp<MPEG4Source> source = new MPEG4Source(
track->meta, mDataSource, track->timescale, track->sampleTable,
mSidxEntries, trex, mMoofOffset, itemTable);
if (source->init() != OK) {
@@ -3884,7 +3881,6 @@
////////////////////////////////////////////////////////////////////////////////
MPEG4Source::MPEG4Source(
- const sp<MPEG4Extractor> &owner,
const sp<MetaData> &format,
const sp<DataSource> &dataSource,
int32_t timeScale,
@@ -3893,8 +3889,7 @@
const Trex *trex,
off64_t firstMoofOffset,
const sp<ItemTable> &itemTable)
- : mOwner(owner),
- mFormat(format),
+ : mFormat(format),
mDataSource(dataSource),
mTimescale(timeScale),
mSampleTable(sampleTable),
diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
index c519caf..e86f62c 100644
--- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp
@@ -73,7 +73,7 @@
};
struct MPEG2PSExtractor::WrappedTrack : public MediaSource {
- WrappedTrack(const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track);
+ WrappedTrack(MPEG2PSExtractor *extractor, const sp<Track> &track);
virtual status_t start(MetaData *params);
virtual status_t stop();
@@ -86,7 +86,7 @@
virtual ~WrappedTrack();
private:
- sp<MPEG2PSExtractor> mExtractor;
+ MPEG2PSExtractor *mExtractor;
sp<MPEG2PSExtractor::Track> mTrack;
DISALLOW_EVIL_CONSTRUCTORS(WrappedTrack);
@@ -723,7 +723,7 @@
////////////////////////////////////////////////////////////////////////////////
MPEG2PSExtractor::WrappedTrack::WrappedTrack(
- const sp<MPEG2PSExtractor> &extractor, const sp<Track> &track)
+ MPEG2PSExtractor *extractor, const sp<Track> &track)
: mExtractor(extractor),
mTrack(track) {
}
diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
index 5beaeda..a21ed47 100644
--- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp
+++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp
@@ -51,9 +51,10 @@
struct MPEG2TSSource : public MediaSource {
MPEG2TSSource(
- const sp<MPEG2TSExtractor> &extractor,
+ MPEG2TSExtractor *extractor,
const sp<AnotherPacketSource> &impl,
bool doesSeek);
+ virtual ~MPEG2TSSource();
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
@@ -63,7 +64,7 @@
MediaBuffer **buffer, const ReadOptions *options = NULL);
private:
- sp<MPEG2TSExtractor> mExtractor;
+ MPEG2TSExtractor *mExtractor;
sp<AnotherPacketSource> mImpl;
// If there are both audio and video streams, only the video stream
@@ -74,7 +75,7 @@
};
MPEG2TSSource::MPEG2TSSource(
- const sp<MPEG2TSExtractor> &extractor,
+ MPEG2TSExtractor *extractor,
const sp<AnotherPacketSource> &impl,
bool doesSeek)
: mExtractor(extractor),
@@ -82,6 +83,9 @@
mDoesSeek(doesSeek) {
}
+MPEG2TSSource::~MPEG2TSSource() {
+}
+
status_t MPEG2TSSource::start(MetaData *params) {
return mImpl->start(params);
}
diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp
index f42a6a8..a2091d5 100644
--- a/media/extractors/ogg/OggExtractor.cpp
+++ b/media/extractors/ogg/OggExtractor.cpp
@@ -46,7 +46,7 @@
namespace android {
struct OggSource : public MediaSource {
- explicit OggSource(const sp<OggExtractor> &extractor);
+ explicit OggSource(OggExtractor *extractor);
virtual sp<MetaData> getFormat();
@@ -60,7 +60,7 @@
virtual ~OggSource();
private:
- sp<OggExtractor> mExtractor;
+ OggExtractor *mExtractor;
bool mStarted;
OggSource(const OggSource &);
@@ -224,7 +224,7 @@
////////////////////////////////////////////////////////////////////////////////
-OggSource::OggSource(const sp<OggExtractor> &extractor)
+OggSource::OggSource(OggExtractor *extractor)
: mExtractor(extractor),
mStarted(false) {
}
diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp
index 6c5f893..6d799fd 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -564,8 +564,10 @@
return NULL;
}
- sp<MediaExtractor> extractor = new WAVExtractor(source);
- if (extractor->countTracks() == 0) {
+ MediaExtractor *extractor = new WAVExtractor(source);
+ int numTracks = extractor->countTracks();
+ delete extractor;
+ if (numTracks == 0) {
return NULL;
}
diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h
index 98a2dfa..3d98ee9 100644
--- a/media/extractors/wav/WAVExtractor.h
+++ b/media/extractors/wav/WAVExtractor.h
@@ -39,7 +39,6 @@
virtual sp<MetaData> getMetaData();
virtual const char * name() { return "WAVExtractor"; }
-protected:
virtual ~WAVExtractor();
private:
diff --git a/media/libmediaextractor/include/media/MediaExtractor.h b/media/libmediaextractor/include/media/MediaExtractor.h
index 276cbed..2269c1b 100644
--- a/media/libmediaextractor/include/media/MediaExtractor.h
+++ b/media/libmediaextractor/include/media/MediaExtractor.h
@@ -33,8 +33,23 @@
struct MediaSource;
typedef std::vector<uint8_t> HInterfaceToken;
-class MediaExtractor : public RefBase {
+
+class ExtractorAllocTracker {
public:
+ ExtractorAllocTracker() {
+ ALOGD("extractor allocated: %p", this);
+ }
+ virtual ~ExtractorAllocTracker() {
+ ALOGD("extractor freed: %p", this);
+ }
+};
+
+
+class MediaExtractor
+// : public ExtractorAllocTracker
+{
+public:
+ virtual ~MediaExtractor();
virtual size_t countTracks() = 0;
virtual sp<MediaSource> getTrack(size_t index) = 0;
@@ -112,7 +127,6 @@
protected:
MediaExtractor();
- virtual ~MediaExtractor();
private:
MediaExtractor(const MediaExtractor &);
diff --git a/media/libstagefright/InterfaceUtils.cpp b/media/libstagefright/InterfaceUtils.cpp
index f174ba4..ee54d66 100644
--- a/media/libstagefright/InterfaceUtils.cpp
+++ b/media/libstagefright/InterfaceUtils.cpp
@@ -19,7 +19,6 @@
#include <media/stagefright/CallbackMediaSource.h>
#include <media/stagefright/InterfaceUtils.h>
#include <media/stagefright/RemoteDataSource.h>
-#include <media/stagefright/RemoteMediaExtractor.h>
#include <media/stagefright/RemoteMediaSource.h>
namespace android {
@@ -39,7 +38,7 @@
}
sp<IMediaExtractor> CreateIMediaExtractorFromMediaExtractor(
- const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin) {
+ MediaExtractor *extractor, const sp<RefBase> &plugin) {
if (extractor == nullptr) {
return nullptr;
}
@@ -54,11 +53,12 @@
}
sp<IMediaSource> CreateIMediaSourceFromMediaSource(
+ const sp<RemoteMediaExtractor> &extractor,
const sp<MediaSource> &source, const sp<RefBase> &plugin) {
if (source == nullptr) {
return nullptr;
}
- return RemoteMediaSource::wrap(source, plugin);
+ return RemoteMediaSource::wrap(extractor, source, plugin);
}
} // namespace android
diff --git a/media/libstagefright/RemoteMediaExtractor.cpp b/media/libstagefright/RemoteMediaExtractor.cpp
index 12654d9..bff1996 100644
--- a/media/libstagefright/RemoteMediaExtractor.cpp
+++ b/media/libstagefright/RemoteMediaExtractor.cpp
@@ -37,7 +37,7 @@
static const char *kExtractorFormat = "android.media.mediaextractor.fmt";
RemoteMediaExtractor::RemoteMediaExtractor(
- const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin)
+ MediaExtractor *extractor, const sp<RefBase> &plugin)
:mExtractor(extractor),
mExtractorPlugin(plugin) {
@@ -67,7 +67,7 @@
}
RemoteMediaExtractor::~RemoteMediaExtractor() {
- mExtractor = nullptr;
+ delete mExtractor;
mExtractorPlugin = nullptr;
// log the current record, provided it has some information worth recording
if (MEDIA_LOG) {
@@ -91,7 +91,7 @@
sp<IMediaSource> RemoteMediaExtractor::getTrack(size_t index) {
sp<MediaSource> source = mExtractor->getTrack(index);
return (source.get() == nullptr)
- ? nullptr : CreateIMediaSourceFromMediaSource(source, mExtractorPlugin);
+ ? nullptr : CreateIMediaSourceFromMediaSource(this, source, mExtractorPlugin);
}
sp<MetaData> RemoteMediaExtractor::getTrackMetaData(size_t index, uint32_t flags) {
@@ -139,8 +139,8 @@
// static
sp<IMediaExtractor> RemoteMediaExtractor::wrap(
- const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin) {
- if (extractor.get() == nullptr) {
+ MediaExtractor *extractor, const sp<RefBase> &plugin) {
+ if (extractor == nullptr) {
return nullptr;
}
return new RemoteMediaExtractor(extractor, plugin);
diff --git a/media/libstagefright/RemoteMediaSource.cpp b/media/libstagefright/RemoteMediaSource.cpp
index d97329c..760d567 100644
--- a/media/libstagefright/RemoteMediaSource.cpp
+++ b/media/libstagefright/RemoteMediaSource.cpp
@@ -14,14 +14,19 @@
* limitations under the License.
*/
+#include <media/stagefright/RemoteMediaExtractor.h>
#include <media/stagefright/RemoteMediaSource.h>
#include <media/IMediaSource.h>
namespace android {
-RemoteMediaSource::RemoteMediaSource(const sp<MediaSource> &source, const sp<RefBase> &plugin)
- :mSource(source),
- mExtractorPlugin(plugin) {}
+RemoteMediaSource::RemoteMediaSource(
+ const sp<RemoteMediaExtractor> &extractor,
+ const sp<MediaSource> &source,
+ const sp<RefBase> &plugin)
+ : mExtractor(extractor),
+ mSource(source),
+ mExtractorPlugin(plugin) {}
RemoteMediaSource::~RemoteMediaSource() {
mSource = nullptr;
@@ -55,11 +60,13 @@
////////////////////////////////////////////////////////////////////////////////
// static
-sp<IMediaSource> RemoteMediaSource::wrap(const sp<MediaSource> &source, const sp<RefBase> &plugin) {
+sp<IMediaSource> RemoteMediaSource::wrap(
+ const sp<RemoteMediaExtractor> &extractor,
+ const sp<MediaSource> &source, const sp<RefBase> &plugin) {
if (source.get() == nullptr) {
return nullptr;
}
- return new RemoteMediaSource(source, plugin);
+ return new RemoteMediaSource(extractor, source, plugin);
}
} // namespace android
diff --git a/media/libstagefright/include/media/stagefright/InterfaceUtils.h b/media/libstagefright/include/media/stagefright/InterfaceUtils.h
index d449aec..ad24472 100644
--- a/media/libstagefright/include/media/stagefright/InterfaceUtils.h
+++ b/media/libstagefright/include/media/stagefright/InterfaceUtils.h
@@ -18,6 +18,11 @@
#define INTERFACE_UTILS_H_
#include <utils/RefBase.h>
+#include <media/MediaExtractor.h>
+#include <media/stagefright/RemoteMediaExtractor.h>
+#include <media/MediaSource.h>
+#include <media/IMediaExtractor.h>
+#include <media/IMediaSource.h>
namespace android {
@@ -36,13 +41,14 @@
// Creates an IMediaExtractor wrapper to the given MediaExtractor.
sp<IMediaExtractor> CreateIMediaExtractorFromMediaExtractor(
- const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin);
+ MediaExtractor *extractor, const sp<RefBase> &plugin);
// Creates a MediaSource which wraps the given IMediaSource object.
sp<MediaSource> CreateMediaSourceFromIMediaSource(const sp<IMediaSource> &source);
// Creates an IMediaSource wrapper to the given MediaSource.
sp<IMediaSource> CreateIMediaSourceFromMediaSource(
+ const sp<RemoteMediaExtractor> &extractor,
const sp<MediaSource> &source, const sp<RefBase> &plugin);
} // namespace android
diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
index bdbad7a..78f3a84 100644
--- a/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
+++ b/media/libstagefright/include/media/stagefright/RemoteMediaExtractor.h
@@ -28,7 +28,7 @@
// IMediaExtractor wrapper to the MediaExtractor.
class RemoteMediaExtractor : public BnMediaExtractor {
public:
- static sp<IMediaExtractor> wrap(const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin);
+ static sp<IMediaExtractor> wrap(MediaExtractor *extractor, const sp<RefBase> &plugin);
virtual ~RemoteMediaExtractor();
virtual size_t countTracks();
@@ -44,12 +44,12 @@
virtual void release();
private:
- sp<MediaExtractor> mExtractor;
+ MediaExtractor *mExtractor;
sp<RefBase> mExtractorPlugin;
MediaAnalyticsItem *mAnalyticsItem;
- explicit RemoteMediaExtractor(const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin);
+ explicit RemoteMediaExtractor(MediaExtractor *extractor, const sp<RefBase> &plugin);
DISALLOW_EVIL_CONSTRUCTORS(RemoteMediaExtractor);
};
diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaSource.h b/media/libstagefright/include/media/stagefright/RemoteMediaSource.h
index cb222cc..d44adf3 100644
--- a/media/libstagefright/include/media/stagefright/RemoteMediaSource.h
+++ b/media/libstagefright/include/media/stagefright/RemoteMediaSource.h
@@ -26,7 +26,10 @@
// IMediaSrouce wrapper to the MediaSource.
class RemoteMediaSource : public BnMediaSource {
public:
- static sp<IMediaSource> wrap(const sp<MediaSource> &source, const sp<RefBase> &plugin);
+ static sp<IMediaSource> wrap(
+ const sp<RemoteMediaExtractor> &extractor,
+ const sp<MediaSource> &source,
+ const sp<RefBase> &plugin);
virtual ~RemoteMediaSource();
virtual status_t start(MetaData *params = NULL);
virtual status_t stop();
@@ -38,10 +41,14 @@
virtual status_t setStopTimeUs(int64_t stopTimeUs);
private:
+ sp<RemoteMediaExtractor> mExtractor;
sp<MediaSource> mSource;
sp<RefBase> mExtractorPlugin;
- explicit RemoteMediaSource(const sp<MediaSource> &source, const sp<RefBase> &plugin);
+ explicit RemoteMediaSource(
+ const sp<RemoteMediaExtractor> &extractor,
+ const sp<MediaSource> &source,
+ const sp<RefBase> &plugin);
DISALLOW_EVIL_CONSTRUCTORS(RemoteMediaSource);
};