diff --git a/include/media/MediaExtractorPluginApi.h b/include/media/MediaExtractorPluginApi.h index 930b6e27e1..cccfc914ab 100644 --- a/include/media/MediaExtractorPluginApi.h +++ b/include/media/MediaExtractorPluginApi.h @@ -23,6 +23,7 @@ namespace android { struct MediaTrack; class MetaDataBase; +class MediaBufferBase; extern "C" { @@ -34,12 +35,33 @@ struct CDataSource { void *handle; }; +enum CMediaTrackReadOptions : uint32_t { + SEEK_PREVIOUS_SYNC = 0, + SEEK_NEXT_SYNC = 1, + SEEK_CLOSEST_SYNC = 2, + SEEK_CLOSEST = 3, + SEEK_FRAME_INDEX = 4, + SEEK = 8, + NONBLOCKING = 16 +}; + +struct CMediaTrack { + void *data; + void (*free)(void *data); + + status_t (*start)(void *data, MetaDataBase *params); + status_t (*stop)(void *data); + status_t (*getFormat)(void *data, MetaDataBase &format); + status_t (*read)(void *data, MediaBufferBase **buffer, uint32_t options, int64_t seekPosUs); + bool (*supportsNonBlockingRead)(void *data); +}; + struct CMediaExtractor { void *data; void (*free)(void *data); size_t (*countTracks)(void *data); - MediaTrack* (*getTrack)(void *data, size_t index); + CMediaTrack* (*getTrack)(void *data, size_t index); status_t (*getTrackMetaData)( void *data, MetaDataBase& meta, diff --git a/include/media/MediaExtractorPluginHelper.h b/include/media/MediaExtractorPluginHelper.h index a659660865..961033bc94 100644 --- a/include/media/MediaExtractorPluginHelper.h +++ b/include/media/MediaExtractorPluginHelper.h @@ -33,6 +33,75 @@ class DataSourceBase; class MetaDataBase; struct MediaTrack; + +class MediaTrackHelper { +public: + virtual ~MediaTrackHelper() {}; + virtual status_t start(MetaDataBase *params = NULL) = 0; + virtual status_t stop() = 0; + virtual status_t getFormat(MetaDataBase& format) = 0; + + class ReadOptions { + public: + enum SeekMode : int32_t { + SEEK_PREVIOUS_SYNC, + SEEK_NEXT_SYNC, + SEEK_CLOSEST_SYNC, + SEEK_CLOSEST, + SEEK_FRAME_INDEX, + }; + + ReadOptions(uint32_t options, int64_t seekPosUs) { + mOptions = options; + mSeekPosUs = seekPosUs; + } + bool getSeekTo(int64_t *time_us, SeekMode *mode) const { + if ((mOptions & CMediaTrackReadOptions::SEEK) == 0) { + return false; + } + *time_us = mSeekPosUs; + *mode = (SeekMode) (mOptions & 7); + return true; + } + bool getNonBlocking() const { + return mOptions & CMediaTrackReadOptions::NONBLOCKING; + } + private: + uint32_t mOptions; + int64_t mSeekPosUs; + }; + + virtual status_t read( + MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0; + virtual bool supportsNonBlockingRead() { return false; } +}; + +inline CMediaTrack *wrap(MediaTrackHelper *track) { + CMediaTrack *wrapper = (CMediaTrack*) malloc(sizeof(CMediaTrack)); + wrapper->data = track; + wrapper->free = [](void *data) -> void { + delete (MediaTrackHelper*)(data); + }; + wrapper->start = [](void *data, MetaDataBase *params) -> status_t { + return ((MediaTrackHelper*)data)->start(params); + }; + wrapper->stop = [](void *data) -> status_t { + return ((MediaTrackHelper*)data)->stop(); + }; + wrapper->getFormat = [](void *data, MetaDataBase &meta) -> status_t { + return ((MediaTrackHelper*)data)->getFormat(meta); + }; + wrapper->read = [](void *data, MediaBufferBase **buffer, uint32_t options, int64_t seekPosUs) + -> status_t { + MediaTrackHelper::ReadOptions opts(options, seekPosUs); + return ((MediaTrackHelper*)data)->read(buffer, &opts); + }; + wrapper->supportsNonBlockingRead = [](void *data) -> bool { + return ((MediaTrackHelper*)data)->supportsNonBlockingRead(); + }; + return wrapper; +} + // extractor plugins can derive from this class which looks remarkably // like MediaExtractor and can be easily wrapped in the required C API class MediaExtractorPluginHelper @@ -40,7 +109,7 @@ class MediaExtractorPluginHelper public: virtual ~MediaExtractorPluginHelper() {} virtual size_t countTracks() = 0; - virtual MediaTrack *getTrack(size_t index) = 0; + virtual MediaTrackHelper *getTrack(size_t index) = 0; enum GetTrackMetaDataFlags { kIncludeExtensiveMetaData = 1 @@ -89,8 +158,8 @@ inline CMediaExtractor *wrap(MediaExtractorPluginHelper *extractor) { wrapper->countTracks = [](void *data) -> size_t { return ((MediaExtractorPluginHelper*)data)->countTracks(); }; - wrapper->getTrack = [](void *data, size_t index) -> MediaTrack* { - return ((MediaExtractorPluginHelper*)data)->getTrack(index); + wrapper->getTrack = [](void *data, size_t index) -> CMediaTrack* { + return wrap(((MediaExtractorPluginHelper*)data)->getTrack(index)); }; wrapper->getTrackMetaData = []( void *data, diff --git a/include/media/MediaTrack.h b/include/media/MediaTrack.h deleted file mode 120000 index 5a63287add..0000000000 --- a/include/media/MediaTrack.h +++ /dev/null @@ -1 +0,0 @@ -../../media/libmediaextractor/include/media/MediaTrack.h \ No newline at end of file diff --git a/include/media/MediaTrack.h b/include/media/MediaTrack.h new file mode 100644 index 0000000000..3f77bda90e --- /dev/null +++ b/include/media/MediaTrack.h @@ -0,0 +1,151 @@ +/* + * 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 +#include +#include + +namespace android { + +class MediaBufferBase; +struct CMediaTrack; + +class SourceBaseAllocTracker { +public: + SourceBaseAllocTracker() { + ALOGD("sourcebase allocated: %p", this); + } + virtual ~SourceBaseAllocTracker() { + ALOGD("sourcebase freed: %p", this); + } +}; + +struct MediaTrack +// : public SourceBaseAllocTracker +{ + MediaTrack(); + + // To be called before any other methods on this object, except + // getFormat(). + virtual status_t start(MetaDataBase *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 track. + virtual status_t getFormat(MetaDataBase& format) = 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 = CMediaTrackReadOptions::SEEK_PREVIOUS_SYNC, + SEEK_NEXT_SYNC = CMediaTrackReadOptions::SEEK_NEXT_SYNC, + SEEK_CLOSEST_SYNC = CMediaTrackReadOptions::SEEK_CLOSEST_SYNC, + SEEK_CLOSEST = CMediaTrackReadOptions::SEEK_CLOSEST, + SEEK_FRAME_INDEX = CMediaTrackReadOptions::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( + MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0; + + // Returns true if |read| supports nonblocking option, otherwise false. + // |readMultiple| if supported, always allows the nonblocking option. + virtual bool supportNonblockingRead() { + return false; + } + + virtual ~MediaTrack(); + +private: + MediaTrack(const MediaTrack &); + MediaTrack &operator=(const MediaTrack &); +}; + +class MediaTrackCUnwrapper : public MediaTrack { +public: + explicit MediaTrackCUnwrapper(CMediaTrack *wrapper); + + virtual status_t start(MetaDataBase *params = NULL); + virtual status_t stop(); + virtual status_t getFormat(MetaDataBase& format); + virtual status_t read(MediaBufferBase **buffer, const ReadOptions *options = NULL); + + virtual bool supportNonblockingRead(); + +protected: + virtual ~MediaTrackCUnwrapper(); + +private: + CMediaTrack *wrapper; +}; + +} // namespace android + +#endif // MEDIA_SOURCE_BASE_H_ diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp index 955a588c42..9effd57258 100644 --- a/media/extractors/aac/AACExtractor.cpp +++ b/media/extractors/aac/AACExtractor.cpp @@ -20,7 +20,6 @@ #include "AACExtractor.h" #include -#include #include #include #include @@ -33,7 +32,7 @@ namespace android { -class AACSource : public MediaTrack { +class AACSource : public MediaTrackHelper { public: AACSource( DataSourceHelper *source, @@ -196,7 +195,7 @@ size_t AACExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -MediaTrack *AACExtractor::getTrack(size_t index) { +MediaTrackHelper *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 3f2046131b..7afdeb7de7 100644 --- a/media/extractors/aac/AACExtractor.h +++ b/media/extractors/aac/AACExtractor.h @@ -34,7 +34,7 @@ public: AACExtractor(DataSourceHelper *source, off64_t offset); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/amr/AMRExtractor.cpp b/media/extractors/amr/AMRExtractor.cpp index e109fb3d5a..664810370c 100644 --- a/media/extractors/amr/AMRExtractor.cpp +++ b/media/extractors/amr/AMRExtractor.cpp @@ -20,7 +20,6 @@ #include "AMRExtractor.h" -#include #include #include #include @@ -30,7 +29,7 @@ namespace android { -class AMRSource : public MediaTrack { +class AMRSource : public MediaTrackHelper { public: AMRSource( DataSourceHelper *source, @@ -208,7 +207,7 @@ size_t AMRExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -MediaTrack *AMRExtractor::getTrack(size_t index) { +MediaTrackHelper *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 499ca67da3..b9a4e9edd2 100644 --- a/media/extractors/amr/AMRExtractor.h +++ b/media/extractors/amr/AMRExtractor.h @@ -34,7 +34,7 @@ public: explicit AMRExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/flac/FLACExtractor.cpp b/media/extractors/flac/FLACExtractor.cpp index 1efaa0c617..c10a557572 100644 --- a/media/extractors/flac/FLACExtractor.cpp +++ b/media/extractors/flac/FLACExtractor.cpp @@ -25,13 +25,13 @@ #include "FLAC/stream_decoder.h" #include -#include #include #include #include #include #include #include +#include #include #include @@ -39,7 +39,7 @@ namespace android { class FLACParser; -class FLACSource : public MediaTrack { +class FLACSource : public MediaTrackHelper { public: FLACSource( @@ -812,7 +812,7 @@ size_t FLACExtractor::countTracks() return mInitCheck == OK ? 1 : 0; } -MediaTrack *FLACExtractor::getTrack(size_t index) +MediaTrackHelper *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 1ddff436da..829f661f3a 100644 --- a/media/extractors/flac/FLACExtractor.h +++ b/media/extractors/flac/FLACExtractor.h @@ -33,7 +33,7 @@ public: explicit FLACExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/midi/MidiExtractor.cpp b/media/extractors/midi/MidiExtractor.cpp index 233033eadc..5b61f342a9 100644 --- a/media/extractors/midi/MidiExtractor.cpp +++ b/media/extractors/midi/MidiExtractor.cpp @@ -24,8 +24,8 @@ #include #include #include +#include #include -#include #include namespace android { @@ -33,7 +33,7 @@ namespace android { // how many Sonivox output buffers to aggregate into one MediaBufferBase static const int NUM_COMBINE_BUFFERS = 4; -class MidiSource : public MediaTrack { +class MidiSource : public MediaTrackHelper { public: MidiSource( @@ -282,7 +282,7 @@ size_t MidiExtractor::countTracks() return mInitCheck == OK ? 1 : 0; } -MediaTrack *MidiExtractor::getTrack(size_t index) +MediaTrackHelper *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 fbbe93ed5c..2147297b97 100644 --- a/media/extractors/midi/MidiExtractor.h +++ b/media/extractors/midi/MidiExtractor.h @@ -57,7 +57,7 @@ public: explicit MidiExtractor(CDataSource *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp index a387970dc8..4ef68920cc 100644 --- a/media/extractors/mkv/MatroskaExtractor.cpp +++ b/media/extractors/mkv/MatroskaExtractor.cpp @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -124,7 +123,7 @@ private: BlockIterator &operator=(const BlockIterator &); }; -struct MatroskaSource : public MediaTrack { +struct MatroskaSource : public MediaTrackHelper { MatroskaSource(MatroskaExtractor *extractor, size_t index); virtual status_t start(MetaDataBase *params); @@ -1002,7 +1001,7 @@ size_t MatroskaExtractor::countTracks() { return mTracks.size(); } -MediaTrack *MatroskaExtractor::getTrack(size_t index) { +MediaTrackHelper *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 2c6ca850b2..43971a0d3f 100644 --- a/media/extractors/mkv/MatroskaExtractor.h +++ b/media/extractors/mkv/MatroskaExtractor.h @@ -40,7 +40,7 @@ struct MatroskaExtractor : public MediaExtractorPluginHelper { virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); diff --git a/media/extractors/mp3/MP3Extractor.cpp b/media/extractors/mp3/MP3Extractor.cpp index a1e5593cff..165ce50e21 100644 --- a/media/extractors/mp3/MP3Extractor.cpp +++ b/media/extractors/mp3/MP3Extractor.cpp @@ -24,7 +24,6 @@ #include "VBRISeeker.h" #include "XINGSeeker.h" -#include #include #include #include @@ -208,7 +207,7 @@ static bool Resync( return valid; } -class MP3Source : public MediaTrack { +class MP3Source : public MediaTrackHelper { public: MP3Source( MetaDataBase &meta, DataSourceHelper *source, @@ -411,7 +410,7 @@ size_t MP3Extractor::countTracks() { return mInitCheck != OK ? 0 : 1; } -MediaTrack *MP3Extractor::getTrack(size_t index) { +MediaTrackHelper *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 585d9f6629..92e0665aeb 100644 --- a/media/extractors/mp3/MP3Extractor.h +++ b/media/extractors/mp3/MP3Extractor.h @@ -38,7 +38,7 @@ public: ~MP3Extractor(); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp index 9d2f5d28c5..da240d6856 100644 --- a/media/extractors/mp4/MPEG4Extractor.cpp +++ b/media/extractors/mp4/MPEG4Extractor.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include #include @@ -68,7 +67,7 @@ enum { kMaxAtomSize = 64 * 1024 * 1024, }; -class MPEG4Source : public MediaTrack { +class MPEG4Source : public MediaTrackHelper { static const size_t kMaxPcmFrameSize = 8192; public: // Caller retains ownership of both "dataSource" and "sampleTable". @@ -3616,7 +3615,7 @@ void MPEG4Extractor::parseID3v2MetaData(off64_t offset) { } } -MediaTrack *MPEG4Extractor::getTrack(size_t index) { +MediaTrackHelper *MPEG4Extractor::getTrack(size_t index) { status_t err; if ((err = readMetaData()) != OK) { return NULL; diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h index b1e04c7c73..9b8de20e2e 100644 --- a/media/extractors/mp4/MPEG4Extractor.h +++ b/media/extractors/mp4/MPEG4Extractor.h @@ -58,7 +58,7 @@ public: explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.cpp b/media/extractors/mpeg2/MPEG2PSExtractor.cpp index ae1e6ba73c..577d1be7cd 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2PSExtractor.cpp @@ -24,7 +24,6 @@ #include "mpeg2ts/ESQueue.h" #include -#include #include #include #include @@ -40,7 +39,7 @@ namespace android { -struct MPEG2PSExtractor::Track : public MediaTrack, public RefBase { +struct MPEG2PSExtractor::Track : public MediaTrackHelper, public RefBase { Track(MPEG2PSExtractor *extractor, unsigned stream_id, unsigned stream_type); @@ -72,7 +71,7 @@ private: DISALLOW_EVIL_CONSTRUCTORS(Track); }; -struct MPEG2PSExtractor::WrappedTrack : public MediaTrack { +struct MPEG2PSExtractor::WrappedTrack : public MediaTrackHelper { WrappedTrack(MPEG2PSExtractor *extractor, const sp &track); virtual status_t start(MetaDataBase *params); @@ -127,7 +126,7 @@ size_t MPEG2PSExtractor::countTracks() { return mTracks.size(); } -MediaTrack *MPEG2PSExtractor::getTrack(size_t index) { +MediaTrackHelper *MPEG2PSExtractor::getTrack(size_t index) { if (index >= mTracks.size()) { return NULL; } @@ -681,7 +680,7 @@ status_t MPEG2PSExtractor::Track::read( } } - return mSource->read(buffer, options); + return mSource->read(buffer, (MediaSource::ReadOptions*)options); } status_t MPEG2PSExtractor::Track::appendPESData( diff --git a/media/extractors/mpeg2/MPEG2PSExtractor.h b/media/extractors/mpeg2/MPEG2PSExtractor.h index 7689910022..c4082ef6cb 100644 --- a/media/extractors/mpeg2/MPEG2PSExtractor.h +++ b/media/extractors/mpeg2/MPEG2PSExtractor.h @@ -36,7 +36,7 @@ struct MPEG2PSExtractor : public MediaExtractorPluginHelper { explicit MPEG2PSExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/mpeg2/MPEG2TSExtractor.cpp b/media/extractors/mpeg2/MPEG2TSExtractor.cpp index 0d7c83158c..c0826c90a0 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.cpp +++ b/media/extractors/mpeg2/MPEG2TSExtractor.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -51,7 +50,7 @@ static const size_t kTSPacketSize = 188; static const int kMaxDurationReadSize = 250000LL; static const int kMaxDurationRetry = 6; -struct MPEG2TSSource : public MediaTrack { +struct MPEG2TSSource : public MediaTrackHelper { MPEG2TSSource( MPEG2TSExtractor *extractor, const sp &impl, @@ -110,7 +109,7 @@ status_t MPEG2TSSource::read( ReadOptions::SeekMode seekMode; if (mDoesSeek && options && options->getSeekTo(&seekTimeUs, &seekMode)) { // seek is needed - status_t err = mExtractor->seek(seekTimeUs, seekMode); + status_t err = mExtractor->seek(seekTimeUs, (ReadOptions::SeekMode)seekMode); if (err != OK) { return err; } @@ -120,7 +119,7 @@ status_t MPEG2TSSource::read( return ERROR_END_OF_STREAM; } - return mImpl->read(out, options); + return mImpl->read(out, (MediaSource::ReadOptions*) options); } //////////////////////////////////////////////////////////////////////////////// @@ -141,7 +140,7 @@ size_t MPEG2TSExtractor::countTracks() { return mSourceImpls.size(); } -MediaTrack *MPEG2TSExtractor::getTrack(size_t index) { +MediaTrackHelper *MPEG2TSExtractor::getTrack(size_t index) { if (index >= mSourceImpls.size()) { return NULL; } @@ -483,7 +482,7 @@ uint32_t MPEG2TSExtractor::flags() const { } status_t MPEG2TSExtractor::seek(int64_t seekTimeUs, - const MediaTrack::ReadOptions::SeekMode &seekMode) { + const MediaTrackHelper::ReadOptions::SeekMode &seekMode) { if (mSeekSyncPoints == NULL || mSeekSyncPoints->isEmpty()) { ALOGW("No sync point to seek to."); // ... and therefore we have nothing useful to do here. @@ -504,18 +503,18 @@ status_t MPEG2TSExtractor::seek(int64_t seekTimeUs, } switch (seekMode) { - case MediaTrack::ReadOptions::SEEK_NEXT_SYNC: + case MediaTrackHelper::ReadOptions::SEEK_NEXT_SYNC: if (index == mSeekSyncPoints->size()) { ALOGW("Next sync not found; starting from the latest sync."); --index; } break; - case MediaTrack::ReadOptions::SEEK_CLOSEST_SYNC: - case MediaTrack::ReadOptions::SEEK_CLOSEST: + case MediaTrackHelper::ReadOptions::SEEK_CLOSEST_SYNC: + case MediaTrackHelper::ReadOptions::SEEK_CLOSEST: ALOGW("seekMode not supported: %d; falling back to PREVIOUS_SYNC", seekMode); FALLTHROUGH_INTENDED; - case MediaTrack::ReadOptions::SEEK_PREVIOUS_SYNC: + case MediaTrackHelper::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 cdaede326c..40134424c6 100644 --- a/media/extractors/mpeg2/MPEG2TSExtractor.h +++ b/media/extractors/mpeg2/MPEG2TSExtractor.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -43,7 +42,7 @@ struct MPEG2TSExtractor : public MediaExtractorPluginHelper { explicit MPEG2TSExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase &meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); @@ -91,7 +90,7 @@ private: // the data has syntax error during parsing, etc. status_t feedMore(bool isInit = false); status_t seek(int64_t seekTimeUs, - const MediaSource::ReadOptions::SeekMode& seekMode); + const MediaTrackHelper::ReadOptions::SeekMode& seekMode); status_t queueDiscontinuityForSeek(int64_t actualSeekTimeUs); status_t seekBeyond(int64_t seekTimeUs); diff --git a/media/extractors/ogg/OggExtractor.cpp b/media/extractors/ogg/OggExtractor.cpp index 4e979219a2..668b01219c 100644 --- a/media/extractors/ogg/OggExtractor.cpp +++ b/media/extractors/ogg/OggExtractor.cpp @@ -21,9 +21,9 @@ #include "OggExtractor.h" #include +#include #include #include -#include #include #include #include @@ -47,7 +47,7 @@ extern "C" { namespace android { -struct OggSource : public MediaTrack { +struct OggSource : public MediaTrackHelper { explicit OggSource(OggExtractor *extractor); virtual status_t getFormat(MetaDataBase &); @@ -1227,7 +1227,7 @@ size_t OggExtractor::countTracks() { return mInitCheck != OK ? 0 : 1; } -MediaTrack *OggExtractor::getTrack(size_t index) { +MediaTrackHelper *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 fbd466362d..c70f832e2e 100644 --- a/media/extractors/ogg/OggExtractor.h +++ b/media/extractors/ogg/OggExtractor.h @@ -34,7 +34,7 @@ struct OggExtractor : public MediaExtractorPluginHelper { explicit OggExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp index c739c2a7bf..cda568b325 100644 --- a/media/extractors/wav/WAVExtractor.cpp +++ b/media/extractors/wav/WAVExtractor.cpp @@ -22,7 +22,6 @@ #include #include -#include #include #include #include @@ -55,7 +54,7 @@ static uint16_t U16_LE_AT(const uint8_t *ptr) { return ptr[1] << 8 | ptr[0]; } -struct WAVSource : public MediaTrack { +struct WAVSource : public MediaTrackHelper { WAVSource( DataSourceHelper *dataSource, MetaDataBase &meta, @@ -118,7 +117,7 @@ size_t WAVExtractor::countTracks() { return mInitCheck == OK ? 1 : 0; } -MediaTrack *WAVExtractor::getTrack(size_t index) { +MediaTrackHelper *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 5136aa8684..a7c2691d47 100644 --- a/media/extractors/wav/WAVExtractor.h +++ b/media/extractors/wav/WAVExtractor.h @@ -34,7 +34,7 @@ public: explicit WAVExtractor(DataSourceHelper *source); virtual size_t countTracks(); - virtual MediaTrack *getTrack(size_t index); + virtual MediaTrackHelper *getTrack(size_t index); virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp index e150f2b6b7..2389a5d25c 100644 --- a/media/libmedia/Android.bp +++ b/media/libmedia/Android.bp @@ -176,6 +176,7 @@ cc_library { "IResourceManagerClient.cpp", "IResourceManagerService.cpp", "IStreamSource.cpp", + "MediaTrack.cpp", "MediaUtils.cpp", "Metadata.cpp", "mediarecorder.cpp", @@ -266,18 +267,13 @@ cc_library { }, } -cc_library { +cc_library_static { name: "libmedia_player2_util", srcs: [ "BufferingSettings.cpp", "DataSourceDesc.cpp", - "IDataSource.cpp", - "IMediaExtractor.cpp", - "IMediaExtractorService.cpp", - "IMediaSource.cpp", "MediaCodecBuffer.cpp", - "MediaUtils.cpp", "Metadata.cpp", "NdkWrapper.cpp", ], diff --git a/media/libmediaextractor/MediaTrack.cpp b/media/libmedia/MediaTrack.cpp similarity index 60% rename from media/libmediaextractor/MediaTrack.cpp rename to media/libmedia/MediaTrack.cpp index 4963f58f17..7117b94d90 100644 --- a/media/libmediaextractor/MediaTrack.cpp +++ b/media/libmedia/MediaTrack.cpp @@ -14,6 +14,8 @@ * limitations under the License. */ +#include + #include namespace android { @@ -65,4 +67,48 @@ bool MediaTrack::ReadOptions::getSeekTo( return (mOptions & kSeekTo_Option) != 0; } +MediaTrackCUnwrapper::MediaTrackCUnwrapper(CMediaTrack *cmediatrack) { + wrapper = cmediatrack; +} + +MediaTrackCUnwrapper::~MediaTrackCUnwrapper() { + wrapper->free(wrapper->data); + free(wrapper); +} + +status_t MediaTrackCUnwrapper::start(MetaDataBase *params) { + return wrapper->start(wrapper->data, params); +} + +status_t MediaTrackCUnwrapper::stop() { + return wrapper->stop(wrapper->data); +} + +status_t MediaTrackCUnwrapper::getFormat(MetaDataBase& format) { + return wrapper->getFormat(wrapper->data, format); +} + +status_t MediaTrackCUnwrapper::read(MediaBufferBase **buffer, const ReadOptions *options) { + + uint32_t opts = 0; + + if (options->getNonBlocking()) { + opts |= CMediaTrackReadOptions::NONBLOCKING; + } + + int64_t seekPosition = 0; + MediaTrack::ReadOptions::SeekMode seekMode; + if (options->getSeekTo(&seekPosition, &seekMode)) { + opts |= SEEK; + opts |= (uint32_t) seekMode; + } + + + return wrapper->read(wrapper->data, buffer, opts, seekPosition); +} + +bool MediaTrackCUnwrapper::supportNonblockingRead() { + return wrapper->supportsNonBlockingRead(wrapper->data); +} + } // namespace android diff --git a/media/libmediaextractor/Android.bp b/media/libmediaextractor/Android.bp index 0208ad491b..cf7d74fec2 100644 --- a/media/libmediaextractor/Android.bp +++ b/media/libmediaextractor/Android.bp @@ -28,7 +28,6 @@ cc_library { "MediaBufferBase.cpp", "MediaBufferGroup.cpp", "MediaSource.cpp", - "MediaTrack.cpp", "MetaData.cpp", "MetaDataBase.cpp", "VorbisComment.cpp", diff --git a/media/libmediaextractor/include/media/MediaTrack.h b/media/libmediaextractor/include/media/MediaTrack.h deleted file mode 100644 index 94510a257f..0000000000 --- a/media/libmediaextractor/include/media/MediaTrack.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 -#include - -namespace android { - -class MediaBufferBase; - -class SourceBaseAllocTracker { -public: - SourceBaseAllocTracker() { - ALOGD("sourcebase allocated: %p", this); - } - virtual ~SourceBaseAllocTracker() { - ALOGD("sourcebase freed: %p", this); - } -}; - -struct MediaTrack -// : public SourceBaseAllocTracker -{ - MediaTrack(); - - // To be called before any other methods on this object, except - // getFormat(). - virtual status_t start(MetaDataBase *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 track. - virtual status_t getFormat(MetaDataBase& format) = 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( - MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0; - - // Returns true if |read| supports nonblocking option, otherwise false. - // |readMultiple| if supported, always allows the nonblocking option. - virtual bool supportNonblockingRead() { - return false; - } - - virtual ~MediaTrack(); - -private: - MediaTrack(const MediaTrack &); - MediaTrack &operator=(const MediaTrack &); -}; - -} // namespace android - -#endif // MEDIA_SOURCE_BASE_H_ diff --git a/media/libmediaplayer2/Android.bp b/media/libmediaplayer2/Android.bp index e30da85040..2db48a4d18 100644 --- a/media/libmediaplayer2/Android.bp +++ b/media/libmediaplayer2/Android.bp @@ -4,7 +4,7 @@ cc_library_headers { export_include_dirs: ["include"], } -cc_library { +cc_library_static { name: "libmediaplayer2", srcs: [ @@ -20,7 +20,6 @@ cc_library { "libgui", "liblog", "libmedia_omx", - "libmedia_player2_util", "libmediaextractor", "libstagefright_foundation", "libui", @@ -35,7 +34,6 @@ cc_library { "libnativewindow", "libpowermanager", "libstagefright_httplive", - "libstagefright_player2", ], export_shared_lib_headers: [ @@ -55,8 +53,10 @@ cc_library { static_libs: [ "libmedia_helper", "libmediaplayer2-protos", + "libmedia_player2_util", "libprotobuf-cpp-lite", "libstagefright_nuplayer2", + "libstagefright_player2", "libstagefright_rtsp", "libstagefright_timedtext2", ], diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp index ae2f61b0e1..4127818969 100644 --- a/media/libstagefright/Android.bp +++ b/media/libstagefright/Android.bp @@ -230,7 +230,7 @@ cc_library_shared { }, } -cc_library { +cc_library_static { name: "libstagefright_player2", srcs: [ @@ -259,7 +259,6 @@ cc_library { "libcutils", "libgui", "liblog", - "libmedia_player2_util", "libaudioclient", "libmediaextractor", "libmediametrics", @@ -274,16 +273,13 @@ cc_library { static_libs: [ "libstagefright_esds", + "libmedia_player2_util", ], header_libs:[ "media_plugin_headers", ], - export_shared_lib_headers: [ - "libmedia_player2_util", - ], - export_include_dirs: [ "include", ], diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp index 5e1dc777b2..671012149e 100644 --- a/media/libstagefright/MediaExtractor.cpp +++ b/media/libstagefright/MediaExtractor.cpp @@ -22,6 +22,7 @@ #include #include #include +#include namespace android { @@ -54,7 +55,7 @@ size_t MediaExtractorCUnwrapper::countTracks() { } MediaTrack *MediaExtractorCUnwrapper::getTrack(size_t index) { - return wrapper->getTrack(wrapper->data, index); + return new MediaTrackCUnwrapper(wrapper->getTrack(wrapper->data, index)); } status_t MediaExtractorCUnwrapper::getTrackMetaData( diff --git a/media/libstagefright/include/media/stagefright/MediaExtractor.h b/media/libstagefright/include/media/stagefright/MediaExtractor.h index d9456ab0a4..3e5c905090 100644 --- a/media/libstagefright/include/media/stagefright/MediaExtractor.h +++ b/media/libstagefright/include/media/stagefright/MediaExtractor.h @@ -104,7 +104,6 @@ private: CMediaExtractor *wrapper; }; - } // namespace android #endif // MEDIA_EXTRACTOR_H_