blob: b480bbe54c5cefc20ab0ea8ae7d2a90dbee70c8e [file] [log] [blame]
Marco Nelissen0b164472018-05-30 12:16:56 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef MEDIA_EXTRACTOR_PLUGIN_API_H_
18#define MEDIA_EXTRACTOR_PLUGIN_API_H_
19
20#include <utils/Errors.h> // for status_t
Marco Nelissen5dcf85a2018-10-11 09:49:02 -070021#include <media/NdkMediaError.h>
Marco Nelissen56f19382018-09-12 15:30:59 -070022struct AMediaFormat;
23
Marco Nelissen0b164472018-05-30 12:16:56 -070024namespace android {
25
26struct MediaTrack;
27class MetaDataBase;
Marco Nelissen2a3363a2018-09-13 13:15:30 -070028class MediaBufferBase;
Marco Nelissen0b164472018-05-30 12:16:56 -070029
30extern "C" {
31
Marco Nelissencec44d02018-06-17 22:21:09 -070032struct CDataSource {
33 ssize_t (*readAt)(void *handle, off64_t offset, void *data, size_t size);
34 status_t (*getSize)(void *handle, off64_t *size);
35 uint32_t (*flags)(void *handle );
36 bool (*getUri)(void *handle, char *uriString, size_t bufferSize);
37 void *handle;
38};
39
Marco Nelissen2a3363a2018-09-13 13:15:30 -070040enum CMediaTrackReadOptions : uint32_t {
41 SEEK_PREVIOUS_SYNC = 0,
42 SEEK_NEXT_SYNC = 1,
43 SEEK_CLOSEST_SYNC = 2,
44 SEEK_CLOSEST = 3,
45 SEEK_FRAME_INDEX = 4,
46 SEEK = 8,
47 NONBLOCKING = 16
48};
49
50struct CMediaTrack {
51 void *data;
52 void (*free)(void *data);
53
Marco Nelissen3db2dcc2018-10-03 14:09:37 -070054 status_t (*start)(void *data);
Marco Nelissen2a3363a2018-09-13 13:15:30 -070055 status_t (*stop)(void *data);
56 status_t (*getFormat)(void *data, MetaDataBase &format);
57 status_t (*read)(void *data, MediaBufferBase **buffer, uint32_t options, int64_t seekPosUs);
58 bool (*supportsNonBlockingRead)(void *data);
59};
60
Marco Nelissen56f19382018-09-12 15:30:59 -070061struct CMediaTrackV2 {
62 void *data;
63 void (*free)(void *data);
64
Marco Nelissen5dcf85a2018-10-11 09:49:02 -070065 media_status_t (*start)(void *data);
66 media_status_t (*stop)(void *data);
67 media_status_t (*getFormat)(void *data, AMediaFormat *format);
68 media_status_t (*read)(void *data, MediaBufferBase **buffer, uint32_t options, int64_t seekPosUs);
Marco Nelissen56f19382018-09-12 15:30:59 -070069 bool (*supportsNonBlockingRead)(void *data);
70};
71
Marco Nelissen0e043b62018-11-14 11:26:05 -080072/**
73 * only use CMediaBufferV3 allocated from the CMediaBufferGroupV3 that is
74 * provided to CMediaTrack::start()
75 */
76struct CMediaBufferV3 {
77 void *handle;
78 void (*release)(void *handle);
79 void* (*data)(void *handle);
80 size_t (*size)(void *handle);
81 size_t (*range_offset)(void *handle);
82 size_t (*range_length)(void *handle);
83 void (*set_range)(void *handle, size_t offset, size_t length);
84 AMediaFormat* (*meta_data)(void *handle);
85};
86
87struct CMediaBufferGroupV3 {
88 void *handle;
89 bool (*init)(void *handle, size_t buffers, size_t buffer_size, size_t growthLimit);
90 void (*add_buffer)(void *handle, size_t size);
91 media_status_t (*acquire_buffer)(void *handle,
92 CMediaBufferV3 **buffer, bool nonBlocking, size_t requestedSize);
93 bool (*has_buffers)(void *handle);
94};
95
96struct CMediaTrackV3 {
97 void *data;
98 void (*free)(void *data);
99
100 media_status_t (*start)(void *data, CMediaBufferGroupV3 *bufferGroup);
101 media_status_t (*stop)(void *data);
102 media_status_t (*getFormat)(void *data, AMediaFormat *format);
103 media_status_t (*read)(void *data, CMediaBufferV3 **buffer, uint32_t options, int64_t seekPosUs);
104 bool (*supportsNonBlockingRead)(void *data);
105};
Marco Nelissen56f19382018-09-12 15:30:59 -0700106
107struct CMediaExtractorV1 {
Marco Nelissen0b164472018-05-30 12:16:56 -0700108 void *data;
109
110 void (*free)(void *data);
111 size_t (*countTracks)(void *data);
Marco Nelissen2a3363a2018-09-13 13:15:30 -0700112 CMediaTrack* (*getTrack)(void *data, size_t index);
Marco Nelissen0b164472018-05-30 12:16:56 -0700113 status_t (*getTrackMetaData)(
114 void *data,
115 MetaDataBase& meta,
116 size_t index, uint32_t flags);
117
118 status_t (*getMetaData)(void *data, MetaDataBase& meta);
119 uint32_t (*flags)(void *data);
120 status_t (*setMediaCas)(void *data, const uint8_t* casToken, size_t size);
121 const char * (*name)(void *data);
122};
123
Marco Nelissen56f19382018-09-12 15:30:59 -0700124struct CMediaExtractorV2 {
125 void *data;
126
127 void (*free)(void *data);
128 size_t (*countTracks)(void *data);
129 CMediaTrackV2* (*getTrack)(void *data, size_t index);
Marco Nelissen5dcf85a2018-10-11 09:49:02 -0700130 media_status_t (*getTrackMetaData)(
Marco Nelissen56f19382018-09-12 15:30:59 -0700131 void *data,
132 AMediaFormat *meta,
133 size_t index, uint32_t flags);
134
Marco Nelissen5dcf85a2018-10-11 09:49:02 -0700135 media_status_t (*getMetaData)(void *data, AMediaFormat *meta);
Marco Nelissen56f19382018-09-12 15:30:59 -0700136 uint32_t (*flags)(void *data);
Marco Nelissen5dcf85a2018-10-11 09:49:02 -0700137 media_status_t (*setMediaCas)(void *data, const uint8_t* casToken, size_t size);
Marco Nelissen56f19382018-09-12 15:30:59 -0700138 const char * (*name)(void *data);
139};
140
Marco Nelissen0e043b62018-11-14 11:26:05 -0800141struct CMediaExtractorV3 {
142 void *data;
143
144 void (*free)(void *data);
145 size_t (*countTracks)(void *data);
146 CMediaTrackV3* (*getTrack)(void *data, size_t index);
147 media_status_t (*getTrackMetaData)(
148 void *data,
149 AMediaFormat *meta,
150 size_t index, uint32_t flags);
151
152 media_status_t (*getMetaData)(void *data, AMediaFormat *meta);
153 uint32_t (*flags)(void *data);
154 media_status_t (*setMediaCas)(void *data, const uint8_t* casToken, size_t size);
155 const char * (*name)(void *data);
156};
157
Marco Nelissen56f19382018-09-12 15:30:59 -0700158typedef CMediaExtractorV1* (*CreatorFuncV1)(CDataSource *source, void *meta);
Marco Nelissen0b164472018-05-30 12:16:56 -0700159typedef void (*FreeMetaFunc)(void *meta);
160
161// The sniffer can optionally fill in an opaque object, "meta", that helps
162// the corresponding extractor initialize its state without duplicating
163// effort already exerted by the sniffer. If "freeMeta" is given, it will be
164// called against the opaque object when it is no longer used.
Marco Nelissen56f19382018-09-12 15:30:59 -0700165typedef CreatorFuncV1 (*SnifferFuncV1)(
Marco Nelissencec44d02018-06-17 22:21:09 -0700166 CDataSource *source, float *confidence,
Marco Nelissen0b164472018-05-30 12:16:56 -0700167 void **meta, FreeMetaFunc *freeMeta);
168
Marco Nelissen56f19382018-09-12 15:30:59 -0700169typedef CMediaExtractorV2* (*CreatorFuncV2)(CDataSource *source, void *meta);
170
171typedef CreatorFuncV2 (*SnifferFuncV2)(
172 CDataSource *source, float *confidence,
173 void **meta, FreeMetaFunc *freeMeta);
174
Marco Nelissen0e043b62018-11-14 11:26:05 -0800175typedef CMediaExtractorV3* (*CreatorFuncV3)(CDataSource *source, void *meta);
176
177typedef CreatorFuncV3 (*SnifferFuncV3)(
178 CDataSource *source, float *confidence,
179 void **meta, FreeMetaFunc *freeMeta);
180
Marco Nelissen56f19382018-09-12 15:30:59 -0700181typedef CMediaExtractorV1 CMediaExtractor;
182typedef CreatorFuncV1 CreatorFunc;
183
184
Marco Nelissen0b164472018-05-30 12:16:56 -0700185typedef struct {
186 const uint8_t b[16];
187} media_uuid_t;
188
Marco Nelissen56f19382018-09-12 15:30:59 -0700189struct ExtractorDef {
Marco Nelissen0b164472018-05-30 12:16:56 -0700190 // version number of this structure
191 const uint32_t def_version;
192
193 // A unique identifier for this extractor.
194 // See below for a convenience macro to create this from a string.
195 media_uuid_t extractor_uuid;
196
197 // Version number of this extractor. When two extractors with the same
198 // uuid are encountered, the one with the largest version number will
199 // be used.
200 const uint32_t extractor_version;
201
202 // a human readable name
203 const char *extractor_name;
204
Marco Nelissen56f19382018-09-12 15:30:59 -0700205 union {
206 SnifferFuncV1 v1;
207 SnifferFuncV2 v2;
Marco Nelissen0e043b62018-11-14 11:26:05 -0800208 SnifferFuncV3 v3;
Marco Nelissen56f19382018-09-12 15:30:59 -0700209 } sniff;
210};
Marco Nelissen0b164472018-05-30 12:16:56 -0700211
Marco Nelissen56f19382018-09-12 15:30:59 -0700212const uint32_t EXTRACTORDEF_VERSION_LEGACY = 1;
213const uint32_t EXTRACTORDEF_VERSION_CURRENT = 2;
214
215const uint32_t EXTRACTORDEF_VERSION = EXTRACTORDEF_VERSION_LEGACY;
Marco Nelissen0b164472018-05-30 12:16:56 -0700216
217// each plugin library exports one function of this type
218typedef ExtractorDef (*GetExtractorDef)();
219
220} // extern "C"
221
222} // namespace android
223
224#endif // MEDIA_EXTRACTOR_PLUGIN_API_H_