| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // The file defines the symbols from NDKMediaCodec that android is using. It | |
| 6 // then loads the library dynamically on first use. | |
| 7 | |
| 8 #include <media/NdkMediaCodec.h> | |
| 9 #include <media/NdkMediaFormat.h> | |
| 10 #include <stddef.h> | |
| 11 #include <stdint.h> | |
| 12 | |
| 13 #include "base/files/file_path.h" | |
| 14 #include "base/logging.h" | |
| 15 #include "base/native_library.h" | |
| 16 | |
| 17 #define LOOKUP_FUNC(func_name, return_type, args, arg_names) \ | |
| 18 return_type func_name args { \ | |
| 19 typedef return_type(*signature) args; \ | |
| 20 static signature g_##func_name = \ | |
| 21 reinterpret_cast<signature>(base::GetFunctionPointerFromNativeLibrary( \ | |
| 22 LibraryHandle(), #func_name)); \ | |
| 23 return g_##func_name arg_names; \ | |
| 24 } | |
| 25 | |
| 26 // The constants used in chromium. Those symbols are defined as extern symbols | |
| 27 // in the NdkMediaFormat headers. They will be initialized to their correct | |
| 28 // values when the library is loaded. | |
| 29 const char* AMEDIAFORMAT_KEY_CHANNEL_COUNT; | |
| 30 const char* AMEDIAFORMAT_KEY_HEIGHT; | |
| 31 const char* AMEDIAFORMAT_KEY_SAMPLE_RATE; | |
| 32 const char* AMEDIAFORMAT_KEY_WIDTH; | |
| 33 | |
| 34 namespace { | |
| 35 | |
| 36 // The name of the library to load. | |
| 37 const char kMediaNDKLibraryName[] = "libmediandk.so"; | |
| 38 | |
| 39 // Loads the OpenSLES library, and initializes all the proxies. | |
| 40 base::NativeLibrary IntializeLibraryHandle() { | |
| 41 base::NativeLibrary handle = | |
| 42 base::LoadNativeLibrary(base::FilePath(kMediaNDKLibraryName), NULL); | |
| 43 DCHECK(handle) << "Unable to load " << kMediaNDKLibraryName; | |
| 44 | |
| 45 // Setup the proxy for each symbol. | |
| 46 // Attach the symbol name to the proxy address. | |
| 47 struct SymbolDefinition { | |
| 48 const char* name; | |
| 49 const char** value; | |
| 50 }; | |
| 51 | |
| 52 // The list of defined symbols. | |
| 53 const SymbolDefinition kSymbols[] = { | |
| 54 {"AMEDIAFORMAT_KEY_CHANNEL_COUNT", &AMEDIAFORMAT_KEY_CHANNEL_COUNT}, | |
| 55 {"AMEDIAFORMAT_KEY_HEIGHT", &AMEDIAFORMAT_KEY_HEIGHT}, | |
| 56 {"AMEDIAFORMAT_KEY_SAMPLE_RATE", &AMEDIAFORMAT_KEY_SAMPLE_RATE}, | |
| 57 {"AMEDIAFORMAT_KEY_WIDTH", &AMEDIAFORMAT_KEY_WIDTH}, | |
| 58 }; | |
| 59 | |
| 60 for (size_t i = 0; i < sizeof(kSymbols) / sizeof(kSymbols[0]); ++i) { | |
| 61 memcpy(kSymbols[i].value, | |
| 62 base::GetFunctionPointerFromNativeLibrary(handle, kSymbols[i].name), | |
| 63 sizeof(char*)); | |
| 64 DCHECK(*kSymbols[i].value) << "Unable to find symbol for " | |
| 65 << kSymbols[i].name; | |
| 66 } | |
| 67 return handle; | |
| 68 } | |
| 69 | |
| 70 // Returns the handler to the shared library. The library itself will be lazily | |
| 71 // loaded during the first call to this function. | |
| 72 base::NativeLibrary LibraryHandle() { | |
| 73 // The handle is lazily initialized on the first call. | |
| 74 static base::NativeLibrary g_mediandk_LibraryHandle = | |
| 75 IntializeLibraryHandle(); | |
| 76 return g_mediandk_LibraryHandle; | |
| 77 } | |
| 78 } | |
| 79 | |
| 80 LOOKUP_FUNC(AMediaCodec_createDecoderByType, | |
| 81 AMediaCodec*, | |
| 82 (const char* mime_type), | |
| 83 (mime_type)); | |
| 84 LOOKUP_FUNC(AMediaCodec_createEncoderByType, | |
| 85 AMediaCodec*, | |
| 86 (const char* mime_type), | |
| 87 (mime_type)); | |
| 88 LOOKUP_FUNC(AMediaCodec_delete, media_status_t, (AMediaCodec * codec), (codec)); | |
| 89 LOOKUP_FUNC(AMediaCodec_configure, | |
| 90 media_status_t, | |
| 91 (AMediaCodec * codec, | |
| 92 const AMediaFormat* format, | |
| 93 ANativeWindow* surface, | |
| 94 AMediaCrypto* crypto, | |
| 95 uint32_t flags), | |
| 96 (codec, format, surface, crypto, flags)); | |
| 97 LOOKUP_FUNC(AMediaCodec_start, media_status_t, (AMediaCodec * codec), (codec)); | |
| 98 LOOKUP_FUNC(AMediaCodec_stop, media_status_t, (AMediaCodec * codec), (codec)); | |
| 99 LOOKUP_FUNC(AMediaCodec_flush, media_status_t, (AMediaCodec * codec), (codec)); | |
| 100 LOOKUP_FUNC(AMediaCodec_getInputBuffer, | |
| 101 uint8_t*, | |
| 102 (AMediaCodec * codec, size_t idx, size_t* out_size), | |
| 103 (codec, idx, out_size)); | |
| 104 LOOKUP_FUNC(AMediaCodec_getOutputBuffer, | |
| 105 uint8_t*, | |
| 106 (AMediaCodec * codec, size_t idx, size_t* out_size), | |
| 107 (codec, idx, out_size)); | |
| 108 LOOKUP_FUNC(AMediaCodec_dequeueInputBuffer, | |
| 109 ssize_t, | |
| 110 (AMediaCodec * codec, int64_t timeoutUs), | |
| 111 (codec, timeoutUs)); | |
| 112 LOOKUP_FUNC(AMediaCodec_queueInputBuffer, | |
| 113 media_status_t, | |
| 114 (AMediaCodec * codec, | |
| 115 size_t idx, | |
| 116 off_t offset, | |
| 117 size_t size, | |
| 118 uint64_t time, | |
| 119 uint32_t flags), | |
| 120 (codec, idx, offset, size, time, flags)); | |
| 121 LOOKUP_FUNC(AMediaCodec_queueSecureInputBuffer, | |
| 122 media_status_t, | |
| 123 (AMediaCodec * codec, | |
| 124 size_t idx, | |
| 125 off_t offset, | |
| 126 AMediaCodecCryptoInfo* cryto, | |
| 127 uint64_t time, | |
| 128 uint32_t flags), | |
| 129 (codec, idx, offset, cryto, time, flags)); | |
| 130 LOOKUP_FUNC(AMediaCodec_dequeueInputBuffer, | |
| 131 ssize_t, | |
| 132 (AMediaCodec * codec, | |
| 133 AMediaCodecBufferInfo* info, | |
| 134 int64_t timeoutUs), | |
| 135 (codec, info, timeoutUs)); | |
| 136 LOOKUP_FUNC(AMediaCodec_dequeueOutputBuffer, | |
| 137 ssize_t, | |
| 138 (AMediaCodec * codec, | |
| 139 AMediaCodecBufferInfo* info, | |
| 140 int64_t timeoutUs), | |
| 141 (codec, info, timeoutUs)); | |
| 142 LOOKUP_FUNC(AMediaCodec_getOutputFormat, | |
| 143 AMediaFormat*, | |
| 144 (AMediaCodec * codec), | |
| 145 (codec)); | |
| 146 LOOKUP_FUNC(AMediaCodec_releaseOutputBuffer, | |
| 147 media_status_t, | |
| 148 (AMediaCodec * codec, size_t idx, bool render), | |
| 149 (codec, idx, render)); | |
| 150 LOOKUP_FUNC(AMediaCodecCryptoInfo_new, | |
| 151 AMediaCodecCryptoInfo*, | |
| 152 (int num_subsamples, | |
| 153 uint8_t key[16], | |
| 154 uint8_t iv[16], | |
| 155 cryptoinfo_mode_t mode, | |
| 156 size_t* clear_bytes, | |
| 157 size_t* encrypted_bytes), | |
| 158 (num_subsamples, key, iv, mode, clear_bytes, encrypted_bytes)); | |
| 159 LOOKUP_FUNC(AMediaCodecCryptoInfo_delete, | |
| 160 media_status_t, | |
| 161 (AMediaCodecCryptoInfo * info), | |
| 162 (info)); | |
| 163 LOOKUP_FUNC(AMediaFormat_delete, | |
| 164 media_status_t, | |
| 165 (AMediaFormat * format), | |
| 166 (format)); | |
| 167 LOOKUP_FUNC(AMediaFormat_getInt32, | |
| 168 bool, | |
| 169 (AMediaFormat * format, const char* name, int32_t* out), | |
| 170 (format, name, out)); | |
| OLD | NEW |