Home | History | Annotate | Download | only in media
      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