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