зеркало из https://github.com/mozilla/gecko-dev.git
moar merges, CLOSED TREE
This commit is contained in:
Коммит
186a054e96
|
@ -8585,7 +8585,9 @@ else
|
||||||
# so if the file is named libsomething.so. The lib/ path is also required
|
# so if the file is named libsomething.so. The lib/ path is also required
|
||||||
# because the unpacked file will be under the lib/ subdirectory and will
|
# because the unpacked file will be under the lib/ subdirectory and will
|
||||||
# need to be executed from that path.
|
# need to be executed from that path.
|
||||||
MOZ_CHILD_PROCESS_NAME="lib/libplugin-container.so"
|
MOZ_CHILD_PROCESS_NAME="libplugin-container.so"
|
||||||
|
MOZ_CHILD_PROCESS_NAME_PIE="libplugin-container-pie.so"
|
||||||
|
AC_SUBST(MOZ_CHILD_PROCESS_NAME_PIE)
|
||||||
fi
|
fi
|
||||||
MOZ_CHILD_PROCESS_BUNDLE="plugin-container.app/Contents/MacOS/"
|
MOZ_CHILD_PROCESS_BUNDLE="plugin-container.app/Contents/MacOS/"
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,10 @@
|
||||||
#include "prlog.h"
|
#include "prlog.h"
|
||||||
#include "nsServiceManagerUtils.h"
|
#include "nsServiceManagerUtils.h"
|
||||||
|
|
||||||
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
#include "AndroidBridge.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct JSContext;
|
struct JSContext;
|
||||||
class JSObject;
|
class JSObject;
|
||||||
|
|
||||||
|
@ -87,7 +91,12 @@ IsTypeSupported(const nsAString& aType)
|
||||||
if (mimeType.EqualsASCII(gMediaSourceTypes[i])) {
|
if (mimeType.EqualsASCII(gMediaSourceTypes[i])) {
|
||||||
if ((mimeType.EqualsASCII("video/mp4") ||
|
if ((mimeType.EqualsASCII("video/mp4") ||
|
||||||
mimeType.EqualsASCII("audio/mp4")) &&
|
mimeType.EqualsASCII("audio/mp4")) &&
|
||||||
!Preferences::GetBool("media.mediasource.mp4.enabled", false)) {
|
(!Preferences::GetBool("media.mediasource.mp4.enabled", false)
|
||||||
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
// MP4 won't work unless we have JellyBean+
|
||||||
|
|| AndroidBridge::Bridge()->GetAPIVersion() < 16
|
||||||
|
#endif
|
||||||
|
)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((mimeType.EqualsASCII("video/webm") ||
|
if ((mimeType.EqualsASCII("video/webm") ||
|
||||||
|
|
|
@ -689,7 +689,7 @@ var interfaceNamesInGlobalScope =
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
"MediaRecorder",
|
"MediaRecorder",
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "MediaSource", android: false, linux: false, release: false},
|
{name: "MediaSource", android: true, linux: false, release: false},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
"MediaStream",
|
"MediaStream",
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
|
@ -933,9 +933,9 @@ var interfaceNamesInGlobalScope =
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "SimpleTest", xbl: false},
|
{name: "SimpleTest", xbl: false},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "SourceBuffer", android: false, linux: false, release: false},
|
{name: "SourceBuffer", android: true, linux: false, release: false},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "SourceBufferList", android: false, linux: false, release: false},
|
{name: "SourceBufferList", android: true, linux: false, release: false},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "SpeechSynthesisEvent", b2g: true},
|
{name: "SpeechSynthesisEvent", b2g: true},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
|
@ -1287,7 +1287,7 @@ var interfaceNamesInGlobalScope =
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
"ValidityState",
|
"ValidityState",
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
{name: "VideoPlaybackQuality", android: false, linux: false, release: false},
|
{name: "VideoPlaybackQuality", android: true, linux: false, release: false},
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
"VideoStreamTrack",
|
"VideoStreamTrack",
|
||||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||||
|
@ -1390,8 +1390,8 @@ function createInterfaceMap(isXBLScope) {
|
||||||
var isB2G = !isDesktop && !navigator.userAgent.includes("Android");
|
var isB2G = !isDesktop && !navigator.userAgent.includes("Android");
|
||||||
var isMac = /Mac OS/.test(navigator.oscpu);
|
var isMac = /Mac OS/.test(navigator.oscpu);
|
||||||
var isWindows = /Windows/.test(navigator.oscpu);
|
var isWindows = /Windows/.test(navigator.oscpu);
|
||||||
var isLinux = /Linux/.test(navigator.oscpu);
|
|
||||||
var isAndroid = navigator.userAgent.includes("Android");
|
var isAndroid = navigator.userAgent.includes("Android");
|
||||||
|
var isLinux = /Linux/.test(navigator.oscpu) && !isAndroid;
|
||||||
var hasPermission = function (aPermissions) {
|
var hasPermission = function (aPermissions) {
|
||||||
var result = false;
|
var result = false;
|
||||||
for (var p of aPermissions) {
|
for (var p of aPermissions) {
|
||||||
|
|
|
@ -2,10 +2,6 @@
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
ifneq ($(dir $(PROGRAM)),./)
|
|
||||||
GENERATED_DIRS = $(dir $(PROGRAM))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef MOZ_WINCONSOLE
|
ifndef MOZ_WINCONSOLE
|
||||||
ifdef MOZ_DEBUG
|
ifdef MOZ_DEBUG
|
||||||
MOZ_WINCONSOLE = 1
|
MOZ_WINCONSOLE = 1
|
||||||
|
|
|
@ -4,11 +4,15 @@
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
# Any changes that affect Android need to be made in pie/moz.build as well.
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
||||||
Program(CONFIG['MOZ_CHILD_PROCESS_NAME'])
|
Program(CONFIG['MOZ_CHILD_PROCESS_NAME'])
|
||||||
SOURCES += [
|
SOURCES += [
|
||||||
'MozillaRuntimeMainAndroid.cpp',
|
'MozillaRuntimeMainAndroid.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
DIRS += ['pie']
|
||||||
else:
|
else:
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'linkage': None,
|
'linkage': None,
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||||
|
# vim: set filetype=python:
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
Program(CONFIG['MOZ_CHILD_PROCESS_NAME_PIE'])
|
||||||
|
SOURCES += [
|
||||||
|
'../MozillaRuntimeMainAndroid.cpp',
|
||||||
|
]
|
||||||
|
|
||||||
|
include('/ipc/chromium/chromium-config.mozbuild')
|
||||||
|
|
||||||
|
LOCAL_INCLUDES += [
|
||||||
|
'/toolkit/xre',
|
||||||
|
'/xpcom/base',
|
||||||
|
]
|
||||||
|
|
||||||
|
if CONFIG['MOZ_SANDBOX']:
|
||||||
|
USE_LIBS += [
|
||||||
|
'mozsandbox',
|
||||||
|
]
|
||||||
|
|
||||||
|
# gcc lto likes to put the top level asm in syscall.cc in a different partition
|
||||||
|
# from the function using it which breaks the build. Work around that by
|
||||||
|
# forcing there to be only one partition.
|
||||||
|
if '-flto' in CONFIG['OS_CXXFLAGS'] and not CONFIG['CLANG_CXX']:
|
||||||
|
LDFLAGS += ['--param lto-partitions=1']
|
||||||
|
|
||||||
|
LDFLAGS += ['-pie']
|
||||||
|
|
||||||
|
FAIL_ON_WARNINGS = True
|
|
@ -57,6 +57,10 @@ using mozilla::ipc::GeckoChildProcessHost;
|
||||||
static const int kMagicAndroidSystemPropFd = 5;
|
static const int kMagicAndroidSystemPropFd = 5;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
#include "AndroidBridge.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static const bool kLowRightsSubprocesses =
|
static const bool kLowRightsSubprocesses =
|
||||||
// We currently only attempt to drop privileges on gonk, because we
|
// We currently only attempt to drop privileges on gonk, because we
|
||||||
// have no plugins or extensions to worry about breaking.
|
// have no plugins or extensions to worry about breaking.
|
||||||
|
@ -164,7 +168,17 @@ GeckoChildProcessHost::GetPathToBinary(FilePath& exePath)
|
||||||
exePath = exePath.DirName();
|
exePath = exePath.DirName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
exePath = exePath.AppendASCII("lib");
|
||||||
|
|
||||||
|
// We must use the PIE binary on 5.0 and higher
|
||||||
|
const char* processName = mozilla::AndroidBridge::Bridge()->GetAPIVersion() >= 21 ?
|
||||||
|
MOZ_CHILD_PROCESS_NAME_PIE : MOZ_CHILD_PROCESS_NAME;
|
||||||
|
|
||||||
|
exePath = exePath.AppendASCII(processName);
|
||||||
|
#else
|
||||||
exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME);
|
exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_COCOA
|
#ifdef MOZ_WIDGET_COCOA
|
||||||
|
|
|
@ -157,8 +157,8 @@ include('/ipc/chromium/chromium-config.mozbuild')
|
||||||
|
|
||||||
FINAL_LIBRARY = 'xul'
|
FINAL_LIBRARY = 'xul'
|
||||||
|
|
||||||
for var in ('MOZ_CHILD_PROCESS_NAME', 'MOZ_CHILD_PROCESS_BUNDLE',
|
for var in ('MOZ_CHILD_PROCESS_NAME', 'MOZ_CHILD_PROCESS_NAME_PIE',
|
||||||
'DLL_PREFIX', 'DLL_SUFFIX'):
|
'MOZ_CHILD_PROCESS_BUNDLE', 'DLL_PREFIX', 'DLL_SUFFIX'):
|
||||||
DEFINES[var] = '"%s"' % CONFIG[var]
|
DEFINES[var] = '"%s"' % CONFIG[var]
|
||||||
|
|
||||||
LOCAL_INCLUDES += [
|
LOCAL_INCLUDES += [
|
||||||
|
|
|
@ -195,7 +195,7 @@ public:
|
||||||
&format);
|
&format);
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateVideoFormat failed err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateVideoFormat failed err = %d", __FUNCTION__, (int)res);
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,7 +203,7 @@ public:
|
||||||
mCoder = CreateEncoder(mime);
|
mCoder = CreateEncoder(mime);
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateEncoderByType failed err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateEncoderByType failed err = %d", __FUNCTION__, (int)res);
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,13 +216,13 @@ public:
|
||||||
} else {
|
} else {
|
||||||
mCoder = CreateDecoder(mime);
|
mCoder = CreateDecoder(mime);
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateDecoderByType failed err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, CreateDecoderByType failed err = %d", __FUNCTION__, (int)res);
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res = mCoder->Configure(format, nullptr, nullptr, flags);
|
res = mCoder->Configure(format, nullptr, nullptr, flags);
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, err = %d", __FUNCTION__, (int)res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ public:
|
||||||
res = mCoder->Start();
|
res = mCoder->Start();
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->start() return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->start() return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
isStarted = true;
|
isStarted = true;
|
||||||
|
@ -361,7 +361,7 @@ public:
|
||||||
res = BufferInfo::New(&bufferInfo);
|
res = BufferInfo::New(&bufferInfo);
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, BufferInfo::New return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, BufferInfo::New return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
int32_t outputIndex = DequeueOutputBuffer(bufferInfo);
|
int32_t outputIndex = DequeueOutputBuffer(bufferInfo);
|
||||||
|
@ -421,7 +421,7 @@ public:
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->DequeueInputBuffer() return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->DequeueInputBuffer() return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return inputIndex;
|
return inputIndex;
|
||||||
|
@ -433,7 +433,7 @@ public:
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->QueueInputBuffer() return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->QueueInputBuffer() return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ public:
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->DequeueOutputBuffer() return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, mCoder->DequeueOutputBuffer() return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ public:
|
||||||
mInputBuffers = (jobjectArray) env->NewGlobalRef(inputBuffers.Get());
|
mInputBuffers = (jobjectArray) env->NewGlobalRef(inputBuffers.Get());
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, GetInputBuffers return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, GetInputBuffers return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ public:
|
||||||
mOutputBuffers = (jobjectArray) env->NewGlobalRef(outputBuffers.Get());
|
mOutputBuffers = (jobjectArray) env->NewGlobalRef(outputBuffers.Get());
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, GetOutputBuffers return err = %d",
|
CSFLogDebug(logTag, "WebrtcAndroidMediaCodec::%s, GetOutputBuffers return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,7 +653,7 @@ int32_t WebrtcMediaCodecVP8VideoEncoder::Encode(
|
||||||
|
|
||||||
if (res != NS_OK) {
|
if (res != NS_OK) {
|
||||||
CSFLogDebug(logTag, "%s, encoder configure return err = %d",
|
CSFLogDebug(logTag, "%s, encoder configure return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,7 +661,7 @@ int32_t WebrtcMediaCodecVP8VideoEncoder::Encode(
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
mMediaCodecEncoder->isStarted = false;
|
mMediaCodecEncoder->isStarted = false;
|
||||||
CSFLogDebug(logTag, "%s start encoder. err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "%s start encoder. err = %d", __FUNCTION__, (int)res);
|
||||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,7 +732,7 @@ int32_t WebrtcMediaCodecVP8VideoEncoder::Encode(
|
||||||
res = BufferInfo::New(&bufferInfo);
|
res = BufferInfo::New(&bufferInfo);
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
CSFLogDebug(logTag, "WebrtcMediaCodecVP8VideoEncoder::%s, BufferInfo::New return err = %d",
|
CSFLogDebug(logTag, "WebrtcMediaCodecVP8VideoEncoder::%s, BufferInfo::New return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -928,7 +928,7 @@ int32_t WebrtcMediaCodecVP8VideoDecoder::Decode(
|
||||||
|
|
||||||
if (res != NS_OK) {
|
if (res != NS_OK) {
|
||||||
CSFLogDebug(logTag, "%s, decoder configure return err = %d",
|
CSFLogDebug(logTag, "%s, decoder configure return err = %d",
|
||||||
__FUNCTION__, res);
|
__FUNCTION__, (int)res);
|
||||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,7 +936,7 @@ int32_t WebrtcMediaCodecVP8VideoDecoder::Decode(
|
||||||
|
|
||||||
if (NS_FAILED(res)) {
|
if (NS_FAILED(res)) {
|
||||||
mMediaCodecDecoder->isStarted = false;
|
mMediaCodecDecoder->isStarted = false;
|
||||||
CSFLogDebug(logTag, "%s start decoder. err = %d", __FUNCTION__, res);
|
CSFLogDebug(logTag, "%s start decoder. err = %d", __FUNCTION__, (int)res);
|
||||||
return WEBRTC_VIDEO_CODEC_ERROR;
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -569,6 +569,9 @@ pref("media.fragmented-mp4.enabled", true);
|
||||||
pref("media.fragmented-mp4.android-media-codec.enabled", true);
|
pref("media.fragmented-mp4.android-media-codec.enabled", true);
|
||||||
pref("media.fragmented-mp4.android-media-codec.preferred", true);
|
pref("media.fragmented-mp4.android-media-codec.preferred", true);
|
||||||
|
|
||||||
|
// Enable MSE
|
||||||
|
pref("media.mediasource.enabled", true);
|
||||||
|
|
||||||
// optimize images memory usage
|
// optimize images memory usage
|
||||||
pref("image.downscale-during-decode.enabled", true);
|
pref("image.downscale-during-decode.enabled", true);
|
||||||
pref("image.decode-only-on-draw.enabled", true);
|
pref("image.decode-only-on-draw.enabled", true);
|
||||||
|
|
|
@ -20,48 +20,6 @@ import javax.microedition.khronos.egl.EGLContext;
|
||||||
import javax.microedition.khronos.egl.EGLDisplay;
|
import javax.microedition.khronos.egl.EGLDisplay;
|
||||||
import javax.microedition.khronos.egl.EGLSurface;
|
import javax.microedition.khronos.egl.EGLSurface;
|
||||||
|
|
||||||
/**
|
|
||||||
* EGLPreloadingThread is purely a preloading optimization, not something
|
|
||||||
* we rely on for anything else than performance. We will be initializing
|
|
||||||
* EGL in GLController::initEGL() when we need it, but having EGL initialization
|
|
||||||
* already previously done by EGLPreloadingThread::run() will make it much
|
|
||||||
* faster for GLController to do again.
|
|
||||||
*
|
|
||||||
* For example, here are some timings recorded on two devices:
|
|
||||||
*
|
|
||||||
* Device | EGLPreloadingThread::run() | GLController::initEGL()
|
|
||||||
* -----------------------+----------------------------+------------------------
|
|
||||||
* Nexus S (Android 2.3) | ~ 80 ms | < 0.1 ms
|
|
||||||
* Nexus 10 (Android 4.3) | ~ 35 ms | < 0.1 ms
|
|
||||||
*/
|
|
||||||
class EGLPreloadingThread extends Thread
|
|
||||||
{
|
|
||||||
private static final String LOGTAG = "EGLPreloadingThread";
|
|
||||||
private EGL10 mEGL;
|
|
||||||
private EGLDisplay mEGLDisplay;
|
|
||||||
|
|
||||||
public EGLPreloadingThread()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
mEGL = (EGL10)EGLContext.getEGL();
|
|
||||||
mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
|
||||||
if (mEGLDisplay == EGL10.EGL_NO_DISPLAY) {
|
|
||||||
Log.w(LOGTAG, "Can't get EGL display!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int[] returnedVersion = new int[2];
|
|
||||||
if (!mEGL.eglInitialize(mEGLDisplay, returnedVersion)) {
|
|
||||||
Log.w(LOGTAG, "eglInitialize failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is a singleton that tracks EGL and compositor things over
|
* This class is a singleton that tracks EGL and compositor things over
|
||||||
* the lifetime of Fennec running.
|
* the lifetime of Fennec running.
|
||||||
|
@ -89,7 +47,6 @@ public class GLController {
|
||||||
private EGL10 mEGL;
|
private EGL10 mEGL;
|
||||||
private EGLDisplay mEGLDisplay;
|
private EGLDisplay mEGLDisplay;
|
||||||
private EGLConfig mEGLConfig;
|
private EGLConfig mEGLConfig;
|
||||||
private final EGLPreloadingThread mEGLPreloadingThread;
|
|
||||||
private EGLSurface mEGLSurfaceForCompositor;
|
private EGLSurface mEGLSurfaceForCompositor;
|
||||||
|
|
||||||
private static final int LOCAL_EGL_OPENGL_ES2_BIT = 4;
|
private static final int LOCAL_EGL_OPENGL_ES2_BIT = 4;
|
||||||
|
@ -113,12 +70,6 @@ public class GLController {
|
||||||
};
|
};
|
||||||
|
|
||||||
private GLController() {
|
private GLController() {
|
||||||
if (AppConstants.Versions.preICS) {
|
|
||||||
mEGLPreloadingThread = new EGLPreloadingThread();
|
|
||||||
mEGLPreloadingThread.start();
|
|
||||||
} else {
|
|
||||||
mEGLPreloadingThread = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLController getInstance(LayerView view) {
|
static GLController getInstance(LayerView view) {
|
||||||
|
@ -211,19 +162,6 @@ public class GLController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This join() should not be necessary, but makes this code a bit easier to think about.
|
|
||||||
// The EGLPreloadingThread should long be done by now, and even if it's not,
|
|
||||||
// it shouldn't be a problem to be initializing EGL from two different threads.
|
|
||||||
// Still, having this join() here means that we don't have to wonder about what
|
|
||||||
// kind of caveats might exist with EGL initialization reentrancy on various drivers.
|
|
||||||
if (mEGLPreloadingThread != null) {
|
|
||||||
try {
|
|
||||||
mEGLPreloadingThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Log.w(LOGTAG, "EGLPreloadingThread interrupted", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mEGL = (EGL10)EGLContext.getEGL();
|
mEGL = (EGL10)EGLContext.getEGL();
|
||||||
|
|
||||||
mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
||||||
|
@ -232,7 +170,6 @@ public class GLController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AppConstants.Versions.preICS) {
|
|
||||||
// while calling eglInitialize here should not be necessary as it was already called
|
// while calling eglInitialize here should not be necessary as it was already called
|
||||||
// by the EGLPreloadingThread, it really doesn't cost much to call it again here,
|
// by the EGLPreloadingThread, it really doesn't cost much to call it again here,
|
||||||
// and makes this code easier to think about: EGLPreloadingThread is only a
|
// and makes this code easier to think about: EGLPreloadingThread is only a
|
||||||
|
@ -246,7 +183,6 @@ public class GLController {
|
||||||
Log.w(LOGTAG, "eglInitialize failed");
|
Log.w(LOGTAG, "eglInitialize failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mEGLConfig = chooseConfig();
|
mEGLConfig = chooseConfig();
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ package: local.properties project.properties AndroidManifest.xml FORCE
|
||||||
|
|
||||||
# Copy the SOs. The latter should be $(MOZ_CHILD_PROCESS_NAME), but
|
# Copy the SOs. The latter should be $(MOZ_CHILD_PROCESS_NAME), but
|
||||||
# it includes a "lib/" prefix.
|
# it includes a "lib/" prefix.
|
||||||
cp $(_ABS_DIST)/bin/libmozglue.so $(_ABS_DIST)/bin/libplugin-container.so libs/$(ANDROID_CPU_ARCH)/
|
cp $(addprefix $(_ABS_DIST)/bin/,libmozglue.so $(MOZ_CHILD_PROCESS_NAME) $(MOZ_CHILD_PROCESS_NAME_PIE)) libs/$(ANDROID_CPU_ARCH)/
|
||||||
|
|
||||||
# Copy the resources
|
# Copy the resources
|
||||||
$(RM) -rf res
|
$(RM) -rf res
|
||||||
|
|
|
@ -23,6 +23,7 @@ DEFINES += \
|
||||||
-DPREF_DIR=$(PREF_DIR) \
|
-DPREF_DIR=$(PREF_DIR) \
|
||||||
-DJAREXT= \
|
-DJAREXT= \
|
||||||
-DMOZ_CHILD_PROCESS_NAME=$(MOZ_CHILD_PROCESS_NAME) \
|
-DMOZ_CHILD_PROCESS_NAME=$(MOZ_CHILD_PROCESS_NAME) \
|
||||||
|
-DMOZ_CHILD_PROCESS_NAME_PIE=$(MOZ_CHILD_PROCESS_NAME_PIE) \
|
||||||
-DANDROID_CPU_ARCH=$(ANDROID_CPU_ARCH) \
|
-DANDROID_CPU_ARCH=$(ANDROID_CPU_ARCH) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,8 @@
|
||||||
[lib destdir="lib/@ANDROID_CPU_ARCH@"]
|
[lib destdir="lib/@ANDROID_CPU_ARCH@"]
|
||||||
@BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@
|
||||||
# This should be MOZ_CHILD_PROCESS_NAME, but that has a "lib/" prefix.
|
# This should be MOZ_CHILD_PROCESS_NAME, but that has a "lib/" prefix.
|
||||||
@BINPATH@/@DLL_PREFIX@plugin-container@DLL_SUFFIX@
|
@BINPATH@/@MOZ_CHILD_PROCESS_NAME@
|
||||||
|
@BINPATH@/@MOZ_CHILD_PROCESS_NAME_PIE@
|
||||||
|
|
||||||
[xpcom]
|
[xpcom]
|
||||||
@BINPATH@/dependentlibs.list
|
@BINPATH@/dependentlibs.list
|
||||||
|
|
Загрузка…
Ссылка в новой задаче