1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef MEDIA_SOURCE_BASE_H_ 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #define MEDIA_SOURCE_BASE_H_ 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <binder/MemoryDealer.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaExtractorPluginApi.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaBufferGroup.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaErrors.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MetaData.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaExtractorPluginApi.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h> 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker namespace android { 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker class MediaBufferBase; 37*ec779b8eSAndroid Build Coastguard Worker struct CMediaTrack; 38*ec779b8eSAndroid Build Coastguard Worker 39*ec779b8eSAndroid Build Coastguard Worker class SourceBaseAllocTracker { 40*ec779b8eSAndroid Build Coastguard Worker public: SourceBaseAllocTracker()41*ec779b8eSAndroid Build Coastguard Worker SourceBaseAllocTracker() { 42*ec779b8eSAndroid Build Coastguard Worker ALOGD("sourcebase allocated: %p", this); 43*ec779b8eSAndroid Build Coastguard Worker } ~SourceBaseAllocTracker()44*ec779b8eSAndroid Build Coastguard Worker virtual ~SourceBaseAllocTracker() { 45*ec779b8eSAndroid Build Coastguard Worker ALOGD("sourcebase freed: %p", this); 46*ec779b8eSAndroid Build Coastguard Worker } 47*ec779b8eSAndroid Build Coastguard Worker }; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker struct MediaTrack 50*ec779b8eSAndroid Build Coastguard Worker // : public SourceBaseAllocTracker 51*ec779b8eSAndroid Build Coastguard Worker { 52*ec779b8eSAndroid Build Coastguard Worker MediaTrack(); 53*ec779b8eSAndroid Build Coastguard Worker 54*ec779b8eSAndroid Build Coastguard Worker // To be called before any other methods on this object, except 55*ec779b8eSAndroid Build Coastguard Worker // getFormat(). 56*ec779b8eSAndroid Build Coastguard Worker virtual status_t start() = 0; 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker // Any blocking read call returns immediately with a result of NO_INIT. 59*ec779b8eSAndroid Build Coastguard Worker // It is an error to call any methods other than start after this call 60*ec779b8eSAndroid Build Coastguard Worker // returns. Any buffers the object may be holding onto at the time of 61*ec779b8eSAndroid Build Coastguard Worker // the stop() call are released. 62*ec779b8eSAndroid Build Coastguard Worker // Also, it is imperative that any buffers output by this object and 63*ec779b8eSAndroid Build Coastguard Worker // held onto by callers be released before a call to stop() !!! 64*ec779b8eSAndroid Build Coastguard Worker virtual status_t stop() = 0; 65*ec779b8eSAndroid Build Coastguard Worker 66*ec779b8eSAndroid Build Coastguard Worker // Returns the format of the data output by this media track. 67*ec779b8eSAndroid Build Coastguard Worker virtual status_t getFormat(MetaDataBase& format) = 0; 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker // Options that modify read() behaviour. The default is to 70*ec779b8eSAndroid Build Coastguard Worker // a) not request a seek 71*ec779b8eSAndroid Build Coastguard Worker // b) not be late, i.e. lateness_us = 0 72*ec779b8eSAndroid Build Coastguard Worker struct ReadOptions { 73*ec779b8eSAndroid Build Coastguard Worker enum SeekMode : int32_t { 74*ec779b8eSAndroid Build Coastguard Worker SEEK_PREVIOUS_SYNC = CMediaTrackReadOptions::SEEK_PREVIOUS_SYNC, 75*ec779b8eSAndroid Build Coastguard Worker SEEK_NEXT_SYNC = CMediaTrackReadOptions::SEEK_NEXT_SYNC, 76*ec779b8eSAndroid Build Coastguard Worker SEEK_CLOSEST_SYNC = CMediaTrackReadOptions::SEEK_CLOSEST_SYNC, 77*ec779b8eSAndroid Build Coastguard Worker SEEK_CLOSEST = CMediaTrackReadOptions::SEEK_CLOSEST, 78*ec779b8eSAndroid Build Coastguard Worker SEEK_FRAME_INDEX = CMediaTrackReadOptions::SEEK_FRAME_INDEX, 79*ec779b8eSAndroid Build Coastguard Worker }; 80*ec779b8eSAndroid Build Coastguard Worker ReadOptionsMediaTrack::ReadOptions81*ec779b8eSAndroid Build Coastguard Worker ReadOptions() { 82*ec779b8eSAndroid Build Coastguard Worker reset(); 83*ec779b8eSAndroid Build Coastguard Worker } 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker // Reset everything back to defaults. resetMediaTrack::ReadOptions86*ec779b8eSAndroid Build Coastguard Worker void reset() { 87*ec779b8eSAndroid Build Coastguard Worker mOptions = 0; 88*ec779b8eSAndroid Build Coastguard Worker mSeekTimeUs = 0; 89*ec779b8eSAndroid Build Coastguard Worker mNonBlocking = false; 90*ec779b8eSAndroid Build Coastguard Worker } 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); clearSeekToMediaTrack::ReadOptions93*ec779b8eSAndroid Build Coastguard Worker void clearSeekTo() { 94*ec779b8eSAndroid Build Coastguard Worker mOptions &= ~kSeekTo_Option; 95*ec779b8eSAndroid Build Coastguard Worker mSeekTimeUs = 0; 96*ec779b8eSAndroid Build Coastguard Worker mSeekMode = SEEK_CLOSEST_SYNC; 97*ec779b8eSAndroid Build Coastguard Worker } 98*ec779b8eSAndroid Build Coastguard Worker bool getSeekTo(int64_t *time_us, SeekMode *mode) const; 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker void setNonBlocking(); 101*ec779b8eSAndroid Build Coastguard Worker void clearNonBlocking(); 102*ec779b8eSAndroid Build Coastguard Worker bool getNonBlocking() const; 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker // Used to clear all non-persistent options for multiple buffer reads. clearNonPersistentMediaTrack::ReadOptions105*ec779b8eSAndroid Build Coastguard Worker void clearNonPersistent() { 106*ec779b8eSAndroid Build Coastguard Worker clearSeekTo(); 107*ec779b8eSAndroid Build Coastguard Worker } 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker private: 110*ec779b8eSAndroid Build Coastguard Worker enum Options { 111*ec779b8eSAndroid Build Coastguard Worker kSeekTo_Option = 1, 112*ec779b8eSAndroid Build Coastguard Worker }; 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker uint32_t mOptions; 115*ec779b8eSAndroid Build Coastguard Worker int64_t mSeekTimeUs; 116*ec779b8eSAndroid Build Coastguard Worker SeekMode mSeekMode; 117*ec779b8eSAndroid Build Coastguard Worker bool mNonBlocking; 118*ec779b8eSAndroid Build Coastguard Worker } __attribute__((packed)); // sent through Binder 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker // Returns a new buffer of data. Call blocks until a 121*ec779b8eSAndroid Build Coastguard Worker // buffer is available, an error is encountered of the end of the stream 122*ec779b8eSAndroid Build Coastguard Worker // is reached. 123*ec779b8eSAndroid Build Coastguard Worker // End of stream is signalled by a result of ERROR_END_OF_STREAM. 124*ec779b8eSAndroid Build Coastguard Worker // A result of INFO_FORMAT_CHANGED indicates that the format of this 125*ec779b8eSAndroid Build Coastguard Worker // MediaSource has changed mid-stream, the client can continue reading 126*ec779b8eSAndroid Build Coastguard Worker // but should be prepared for buffers of the new configuration. 127*ec779b8eSAndroid Build Coastguard Worker virtual status_t read( 128*ec779b8eSAndroid Build Coastguard Worker MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0; 129*ec779b8eSAndroid Build Coastguard Worker 130*ec779b8eSAndroid Build Coastguard Worker // Returns true if |read| supports nonblocking option, otherwise false. 131*ec779b8eSAndroid Build Coastguard Worker // |readMultiple| if supported, always allows the nonblocking option. supportNonblockingReadMediaTrack132*ec779b8eSAndroid Build Coastguard Worker virtual bool supportNonblockingRead() { 133*ec779b8eSAndroid Build Coastguard Worker return false; 134*ec779b8eSAndroid Build Coastguard Worker } 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker virtual ~MediaTrack(); 137*ec779b8eSAndroid Build Coastguard Worker 138*ec779b8eSAndroid Build Coastguard Worker private: 139*ec779b8eSAndroid Build Coastguard Worker MediaTrack(const MediaTrack &); 140*ec779b8eSAndroid Build Coastguard Worker MediaTrack &operator=(const MediaTrack &); 141*ec779b8eSAndroid Build Coastguard Worker }; 142*ec779b8eSAndroid Build Coastguard Worker 143*ec779b8eSAndroid Build Coastguard Worker class MediaTrackCUnwrapper : public MediaTrack { 144*ec779b8eSAndroid Build Coastguard Worker public: 145*ec779b8eSAndroid Build Coastguard Worker static MediaTrackCUnwrapper *create(CMediaTrack *wrapper); 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker virtual status_t start(); 148*ec779b8eSAndroid Build Coastguard Worker virtual status_t stop(); 149*ec779b8eSAndroid Build Coastguard Worker virtual status_t getFormat(MetaDataBase& format); 150*ec779b8eSAndroid Build Coastguard Worker virtual status_t read(MediaBufferBase **buffer, const ReadOptions *options = NULL); 151*ec779b8eSAndroid Build Coastguard Worker 152*ec779b8eSAndroid Build Coastguard Worker virtual bool supportNonblockingRead(); 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker protected: 155*ec779b8eSAndroid Build Coastguard Worker virtual ~MediaTrackCUnwrapper(); 156*ec779b8eSAndroid Build Coastguard Worker 157*ec779b8eSAndroid Build Coastguard Worker private: 158*ec779b8eSAndroid Build Coastguard Worker explicit MediaTrackCUnwrapper(CMediaTrack *wrapper); 159*ec779b8eSAndroid Build Coastguard Worker CMediaTrack *wrapper; 160*ec779b8eSAndroid Build Coastguard Worker MediaBufferGroup *bufferGroup; 161*ec779b8eSAndroid Build Coastguard Worker }; 162*ec779b8eSAndroid Build Coastguard Worker 163*ec779b8eSAndroid Build Coastguard Worker } // namespace android 164*ec779b8eSAndroid Build Coastguard Worker 165*ec779b8eSAndroid Build Coastguard Worker #endif // MEDIA_SOURCE_BASE_H_ 166