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