tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

mediacodec_wrapper.h (15974B)


      1 /*
      2 * Android MediaCodec Wrapper
      3 *
      4 * Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com>
      5 *
      6 * This file is part of FFmpeg.
      7 *
      8 * FFmpeg is free software; you can redistribute it and/or
      9 * modify it under the terms of the GNU Lesser General Public
     10 * License as published by the Free Software Foundation; either
     11 * version 2.1 of the License, or (at your option) any later version.
     12 *
     13 * FFmpeg is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16 * Lesser General Public License for more details.
     17 *
     18 * You should have received a copy of the GNU Lesser General Public
     19 * License along with FFmpeg; if not, write to the Free Software
     20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     21 */
     22 
     23 #ifndef AVCODEC_MEDIACODEC_WRAPPER_H
     24 #define AVCODEC_MEDIACODEC_WRAPPER_H
     25 
     26 #include <stdint.h>
     27 #include <sys/types.h>
     28 
     29 #include "avcodec.h"
     30 #include "mediacodec_surface.h"
     31 
     32 /**
     33 * The following API around MediaCodec and MediaFormat is based on the
     34 * NDK one provided by Google since Android 5.0.
     35 *
     36 * Differences from the NDK API:
     37 *
     38 * Buffers returned by ff_AMediaFormat_toString and ff_AMediaFormat_getString
     39 * are newly allocated buffer and must be freed by the user after use.
     40 *
     41 * The MediaCrypto API is not implemented.
     42 *
     43 * ff_AMediaCodec_infoTryAgainLater, ff_AMediaCodec_infoOutputBuffersChanged,
     44 * ff_AMediaCodec_infoOutputFormatChanged, ff_AMediaCodec_cleanOutputBuffers
     45 * ff_AMediaCodec_getName and ff_AMediaCodec_getBufferFlagEndOfStream are not
     46 * part of the original NDK API and are convenience functions to hide JNI
     47 * implementation.
     48 *
     49 * The API around MediaCodecList is not part of the NDK (and is lacking as
     50 * we still need to retrieve the codec name to work around faulty decoders
     51 * and encoders).
     52 *
     53 * For documentation, please refers to NdkMediaCodec.h NdkMediaFormat.h and
     54 * http://developer.android.com/reference/android/media/MediaCodec.html.
     55 *
     56 */
     57 
     58 int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx);
     59 
     60 char *ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int encoder, void *log_ctx);
     61 
     62 typedef struct FFAMediaFormat FFAMediaFormat;
     63 struct FFAMediaFormat {
     64    const AVClass *class;
     65 
     66    FFAMediaFormat *(*create)(void);
     67    int (*delete)(FFAMediaFormat *);
     68 
     69    char* (*toString)(FFAMediaFormat* format);
     70 
     71    int (*getInt32)(FFAMediaFormat* format, const char *name, int32_t *out);
     72    int (*getInt64)(FFAMediaFormat* format, const char *name, int64_t *out);
     73    int (*getFloat)(FFAMediaFormat* format, const char *name, float *out);
     74    int (*getBuffer)(FFAMediaFormat* format, const char *name, void** data, size_t *size);
     75    int (*getString)(FFAMediaFormat* format, const char *name, const char **out);
     76    // NDK only, introduced in API level 28
     77    int (*getRect)(FFAMediaFormat *, const char *name,
     78                   int32_t *left, int32_t *top, int32_t *right, int32_t *bottom);
     79 
     80    void (*setInt32)(FFAMediaFormat* format, const char* name, int32_t value);
     81    void (*setInt64)(FFAMediaFormat* format, const char* name, int64_t value);
     82    void (*setFloat)(FFAMediaFormat* format, const char* name, float value);
     83    void (*setString)(FFAMediaFormat* format, const char* name, const char* value);
     84    void (*setBuffer)(FFAMediaFormat* format, const char* name, void* data, size_t size);
     85    // NDK only, introduced in API level 28
     86    void (*setRect)(FFAMediaFormat*, const char* name,
     87                    int32_t left, int32_t top, int32_t right, int32_t bottom);
     88 };
     89 
     90 FFAMediaFormat *ff_AMediaFormat_new(int ndk);
     91 
     92 static inline int ff_AMediaFormat_delete(FFAMediaFormat* format)
     93 {
     94    return format->delete(format);
     95 }
     96 
     97 static inline char* ff_AMediaFormat_toString(FFAMediaFormat* format)
     98 {
     99    return format->toString(format);
    100 }
    101 
    102 static inline int ff_AMediaFormat_getInt32(FFAMediaFormat* format, const char *name, int32_t *out)
    103 {
    104    return format->getInt32(format, name, out);
    105 }
    106 
    107 static inline int ff_AMediaFormat_getInt64(FFAMediaFormat* format, const char *name, int64_t *out)
    108 {
    109    return format->getInt64(format, name, out);
    110 }
    111 
    112 static inline int ff_AMediaFormat_getFloat(FFAMediaFormat* format, const char *name, float *out)
    113 {
    114    return format->getFloat(format, name, out);
    115 }
    116 
    117 static inline int ff_AMediaFormat_getBuffer(FFAMediaFormat* format, const char *name, void** data, size_t *size)
    118 {
    119    return format->getBuffer(format, name, data, size);
    120 }
    121 
    122 static inline int ff_AMediaFormat_getString(FFAMediaFormat* format, const char *name, const char **out)
    123 {
    124    return format->getString(format, name, out);
    125 }
    126 
    127 static inline int ff_AMediaFormat_getRect(FFAMediaFormat *format, const char *name,
    128                                          int32_t *left, int32_t *top, int32_t *right, int32_t *bottom)
    129 {
    130    if (!format->getRect)
    131        return AVERROR_EXTERNAL;
    132    return format->getRect(format, name, left, top, right, bottom);
    133 }
    134 
    135 static inline void ff_AMediaFormat_setInt32(FFAMediaFormat* format, const char* name, int32_t value)
    136 {
    137    format->setInt32(format, name, value);
    138 }
    139 
    140 static inline void ff_AMediaFormat_setInt64(FFAMediaFormat* format, const char* name, int64_t value)
    141 {
    142    format->setInt64(format, name, value);
    143 }
    144 
    145 static inline void ff_AMediaFormat_setFloat(FFAMediaFormat* format, const char* name, float value)
    146 {
    147    format->setFloat(format, name, value);
    148 }
    149 
    150 static inline void ff_AMediaFormat_setString(FFAMediaFormat* format, const char* name, const char* value)
    151 {
    152    format->setString(format, name, value);
    153 }
    154 
    155 static inline void ff_AMediaFormat_setBuffer(FFAMediaFormat* format, const char* name, void* data, size_t size)
    156 {
    157    format->setBuffer(format, name, data, size);
    158 }
    159 
    160 static inline void ff_AMediaFormat_setRect(FFAMediaFormat* format, const char* name,
    161                                           int32_t left, int32_t top, int32_t right, int32_t bottom)
    162 {
    163    if (!format->setRect) {
    164        av_log(format, AV_LOG_WARNING, "Doesn't support setRect\n");
    165        return;
    166    }
    167    format->setRect(format, name, left, top, right, bottom);
    168 }
    169 
    170 typedef struct FFAMediaCodecCryptoInfo FFAMediaCodecCryptoInfo;
    171 
    172 struct FFAMediaCodecBufferInfo {
    173    int32_t offset;
    174    int32_t size;
    175    int64_t presentationTimeUs;
    176    uint32_t flags;
    177 };
    178 typedef struct FFAMediaCodecBufferInfo FFAMediaCodecBufferInfo;
    179 
    180 typedef struct FFAMediaCodec FFAMediaCodec;
    181 
    182 typedef struct FFAMediaCodecOnAsyncNotifyCallback {
    183    void (*onAsyncInputAvailable)(FFAMediaCodec *codec, void *userdata,
    184                                  int32_t index);
    185 
    186    void (*onAsyncOutputAvailable)(FFAMediaCodec *codec, void *userdata,
    187                                   int32_t index,
    188                                   FFAMediaCodecBufferInfo *buffer_info);
    189 
    190    void (*onAsyncFormatChanged)(FFAMediaCodec *codec, void *userdata,
    191                                 FFAMediaFormat *format);
    192 
    193    void (*onAsyncError)(FFAMediaCodec *codec, void *userdata, int error,
    194                         const char *detail);
    195 } FFAMediaCodecOnAsyncNotifyCallback;
    196 
    197 struct FFAMediaCodec {
    198    const AVClass *class;
    199 
    200    char *(*getName)(FFAMediaCodec *codec);
    201 
    202    FFAMediaCodec* (*createCodecByName)(const char *name);
    203    FFAMediaCodec* (*createDecoderByType)(const char *mime_type);
    204    FFAMediaCodec* (*createEncoderByType)(const char *mime_type);
    205    int (*delete)(FFAMediaCodec* codec);
    206 
    207    int (*configure)(FFAMediaCodec* codec, const FFAMediaFormat* format, FFANativeWindow* surface, void *crypto, uint32_t flags);
    208    int (*setParameters)(FFAMediaCodec* codec, const FFAMediaFormat* format);
    209    int (*start)(FFAMediaCodec* codec);
    210    int (*stop)(FFAMediaCodec* codec);
    211    int (*flush)(FFAMediaCodec* codec);
    212 
    213    uint8_t* (*getInputBuffer)(FFAMediaCodec* codec, size_t idx, size_t *out_size);
    214    uint8_t* (*getOutputBuffer)(FFAMediaCodec* codec, size_t idx, size_t *out_size);
    215 
    216    ssize_t (*dequeueInputBuffer)(FFAMediaCodec* codec, int64_t timeoutUs);
    217    int (*queueInputBuffer)(FFAMediaCodec* codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
    218    int (*queueSecureInputBuffer)(FFAMediaCodec* codec, size_t idx, off_t offset, void* cryptoInfo, uint64_t time, uint32_t flags);
    219 
    220    ssize_t (*dequeueOutputBuffer)(FFAMediaCodec* codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs);
    221    FFAMediaFormat* (*getOutputFormat)(FFAMediaCodec* codec);
    222 
    223    int (*releaseOutputBuffer)(FFAMediaCodec* codec, size_t idx, int render);
    224    int (*releaseOutputBufferAtTime)(FFAMediaCodec *codec, size_t idx, int64_t timestampNs);
    225 
    226    int (*infoTryAgainLater)(FFAMediaCodec *codec, ssize_t idx);
    227    int (*infoOutputBuffersChanged)(FFAMediaCodec *codec, ssize_t idx);
    228    int (*infoOutputFormatChanged)(FFAMediaCodec *codec, ssize_t indx);
    229 
    230    int (*getBufferFlagCodecConfig)(FFAMediaCodec *codec);
    231    int (*getBufferFlagEndOfStream)(FFAMediaCodec *codec);
    232    int (*getBufferFlagKeyFrame)(FFAMediaCodec *codec);
    233 
    234    int (*getConfigureFlagEncode)(FFAMediaCodec *codec);
    235 
    236    int (*cleanOutputBuffers)(FFAMediaCodec *codec);
    237 
    238    // For encoder with FFANativeWindow as input.
    239    int (*signalEndOfInputStream)(FFAMediaCodec *);
    240 
    241    // Introduced in Android API 28
    242    int (*setAsyncNotifyCallback)(FFAMediaCodec *codec,
    243                                  const FFAMediaCodecOnAsyncNotifyCallback *callback,
    244                                  void *userdata);
    245 };
    246 
    247 static inline char *ff_AMediaCodec_getName(FFAMediaCodec *codec)
    248 {
    249    return codec->getName(codec);
    250 }
    251 
    252 FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name, int ndk);
    253 FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime_type, int ndk);
    254 FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime_type, int ndk);
    255 
    256 static inline int ff_AMediaCodec_configure(FFAMediaCodec *codec,
    257                                           const FFAMediaFormat *format,
    258                                           FFANativeWindow *surface,
    259                                           void *crypto, uint32_t flags)
    260 {
    261    return codec->configure(codec, format, surface, crypto, flags);
    262 }
    263 
    264 static inline int ff_AMediaCodec_setParameters(FFAMediaCodec *codec,
    265                                               const FFAMediaFormat *format)
    266 {
    267    return codec->setParameters(codec, format);
    268 }
    269 
    270 static inline int ff_AMediaCodec_start(FFAMediaCodec* codec)
    271 {
    272    return codec->start(codec);
    273 }
    274 
    275 static inline int ff_AMediaCodec_stop(FFAMediaCodec* codec)
    276 {
    277    return codec->stop(codec);
    278 }
    279 
    280 static inline int ff_AMediaCodec_flush(FFAMediaCodec* codec)
    281 {
    282    return codec->flush(codec);
    283 }
    284 
    285 static inline int ff_AMediaCodec_delete(FFAMediaCodec* codec)
    286 {
    287    return codec->delete(codec);
    288 }
    289 
    290 static inline uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t *out_size)
    291 {
    292    return codec->getInputBuffer(codec, idx, out_size);
    293 }
    294 
    295 static inline uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t *out_size)
    296 {
    297    return codec->getOutputBuffer(codec, idx, out_size);
    298 }
    299 
    300 static inline ssize_t ff_AMediaCodec_dequeueInputBuffer(FFAMediaCodec* codec, int64_t timeoutUs)
    301 {
    302    return codec->dequeueInputBuffer(codec, timeoutUs);
    303 }
    304 
    305 static inline int ff_AMediaCodec_queueInputBuffer(FFAMediaCodec *codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags)
    306 {
    307    return codec->queueInputBuffer(codec, idx, offset, size, time, flags);
    308 }
    309 
    310 static inline int ff_AMediaCodec_queueSecureInputBuffer(FFAMediaCodec *codec, size_t idx, off_t offset, void* cryptoInfo, uint64_t time, uint32_t flags)
    311 {
    312    return codec->queueSecureInputBuffer(codec, idx, offset, cryptoInfo, time, flags);
    313 }
    314 
    315 static inline ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec* codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
    316 {
    317    return codec->dequeueOutputBuffer(codec, info, timeoutUs);
    318 }
    319 
    320 static inline FFAMediaFormat* ff_AMediaCodec_getOutputFormat(FFAMediaCodec* codec)
    321 {
    322    return codec->getOutputFormat(codec);
    323 }
    324 
    325 static inline int ff_AMediaCodec_releaseOutputBuffer(FFAMediaCodec* codec, size_t idx, int render)
    326 {
    327    return codec->releaseOutputBuffer(codec, idx, render);
    328 }
    329 
    330 static inline int ff_AMediaCodec_releaseOutputBufferAtTime(FFAMediaCodec *codec, size_t idx, int64_t timestampNs)
    331 {
    332    return codec->releaseOutputBufferAtTime(codec, idx, timestampNs);
    333 }
    334 
    335 static inline int ff_AMediaCodec_infoTryAgainLater(FFAMediaCodec *codec, ssize_t idx)
    336 {
    337    return codec->infoTryAgainLater(codec, idx);
    338 }
    339 
    340 static inline int ff_AMediaCodec_infoOutputBuffersChanged(FFAMediaCodec *codec, ssize_t idx)
    341 {
    342    return codec->infoOutputBuffersChanged(codec, idx);
    343 }
    344 
    345 static inline int ff_AMediaCodec_infoOutputFormatChanged(FFAMediaCodec *codec, ssize_t idx)
    346 {
    347    return codec->infoOutputFormatChanged(codec, idx);
    348 }
    349 
    350 static inline int ff_AMediaCodec_getBufferFlagCodecConfig(FFAMediaCodec *codec)
    351 {
    352    return codec->getBufferFlagCodecConfig(codec);
    353 }
    354 
    355 static inline int ff_AMediaCodec_getBufferFlagEndOfStream(FFAMediaCodec *codec)
    356 {
    357    return codec->getBufferFlagEndOfStream(codec);
    358 }
    359 
    360 static inline int ff_AMediaCodec_getBufferFlagKeyFrame(FFAMediaCodec *codec)
    361 {
    362    return codec->getBufferFlagKeyFrame(codec);
    363 }
    364 
    365 static inline int ff_AMediaCodec_getConfigureFlagEncode(FFAMediaCodec *codec)
    366 {
    367    return codec->getConfigureFlagEncode(codec);
    368 }
    369 
    370 static inline int ff_AMediaCodec_cleanOutputBuffers(FFAMediaCodec *codec)
    371 {
    372    return codec->cleanOutputBuffers(codec);
    373 }
    374 
    375 static inline int ff_AMediaCodec_signalEndOfInputStream(FFAMediaCodec *codec)
    376 {
    377    return codec->signalEndOfInputStream(codec);
    378 }
    379 
    380 static inline int ff_AMediaCodec_setAsyncNotifyCallback(FFAMediaCodec *codec,
    381        const FFAMediaCodecOnAsyncNotifyCallback *callback,
    382        void *userdata)
    383 {
    384    return codec->setAsyncNotifyCallback(codec, callback, userdata);
    385 }
    386 
    387 int ff_Build_SDK_INT(AVCodecContext *avctx);
    388 
    389 enum FFAMediaFormatColorRange {
    390    COLOR_RANGE_UNSPECIFIED = 0x0,
    391    COLOR_RANGE_FULL        = 0x1,
    392    COLOR_RANGE_LIMITED     = 0x2,
    393 };
    394 
    395 enum FFAMediaFormatColorStandard {
    396    COLOR_STANDARD_UNSPECIFIED  = 0x0,
    397    COLOR_STANDARD_BT709        = 0x1,
    398    COLOR_STANDARD_BT601_PAL    = 0x2,
    399    COLOR_STANDARD_BT601_NTSC   = 0x4,
    400    COLOR_STANDARD_BT2020       = 0x6,
    401 };
    402 
    403 enum FFAMediaFormatColorTransfer {
    404    COLOR_TRANSFER_UNSPECIFIED = 0x0,
    405    COLOR_TRANSFER_LINEAR      = 0x1,
    406    COLOR_TRANSFER_SDR_VIDEO   = 0x3,
    407    COLOR_TRANSFER_ST2084      = 0x6,
    408    COLOR_TRANSFER_HLG         = 0x7,
    409 };
    410 
    411 /**
    412 * Map MediaFormat color range to AVColorRange.
    413 *
    414 * return AVCOL_RANGE_UNSPECIFIED when failed.
    415 */
    416 enum AVColorRange ff_AMediaFormatColorRange_to_AVColorRange(int color_range);
    417 
    418 /**
    419 * Map AVColorRange to MediaFormat color range.
    420 *
    421 * return COLOR_RANGE_UNSPECIFIED when failed.
    422 */
    423 int ff_AMediaFormatColorRange_from_AVColorRange(enum AVColorRange color_range);
    424 
    425 /**
    426 * Map MediaFormat color standard to AVColorSpace.
    427 *
    428 * return AVCOL_SPC_UNSPECIFIED when failed.
    429 */
    430 enum AVColorSpace ff_AMediaFormatColorStandard_to_AVColorSpace(int color_standard);
    431 
    432 /**
    433 * Map AVColorSpace to MediaFormat color standard.
    434 *
    435 * return COLOR_STANDARD_UNSPECIFIED when failed.
    436 */
    437 int ff_AMediaFormatColorStandard_from_AVColorSpace(enum AVColorSpace color_space);
    438 
    439 /**
    440 * Map MediaFormat color standard to AVColorPrimaries.
    441 *
    442 * return AVCOL_PRI_UNSPECIFIED when failed.
    443 */
    444 enum AVColorPrimaries ff_AMediaFormatColorStandard_to_AVColorPrimaries(int color_standard);
    445 
    446 /**
    447 * Map MediaFormat color transfer to AVColorTransferCharacteristic.
    448 *
    449 * return AVCOL_TRC_UNSPECIFIED when failed.
    450 */
    451 enum AVColorTransferCharacteristic
    452 ff_AMediaFormatColorTransfer_to_AVColorTransfer(int color_transfer);
    453 
    454 /**
    455 * Map AVColorTransferCharacteristic to MediaFormat color transfer.
    456 *
    457 * return COLOR_TRANSFER_UNSPECIFIED when failed.
    458 */
    459 int ff_AMediaFormatColorTransfer_from_AVColorTransfer(
    460    enum AVColorTransferCharacteristic color_transfer);
    461 
    462 #endif /* AVCODEC_MEDIACODEC_WRAPPER_H */