Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(900)

Unified Diff: media/base/android/ndk_media_codec_wrapper.cc

Issue 1472943002: Refactor MediaCodecBridge to add support for NDK APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix crazy linker issue Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/ndk_media_codec_bridge.cc ('k') | media/base/android/sdk_media_codec_bridge.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/android/ndk_media_codec_wrapper.cc
diff --git a/media/base/android/ndk_media_codec_wrapper.cc b/media/base/android/ndk_media_codec_wrapper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e2d916e86d3629f36de8d93f2d699dae84436d14
--- /dev/null
+++ b/media/base/android/ndk_media_codec_wrapper.cc
@@ -0,0 +1,162 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// The file defines the symbols from NDKMediaCodec that android is using. It
+// then loads the library dynamically on first use.
+
+#include <media/NdkMediaCodec.h>
+#include <media/NdkMediaFormat.h>
+
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/native_library.h"
+
+#define LOOKUP_FUNC(func_name, return_type, args, arg_names) \
+ return_type func_name args { \
+ typedef return_type(*signature) args; \
+ static signature g_##func_name = \
+ reinterpret_cast<signature>(base::GetFunctionPointerFromNativeLibrary( \
+ LibraryHandle(), #func_name)); \
+ return g_##func_name arg_names; \
+ }
+
+// The constants used in chromium. Those symbols are defined as extern symbols
+// in the NdkMediaFormat headers. They will be initialized to their correct
+// values when the library is loaded.
+const char* AMEDIAFORMAT_KEY_HEIGHT;
+const char* AMEDIAFORMAT_KEY_SAMPLE_RATE;
+const char* AMEDIAFORMAT_KEY_WIDTH;
+
+namespace {
+
+// The name of the library to load.
+const char kMediaNDKLibraryName[] = "libmediandk.so";
+
+// Loads the OpenSLES library, and initializes all the proxies.
+base::NativeLibrary IntializeLibraryHandle() {
+ base::NativeLibrary handle =
+ base::LoadNativeLibrary(base::FilePath(kMediaNDKLibraryName), NULL);
+ DCHECK(handle) << "Unable to load " << kMediaNDKLibraryName;
+
+ // Setup the proxy for each symbol.
+ // Attach the symbol name to the proxy address.
+ struct SymbolDefinition {
+ const char* name;
+ const char** value;
+ };
+
+ // The list of defined symbols.
+ const SymbolDefinition kSymbols[] = {
+ {"AMEDIAFORMAT_KEY_HEIGHT", &AMEDIAFORMAT_KEY_HEIGHT},
+ {"AMEDIAFORMAT_KEY_SAMPLE_RATE", &AMEDIAFORMAT_KEY_SAMPLE_RATE},
+ {"AMEDIAFORMAT_KEY_SAMPLE_RATE", &AMEDIAFORMAT_KEY_SAMPLE_RATE},
+ };
+
+ for (size_t i = 0; i < sizeof(kSymbols) / sizeof(kSymbols[0]); ++i) {
+ memcpy(kSymbols[i].value,
+ base::GetFunctionPointerFromNativeLibrary(handle, kSymbols[i].name),
+ sizeof(char*));
+ DCHECK(*kSymbols[i].value) << "Unable to find symbol for "
+ << kSymbols[i].name;
+ }
+ return handle;
+}
+
+// Returns the handler to the shared library. The library itself will be lazily
+// loaded during the first call to this function.
+base::NativeLibrary LibraryHandle() {
+ // The handle is lazily initialized on the first call.
+ static base::NativeLibrary g_mediandk_LibraryHandle =
+ IntializeLibraryHandle();
+ return g_mediandk_LibraryHandle;
+}
+}
+
+LOOKUP_FUNC(AMediaCodec_createDecoderByType,
+ AMediaCodec*,
+ (const char* mime_type),
+ (mime_type));
+LOOKUP_FUNC(AMediaCodec_createEncoderByType,
+ AMediaCodec*,
+ (const char* mime_type),
+ (mime_type));
+LOOKUP_FUNC(AMediaCodec_delete, media_status_t, (AMediaCodec * codec), (codec));
+LOOKUP_FUNC(AMediaCodec_configure,
+ media_status_t,
+ (AMediaCodec * codec,
+ const AMediaFormat* format,
+ ANativeWindow* surface,
+ AMediaCrypto* crypto,
+ uint32_t flags),
+ (codec, format, surface, crypto, flags));
+LOOKUP_FUNC(AMediaCodec_start, media_status_t, (AMediaCodec * codec), (codec));
+LOOKUP_FUNC(AMediaCodec_stop, media_status_t, (AMediaCodec * codec), (codec));
+LOOKUP_FUNC(AMediaCodec_flush, media_status_t, (AMediaCodec * codec), (codec));
+LOOKUP_FUNC(AMediaCodec_getInputBuffer,
+ uint8_t*,
+ (AMediaCodec * codec, size_t idx, size_t* out_size),
+ (codec, idx, out_size));
+LOOKUP_FUNC(AMediaCodec_getOutputBuffer,
+ uint8_t*,
+ (AMediaCodec * codec, size_t idx, size_t* out_size),
+ (codec, idx, out_size));
+LOOKUP_FUNC(AMediaCodec_dequeueInputBuffer,
+ ssize_t,
+ (AMediaCodec * codec, int64_t timeoutUs),
+ (codec, timeoutUs));
+LOOKUP_FUNC(AMediaCodec_queueInputBuffer,
+ media_status_t,
+ (AMediaCodec * codec,
+ size_t idx,
+ off_t offset,
+ size_t size,
+ uint64_t time,
+ uint32_t flags),
+ (codec, idx, offset, size, time, flags));
+LOOKUP_FUNC(AMediaCodec_queueSecureInputBuffer,
+ media_status_t,
+ (AMediaCodec * codec,
+ size_t idx,
+ off_t offset,
+ AMediaCodecCryptoInfo* cryto,
+ uint64_t time,
+ uint32_t flags),
+ (codec, idx, offset, cryto, time, flags));
+LOOKUP_FUNC(AMediaCodec_dequeueInputBuffer,
+ ssize_t,
+ (AMediaCodec * codec,
+ AMediaCodecBufferInfo* info,
+ int64_t timeoutUs),
+ (codec, info, timeoutUs));
+LOOKUP_FUNC(AMediaCodec_dequeueOutputBuffer,
+ ssize_t,
+ (AMediaCodec * codec,
+ AMediaCodecBufferInfo* info,
+ int64_t timeoutUs),
+ (codec, info, timeoutUs));
+LOOKUP_FUNC(AMediaCodec_getOutputFormat,
+ AMediaFormat*,
+ (AMediaCodec * codec),
+ (codec));
+LOOKUP_FUNC(AMediaCodec_releaseOutputBuffer,
+ media_status_t,
+ (AMediaCodec * codec, size_t idx, bool render),
+ (codec, idx, render));
+LOOKUP_FUNC(AMediaCodecCryptoInfo_new,
+ AMediaCodecCryptoInfo*,
+ (int num_subsamples,
+ uint8_t key[16],
+ uint8_t iv[16],
+ cryptoinfo_mode_t mode,
+ size_t* clear_bytes,
+ size_t* encrypted_bytes),
+ (num_subsamples, key, iv, mode, clear_bytes, encrypted_bytes));
+LOOKUP_FUNC(AMediaCodecCryptoInfo_delete,
+ media_status_t,
+ (AMediaCodecCryptoInfo * info),
+ (info));
+LOOKUP_FUNC(AMediaFormat_getInt32,
+ bool,
+ (AMediaFormat * format, const char* name, int32_t* out),
+ (format, name, out));
« no previous file with comments | « media/base/android/ndk_media_codec_bridge.cc ('k') | media/base/android/sdk_media_codec_bridge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698