Home | History | Annotate | Download | only in ndk
      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,
     59         off64_t length);
     60 
     61 /**
     62  * Set the URI from which the extractor will read.
     63  */
     64 media_status_t AMediaExtractor_setDataSource(AMediaExtractor*, const char *location);
     65         // TODO support headers
     66 
     67 /**
     68  * Return the number of tracks in the previously specified media file
     69  */
     70 size_t AMediaExtractor_getTrackCount(AMediaExtractor*);
     71 
     72 /**
     73  * Return the format of the specified track. The caller must free the returned format
     74  */
     75 AMediaFormat* AMediaExtractor_getTrackFormat(AMediaExtractor*, size_t idx);
     76 
     77 /**
     78  * Select the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and
     79  * getSampleTime only retrieve information for the subset of tracks selected.
     80  * Selecting the same track multiple times has no effect, the track is
     81  * only selected once.
     82  */
     83 media_status_t AMediaExtractor_selectTrack(AMediaExtractor*, size_t idx);
     84 
     85 /**
     86  * Unselect the specified track. Subsequent calls to readSampleData, getSampleTrackIndex and
     87  * getSampleTime only retrieve information for the subset of tracks selected..
     88  */
     89 media_status_t AMediaExtractor_unselectTrack(AMediaExtractor*, size_t idx);
     90 
     91 /**
     92  * Read the current sample.
     93  */
     94 ssize_t AMediaExtractor_readSampleData(AMediaExtractor*, uint8_t *buffer, size_t capacity);
     95 
     96 /**
     97  * Read the current sample's flags.
     98  */
     99 uint32_t AMediaExtractor_getSampleFlags(AMediaExtractor*); // see definitions below
    100 
    101 /**
    102  * Returns the track index the current sample originates from (or -1
    103  * if no more samples are available)
    104  */
    105 int AMediaExtractor_getSampleTrackIndex(AMediaExtractor*);
    106 
    107 /**
    108  * Returns the current sample's presentation time in microseconds.
    109  * or -1 if no more samples are available.
    110  */
    111 int64_t AMediaExtractor_getSampleTime(AMediaExtractor*);
    112 
    113 /**
    114  * Advance to the next sample. Returns false if no more sample data
    115  * is available (end of stream).
    116  */
    117 bool AMediaExtractor_advance(AMediaExtractor*);
    118 
    119 typedef enum {
    120     AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC,
    121     AMEDIAEXTRACTOR_SEEK_NEXT_SYNC,
    122     AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC
    123 } SeekMode;
    124 
    125 /**
    126  *
    127  */
    128 media_status_t AMediaExtractor_seekTo(AMediaExtractor*, int64_t seekPosUs, SeekMode mode);
    129 
    130 /**
    131  * mapping of crypto scheme uuid to the scheme specific data for that scheme
    132  */
    133 typedef struct PsshEntry {
    134     AMediaUUID uuid;
    135     size_t datalen;
    136     void *data;
    137 } PsshEntry;
    138 
    139 /**
    140  * list of crypto schemes and their data
    141  */
    142 typedef struct PsshInfo {
    143     size_t numentries;
    144     PsshEntry entries[0];
    145 } PsshInfo;
    146 
    147 /**
    148  * Get the PSSH info if present.
    149  */
    150 PsshInfo* AMediaExtractor_getPsshInfo(AMediaExtractor*);
    151 
    152 
    153 AMediaCodecCryptoInfo *AMediaExtractor_getSampleCryptoInfo(AMediaExtractor *);
    154 
    155 
    156 enum {
    157     AMEDIAEXTRACTOR_SAMPLE_FLAG_SYNC = 1,
    158     AMEDIAEXTRACTOR_SAMPLE_FLAG_ENCRYPTED = 2,
    159 };
    160 
    161 #ifdef __cplusplus
    162 } // extern "C"
    163 #endif
    164 
    165 #endif // _NDK_MEDIA_EXTRACTOR_H
    166