1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef MEDIA_SOURCE_H_ 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define MEDIA_SOURCE_H_ 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <sys/types.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 231f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber#include <media/stagefright/MediaErrors.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/RefBase.h> 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MediaBuffer; 29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass MetaData; 30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 31be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberstruct MediaSource : public RefBase { 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaSource(); 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // To be called before any other methods on this object, except 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // getFormat(). 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t start(MetaData *params = NULL) = 0; 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Any blocking read call returns immediately with a result of NO_INIT. 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // It is an error to call any methods other than start after this call 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // returns. Any buffers the object may be holding onto at the time of 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // the stop() call are released. 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Also, it is imperative that any buffers output by this object and 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // held onto by callers be released before a call to stop() !!! 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t stop() = 0; 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Returns the format of the data output by this media source. 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual sp<MetaData> getFormat() = 0; 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct ReadOptions; 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Returns a new buffer of data. Call blocks until a 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // buffer is available, an error is encountered of the end of the stream 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // is reached. 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // End of stream is signalled by a result of ERROR_END_OF_STREAM. 55cfd55579c2e20514b181809dfaf30bd6f7e04c7eAndreas Huber // A result of INFO_FORMAT_CHANGED indicates that the format of this 56cfd55579c2e20514b181809dfaf30bd6f7e04c7eAndreas Huber // MediaSource has changed mid-stream, the client can continue reading 57cfd55579c2e20514b181809dfaf30bd6f7e04c7eAndreas Huber // but should be prepared for buffers of the new configuration. 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t read( 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaBuffer **buffer, const ReadOptions *options = NULL) = 0; 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Options that modify read() behaviour. The default is to 62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // a) not request a seek 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // b) not be late, i.e. lateness_us = 0 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct ReadOptions { 656624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber enum SeekMode { 666624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber SEEK_PREVIOUS_SYNC, 676624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber SEEK_NEXT_SYNC, 686624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber SEEK_CLOSEST_SYNC, 696624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber SEEK_CLOSEST, 706624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber }; 716624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber ReadOptions(); 73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber // Reset everything back to defaults. 75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void reset(); 76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 776624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC); 78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void clearSeekTo(); 796624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber bool getSeekTo(int64_t *time_us, SeekMode *mode) const; 80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 8153d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // Option allows encoder to skip some frames until the specified 8253d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // time stamp. 8353d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // To prevent from being abused, when the skipFrame timestamp is 8453d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // found to be more than 1 second later than the current timestamp, 8553d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // an error will be returned from read(). 8653d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong void clearSkipFrame(); 8753d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong bool getSkipFrame(int64_t *timeUs) const; 8853d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong void setSkipFrame(int64_t timeUs); 8953d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void setLateBy(int64_t lateness_us); 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int64_t getLateBy() const; 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber private: 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber enum Options { 9553d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong // Bit map 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber kSeekTo_Option = 1, 9753d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong kSkipFrame_Option = 2, 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber }; 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t mOptions; 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int64_t mSeekTimeUs; 1026624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber SeekMode mSeekMode; 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int64_t mLatenessUs; 10453d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong 10553d4e0d58e2d5c18f6e026c705af833b9bdd7abaJames Dong int64_t mSkipFrameUntilTimeUs; 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber }; 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 1081f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber // Causes this source to suspend pulling data from its upstream source 1091f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber // until a subsequent read-with-seek. Currently only supported by 1101f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber // OMXCodec. 1111f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber virtual status_t pause() { 1121f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber return ERROR_UNSUPPORTED; 1131f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber } 1141f24b30fe4b5d8e4050d30c92cf81cfa599cf991Andreas Huber 115be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprotected: 116be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual ~MediaSource(); 117be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate: 119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaSource(const MediaSource &); 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaSource &operator=(const MediaSource &); 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 124e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // MEDIA_SOURCE_H_ 126