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