From cb30d8477cbd16dcef6acee1e07dedfa246e9456 Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Fri, 26 Jan 2018 15:29:02 -0800 Subject: [PATCH] Remove RefBase from plugin-side MediaSource Extractor plugins now use MediaSourceBase, which is not refcounted. Framework-side MediaSource derives from MediaSourceBase and RefBase. Bug: 67908556 Test: build, boot Change-Id: Ie33ca07f0d0ba783a504d7b7bf1a75ca4acdd745 --- include/media/MediaSourceBase.h | 1 + media/extractors/aac/AACExtractor.cpp | 6 +- media/extractors/aac/AACExtractor.h | 2 +- media/extractors/amr/AMRExtractor.cpp | 6 +- media/extractors/amr/AMRExtractor.h | 2 +- media/extractors/flac/FLACExtractor.cpp | 6 +- media/extractors/flac/FLACExtractor.h | 2 +- media/extractors/midi/MidiExtractor.cpp | 6 +- media/extractors/midi/MidiExtractor.h | 2 +- media/extractors/mkv/MatroskaExtractor.cpp | 6 +- media/extractors/mkv/MatroskaExtractor.h | 2 +- media/extractors/mp3/MP3Extractor.cpp | 6 +- media/extractors/mp3/MP3Extractor.h | 2 +- media/extractors/mp4/MPEG4Extractor.cpp | 10 +- media/extractors/mp4/MPEG4Extractor.h | 2 +- media/extractors/mpeg2/MPEG2PSExtractor.cpp | 8 +- media/extractors/mpeg2/MPEG2PSExtractor.h | 2 +- media/extractors/mpeg2/MPEG2TSExtractor.cpp | 16 +- media/extractors/mpeg2/MPEG2TSExtractor.h | 4 +- media/extractors/ogg/OggExtractor.cpp | 6 +- media/extractors/ogg/OggExtractor.h | 2 +- media/extractors/wav/WAVExtractor.cpp | 6 +- media/extractors/wav/WAVExtractor.h | 2 +- media/libmediaextractor/Android.bp | 1 + media/libmediaextractor/MediaSource.cpp | 41 ----- media/libmediaextractor/MediaSourceBase.cpp | 68 ++++++++ .../include/media/MediaExtractor.h | 4 +- .../include/media/MediaSource.h | 96 +---------- .../include/media/MediaSourceBase.h | 149 ++++++++++++++++++ media/libstagefright/InterfaceUtils.cpp | 4 +- media/libstagefright/RemoteMediaExtractor.cpp | 6 +- media/libstagefright/RemoteMediaSource.cpp | 8 +- .../media/stagefright/InterfaceUtils.h | 4 +- .../media/stagefright/RemoteMediaSource.h | 6 +- 34 files changed, 291 insertions(+), 203 deletions(-) create mode 120000 include/media/MediaSourceBase.h create mode 100644 media/libmediaextractor/MediaSourceBase.cpp create mode 100644 media/libmediaextractor/include/media/MediaSourceBase.h diff --git a/include/media/MediaSourceBase.h b/include/media/MediaSourceBase.h new file mode 120000 index 0000000000..fe227b1a97 --- /dev/null +++ b/include/media/MediaSourceBase.h @@ -0,0 +1 @@ +../../media/libmediaextractor/include/media/MediaSourceBase.h \ No newline at end of file diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp index dfb54e22c5..17d6aeed00 100644 --- a/media/extractors/aac/AACExtractor.cpp +++ b/media/extractors/aac/AACExtractor.cpp @@ -20,7 +20,7 @@ #include "AACExtractor.h" #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ namespace android { -class AACSource : public MediaSource { +class AACSource : public MediaSourceBase { public: AACSource(const sp &source, const sp &meta, @@ -207,7 +207,7 @@ size_t AACExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -sp AACExtractor::getTrack(size_t index) { +MediaSourceBase *AACExtractor::getTrack(size_t index) { if (mInitCheck != OK || index != 0) { return NULL; } diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h index aede185175..33fbba7dca 100644 --- a/media/extractors/aac/AACExtractor.h +++ b/media/extractors/aac/AACExtractor.h @@ -32,7 +32,7 @@ public: AACExtractor(const sp &source, const sp &meta); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp index b8967bde59..10be50cce9 100644 --- a/media/extractors/amr/AMRExtractor.cpp +++ b/media/extractors/amr/AMRExtractor.cpp @@ -21,7 +21,7 @@ #include "AMRExtractor.h" #include -#include +#include #include #include #include @@ -31,7 +31,7 @@ namespace android { -class AMRSource : public MediaSource { +class AMRSource : public MediaSourceBase { public: AMRSource(const sp &source, const sp &meta, @@ -186,7 +186,7 @@ size_t AMRExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -sp AMRExtractor::getTrack(size_t index) { +MediaSourceBase *AMRExtractor::getTrack(size_t index) { if (mInitCheck != OK || index != 0) { return NULL; } diff --git a/media/extractors/amr/AMRExtractor.h b/media/extractors/amr/AMRExtractor.h index 79b22d6c3c..56883e397c 100644 --- a/media/extractors/amr/AMRExtractor.h +++ b/media/extractors/amr/AMRExtractor.h @@ -32,7 +32,7 @@ public: explicit AMRExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp index 0c88246317..ba28e86933 100644 --- a/media/extractors/flac/FLACExtractor.cpp +++ b/media/extractors/flac/FLACExtractor.cpp @@ -23,7 +23,7 @@ #include "FLAC/stream_decoder.h" #include -#include +#include #include #include #include @@ -161,7 +161,7 @@ static void parseVorbisComment( class FLACParser; -class FLACSource : public MediaSource { +class FLACSource : public MediaSourceBase { public: FLACSource( @@ -936,7 +936,7 @@ size_t FLACExtractor::countTracks() return mInitCheck == OK ? 1 : 0; } -sp FLACExtractor::getTrack(size_t index) +MediaSourceBase *FLACExtractor::getTrack(size_t index) { if (mInitCheck != OK || index > 0) { return NULL; diff --git a/media/extractors/flac/FLACExtractor.h b/media/extractors/flac/FLACExtractor.h index 6907ceb18d..2e7ee3b98d 100644 --- a/media/extractors/flac/FLACExtractor.h +++ b/media/extractors/flac/FLACExtractor.h @@ -32,7 +32,7 @@ public: explicit FLACExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp index a8509fc64a..18b1d23ddd 100644 --- a/media/extractors/midi/MidiExtractor.cpp +++ b/media/extractors/midi/MidiExtractor.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include namespace android { @@ -33,7 +33,7 @@ namespace android { // how many Sonivox output buffers to aggregate into one MediaBuffer static const int NUM_COMBINE_BUFFERS = 4; -class MidiSource : public MediaSource { +class MidiSource : public MediaSourceBase { public: MidiSource( @@ -282,7 +282,7 @@ size_t MidiExtractor::countTracks() return mInitCheck == OK ? 1 : 0; } -sp MidiExtractor::getTrack(size_t index) +MediaSourceBase *MidiExtractor::getTrack(size_t index) { if (mInitCheck != OK || index > 0) { return NULL; diff --git a/media/extractors/midi/MidiExtractor.h b/media/extractors/midi/MidiExtractor.h index 0fae94a8cd..87e4654c38 100644 --- a/media/extractors/midi/MidiExtractor.h +++ b/media/extractors/midi/MidiExtractor.h @@ -56,7 +56,7 @@ public: explicit MidiExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp index b7773a9b70..7baccb7711 100644 --- a/media/extractors/mkv/MatroskaExtractor.cpp +++ b/media/extractors/mkv/MatroskaExtractor.cpp @@ -22,7 +22,7 @@ #include "MatroskaExtractor.h" #include -#include +#include #include #include #include @@ -121,7 +121,7 @@ private: BlockIterator &operator=(const BlockIterator &); }; -struct MatroskaSource : public MediaSource { +struct MatroskaSource : public MediaSourceBase { MatroskaSource(MatroskaExtractor *extractor, size_t index); virtual status_t start(MetaData *params); @@ -927,7 +927,7 @@ size_t MatroskaExtractor::countTracks() { return mTracks.size(); } -sp MatroskaExtractor::getTrack(size_t index) { +MediaSourceBase *MatroskaExtractor::getTrack(size_t index) { if (index >= mTracks.size()) { return NULL; } diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h index 26f8d19fbd..54419bf62a 100644 --- a/media/extractors/mkv/MatroskaExtractor.h +++ b/media/extractors/mkv/MatroskaExtractor.h @@ -38,7 +38,7 @@ struct MatroskaExtractor : public MediaExtractor { virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData( size_t index, uint32_t flags); diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp index f26ed251b2..7e27fd8088 100644 --- a/media/extractors/mp3/MP3Extractor.cpp +++ b/media/extractors/mp3/MP3Extractor.cpp @@ -25,7 +25,7 @@ #include "XINGSeeker.h" #include -#include +#include #include #include #include @@ -209,7 +209,7 @@ static bool Resync( return valid; } -class MP3Source : public MediaSource { +class MP3Source : public MediaSourceBase { public: MP3Source( const sp &meta, const sp &source, @@ -407,7 +407,7 @@ size_t MP3Extractor::countTracks() { return mInitCheck != OK ? 0 : 1; } -sp MP3Extractor::getTrack(size_t index) { +MediaSourceBase *MP3Extractor::getTrack(size_t index) { if (mInitCheck != OK || index != 0) { return NULL; } diff --git a/media/extractors/mp3/MP3Extractor.h b/media/extractors/mp3/MP3Extractor.h index f0ab6b09d1..3b3387d372 100644 --- a/media/extractors/mp3/MP3Extractor.h +++ b/media/extractors/mp3/MP3Extractor.h @@ -34,7 +34,7 @@ public: MP3Extractor(const sp &source, const sp &meta); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index 6082d293a5..e88a46443f 100644 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -31,7 +31,7 @@ #include "ItemTable.h" #include "include/ESDS.h" -#include +#include #include #include #include @@ -65,7 +65,7 @@ enum { kMaxAtomSize = 64 * 1024 * 1024, }; -class MPEG4Source : public MediaSource { +class MPEG4Source : public MediaSourceBase { public: // Caller retains ownership of both "dataSource" and "sampleTable". MPEG4Source(const sp &format, @@ -87,7 +87,6 @@ public: virtual bool supportNonblockingRead() { return true; } virtual status_t fragmentedRead(MediaBuffer **buffer, const ReadOptions *options = NULL); -protected: virtual ~MPEG4Source(); private: @@ -3409,7 +3408,7 @@ void MPEG4Extractor::parseID3v2MetaData(off64_t offset) { } } -sp MPEG4Extractor::getTrack(size_t index) { +MediaSourceBase *MPEG4Extractor::getTrack(size_t index) { status_t err; if ((err = readMetaData()) != OK) { return NULL; @@ -3485,10 +3484,11 @@ sp MPEG4Extractor::getTrack(size_t index) { } } - sp source = new MPEG4Source( + MPEG4Source *source = new MPEG4Source( track->meta, mDataSource, track->timescale, track->sampleTable, mSidxEntries, trex, mMoofOffset, itemTable); if (source->init() != OK) { + delete source; return NULL; } return source; diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index 35c532111b..e947b876b3 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -56,7 +56,7 @@ public: explicit MPEG4Extractor(const sp &source, const char *mime = NULL); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp index e86f62c081..0978387795 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp @@ -24,7 +24,7 @@ #include "mpeg2ts/ESQueue.h" #include -#include +#include #include #include #include @@ -40,7 +40,7 @@ namespace android { -struct MPEG2PSExtractor::Track : public MediaSource { +struct MPEG2PSExtractor::Track : public MediaSourceBase, public RefBase { Track(MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type); @@ -72,7 +72,7 @@ private: DISALLOW_EVIL_CONSTRUCTORS(Track); }; -struct MPEG2PSExtractor::WrappedTrack : public MediaSource { +struct MPEG2PSExtractor::WrappedTrack : public MediaSourceBase { WrappedTrack(MPEG2PSExtractor *extractor, const sp &track); virtual status_t start(MetaData *params); @@ -125,7 +125,7 @@ size_t MPEG2PSExtractor::countTracks() { return mTracks.size(); } -sp MPEG2PSExtractor::getTrack(size_t index) { +MediaSourceBase *MPEG2PSExtractor::getTrack(size_t index) { if (index >= mTracks.size()) { return NULL; } diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.h b/media/extractors/mpeg2/MPEG2PSExtractor.h index ab3ab05b1f..f8a97ef92f 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.h +++ b/media/extractors/mpeg2/MPEG2PSExtractor.h @@ -34,7 +34,7 @@ struct MPEG2PSExtractor : public MediaExtractor { explicit MPEG2PSExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp index a21ed47453..b24e8db83c 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include #include @@ -49,7 +49,7 @@ static const size_t kTSPacketSize = 188; static const int kMaxDurationReadSize = 250000LL; static const int kMaxDurationRetry = 6; -struct MPEG2TSSource : public MediaSource { +struct MPEG2TSSource : public MediaSourceBase { MPEG2TSSource( MPEG2TSExtractor *extractor, const sp &impl, @@ -133,7 +133,7 @@ size_t MPEG2TSExtractor::countTracks() { return mSourceImpls.size(); } -sp MPEG2TSExtractor::getTrack(size_t index) { +MediaSourceBase *MPEG2TSExtractor::getTrack(size_t index) { if (index >= mSourceImpls.size()) { return NULL; } @@ -470,7 +470,7 @@ uint32_t MPEG2TSExtractor::flags() const { } status_t MPEG2TSExtractor::seek(int64_t seekTimeUs, - const MediaSource::ReadOptions::SeekMode &seekMode) { + const MediaSourceBase::ReadOptions::SeekMode &seekMode) { if (mSeekSyncPoints == NULL || mSeekSyncPoints->isEmpty()) { ALOGW("No sync point to seek to."); // ... and therefore we have nothing useful to do here. @@ -491,18 +491,18 @@ status_t MPEG2TSExtractor::seek(int64_t seekTimeUs, } switch (seekMode) { - case MediaSource::ReadOptions::SEEK_NEXT_SYNC: + case MediaSourceBase::ReadOptions::SEEK_NEXT_SYNC: if (index == mSeekSyncPoints->size()) { ALOGW("Next sync not found; starting from the latest sync."); --index; } break; - case MediaSource::ReadOptions::SEEK_CLOSEST_SYNC: - case MediaSource::ReadOptions::SEEK_CLOSEST: + case MediaSourceBase::ReadOptions::SEEK_CLOSEST_SYNC: + case MediaSourceBase::ReadOptions::SEEK_CLOSEST: ALOGW("seekMode not supported: %d; falling back to PREVIOUS_SYNC", seekMode); // fall-through - case MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC: + case MediaSourceBase::ReadOptions::SEEK_PREVIOUS_SYNC: if (index == 0) { ALOGW("Previous sync not found; starting from the earliest " "sync."); diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.h b/media/extractors/mpeg2/MPEG2TSExtractor.h index 55356bfef5..362f01668e 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.h +++ b/media/extractors/mpeg2/MPEG2TSExtractor.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include #include @@ -40,7 +40,7 @@ struct MPEG2TSExtractor : public MediaExtractor { explicit MPEG2TSExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp index a2091d5c88..f62ec47112 100644 --- a/media/extractors/ogg/OggExtractor.cpp +++ b/media/extractors/ogg/OggExtractor.cpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include @@ -45,7 +45,7 @@ extern "C" { namespace android { -struct OggSource : public MediaSource { +struct OggSource : public MediaSourceBase { explicit OggSource(OggExtractor *extractor); virtual sp getFormat(); @@ -1348,7 +1348,7 @@ size_t OggExtractor::countTracks() { return mInitCheck != OK ? 0 : 1; } -sp OggExtractor::getTrack(size_t index) { +MediaSourceBase *OggExtractor::getTrack(size_t index) { if (index >= 1) { return NULL; } diff --git a/media/extractors/ogg/OggExtractor.h b/media/extractors/ogg/OggExtractor.h index 0f7fe5fa37..126428c91e 100644 --- a/media/extractors/ogg/OggExtractor.h +++ b/media/extractors/ogg/OggExtractor.h @@ -34,7 +34,7 @@ struct OggExtractor : public MediaExtractor { explicit OggExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp index 6d799fd5e7..cf22c66223 100644 --- a/media/extractors/wav/WAVExtractor.cpp +++ b/media/extractors/wav/WAVExtractor.cpp @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include @@ -55,7 +55,7 @@ static uint16_t U16_LE_AT(const uint8_t *ptr) { return ptr[1] << 8 | ptr[0]; } -struct WAVSource : public MediaSource { +struct WAVSource : public MediaSourceBase { WAVSource( const sp &dataSource, const sp &meta, @@ -120,7 +120,7 @@ size_t WAVExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -sp WAVExtractor::getTrack(size_t index) { +MediaSourceBase *WAVExtractor::getTrack(size_t index) { if (mInitCheck != OK || index > 0) { return NULL; } diff --git a/media/extractors/wav/WAVExtractor.h b/media/extractors/wav/WAVExtractor.h index 3d98ee9e8d..47c3c40d08 100644 --- a/media/extractors/wav/WAVExtractor.h +++ b/media/extractors/wav/WAVExtractor.h @@ -33,7 +33,7 @@ public: explicit WAVExtractor(const sp &source); virtual size_t countTracks(); - virtual sp getTrack(size_t index); + virtual MediaSourceBase *getTrack(size_t index); virtual sp getTrackMetaData(size_t index, uint32_t flags); virtual sp getMetaData(); diff --git a/media/libmediaextractor/Android.bp b/media/libmediaextractor/Android.bp index 83fea391f2..984d4f1b09 100644 --- a/media/libmediaextractor/Android.bp +++ b/media/libmediaextractor/Android.bp @@ -26,6 +26,7 @@ cc_library { "DataSource.cpp", "MediaBuffer.cpp", "MediaBufferGroup.cpp", + "MediaSourceBase.cpp", "MediaSource.cpp", "MediaExtractor.cpp", ], diff --git a/media/libmediaextractor/MediaSource.cpp b/media/libmediaextractor/MediaSource.cpp index a5d41f79e9..5bbd3d8e1b 100644 --- a/media/libmediaextractor/MediaSource.cpp +++ b/media/libmediaextractor/MediaSource.cpp @@ -25,45 +25,4 @@ MediaSource::~MediaSource() {} //////////////////////////////////////////////////////////////////////////////// -MediaSource::ReadOptions::ReadOptions() { - reset(); -} - -void MediaSource::ReadOptions::reset() { - mOptions = 0; - mSeekTimeUs = 0; - mNonBlocking = false; -} - -void MediaSource::ReadOptions::setNonBlocking() { - mNonBlocking = true; -} - -void MediaSource::ReadOptions::clearNonBlocking() { - mNonBlocking = false; -} - -bool MediaSource::ReadOptions::getNonBlocking() const { - return mNonBlocking; -} - -void MediaSource::ReadOptions::setSeekTo(int64_t time_us, SeekMode mode) { - mOptions |= kSeekTo_Option; - mSeekTimeUs = time_us; - mSeekMode = mode; -} - -void MediaSource::ReadOptions::clearSeekTo() { - mOptions &= ~kSeekTo_Option; - mSeekTimeUs = 0; - mSeekMode = SEEK_CLOSEST_SYNC; -} - -bool MediaSource::ReadOptions::getSeekTo( - int64_t *time_us, SeekMode *mode) const { - *time_us = mSeekTimeUs; - *mode = mSeekMode; - return (mOptions & kSeekTo_Option) != 0; -} - } // namespace android diff --git a/media/libmediaextractor/MediaSourceBase.cpp b/media/libmediaextractor/MediaSourceBase.cpp new file mode 100644 index 0000000000..6d45c9019c --- /dev/null +++ b/media/libmediaextractor/MediaSourceBase.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace android { + +MediaSourceBase::MediaSourceBase() {} + +MediaSourceBase::~MediaSourceBase() {} + +//////////////////////////////////////////////////////////////////////////////// + +MediaSourceBase::ReadOptions::ReadOptions() { + reset(); +} + +void MediaSourceBase::ReadOptions::reset() { + mOptions = 0; + mSeekTimeUs = 0; + mNonBlocking = false; +} + +void MediaSourceBase::ReadOptions::setNonBlocking() { + mNonBlocking = true; +} + +void MediaSourceBase::ReadOptions::clearNonBlocking() { + mNonBlocking = false; +} + +bool MediaSourceBase::ReadOptions::getNonBlocking() const { + return mNonBlocking; +} + +void MediaSourceBase::ReadOptions::setSeekTo(int64_t time_us, SeekMode mode) { + mOptions |= kSeekTo_Option; + mSeekTimeUs = time_us; + mSeekMode = mode; +} + +void MediaSourceBase::ReadOptions::clearSeekTo() { + mOptions &= ~kSeekTo_Option; + mSeekTimeUs = 0; + mSeekMode = SEEK_CLOSEST_SYNC; +} + +bool MediaSourceBase::ReadOptions::getSeekTo( + int64_t *time_us, SeekMode *mode) const { + *time_us = mSeekTimeUs; + *mode = mSeekMode; + return (mOptions & kSeekTo_Option) != 0; +} + +} // namespace android diff --git a/media/libmediaextractor/include/media/MediaExtractor.h b/media/libmediaextractor/include/media/MediaExtractor.h index 2269c1b91d..15a5d8caf1 100644 --- a/media/libmediaextractor/include/media/MediaExtractor.h +++ b/media/libmediaextractor/include/media/MediaExtractor.h @@ -30,7 +30,7 @@ class DataSource; class MetaData; class String8; struct AMessage; -struct MediaSource; +struct MediaSourceBase; typedef std::vector HInterfaceToken; @@ -51,7 +51,7 @@ class MediaExtractor public: virtual ~MediaExtractor(); virtual size_t countTracks() = 0; - virtual sp getTrack(size_t index) = 0; + virtual MediaSourceBase *getTrack(size_t index) = 0; enum GetTrackMetaDataFlags { kIncludeExtensiveMetaData = 1 diff --git a/media/libmediaextractor/include/media/MediaSource.h b/media/libmediaextractor/include/media/MediaSource.h index 3df9a0dfa7..45070d6de2 100644 --- a/media/libmediaextractor/include/media/MediaSource.h +++ b/media/libmediaextractor/include/media/MediaSource.h @@ -24,105 +24,15 @@ #include #include +#include "media/MediaSourceBase.h" + namespace android { class MediaBuffer; -struct MediaSource : public virtual RefBase { +struct MediaSource : public MediaSourceBase, public virtual RefBase { MediaSource(); - // To be called before any other methods on this object, except - // getFormat(). - virtual status_t start(MetaData *params = NULL) = 0; - - // Any blocking read call returns immediately with a result of NO_INIT. - // It is an error to call any methods other than start after this call - // returns. Any buffers the object may be holding onto at the time of - // the stop() call are released. - // Also, it is imperative that any buffers output by this object and - // held onto by callers be released before a call to stop() !!! - virtual status_t stop() = 0; - - // Returns the format of the data output by this media source. - virtual sp getFormat() = 0; - - // Options that modify read() behaviour. The default is to - // a) not request a seek - // b) not be late, i.e. lateness_us = 0 - struct ReadOptions { - enum SeekMode : int32_t { - SEEK_PREVIOUS_SYNC, - SEEK_NEXT_SYNC, - SEEK_CLOSEST_SYNC, - SEEK_CLOSEST, - SEEK_FRAME_INDEX, - }; - - ReadOptions(); - - // Reset everything back to defaults. - void reset(); - - void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); - void clearSeekTo(); - bool getSeekTo(int64_t *time_us, SeekMode *mode) const; - - void setNonBlocking(); - void clearNonBlocking(); - bool getNonBlocking() const; - - // Used to clear all non-persistent options for multiple buffer reads. - void clearNonPersistent() { - clearSeekTo(); - } - - private: - enum Options { - kSeekTo_Option = 1, - }; - - uint32_t mOptions; - int64_t mSeekTimeUs; - SeekMode mSeekMode; - bool mNonBlocking; - } __attribute__((packed)); // sent through Binder - - // Returns a new buffer of data. Call blocks until a - // buffer is available, an error is encountered of the end of the stream - // is reached. - // End of stream is signalled by a result of ERROR_END_OF_STREAM. - // A result of INFO_FORMAT_CHANGED indicates that the format of this - // MediaSource has changed mid-stream, the client can continue reading - // but should be prepared for buffers of the new configuration. - virtual status_t read( - MediaBuffer **buffer, const ReadOptions *options = NULL) = 0; - - // Causes this source to suspend pulling data from its upstream source - // until a subsequent read-with-seek. This is currently not supported - // as such by any source. E.g. MediaCodecSource does not suspend its - // upstream source, and instead discard upstream data while paused. - virtual status_t pause() { - return ERROR_UNSUPPORTED; - } - - // The consumer of this media source requests the source stops sending - // buffers with timestamp larger than or equal to stopTimeUs. stopTimeUs - // must be in the same time base as the startTime passed in start(). If - // source does not support this request, ERROR_UNSUPPORTED will be returned. - // If stopTimeUs is invalid, BAD_VALUE will be returned. This could be - // called at any time even before source starts and it could be called - // multiple times. Setting stopTimeUs to be -1 will effectively cancel the stopTimeUs - // set previously. If stopTimeUs is larger than or equal to last buffer's timestamp, - // source will start to drop buffer when it gets a buffer with timestamp larger - // than or equal to stopTimeUs. If stopTimeUs is smaller than or equal to last - // buffer's timestamp, source will drop all the incoming buffers immediately. - // After setting stopTimeUs, source may still stop sending buffers with timestamp - // less than stopTimeUs if it is stopped by the consumer. - virtual status_t setStopTimeUs(int64_t /* stopTimeUs */) { - return ERROR_UNSUPPORTED; - } - -protected: virtual ~MediaSource(); private: diff --git a/media/libmediaextractor/include/media/MediaSourceBase.h b/media/libmediaextractor/include/media/MediaSourceBase.h new file mode 100644 index 0000000000..77d4fc914b --- /dev/null +++ b/media/libmediaextractor/include/media/MediaSourceBase.h @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MEDIA_SOURCE_BASE_H_ + +#define MEDIA_SOURCE_BASE_H_ + +#include + +#include +#include +#include +#include +#include +#include + +namespace android { + +class MediaBuffer; + +class SourceBaseAllocTracker { +public: + SourceBaseAllocTracker() { + ALOGD("sourcebase allocated: %p", this); + } + virtual ~SourceBaseAllocTracker() { + ALOGD("sourcebase freed: %p", this); + } +}; + +struct MediaSourceBase +// : public SourceBaseAllocTracker +{ + MediaSourceBase(); + + // To be called before any other methods on this object, except + // getFormat(). + virtual status_t start(MetaData *params = NULL) = 0; + + // Any blocking read call returns immediately with a result of NO_INIT. + // It is an error to call any methods other than start after this call + // returns. Any buffers the object may be holding onto at the time of + // the stop() call are released. + // Also, it is imperative that any buffers output by this object and + // held onto by callers be released before a call to stop() !!! + virtual status_t stop() = 0; + + // Returns the format of the data output by this media source. + virtual sp getFormat() = 0; + + // Options that modify read() behaviour. The default is to + // a) not request a seek + // b) not be late, i.e. lateness_us = 0 + struct ReadOptions { + enum SeekMode : int32_t { + SEEK_PREVIOUS_SYNC, + SEEK_NEXT_SYNC, + SEEK_CLOSEST_SYNC, + SEEK_CLOSEST, + SEEK_FRAME_INDEX, + }; + + ReadOptions(); + + // Reset everything back to defaults. + void reset(); + + void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); + void clearSeekTo(); + bool getSeekTo(int64_t *time_us, SeekMode *mode) const; + + void setNonBlocking(); + void clearNonBlocking(); + bool getNonBlocking() const; + + // Used to clear all non-persistent options for multiple buffer reads. + void clearNonPersistent() { + clearSeekTo(); + } + + private: + enum Options { + kSeekTo_Option = 1, + }; + + uint32_t mOptions; + int64_t mSeekTimeUs; + SeekMode mSeekMode; + bool mNonBlocking; + } __attribute__((packed)); // sent through Binder + + // Returns a new buffer of data. Call blocks until a + // buffer is available, an error is encountered of the end of the stream + // is reached. + // End of stream is signalled by a result of ERROR_END_OF_STREAM. + // A result of INFO_FORMAT_CHANGED indicates that the format of this + // MediaSource has changed mid-stream, the client can continue reading + // but should be prepared for buffers of the new configuration. + virtual status_t read( + MediaBuffer **buffer, const ReadOptions *options = NULL) = 0; + + // Causes this source to suspend pulling data from its upstream source + // until a subsequent read-with-seek. This is currently not supported + // as such by any source. E.g. MediaCodecSource does not suspend its + // upstream source, and instead discard upstream data while paused. + virtual status_t pause() { + return ERROR_UNSUPPORTED; + } + + // The consumer of this media source requests the source stops sending + // buffers with timestamp larger than or equal to stopTimeUs. stopTimeUs + // must be in the same time base as the startTime passed in start(). If + // source does not support this request, ERROR_UNSUPPORTED will be returned. + // If stopTimeUs is invalid, BAD_VALUE will be returned. This could be + // called at any time even before source starts and it could be called + // multiple times. Setting stopTimeUs to be -1 will effectively cancel the stopTimeUs + // set previously. If stopTimeUs is larger than or equal to last buffer's timestamp, + // source will start to drop buffer when it gets a buffer with timestamp larger + // than or equal to stopTimeUs. If stopTimeUs is smaller than or equal to last + // buffer's timestamp, source will drop all the incoming buffers immediately. + // After setting stopTimeUs, source may still stop sending buffers with timestamp + // less than stopTimeUs if it is stopped by the consumer. + virtual status_t setStopTimeUs(int64_t /* stopTimeUs */) { + return ERROR_UNSUPPORTED; + } + + virtual ~MediaSourceBase(); + +private: + MediaSourceBase(const MediaSourceBase &); + MediaSourceBase &operator=(const MediaSourceBase &); +}; + +} // namespace android + +#endif // MEDIA_SOURCE_BASE_H_ diff --git a/media/libstagefright/InterfaceUtils.cpp b/media/libstagefright/InterfaceUtils.cpp index ee54d66814..284e63b380 100644 --- a/media/libstagefright/InterfaceUtils.cpp +++ b/media/libstagefright/InterfaceUtils.cpp @@ -52,9 +52,9 @@ sp CreateMediaSourceFromIMediaSource(const sp &source return new CallbackMediaSource(source); } -sp CreateIMediaSourceFromMediaSource( +sp CreateIMediaSourceFromMediaSourceBase( const sp &extractor, - const sp &source, const sp &plugin) { + MediaSourceBase *source, const sp &plugin) { if (source == nullptr) { return nullptr; } diff --git a/media/libstagefright/RemoteMediaExtractor.cpp b/media/libstagefright/RemoteMediaExtractor.cpp index bff1996ad8..43d33e5554 100644 --- a/media/libstagefright/RemoteMediaExtractor.cpp +++ b/media/libstagefright/RemoteMediaExtractor.cpp @@ -89,9 +89,9 @@ size_t RemoteMediaExtractor::countTracks() { } sp RemoteMediaExtractor::getTrack(size_t index) { - sp source = mExtractor->getTrack(index); - return (source.get() == nullptr) - ? nullptr : CreateIMediaSourceFromMediaSource(this, source, mExtractorPlugin); + MediaSourceBase *source = mExtractor->getTrack(index); + return (source == nullptr) + ? nullptr : CreateIMediaSourceFromMediaSourceBase(this, source, mExtractorPlugin); } sp RemoteMediaExtractor::getTrackMetaData(size_t index, uint32_t flags) { diff --git a/media/libstagefright/RemoteMediaSource.cpp b/media/libstagefright/RemoteMediaSource.cpp index 760d56714c..6b48ce8459 100644 --- a/media/libstagefright/RemoteMediaSource.cpp +++ b/media/libstagefright/RemoteMediaSource.cpp @@ -22,14 +22,14 @@ namespace android { RemoteMediaSource::RemoteMediaSource( const sp &extractor, - const sp &source, + MediaSourceBase *source, const sp &plugin) : mExtractor(extractor), mSource(source), mExtractorPlugin(plugin) {} RemoteMediaSource::~RemoteMediaSource() { - mSource = nullptr; + delete mSource; mExtractorPlugin = nullptr; } @@ -62,8 +62,8 @@ status_t RemoteMediaSource::setStopTimeUs(int64_t stopTimeUs) { // static sp RemoteMediaSource::wrap( const sp &extractor, - const sp &source, const sp &plugin) { - if (source.get() == nullptr) { + MediaSourceBase *source, const sp &plugin) { + if (source == nullptr) { return nullptr; } return new RemoteMediaSource(extractor, source, plugin); diff --git a/media/libstagefright/include/media/stagefright/InterfaceUtils.h b/media/libstagefright/include/media/stagefright/InterfaceUtils.h index ad24472124..ceeaf319ee 100644 --- a/media/libstagefright/include/media/stagefright/InterfaceUtils.h +++ b/media/libstagefright/include/media/stagefright/InterfaceUtils.h @@ -47,9 +47,9 @@ sp CreateIMediaExtractorFromMediaExtractor( sp CreateMediaSourceFromIMediaSource(const sp &source); // Creates an IMediaSource wrapper to the given MediaSource. -sp CreateIMediaSourceFromMediaSource( +sp CreateIMediaSourceFromMediaSourceBase( const sp &extractor, - const sp &source, const sp &plugin); + MediaSourceBase *source, const sp &plugin); } // namespace android diff --git a/media/libstagefright/include/media/stagefright/RemoteMediaSource.h b/media/libstagefright/include/media/stagefright/RemoteMediaSource.h index d44adf313d..d1afa6a9b7 100644 --- a/media/libstagefright/include/media/stagefright/RemoteMediaSource.h +++ b/media/libstagefright/include/media/stagefright/RemoteMediaSource.h @@ -28,7 +28,7 @@ class RemoteMediaSource : public BnMediaSource { public: static sp wrap( const sp &extractor, - const sp &source, + MediaSourceBase *source, const sp &plugin); virtual ~RemoteMediaSource(); virtual status_t start(MetaData *params = NULL); @@ -42,12 +42,12 @@ public: private: sp mExtractor; - sp mSource; + MediaSourceBase *mSource; sp mExtractorPlugin; explicit RemoteMediaSource( const sp &extractor, - const sp &source, + MediaSourceBase *source, const sp &plugin); DISALLOW_EVIL_CONSTRUCTORS(RemoteMediaSource);