xref: /aosp_15_r20/frameworks/av/include/media/MediaTrack.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef MEDIA_SOURCE_BASE_H_
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #define MEDIA_SOURCE_BASE_H_
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/MemoryDealer.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaExtractorPluginApi.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaBufferGroup.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MediaErrors.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/MetaData.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaExtractorPluginApi.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker namespace android {
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker class MediaBufferBase;
37*ec779b8eSAndroid Build Coastguard Worker struct CMediaTrack;
38*ec779b8eSAndroid Build Coastguard Worker 
39*ec779b8eSAndroid Build Coastguard Worker class SourceBaseAllocTracker {
40*ec779b8eSAndroid Build Coastguard Worker public:
SourceBaseAllocTracker()41*ec779b8eSAndroid Build Coastguard Worker     SourceBaseAllocTracker() {
42*ec779b8eSAndroid Build Coastguard Worker         ALOGD("sourcebase allocated: %p", this);
43*ec779b8eSAndroid Build Coastguard Worker     }
~SourceBaseAllocTracker()44*ec779b8eSAndroid Build Coastguard Worker     virtual ~SourceBaseAllocTracker() {
45*ec779b8eSAndroid Build Coastguard Worker         ALOGD("sourcebase freed: %p", this);
46*ec779b8eSAndroid Build Coastguard Worker     }
47*ec779b8eSAndroid Build Coastguard Worker };
48*ec779b8eSAndroid Build Coastguard Worker 
49*ec779b8eSAndroid Build Coastguard Worker struct MediaTrack
50*ec779b8eSAndroid Build Coastguard Worker //    : public SourceBaseAllocTracker
51*ec779b8eSAndroid Build Coastguard Worker {
52*ec779b8eSAndroid Build Coastguard Worker     MediaTrack();
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker     // To be called before any other methods on this object, except
55*ec779b8eSAndroid Build Coastguard Worker     // getFormat().
56*ec779b8eSAndroid Build Coastguard Worker     virtual status_t start() = 0;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     // Any blocking read call returns immediately with a result of NO_INIT.
59*ec779b8eSAndroid Build Coastguard Worker     // It is an error to call any methods other than start after this call
60*ec779b8eSAndroid Build Coastguard Worker     // returns. Any buffers the object may be holding onto at the time of
61*ec779b8eSAndroid Build Coastguard Worker     // the stop() call are released.
62*ec779b8eSAndroid Build Coastguard Worker     // Also, it is imperative that any buffers output by this object and
63*ec779b8eSAndroid Build Coastguard Worker     // held onto by callers be released before a call to stop() !!!
64*ec779b8eSAndroid Build Coastguard Worker     virtual status_t stop() = 0;
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     // Returns the format of the data output by this media track.
67*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getFormat(MetaDataBase& format) = 0;
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker     // Options that modify read() behaviour. The default is to
70*ec779b8eSAndroid Build Coastguard Worker     // a) not request a seek
71*ec779b8eSAndroid Build Coastguard Worker     // b) not be late, i.e. lateness_us = 0
72*ec779b8eSAndroid Build Coastguard Worker     struct ReadOptions {
73*ec779b8eSAndroid Build Coastguard Worker         enum SeekMode : int32_t {
74*ec779b8eSAndroid Build Coastguard Worker             SEEK_PREVIOUS_SYNC = CMediaTrackReadOptions::SEEK_PREVIOUS_SYNC,
75*ec779b8eSAndroid Build Coastguard Worker             SEEK_NEXT_SYNC = CMediaTrackReadOptions::SEEK_NEXT_SYNC,
76*ec779b8eSAndroid Build Coastguard Worker             SEEK_CLOSEST_SYNC = CMediaTrackReadOptions::SEEK_CLOSEST_SYNC,
77*ec779b8eSAndroid Build Coastguard Worker             SEEK_CLOSEST = CMediaTrackReadOptions::SEEK_CLOSEST,
78*ec779b8eSAndroid Build Coastguard Worker             SEEK_FRAME_INDEX = CMediaTrackReadOptions::SEEK_FRAME_INDEX,
79*ec779b8eSAndroid Build Coastguard Worker         };
80*ec779b8eSAndroid Build Coastguard Worker 
ReadOptionsMediaTrack::ReadOptions81*ec779b8eSAndroid Build Coastguard Worker         ReadOptions() {
82*ec779b8eSAndroid Build Coastguard Worker             reset();
83*ec779b8eSAndroid Build Coastguard Worker         }
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker         // Reset everything back to defaults.
resetMediaTrack::ReadOptions86*ec779b8eSAndroid Build Coastguard Worker         void reset() {
87*ec779b8eSAndroid Build Coastguard Worker             mOptions = 0;
88*ec779b8eSAndroid Build Coastguard Worker             mSeekTimeUs = 0;
89*ec779b8eSAndroid Build Coastguard Worker             mNonBlocking = false;
90*ec779b8eSAndroid Build Coastguard Worker         }
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker         void setSeekTo(int64_t time_us, SeekMode mode = SEEK_CLOSEST_SYNC);
clearSeekToMediaTrack::ReadOptions93*ec779b8eSAndroid Build Coastguard Worker         void clearSeekTo() {
94*ec779b8eSAndroid Build Coastguard Worker             mOptions &= ~kSeekTo_Option;
95*ec779b8eSAndroid Build Coastguard Worker             mSeekTimeUs = 0;
96*ec779b8eSAndroid Build Coastguard Worker             mSeekMode = SEEK_CLOSEST_SYNC;
97*ec779b8eSAndroid Build Coastguard Worker         }
98*ec779b8eSAndroid Build Coastguard Worker         bool getSeekTo(int64_t *time_us, SeekMode *mode) const;
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker         void setNonBlocking();
101*ec779b8eSAndroid Build Coastguard Worker         void clearNonBlocking();
102*ec779b8eSAndroid Build Coastguard Worker         bool getNonBlocking() const;
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker         // Used to clear all non-persistent options for multiple buffer reads.
clearNonPersistentMediaTrack::ReadOptions105*ec779b8eSAndroid Build Coastguard Worker         void clearNonPersistent() {
106*ec779b8eSAndroid Build Coastguard Worker             clearSeekTo();
107*ec779b8eSAndroid Build Coastguard Worker         }
108*ec779b8eSAndroid Build Coastguard Worker 
109*ec779b8eSAndroid Build Coastguard Worker     private:
110*ec779b8eSAndroid Build Coastguard Worker         enum Options {
111*ec779b8eSAndroid Build Coastguard Worker             kSeekTo_Option      = 1,
112*ec779b8eSAndroid Build Coastguard Worker         };
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker         uint32_t mOptions;
115*ec779b8eSAndroid Build Coastguard Worker         int64_t mSeekTimeUs;
116*ec779b8eSAndroid Build Coastguard Worker         SeekMode mSeekMode;
117*ec779b8eSAndroid Build Coastguard Worker         bool mNonBlocking;
118*ec779b8eSAndroid Build Coastguard Worker     } __attribute__((packed)); // sent through Binder
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker     // Returns a new buffer of data. Call blocks until a
121*ec779b8eSAndroid Build Coastguard Worker     // buffer is available, an error is encountered of the end of the stream
122*ec779b8eSAndroid Build Coastguard Worker     // is reached.
123*ec779b8eSAndroid Build Coastguard Worker     // End of stream is signalled by a result of ERROR_END_OF_STREAM.
124*ec779b8eSAndroid Build Coastguard Worker     // A result of INFO_FORMAT_CHANGED indicates that the format of this
125*ec779b8eSAndroid Build Coastguard Worker     // MediaSource has changed mid-stream, the client can continue reading
126*ec779b8eSAndroid Build Coastguard Worker     // but should be prepared for buffers of the new configuration.
127*ec779b8eSAndroid Build Coastguard Worker     virtual status_t read(
128*ec779b8eSAndroid Build Coastguard Worker             MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0;
129*ec779b8eSAndroid Build Coastguard Worker 
130*ec779b8eSAndroid Build Coastguard Worker     // Returns true if |read| supports nonblocking option, otherwise false.
131*ec779b8eSAndroid Build Coastguard Worker     // |readMultiple| if supported, always allows the nonblocking option.
supportNonblockingReadMediaTrack132*ec779b8eSAndroid Build Coastguard Worker     virtual bool supportNonblockingRead() {
133*ec779b8eSAndroid Build Coastguard Worker         return false;
134*ec779b8eSAndroid Build Coastguard Worker     }
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker     virtual ~MediaTrack();
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker private:
139*ec779b8eSAndroid Build Coastguard Worker     MediaTrack(const MediaTrack &);
140*ec779b8eSAndroid Build Coastguard Worker     MediaTrack &operator=(const MediaTrack &);
141*ec779b8eSAndroid Build Coastguard Worker };
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker class MediaTrackCUnwrapper : public MediaTrack {
144*ec779b8eSAndroid Build Coastguard Worker public:
145*ec779b8eSAndroid Build Coastguard Worker     static MediaTrackCUnwrapper *create(CMediaTrack *wrapper);
146*ec779b8eSAndroid Build Coastguard Worker 
147*ec779b8eSAndroid Build Coastguard Worker     virtual status_t start();
148*ec779b8eSAndroid Build Coastguard Worker     virtual status_t stop();
149*ec779b8eSAndroid Build Coastguard Worker     virtual status_t getFormat(MetaDataBase& format);
150*ec779b8eSAndroid Build Coastguard Worker     virtual status_t read(MediaBufferBase **buffer, const ReadOptions *options = NULL);
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker     virtual bool supportNonblockingRead();
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker protected:
155*ec779b8eSAndroid Build Coastguard Worker     virtual ~MediaTrackCUnwrapper();
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker private:
158*ec779b8eSAndroid Build Coastguard Worker     explicit MediaTrackCUnwrapper(CMediaTrack *wrapper);
159*ec779b8eSAndroid Build Coastguard Worker     CMediaTrack *wrapper;
160*ec779b8eSAndroid Build Coastguard Worker     MediaBufferGroup *bufferGroup;
161*ec779b8eSAndroid Build Coastguard Worker };
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
164*ec779b8eSAndroid Build Coastguard Worker 
165*ec779b8eSAndroid Build Coastguard Worker #endif  // MEDIA_SOURCE_BASE_H_
166