10c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/* 20c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Copyright (C) 2014 The Android Open Source Project 30c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * 40c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 50c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * you may not use this file except in compliance with the License. 60c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * You may obtain a copy of the License at 70c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * 80c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 90c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * 100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Unless required by applicable law or agreed to in writing, software 110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * See the License for the specific language governing permissions and 140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * limitations under the License. 150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 170c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 180c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/* 190c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * This file defines an NDK API. 200c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not remove methods. 210c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change method signatures. 220c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change the value of constants. 230c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not change the size of any of the classes defined in here. 240c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not reference types that are not part of the NDK. 250c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Do not #include files that aren't part of the NDK. 260c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 270c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 280c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifndef _NDK_MEDIA_EXTRACTOR_H 290c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#define _NDK_MEDIA_EXTRACTOR_H 300c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 310c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include <sys/types.h> 320c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 33050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCodec.h" 340c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#include "NdkMediaFormat.h" 35050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCrypto.h" 360c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 370c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus 380c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenextern "C" { 390c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif 400c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 410c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenstruct AMediaExtractor; 420c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissentypedef struct AMediaExtractor AMediaExtractor; 430c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 440c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 450c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 460c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Create new media extractor 470c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 480c3be875376adaee8d8e8dd917c64926e1513b29Marco NelissenAMediaExtractor* AMediaExtractor_new(); 490c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 500c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 510c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Delete a previously created media extractor 520c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 53e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaExtractor_delete(AMediaExtractor*); 540c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 550c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 560c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Set the file descriptor from which the extractor will read. 570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 58e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaExtractor_setDataSourceFd(AMediaExtractor*, int fd, off64_t offset, off64_t length); 590c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 600c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 610c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Set the URI from which the extractor will read. 620c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 63e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaExtractor_setDataSource(AMediaExtractor*, const char *location); // TODO support headers 640c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 650c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 660c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Return the number of tracks in the previously specified media file 670c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 68e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissensize_t AMediaExtractor_getTrackCount(AMediaExtractor*); 690c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 700c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 710c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Return the format of the specified track. The caller must free the returned format 720c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 730c3be875376adaee8d8e8dd917c64926e1513b29Marco NelissenAMediaFormat* AMediaExtractor_getTrackFormat(AMediaExtractor*, size_t idx); 740c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 750c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 760c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Select the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and 770c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * getSampleTime only retrieve information for the subset of tracks selected. 780c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Selecting the same track multiple times has no effect, the track is 790c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * only selected once. 800c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 81e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaExtractor_selectTrack(AMediaExtractor*, size_t idx); 820c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 830c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 840c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Unselect the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and 850c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * getSampleTime only retrieve information for the subset of tracks selected.. 860c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 87e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenmedia_status_t AMediaExtractor_unselectTrack(AMediaExtractor*, size_t idx); 880c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 890c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 900c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Read the current sample. 910c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 92e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenssize_t AMediaExtractor_readSampleData(AMediaExtractor*, uint8_t *buffer, size_t capacity); 930c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 940c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 950c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Read the current sample's flags. 960c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 97e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenuint32_t AMediaExtractor_getSampleFlags(AMediaExtractor*); // see definitions below 980c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 990c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1000c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Returns the track index the current sample originates from (or -1 1010c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * if no more samples are available) 1020c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1030c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenint AMediaExtractor_getSampleTrackIndex(AMediaExtractor*); 1040c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1050c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1060c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Returns the current sample's presentation time in microseconds. 1070c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * or -1 if no more samples are available. 1080c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 109eb4860c305def68c5965474bb43c67c2c9d49bbbMarco Nelissenint64_t AMediaExtractor_getSampleTime(AMediaExtractor*); 1100c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1110c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen/** 1120c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * Advance to the next sample. Returns false if no more sample data 1130c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen * is available (end of stream). 1140c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen */ 1150c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenbool AMediaExtractor_advance(AMediaExtractor*); 1160c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 11779e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissentypedef enum { 11879e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC, 11979e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen AMEDIAEXTRACTOR_SEEK_NEXT_SYNC, 12079e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC 12179e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen} SeekMode; 12279e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen 12379e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen/** 12479e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen * 12579e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissen */ 12679e2b622702fb148ccff12d6f38643466555c4ebMarco Nelissenmedia_status_t AMediaExtractor_seekTo(AMediaExtractor*, int64_t seekPosUs, SeekMode mode); 127050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 128050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/** 129050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * mapping of crypto scheme uuid to the scheme specific data for that scheme 130050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */ 131050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissentypedef struct PsshEntry { 132050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen AMediaUUID uuid; 133050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen size_t datalen; 134050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen void *data; 135050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} PsshEntry; 136050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 137050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/** 138050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * list of crypto schemes and their data 139050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */ 140050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissentypedef struct PsshInfo { 141050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen size_t numentries; 142050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen PsshEntry entries[0]; 143050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} PsshInfo; 144050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 145050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/** 146050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Get the PSSH info if present. 147050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */ 148050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenPsshInfo* AMediaExtractor_getPsshInfo(AMediaExtractor*); 149050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 150050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 151050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenAMediaCodecCryptoInfo *AMediaExtractor_getSampleCryptoInfo(AMediaExtractor *); 152050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 153050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 1540c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissenenum { 1550c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC = 1, 1560c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED = 2, 1570c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen}; 1580c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1590c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#ifdef __cplusplus 1600c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen} // extern "C" 1610c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif 1620c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen 1630c3be875376adaee8d8e8dd917c64926e1513b29Marco Nelissen#endif // _NDK_MEDIA_EXTRACTOR_H 164