1cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen/* 2cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * Copyright (C) 2018 The Android Open Source Project 3cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * 4cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * you may not use this file except in compliance with the License. 6cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * You may obtain a copy of the License at 7cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * 8cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * 10cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * See the License for the specific language governing permissions and 14cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen * limitations under the License. 15cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen */ 16cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 17cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#ifndef MEDIA_SOURCE_BASE_H_ 18cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 19cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#define MEDIA_SOURCE_BASE_H_ 20cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 21cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <sys/types.h> 22cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 23cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <binder/IMemory.h> 24cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <binder/MemoryDealer.h> 25cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <media/stagefright/MediaErrors.h> 26cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <media/stagefright/MetaData.h> 2742e497d687c8e9ec61601987894c9033dcbf62d6Dongwon Kang#include <utils/Log.h> 28cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <utils/RefBase.h> 29cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#include <utils/Vector.h> 30cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 31cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissennamespace android { 32cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 331889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kangclass MediaBufferBase; 34cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 35cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissenclass SourceBaseAllocTracker { 36cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissenpublic: 37cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SourceBaseAllocTracker() { 38cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen ALOGD("sourcebase allocated: %p", this); 39cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen } 40cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen virtual ~SourceBaseAllocTracker() { 41cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen ALOGD("sourcebase freed: %p", this); 42cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen } 43cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen}; 44cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 453d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenstruct MediaTrack 46cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen// : public SourceBaseAllocTracker 47cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen{ 483d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MediaTrack(); 49cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 50cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // To be called before any other methods on this object, except 51cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // getFormat(). 523d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t start(MetaDataBase *params = NULL) = 0; 53cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 54cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Any blocking read call returns immediately with a result of NO_INIT. 55cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // It is an error to call any methods other than start after this call 56cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // returns. Any buffers the object may be holding onto at the time of 57cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // the stop() call are released. 58cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Also, it is imperative that any buffers output by this object and 59cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // held onto by callers be released before a call to stop() !!! 60cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen virtual status_t stop() = 0; 61cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 623d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen // Returns the format of the data output by this media track. 633d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual status_t getFormat(MetaDataBase& format) = 0; 64cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 65cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Options that modify read() behaviour. The default is to 66cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // a) not request a seek 67cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // b) not be late, i.e. lateness_us = 0 68cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen struct ReadOptions { 69cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen enum SeekMode : int32_t { 70cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SEEK_PREVIOUS_SYNC, 71cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SEEK_NEXT_SYNC, 72cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SEEK_CLOSEST_SYNC, 73cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SEEK_CLOSEST, 74cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SEEK_FRAME_INDEX, 75cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen }; 76cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 77cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen ReadOptions(); 78cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 79cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Reset everything back to defaults. 80cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void reset(); 81cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 82cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); 83cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void clearSeekTo(); 84cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen bool getSeekTo(int64_t *time_us, SeekMode *mode) const; 85cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 86cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void setNonBlocking(); 87cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void clearNonBlocking(); 88cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen bool getNonBlocking() const; 89cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 90cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Used to clear all non-persistent options for multiple buffer reads. 91cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen void clearNonPersistent() { 92cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen clearSeekTo(); 93cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen } 94cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 95cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen private: 96cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen enum Options { 97cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen kSeekTo_Option = 1, 98cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen }; 99cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 100cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen uint32_t mOptions; 101cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen int64_t mSeekTimeUs; 102cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen SeekMode mSeekMode; 103cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen bool mNonBlocking; 104cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen } __attribute__((packed)); // sent through Binder 105cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 106cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // Returns a new buffer of data. Call blocks until a 107cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // buffer is available, an error is encountered of the end of the stream 108cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // is reached. 109cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // End of stream is signalled by a result of ERROR_END_OF_STREAM. 110cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // A result of INFO_FORMAT_CHANGED indicates that the format of this 111cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // MediaSource has changed mid-stream, the client can continue reading 112cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen // but should be prepared for buffers of the new configuration. 113cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen virtual status_t read( 1141889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0; 115cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 1163d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen virtual ~MediaTrack(); 117cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 118cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissenprivate: 1193d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MediaTrack(const MediaTrack &); 1203d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MediaTrack &operator=(const MediaTrack &); 121cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen}; 122cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 123cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen} // namespace android 124cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen 125cb30d8477cbd16dcef6acee1e07dedfa246e9456Marco Nelissen#endif // MEDIA_SOURCE_BASE_H_ 126