120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef MEDIA_SOURCE_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define MEDIA_SOURCE_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/types.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber#include <media/stagefright/MediaErrors.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h> 250bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber#include <utils/Vector.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MediaBuffer; 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData; 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketistruct MediaSource : public virtual RefBase { 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaSource(); 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // To be called before any other methods on this object, except 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // getFormat(). 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t start(MetaData *params = NULL) = 0; 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Any blocking read call returns immediately with a result of NO_INIT. 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // It is an error to call any methods other than start after this call 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // returns. Any buffers the object may be holding onto at the time of 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // the stop() call are released. 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Also, it is imperative that any buffers output by this object and 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // held onto by callers be released before a call to stop() !!! 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t stop() = 0; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Returns the format of the data output by this media source. 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<MetaData> getFormat() = 0; 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct ReadOptions; 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Returns a new buffer of data. Call blocks until a 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // buffer is available, an error is encountered of the end of the stream 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // is reached. 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // End of stream is signalled by a result of ERROR_END_OF_STREAM. 567f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber // A result of INFO_FORMAT_CHANGED indicates that the format of this 577f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber // MediaSource has changed mid-stream, the client can continue reading 587f281f87670c63775ea1ae8b24af31822d5ad416Andreas Huber // but should be prepared for buffers of the new configuration. 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t read( 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL) = 0; 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Options that modify read() behaviour. The default is to 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // a) not request a seek 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // b) not be late, i.e. lateness_us = 0 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct ReadOptions { 66abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber enum SeekMode { 67abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber SEEK_PREVIOUS_SYNC, 68abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber SEEK_NEXT_SYNC, 69abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber SEEK_CLOSEST_SYNC, 70abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber SEEK_CLOSEST, 71abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber }; 72abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ReadOptions(); 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // Reset everything back to defaults. 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void reset(); 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 78abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void clearSeekTo(); 80abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber bool getSeekTo(int64_t *time_us, SeekMode *mode) const; 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void setLateBy(int64_t lateness_us); 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t getLateBy() const; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber private: 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber enum Options { 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kSeekTo_Option = 1, 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t mOptions; 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mSeekTimeUs; 92abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber SeekMode mSeekMode; 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t mLatenessUs; 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 96d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber // Causes this source to suspend pulling data from its upstream source 97d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber // until a subsequent read-with-seek. Currently only supported by 98d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber // OMXCodec. 99d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber virtual status_t pause() { 100d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber return ERROR_UNSUPPORTED; 101d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber } 102d35bd5fb4e09c2cd8608497c279cbb2ef9c3a029Andreas Huber 1030bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber // The consumer of this media source requests that the given buffers 1040bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber // are to be returned exclusively in response to read calls. 1050bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber // This will be called after a successful start() and before the 1060bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber // first read() call. 1070bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber // Callee assumes ownership of the buffers if no error is returned. 1080bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber virtual status_t setBuffers(const Vector<MediaBuffer *> &buffers) { 1090bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber return ERROR_UNSUPPORTED; 1100bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber } 1110bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber 112693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huberprotected: 113693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber virtual ~MediaSource(); 114693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaSource(const MediaSource &); 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaSource &operator=(const MediaSource &); 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // MEDIA_SOURCE_H_ 123