1 /*
2  * Copyright (C) 2014 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 
18 /*
19  * This file defines an NDK API.
20  * Do not remove methods.
21  * Do not change method signatures.
22  * Do not change the value of constants.
23  * Do not change the size of any of the classes defined in here.
24  * Do not reference types that are not part of the NDK.
25  * Do not #include files that aren't part of the NDK.
26  */
27 
28 #ifndef _NDK_MEDIA_EXTRACTOR_H
29 #define _NDK_MEDIA_EXTRACTOR_H
30 
31 #include <sys/types.h>
32 
33 #include "NdkMediaCodec.h"
34 #include "NdkMediaFormat.h"
35 #include "NdkMediaCrypto.h"
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 struct AMediaExtractor;
42 typedef struct AMediaExtractor AMediaExtractor;
43 
44 
45 /**
46  * Create new media extractor
47  */
48 AMediaExtractor* AMediaExtractor_new();
49 
50 /**
51  * Delete a previously created media extractor
52  */
53 media_status_t AMediaExtractor_delete(AMediaExtractor*);
54 
55 /**
56  *  Set the file descriptor from which the extractor will read.
57  */
58 media_status_t AMediaExtractor_setDataSourceFd(AMediaExtractor*, int fd, off64_t offset, off64_t length);
59 
60 /**
61  * Set the URI from which the extractor will read.
62  */
63 media_status_t AMediaExtractor_setDataSource(AMediaExtractor*, const char *location); // TODO support headers
64 
65 /**
66  * Return the number of tracks in the previously specified media file
67  */
68 size_t AMediaExtractor_getTrackCount(AMediaExtractor*);
69 
70 /**
71  * Return the format of the specified track. The caller must free the returned format
72  */
73 AMediaFormat* AMediaExtractor_getTrackFormat(AMediaExtractor*, size_t idx);
74 
75 /**
76  * Select the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and
77  * getSampleTime only retrieve information for the subset of tracks selected.
78  * Selecting the same track multiple times has no effect, the track is
79  * only selected once.
80  */
81 media_status_t AMediaExtractor_selectTrack(AMediaExtractor*, size_t idx);
82 
83 /**
84  * Unselect the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and
85  * getSampleTime only retrieve information for the subset of tracks selected..
86  */
87 media_status_t AMediaExtractor_unselectTrack(AMediaExtractor*, size_t idx);
88 
89 /**
90  * Read the current sample.
91  */
92 ssize_t AMediaExtractor_readSampleData(AMediaExtractor*, uint8_t *buffer, size_t capacity);
93 
94 /**
95  * Read the current sample's flags.
96  */
97 uint32_t AMediaExtractor_getSampleFlags(AMediaExtractor*); // see definitions below
98 
99 /**
100  * Returns the track index the current sample originates from (or -1
101  * if no more samples are available)
102  */
103 int AMediaExtractor_getSampleTrackIndex(AMediaExtractor*);
104 
105 /**
106  * Returns the current sample's presentation time in microseconds.
107  * or -1 if no more samples are available.
108  */
109 int64_t AMediaExtractor_getSampleTime(AMediaExtractor*);
110 
111 /**
112  * Advance to the next sample. Returns false if no more sample data
113  * is available (end of stream).
114  */
115 bool AMediaExtractor_advance(AMediaExtractor*);
116 
117 typedef enum {
118     AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC,
119     AMEDIAEXTRACTOR_SEEK_NEXT_SYNC,
120     AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC
121 } SeekMode;
122 
123 /**
124  *
125  */
126 media_status_t AMediaExtractor_seekTo(AMediaExtractor*, int64_t seekPosUs, SeekMode mode);
127 
128 /**
129  * mapping of crypto scheme uuid to the scheme specific data for that scheme
130  */
131 typedef struct PsshEntry {
132     AMediaUUID uuid;
133     size_t datalen;
134     void *data;
135 } PsshEntry;
136 
137 /**
138  * list of crypto schemes and their data
139  */
140 typedef struct PsshInfo {
141     size_t numentries;
142     PsshEntry entries[0];
143 } PsshInfo;
144 
145 /**
146  * Get the PSSH info if present.
147  */
148 PsshInfo* AMediaExtractor_getPsshInfo(AMediaExtractor*);
149 
150 
151 AMediaCodecCryptoInfo *AMediaExtractor_getSampleCryptoInfo(AMediaExtractor *);
152 
153 
154 enum {
155     AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC = 1,
156     AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED = 2,
157 };
158 
159 #ifdef __cplusplus
160 } // extern "C"
161 #endif
162 
163 #endif // _NDK_MEDIA_EXTRACTOR_H
164