Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce61835a81 | ||
|
|
8a2a9ead92 | ||
|
|
efdbd34b0b | ||
|
|
d2fa69f593 | ||
|
|
18d0a1a525 | ||
|
|
9d9802c660 | ||
|
|
27c579652a | ||
|
|
8ffa6b3c13 | ||
|
|
83f6efc33d | ||
|
|
47f1928610 | ||
|
|
7b3d961465 | ||
|
|
22b2e18d91 | ||
|
|
f6c9c0c59f | ||
|
|
d8c9d24a9c | ||
|
|
a466b73267 | ||
|
|
1ce14fb014 | ||
|
|
8bbf60fb38 | ||
|
|
f2d7c02290 | ||
|
|
65ddfc21b6 | ||
|
|
163619de60 | ||
|
|
29c4d554a0 | ||
|
|
3e59569d0b | ||
|
|
fb8483407b | ||
|
|
ec8b7f86d0 | ||
|
|
9899d59010 | ||
|
|
789e976ace | ||
|
|
d5bf2555a3 | ||
|
|
be672813f6 | ||
|
|
746a7be08c | ||
|
|
c222ee80fa | ||
|
|
4950bd038d | ||
|
|
058336a071 | ||
|
|
6823388a85 | ||
|
|
b68d097eb6 | ||
|
|
c97a22776d | ||
|
|
c484dbcca5 | ||
|
|
54f15d7afe | ||
|
|
05441188be | ||
|
|
25a2d31be7 | ||
|
|
58a4e0d545 | ||
|
|
ad06b4ce5e | ||
|
|
be3827b088 | ||
|
|
a136aaf502 | ||
|
|
40d91a8eae | ||
|
|
5b81a81ac4 | ||
|
|
328ddb2927 | ||
|
|
06b9622302 | ||
|
|
1218649202 | ||
|
|
cbea8f5a53 | ||
|
|
f42e644486 | ||
|
|
a40490b946 | ||
|
|
ad98693f3d | ||
|
|
7b4aaca975 | ||
|
|
400e59a96d | ||
|
|
09276b72a6 | ||
|
|
ec18304362 | ||
|
|
4cf411f393 | ||
|
|
2b0935adf4 | ||
|
|
cbdc5fa85f | ||
|
|
2a06c40a09 | ||
|
|
f499e3dd36 | ||
|
|
48d21fa2bf | ||
|
|
c91c69272b | ||
|
|
91f4fa744e | ||
|
|
c2abd4aaa6 | ||
|
|
617ad84f96 | ||
|
|
33b6bfa1b9 | ||
|
|
4e03afd191 | ||
|
|
3512b73bc3 | ||
|
|
d0ac45cb08 | ||
|
|
ab3d950bd3 | ||
|
|
44ddd79356 | ||
|
|
054ddf661f | ||
|
|
da466a3bdd | ||
|
|
42f0c2d78f | ||
|
|
5853784a31 | ||
|
|
5b20295620 | ||
|
|
68e151c2a3 | ||
|
|
dd764a70a2 | ||
|
|
12defe0d12 | ||
|
|
8868dd5785 | ||
|
|
e787d585a4 | ||
|
|
5eb7518ce2 | ||
|
|
5be93da111 |
No files matched your search
@@ -43,8 +43,6 @@ gyp_vars.update({
|
||||
'arm_neon': 0,
|
||||
'arm_neon_optional': 1,
|
||||
|
||||
'moz_webrtc_omx': 0,
|
||||
'moz_webrtc_mediacodec': 0,
|
||||
|
||||
# Turn off multi monitor screen share
|
||||
'multi_monitor_screenshare%' : 0,
|
||||
|
||||
@@ -344,7 +344,7 @@ def split_triplet(triplet):
|
||||
if cpu.endswith('86') or (cpu.startswith('i') and '86' in cpu):
|
||||
canonical_cpu = 'x86'
|
||||
endianness = 'little'
|
||||
elif cpu in ('x86_64', 'ia64'):
|
||||
elif cpu == 'x86_64':
|
||||
canonical_cpu = cpu
|
||||
endianness = 'little'
|
||||
elif cpu in ('s390', 's390x'):
|
||||
|
||||
@@ -290,11 +290,6 @@ fi
|
||||
if [ -n "$LD_LIBRARY_PATH_64" ]; then
|
||||
LD_LIBRARY_PATH_64=${MOZ_DIST_BIN}:${MOZ_DIST_BIN}/plugins:${MRE_HOME}${LD_LIBRARY_PATH_64:+":$LD_LIBRARY_PATH_64"}
|
||||
fi
|
||||
#
|
||||
#
|
||||
## Set SHLIB_PATH for HPUX
|
||||
SHLIB_PATH=${MOZ_DIST_BIN}:${MRE_HOME}${SHLIB_PATH:+":$SHLIB_PATH"}
|
||||
#
|
||||
## Set LIBPATH for AIX
|
||||
LIBPATH=${MOZ_DIST_BIN}:${MRE_HOME}${LIBPATH:+":$LIBPATH"}
|
||||
#
|
||||
@@ -339,7 +334,6 @@ then
|
||||
fi
|
||||
echo "DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH"
|
||||
echo " LIBRARY_PATH=$LIBRARY_PATH"
|
||||
echo " SHLIB_PATH=$SHLIB_PATH"
|
||||
echo " LIBPATH=$LIBPATH"
|
||||
echo " ADDON_PATH=$ADDON_PATH"
|
||||
echo " MOZ_PROGRAM=$MOZ_PROGRAM"
|
||||
@@ -350,7 +344,7 @@ then
|
||||
fi
|
||||
#
|
||||
export MOZILLA_FIVE_HOME LD_LIBRARY_PATH
|
||||
export SHLIB_PATH LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH
|
||||
export LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH
|
||||
|
||||
if [ $moz_debug -eq 1 ]
|
||||
then
|
||||
|
||||
@@ -448,7 +448,6 @@ gtk/gtkx.h
|
||||
gtk/gtkunixprint.h
|
||||
HIToolbox/HIToolbox.h
|
||||
hlink.h
|
||||
ia64/sys/inline.h
|
||||
Icons.h
|
||||
iconv.h
|
||||
ieeefp.h
|
||||
|
||||
@@ -204,21 +204,22 @@ function initialHTML(doc) {
|
||||
os = "linux";
|
||||
}
|
||||
|
||||
let base = doc.createElement("base");
|
||||
base.href = "resource://devtools/client/jsonview/";
|
||||
// The appRoot URI is prepended to all URIs instead of using a <base> element
|
||||
// because the latter can cause spurious network requests (UXP Issue #3122)
|
||||
let appRoot = "resource://devtools/client/jsonview/";
|
||||
|
||||
let style = doc.createElement("link");
|
||||
style.rel = "stylesheet";
|
||||
style.type = "text/css";
|
||||
style.href = base.href +"css/main.css";
|
||||
style.href = appRoot +"css/main.css";
|
||||
|
||||
let script = doc.createElement("script");
|
||||
script.src = base.href + "lib/require.js";
|
||||
script.dataset.main = "viewer-config";
|
||||
script.src = appRoot + "lib/require.js";
|
||||
script.dataset.main = appRoot + "viewer-config.js";
|
||||
script.defer = true;
|
||||
|
||||
let head = doc.createElement("head");
|
||||
head.append(base, style, script);
|
||||
head.append(style, script);
|
||||
|
||||
return "<!DOCTYPE html>\n" +
|
||||
startTag("html", {
|
||||
|
||||
@@ -4,6 +4,8 @@ subsuite = devtools
|
||||
support-files =
|
||||
array_json.json
|
||||
array_json.json^headers^
|
||||
csp_json.json
|
||||
csp_json.json^headers^
|
||||
doc_frame_script.js
|
||||
head.js
|
||||
invalid_json.json
|
||||
@@ -22,6 +24,7 @@ subsuite = clipboard
|
||||
subsuite = clipboard
|
||||
[browser_jsonview_copy_rawdata.js]
|
||||
subsuite = clipboard
|
||||
[browser_jsonview_csp_json.js]
|
||||
[browser_jsonview_filter.js]
|
||||
[browser_jsonview_invalid_json.js]
|
||||
[browser_jsonview_valid_json.js]
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_JSON_URL = URL_ROOT + "csp_json.json";
|
||||
|
||||
add_task(function* () {
|
||||
info("Test CSP JSON started");
|
||||
|
||||
yield addJsonViewTab(TEST_JSON_URL);
|
||||
|
||||
let count = yield getElementCount(".jsonPanelBox .treeTable .treeRow");
|
||||
is(count, 1, "There must be one row");
|
||||
});
|
||||
@@ -0,0 +1 @@
|
||||
{"csp": true}
|
||||
@@ -0,0 +1,2 @@
|
||||
Content-Type: application/json
|
||||
Content-Security-Policy: default-src 'none'; base-uri 'none';
|
||||
@@ -23,7 +23,7 @@
|
||||
* of the code base, so it's consistent and modules can be easily reused.
|
||||
*/
|
||||
require.config({
|
||||
baseUrl: ".",
|
||||
baseUrl: "resource://devtools/client/jsonview/",
|
||||
paths: {
|
||||
"devtools/client/shared": "resource://devtools/client/shared",
|
||||
"devtools/shared": "resource://devtools/shared",
|
||||
|
||||
@@ -97,7 +97,7 @@ ToJSValue(JSContext* aCx,
|
||||
return true;
|
||||
}
|
||||
|
||||
// Accept floating point types
|
||||
// accept floating point types
|
||||
inline bool
|
||||
ToJSValue(JSContext* aCx,
|
||||
float aArgument,
|
||||
@@ -106,7 +106,7 @@ ToJSValue(JSContext* aCx,
|
||||
// Make sure we're called in a compartment
|
||||
MOZ_ASSERT(JS::CurrentGlobalOrNull(aCx));
|
||||
|
||||
aValue.set(JS_NumberValue(double(aArgument)));
|
||||
aValue.setNumber(aArgument);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -876,12 +876,20 @@ HTMLImageElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
return HTMLImageElementBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
nsIDOMHTMLFormElement*
|
||||
HTMLImageElement::GetForm() const
|
||||
{
|
||||
return mForm;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
HTMLImageElement::SetForm(nsIDOMHTMLFormElement* aForm)
|
||||
{
|
||||
NS_PRECONDITION(aForm, "Don't pass null here");
|
||||
MOZ_ASSERT(!mForm && !HasFlag(ADDED_TO_FORM),
|
||||
"We don't support switching from one non-null form to another.");
|
||||
NS_ASSERTION(!mForm,
|
||||
"We don't support switching from one non-null form to another.");
|
||||
|
||||
mForm = static_cast<HTMLFormElement*>(aForm);
|
||||
}
|
||||
|
||||
@@ -216,8 +216,9 @@ public:
|
||||
SetHTMLAttr(nsGkAtoms::lowsrc, aLowsrc, aError);
|
||||
}
|
||||
|
||||
HTMLFormElement* GetForm() const { return mForm; };
|
||||
|
||||
#ifdef DEBUG
|
||||
nsIDOMHTMLFormElement* GetForm() const;
|
||||
#endif
|
||||
void SetForm(nsIDOMHTMLFormElement* aForm);
|
||||
void ClearForm(bool aRemoveFromForm);
|
||||
|
||||
|
||||
@@ -1824,8 +1824,8 @@ void
|
||||
nsGenericHTMLFormElement::SetForm(nsIDOMHTMLFormElement* aForm)
|
||||
{
|
||||
NS_PRECONDITION(aForm, "Don't pass null here");
|
||||
MOZ_ASSERT(!mForm && !HasFlag(ADDED_TO_FORM),
|
||||
"We don't support switching from one non-null form to another.");
|
||||
NS_ASSERTION(!mForm,
|
||||
"We don't support switching from one non-null form to another.");
|
||||
|
||||
// keep a *weak* ref to the form here
|
||||
mForm = static_cast<HTMLFormElement*>(aForm);
|
||||
|
||||
@@ -367,13 +367,12 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
static const uint32_t MIN_RATE = 8000;
|
||||
static const uint32_t MAX_RATE = 640000;
|
||||
|
||||
bool IsValid() const override
|
||||
{
|
||||
return mChannels > 0 && mChannels <= MAX_AUDIO_CHANNELS
|
||||
&& mRate >= MIN_RATE && mRate <= MAX_RATE;
|
||||
&& mRate > 0 && mRate <= MAX_RATE;
|
||||
}
|
||||
|
||||
AudioInfo* GetAsAudioInfo() override
|
||||
|
||||
@@ -179,18 +179,12 @@ IsValidVideoRegion(const nsIntSize& aFrame, const nsIntRect& aPicture,
|
||||
aFrame.height <= PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aFrame.width * aFrame.height <= MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
|
||||
aFrame.width * aFrame.height != 0 &&
|
||||
aPicture.width > 0 &&
|
||||
aPicture.width <= PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.x >= 0 &&
|
||||
aPicture.x < PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.x + aPicture.width < PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.XMost() <= aFrame.width &&
|
||||
aPicture.height > 0 &&
|
||||
aPicture.height <= PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.y >= 0 &&
|
||||
aPicture.y < PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.y + aPicture.height < PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
aPicture.YMost() <= aFrame.height &&
|
||||
aPicture.width * aPicture.height <= MAX_VIDEO_WIDTH * MAX_VIDEO_HEIGHT &&
|
||||
aPicture.width * aPicture.height != 0 &&
|
||||
aDisplay.width <= PlanarYCbCrImage::MAX_DIMENSION &&
|
||||
|
||||
@@ -439,7 +439,7 @@ private:
|
||||
Maybe<size_t> mInitOffset;
|
||||
Maybe<size_t> mMediaOffset;
|
||||
bool mValid = true;
|
||||
char mLastInvalidBox[5]{};
|
||||
char mLastInvalidBox[5];
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "WebMBufferedParser.h"
|
||||
#include "gfx2DGlue.h"
|
||||
#include "mozilla/Atomics.h"
|
||||
#include "mozilla/CheckedInt.h"
|
||||
#include "mozilla/EndianUtils.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "mozilla/SharedThreadPool.h"
|
||||
@@ -353,27 +352,19 @@ WebMDemuxer::ReadMetadata()
|
||||
mInfo.mVideo.mExtraData = new MediaByteBuffer(length);
|
||||
mInfo.mVideo.mExtraData->AppendElements(data, length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
NS_WARNING("Unknown WebM video codec");
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
// Picture region, taking into account cropping, before scaling
|
||||
// to the display size.
|
||||
CheckedInt<uint32_t> cropH = CheckedInt<uint32_t>(params.crop_left) + params.crop_right;
|
||||
CheckedInt<uint32_t> cropV = CheckedInt<uint32_t>(params.crop_top) + params.crop_bottom;
|
||||
if (!cropH.isValid() || !cropV.isValid() ||
|
||||
cropH.value() >= params.width || cropV.value() >= params.height) {
|
||||
WEBM_DEBUG("Invalid crop values left: {} right: {} top: {} bottom: {}",
|
||||
params.crop_left, params.crop_right, params.crop_top,
|
||||
params.crop_bottom);
|
||||
// Ignore invalid crop parameters.
|
||||
continue;
|
||||
}
|
||||
unsigned int cropH = params.crop_right + params.crop_left;
|
||||
unsigned int cropV = params.crop_bottom + params.crop_top;
|
||||
nsIntRect pictureRect(params.crop_left,
|
||||
params.crop_top,
|
||||
params.width - cropH.value(),
|
||||
params.height - cropV.value());
|
||||
params.width - cropH,
|
||||
params.height - cropV);
|
||||
|
||||
// If the cropping data appears invalid then use the frame data
|
||||
if (pictureRect.width <= 0 ||
|
||||
|
||||
@@ -29,8 +29,7 @@ enum {
|
||||
* Abstract interface for managing audio and video devices. Each platform
|
||||
* must implement a concrete class that will map these classes and methods
|
||||
* to the appropriate backend. For example, on Desktop platforms, these will
|
||||
* correspond to equivalent webrtc (GIPS) calls, and on B2G they will map to
|
||||
* a Gonk interface.
|
||||
* correspond to equivalent webrtc (GIPS) calls.
|
||||
*/
|
||||
class MediaEngineVideoSource;
|
||||
class MediaEngineAudioSource;
|
||||
@@ -302,7 +301,6 @@ public:
|
||||
|
||||
/* If implementation of MediaEngineSource supports TakePhoto(), the picture
|
||||
* should be return via aCallback object. Otherwise, it returns NS_ERROR_NOT_IMPLEMENTED.
|
||||
* Currently, only Gonk MediaEngineSource implementation supports it.
|
||||
*/
|
||||
virtual nsresult TakePhoto(MediaEnginePhotoCallback* aCallback) = 0;
|
||||
|
||||
|
||||
@@ -36,8 +36,8 @@ bool MediaEngineCameraVideoSource::AppendToTrack(SourceMediaStream* aSource,
|
||||
return aSource->AppendToTrack(aID, &(segment));
|
||||
}
|
||||
|
||||
// Sub-classes (B2G or desktop) should overload one of both of these two methods
|
||||
// to provide capabilities
|
||||
// Subclasses should overload one or both of these methods to provide
|
||||
// capabilities.
|
||||
size_t
|
||||
MediaEngineCameraVideoSource::NumCapabilities() const
|
||||
{
|
||||
@@ -324,21 +324,6 @@ MediaEngineCameraVideoSource::SetName(nsString aName)
|
||||
bool hasFacingMode = false;
|
||||
VideoFacingModeEnum facingMode = VideoFacingModeEnum::User;
|
||||
|
||||
// Set facing mode based on device name.
|
||||
#if defined(ANDROID)
|
||||
// Names are generated. Example: "Camera 0, Facing back, Orientation 90"
|
||||
//
|
||||
// See media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/
|
||||
// webrtc/videoengine/VideoCaptureDeviceInfoAndroid.java
|
||||
|
||||
if (aName.Find(NS_LITERAL_STRING("Facing back")) != kNotFound) {
|
||||
hasFacingMode = true;
|
||||
facingMode = VideoFacingModeEnum::Environment;
|
||||
} else if (aName.Find(NS_LITERAL_STRING("Facing front")) != kNotFound) {
|
||||
hasFacingMode = true;
|
||||
facingMode = VideoFacingModeEnum::User;
|
||||
}
|
||||
#endif // ANDROID
|
||||
#ifdef XP_MACOSX
|
||||
// Kludge to test user-facing cameras on OSX.
|
||||
if (aName.Find(NS_LITERAL_STRING("Face")) != -1) {
|
||||
|
||||
@@ -108,7 +108,7 @@ protected:
|
||||
nsTArray<PrincipalHandle> mPrincipalHandles; // Directly mapped to mSources.
|
||||
RefPtr<layers::Image> mImage;
|
||||
RefPtr<layers::ImageContainer> mImageContainer;
|
||||
int mWidth, mHeight; // protected with mMonitor on Gonk due to different threading
|
||||
int mWidth, mHeight; // protected with mMonitor
|
||||
// end of data protected by mMonitor
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#ifdef FF
|
||||
#undef FF
|
||||
#endif
|
||||
#include "webrtc/modules/audio_device/opensl/single_rw_fifo.h"
|
||||
#include "SingleRwFifo.h"
|
||||
|
||||
#define CHANNELS 1
|
||||
#define ENCODING "L16"
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#include "SingleRwFifo.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
static int
|
||||
UpdatePos(int pos, int capacity)
|
||||
{
|
||||
return (pos + 1) % capacity;
|
||||
}
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
namespace subtle {
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
inline void
|
||||
MemoryBarrier()
|
||||
{
|
||||
::MemoryBarrier();
|
||||
}
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
inline void
|
||||
MemoryBarrier()
|
||||
{
|
||||
__sync_synchronize();
|
||||
}
|
||||
#else
|
||||
#error Add an implementation of MemoryBarrier() for this platform!
|
||||
#endif
|
||||
|
||||
} // namespace subtle
|
||||
|
||||
SingleRwFifo::SingleRwFifo(int capacity)
|
||||
: capacity_(capacity)
|
||||
, size_(0)
|
||||
, read_pos_(0)
|
||||
, write_pos_(0)
|
||||
{
|
||||
queue_.reset(new int8_t*[capacity_]);
|
||||
}
|
||||
|
||||
SingleRwFifo::~SingleRwFifo()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
SingleRwFifo::Push(int8_t* mem)
|
||||
{
|
||||
assert(mem);
|
||||
|
||||
// Ensure that there is space for the new data in the FIFO. There is only one
|
||||
// writer, so the other thread is guaranteed only to decrease the size.
|
||||
const int free_slots = capacity() - size();
|
||||
if (free_slots <= 0) {
|
||||
// Size can be queried outside of Push. The caller is expected to ensure
|
||||
// that Push will be successful before calling it.
|
||||
assert(false);
|
||||
return;
|
||||
}
|
||||
queue_[write_pos_] = mem;
|
||||
// Ensure that |size_| is updated after the stored pointer is visible.
|
||||
subtle::MemoryBarrier();
|
||||
++size_;
|
||||
write_pos_ = UpdatePos(write_pos_, capacity());
|
||||
}
|
||||
|
||||
int8_t*
|
||||
SingleRwFifo::Pop()
|
||||
{
|
||||
int8_t* ret_val = nullptr;
|
||||
if (size() <= 0) {
|
||||
// Size can be queried outside of Pop. The caller is expected to ensure
|
||||
// that Pop will be successful before calling it.
|
||||
assert(false);
|
||||
return ret_val;
|
||||
}
|
||||
ret_val = queue_[read_pos_];
|
||||
// Ensure that |size_| is updated after the stored pointer is read.
|
||||
subtle::MemoryBarrier();
|
||||
--size_;
|
||||
read_pos_ = UpdatePos(read_pos_, capacity());
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
+5
-8
@@ -8,8 +8,8 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
|
||||
#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
|
||||
#ifndef DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
|
||||
#define DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
|
||||
|
||||
#include "webrtc/base/scoped_ptr.h"
|
||||
#include "webrtc/system_wrappers/interface/atomic32.h"
|
||||
@@ -17,10 +17,9 @@
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Implements a lock-free FIFO losely based on
|
||||
// Implements a lock-free FIFO loosely based on
|
||||
// http://src.chromium.org/viewvc/chrome/trunk/src/media/base/audio_fifo.cc
|
||||
// Note that this class assumes there is one producer (writer) and one
|
||||
// consumer (reader) thread.
|
||||
// This class assumes there is one producer and one consumer thread.
|
||||
class SingleRwFifo {
|
||||
public:
|
||||
explicit SingleRwFifo(int capacity);
|
||||
@@ -29,8 +28,6 @@ class SingleRwFifo {
|
||||
void Push(int8_t* mem);
|
||||
int8_t* Pop();
|
||||
|
||||
void Clear();
|
||||
|
||||
int size() { return size_.Value(); }
|
||||
int capacity() const { return capacity_; }
|
||||
|
||||
@@ -46,4 +43,4 @@ class SingleRwFifo {
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_SINGLE_RW_FIFO_H_
|
||||
#endif // DOM_MEDIA_WEBRTC_SINGLE_RW_FIFO_H_
|
||||
@@ -38,6 +38,7 @@ if CONFIG['MOZ_WEBRTC']:
|
||||
# MediaEngineWebRTC.cpp needs to be built separately.
|
||||
SOURCES += [
|
||||
'MediaEngineWebRTC.cpp',
|
||||
'SingleRwFifo.cpp',
|
||||
]
|
||||
LOCAL_INCLUDES += [
|
||||
'/dom/base',
|
||||
@@ -68,8 +69,7 @@ include('/ipc/chromium/chromium-config.mozbuild')
|
||||
|
||||
# Suppress some GCC/clang warnings being treated as errors:
|
||||
# - about attributes on forward declarations for types that are already
|
||||
# defined, which complains about important MOZ_EXPORT attributes for
|
||||
# android API types
|
||||
# defined, which complains about important MOZ_EXPORT attributes.
|
||||
if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
|
||||
CXXFLAGS += [
|
||||
'-Wno-error=attributes',
|
||||
|
||||
@@ -194,7 +194,7 @@ static void FreeStringArray(uint32_t variants, char ** array)
|
||||
|
||||
static bool CanLoadPlugin(char16ptr_t aBinaryPath)
|
||||
{
|
||||
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_IA64)
|
||||
#if defined(_M_IX86) || defined(_M_X64)
|
||||
bool canLoad = false;
|
||||
|
||||
HANDLE file = CreateFileW(aBinaryPath, GENERIC_READ,
|
||||
@@ -214,8 +214,6 @@ static bool CanLoadPlugin(char16ptr_t aBinaryPath)
|
||||
canLoad = (arch == IMAGE_FILE_MACHINE_I386);
|
||||
#elif defined(_M_X64)
|
||||
canLoad = (arch == IMAGE_FILE_MACHINE_AMD64);
|
||||
#elif defined(_M_IA64)
|
||||
canLoad = (arch == IMAGE_FILE_MACHINE_IA64);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
+5
-14
@@ -1789,26 +1789,17 @@ URL::IsValidURL(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
return URLWorker::IsValidURL(aGlobal, aURL, aRv);
|
||||
}
|
||||
|
||||
already_AddRefed<URL>
|
||||
URL::Parse(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
const Optional<nsAString>& aBase)
|
||||
{
|
||||
bool
|
||||
URL::CanParse(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
const Optional<nsAString>& aBase) {
|
||||
ErrorResult rv;
|
||||
RefPtr<URL> parsed = URL::Constructor(aGlobal, aURL, aBase, rv);
|
||||
if (rv.Failed() || !parsed) {
|
||||
rv.SuppressException();
|
||||
return nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
return parsed.forget();
|
||||
}
|
||||
|
||||
bool
|
||||
URL::CanParse(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
const Optional<nsAString>& aBase)
|
||||
{
|
||||
RefPtr<URL> parsed = URL::Parse(aGlobal, aURL, aBase);
|
||||
return !!parsed;
|
||||
return true;
|
||||
}
|
||||
|
||||
already_AddRefed<URLSearchParams>
|
||||
|
||||
@@ -88,10 +88,6 @@ public:
|
||||
IsValidURL(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
ErrorResult& aRv);
|
||||
|
||||
static already_AddRefed<URL>
|
||||
Parse(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
const Optional<nsAString>& aBase);
|
||||
|
||||
static bool
|
||||
CanParse(const GlobalObject& aGlobal, const nsAString& aURL,
|
||||
const Optional<nsAString>& aBase);
|
||||
|
||||
@@ -448,34 +448,6 @@
|
||||
!URL.canParse("/static/client/runtime.js", "mailto:test@example.com"),
|
||||
"URL.canParse rejects root-relative input against opaque mailto: base",
|
||||
);
|
||||
ok("parse" in URL, "URL.parse exists");
|
||||
is(URL.parse.length, 1, "URL.parse has one required argument");
|
||||
var parsed = URL.parse("/static/client/runtime.js", "x:/");
|
||||
ok(parsed instanceof URL, "URL.parse returns a URL object on success");
|
||||
is(parsed.href, "x:/static/client/runtime.js", "URL.parse resolves against a base");
|
||||
is(URL.parse("/static/client/runtime.js"), null, "URL.parse returns null for invalid input");
|
||||
is(
|
||||
URL.parse("/static/client/runtime.js", "mailto:test@example.com"),
|
||||
null,
|
||||
"URL.parse returns null for an invalid base/input combination",
|
||||
);
|
||||
|
||||
var conversionOrder = [];
|
||||
parsed = URL.parse(
|
||||
{ toString: function() { conversionOrder.push("url"); return "child"; } },
|
||||
{ toString: function() { conversionOrder.push("base"); return "https://example.com/root/"; } },
|
||||
);
|
||||
is(conversionOrder.join(","), "url,base", "URL.parse converts its arguments in order");
|
||||
is(parsed.href, "https://example.com/root/child", "URL.parse uses converted arguments");
|
||||
|
||||
var sentinel = {};
|
||||
var thrown;
|
||||
try {
|
||||
URL.parse({ toString: function() { throw sentinel; } });
|
||||
} catch (e) {
|
||||
thrown = e;
|
||||
}
|
||||
is(thrown, sentinel, "URL.parse propagates argument conversion exceptions");
|
||||
SimpleTest.doesThrow(() => {
|
||||
new URL("/static/client/runtime.js", "mailto:test@example.com");
|
||||
}, "constructor rejects root-relative input against opaque mailto: base");
|
||||
|
||||
@@ -301,64 +301,6 @@ onmessage = function () {
|
||||
!URL.canParse("/static/client/runtime.js", "mailto:test@example.com"),
|
||||
"URL.canParse rejects root-relative input against opaque mailto: base",
|
||||
);
|
||||
ok("parse" in URL, "URL.parse exists");
|
||||
is(URL.parse.length, 1, "URL.parse has one required argument");
|
||||
let parsed = URL.parse("/static/client/runtime.js", "x:/");
|
||||
ok(parsed instanceof URL, "URL.parse returns a URL object on success");
|
||||
is(
|
||||
parsed.href,
|
||||
"x:/static/client/runtime.js",
|
||||
"URL.parse resolves against a base",
|
||||
);
|
||||
is(
|
||||
URL.parse("/static/client/runtime.js"),
|
||||
null,
|
||||
"URL.parse returns null for invalid input",
|
||||
);
|
||||
is(
|
||||
URL.parse("/static/client/runtime.js", "mailto:test@example.com"),
|
||||
null,
|
||||
"URL.parse returns null for an invalid base/input combination",
|
||||
);
|
||||
|
||||
const conversionOrder = [];
|
||||
parsed = URL.parse(
|
||||
{
|
||||
toString() {
|
||||
conversionOrder.push("url");
|
||||
return "child";
|
||||
},
|
||||
},
|
||||
{
|
||||
toString() {
|
||||
conversionOrder.push("base");
|
||||
return "https://example.com/root/";
|
||||
},
|
||||
},
|
||||
);
|
||||
is(
|
||||
conversionOrder.join(","),
|
||||
"url,base",
|
||||
"URL.parse converts its arguments in order",
|
||||
);
|
||||
is(
|
||||
parsed.href,
|
||||
"https://example.com/root/child",
|
||||
"URL.parse uses converted arguments",
|
||||
);
|
||||
|
||||
const sentinel = {};
|
||||
let thrown;
|
||||
try {
|
||||
URL.parse({
|
||||
toString() {
|
||||
throw sentinel;
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
thrown = e;
|
||||
}
|
||||
is(thrown, sentinel, "URL.parse propagates argument conversion exceptions");
|
||||
let mailtoRelativeFailed = false;
|
||||
try {
|
||||
new URL("/static/client/runtime.js", "mailto:test@example.com");
|
||||
|
||||
@@ -23,7 +23,6 @@ interface URL {
|
||||
[Throws]
|
||||
stringifier;
|
||||
|
||||
static URL? parse(USVString url, optional USVString base);
|
||||
static boolean canParse(USVString url, optional USVString base);
|
||||
|
||||
[Throws]
|
||||
|
||||
@@ -301,6 +301,7 @@ LoadContextOptions(const char* aPrefName, void* /* aClosure */)
|
||||
.setAsyncStack(GetWorkerPref<bool>(NS_LITERAL_CSTRING("asyncstack")))
|
||||
.setWerror(GetWorkerPref<bool>(NS_LITERAL_CSTRING("werror")))
|
||||
.setStreams(GetWorkerPref<bool>(NS_LITERAL_CSTRING("streams")))
|
||||
.setWeakRefs(GetWorkerPref<bool>(NS_LITERAL_CSTRING("weakrefs")))
|
||||
.setExtraWarnings(GetWorkerPref<bool>(NS_LITERAL_CSTRING("strict")))
|
||||
.setArrayProtoValues(GetWorkerPref<bool>(
|
||||
NS_LITERAL_CSTRING("array_prototype_values")));
|
||||
|
||||
@@ -35,6 +35,7 @@ WORKER_SIMPLE_PREF("dom.serviceWorkers.openWindow.enabled", OpenWindowEnabled, O
|
||||
WORKER_SIMPLE_PREF("dom.storageManager.enabled", StorageManagerEnabled, STORAGEMANAGER_ENABLED)
|
||||
WORKER_SIMPLE_PREF("dom.push.enabled", PushEnabled, PUSH_ENABLED)
|
||||
WORKER_SIMPLE_PREF("dom.streams.enabled", StreamsEnabled, STREAMS_ENABLED)
|
||||
WORKER_SIMPLE_PREF("javascript.options.weakrefs", WeakRefsEnabled, WEAKREFS_ENABLED)
|
||||
WORKER_SIMPLE_PREF("dom.requestcontext.enabled", RequestContextEnabled, REQUESTCONTEXT_ENABLED)
|
||||
WORKER_SIMPLE_PREF("gfx.offscreencanvas.enabled", OffscreenCanvasEnabled, OFFSCREENCANVAS_ENABLED)
|
||||
WORKER_SIMPLE_PREF("dom.webkitBlink.dirPicker.enabled", WebkitBlinkDirectoryPickerEnabled, DOM_WEBKITBLINK_DIRPICKER_WEBKITBLINK)
|
||||
|
||||
@@ -336,20 +336,7 @@ gfxGraphiteShaper::SetGlyphsFromSegment(DrawTarget *aDrawTarget,
|
||||
// not a one-to-one mapping with simple metrics: use DetailedGlyph
|
||||
AutoTArray<gfxShapedText::DetailedGlyph,8> details;
|
||||
float clusterLoc;
|
||||
|
||||
uint32_t glyph_start = c.baseGlyph;
|
||||
uint32_t glyph_end = glyph_start + c.nGlyphs;
|
||||
if (glyph_end < glyph_start) {
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
if (glyph_end - glyph_start > 0xFFFF) {
|
||||
return NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
if (!details.SetCapacity(glyph_end - glyph_start, fallible)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
for (uint32_t j = glyph_start; j < glyph_end; ++j) {
|
||||
for (uint32_t j = c.baseGlyph; j < c.baseGlyph + c.nGlyphs; ++j) {
|
||||
gfxShapedText::DetailedGlyph* d = details.AppendElement();
|
||||
d->mGlyphID = gids[j];
|
||||
d->mYOffset = roundY ? NSToIntRound(-yLocs[j]) * dev2appUnits :
|
||||
|
||||
@@ -231,13 +231,11 @@ gfxTextRun::ComputeLigatureData(Range aPartRange,
|
||||
LigatureData result;
|
||||
const CompressedGlyph *charGlyphs = mCharacterGlyphs;
|
||||
|
||||
uint32_t i = aPartRange.start;
|
||||
while (i && !charGlyphs[i].IsLigatureGroupStart()) {
|
||||
--i;
|
||||
uint32_t i;
|
||||
for (i = aPartRange.start; !charGlyphs[i].IsLigatureGroupStart(); --i) {
|
||||
NS_ASSERTION(i > 0, "Ligature at the start of the run??");
|
||||
}
|
||||
NS_ASSERTION(charGlyphs[i].IsLigatureGroupStart(), "Ligature at run start?");
|
||||
result.mRange.start = i;
|
||||
|
||||
for (i = aPartRange.start + 1;
|
||||
i < GetLength() && !charGlyphs[i].IsLigatureGroupStart(); ++i) {
|
||||
}
|
||||
@@ -1706,27 +1704,21 @@ gfxFontGroup::GetFontAt(int32_t i, uint32_t aCh)
|
||||
|
||||
RefPtr<gfxFont> font = ff.Font();
|
||||
if (!font) {
|
||||
RefPtr<gfxFontEntry> fe = ff.FontEntry();
|
||||
if (!fe) {
|
||||
return nullptr;
|
||||
}
|
||||
RefPtr<gfxCharacterMap> unicodeRangeMap;
|
||||
gfxFontEntry* fe = mFonts[i].FontEntry();
|
||||
gfxCharacterMap* unicodeRangeMap = nullptr;
|
||||
if (fe->mIsUserFontContainer) {
|
||||
// This raw pointer is OK because fe holds a strong ref to the object.
|
||||
gfxUserFontEntry* ufe = static_cast<gfxUserFontEntry*>(fe.get());
|
||||
gfxUserFontEntry* ufe = static_cast<gfxUserFontEntry*>(fe);
|
||||
if (ufe->LoadState() == gfxUserFontEntry::STATUS_NOT_LOADED &&
|
||||
ufe->CharacterInUnicodeRange(aCh) &&
|
||||
!FontLoadingForFamily(ff.Family(), aCh)) {
|
||||
ufe->Load();
|
||||
ff.CheckState(mSkipDrawing);
|
||||
}
|
||||
unicodeRangeMap = ufe->GetUnicodeRangeMap();
|
||||
// Update fe to refer to the actual platform font entry, rather than the
|
||||
// webfont wrapper. After this, we no longer have a strong ref to ufe.
|
||||
fe = ufe->GetPlatformFontEntry();
|
||||
if (!fe) {
|
||||
return nullptr;
|
||||
}
|
||||
unicodeRangeMap = ufe->GetUnicodeRangeMap();
|
||||
}
|
||||
font = fe->FindOrMakeFont(&mStyle, mFonts[i].NeedsBold(),
|
||||
unicodeRangeMap);
|
||||
|
||||
@@ -1637,13 +1637,10 @@ RasterImage::NotifyDecodeComplete(const DecoderFinalStatus& aStatus,
|
||||
|
||||
if (!(aDecoderFlags & DecoderFlags::FIRST_FRAME_ONLY) &&
|
||||
mHasBeenDecoded && mAnimationState) {
|
||||
// If we've successfully finished a full decode of all animation frames
|
||||
// then let our animation state know it's complete and to not to expect
|
||||
// any more frames.
|
||||
if (aStatus.mFinished && !aStatus.mHadError) {
|
||||
mAnimationState->NotifyDecodeComplete();
|
||||
mAnimationState->UpdateState(mAnimationFinished, this, mSize);
|
||||
}
|
||||
// We've finished a full decode of all animation frames and our AnimationState
|
||||
// has been notified about them all, so let it know not to expect anymore.
|
||||
mAnimationState->NotifyDecodeComplete();
|
||||
mAnimationState->UpdateState(mAnimationFinished, this, mSize);
|
||||
}
|
||||
|
||||
// Only act on errors if we have no usable frames from the decoder.
|
||||
|
||||
@@ -66,10 +66,28 @@ struct WeakCell {
|
||||
WeakCellKind kind;
|
||||
WeakRef<JSObject*> object;
|
||||
WeakRef<JS::Symbol*> symbol;
|
||||
bool enabled;
|
||||
|
||||
WeakCell() : kind(WeakCellKind::Empty), object(nullptr), symbol(nullptr) {}
|
||||
explicit WeakCell(JSObject* obj) : kind(WeakCellKind::Object), object(obj), symbol(nullptr) {}
|
||||
explicit WeakCell(JS::Symbol* sym) : kind(WeakCellKind::Symbol), object(nullptr), symbol(sym) {}
|
||||
WeakCell()
|
||||
: kind(WeakCellKind::Empty)
|
||||
, object(nullptr)
|
||||
, symbol(nullptr)
|
||||
, enabled(true)
|
||||
{}
|
||||
|
||||
explicit WeakCell(JSObject* obj, bool enabled)
|
||||
: kind(WeakCellKind::Object)
|
||||
, object(obj)
|
||||
, symbol(nullptr)
|
||||
, enabled(enabled)
|
||||
{}
|
||||
|
||||
explicit WeakCell(JS::Symbol* sym, bool enabled)
|
||||
: kind(WeakCellKind::Symbol)
|
||||
, object(nullptr)
|
||||
, symbol(sym)
|
||||
, enabled(enabled)
|
||||
{}
|
||||
|
||||
void clear() {
|
||||
kind = WeakCellKind::Empty;
|
||||
@@ -101,7 +119,9 @@ struct WeakCell {
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
if (IsInsideNursery(target)) {
|
||||
if (!enabled) {
|
||||
// Do nothing
|
||||
} else if (IsInsideNursery(target)) {
|
||||
TraceManuallyBarrieredEdge(trc, object.unsafeGet(), name);
|
||||
} else {
|
||||
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
|
||||
@@ -110,7 +130,7 @@ struct WeakCell {
|
||||
}
|
||||
} else if (kind == WeakCellKind::Symbol) {
|
||||
JS::Symbol* target = symbol.unbarrieredGet();
|
||||
if (target) {
|
||||
if (enabled && target) {
|
||||
if (trc->isMarkingTracer() && !target->asTenured().zone()->isCollecting())
|
||||
return;
|
||||
TraceWeakEdge(trc, &symbol, name);
|
||||
@@ -124,14 +144,16 @@ struct WeakCell {
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
if (IsInsideNursery(target)) {
|
||||
if (!enabled) {
|
||||
// Do nothing
|
||||
} else if (IsInsideNursery(target)) {
|
||||
TraceManuallyBarrieredEdge(trc, object.unsafeGet(), name);
|
||||
} else if (target->asTenured().zone()->isCollecting()) {
|
||||
TraceWeakEdge(trc, &object, name);
|
||||
}
|
||||
} else if (kind == WeakCellKind::Symbol) {
|
||||
JS::Symbol* target = symbol.unbarrieredGet();
|
||||
if (target && target->asTenured().zone()->isCollecting())
|
||||
if (enabled && target && target->asTenured().zone()->isCollecting())
|
||||
TraceWeakEdge(trc, &symbol, name);
|
||||
}
|
||||
}
|
||||
@@ -143,22 +165,24 @@ struct FinalizationRecord {
|
||||
WeakCell unregisterToken;
|
||||
bool active;
|
||||
bool queued;
|
||||
bool enabled;
|
||||
|
||||
FinalizationRecord(HandleValue targetValue, HandleValue heldValue,
|
||||
HandleValue unregisterTokenValue)
|
||||
HandleValue unregisterTokenValue, bool enabled)
|
||||
: heldValue(heldValue),
|
||||
active(true),
|
||||
queued(false)
|
||||
queued(false),
|
||||
enabled(enabled)
|
||||
{
|
||||
if (targetValue.isObject())
|
||||
target = WeakCell(NormalizeWeakObject(&targetValue.toObject()));
|
||||
target = WeakCell(NormalizeWeakObject(&targetValue.toObject()), enabled);
|
||||
else
|
||||
target = WeakCell(targetValue.toSymbol());
|
||||
target = WeakCell(targetValue.toSymbol(), enabled);
|
||||
|
||||
if (unregisterTokenValue.isObject())
|
||||
unregisterToken = WeakCell(NormalizeWeakObject(&unregisterTokenValue.toObject()));
|
||||
unregisterToken = WeakCell(NormalizeWeakObject(&unregisterTokenValue.toObject()), enabled);
|
||||
else if (unregisterTokenValue.isSymbol())
|
||||
unregisterToken = WeakCell(unregisterTokenValue.toSymbol());
|
||||
unregisterToken = WeakCell(unregisterTokenValue.toSymbol(), enabled);
|
||||
}
|
||||
|
||||
void trace(JSTracer* trc) {
|
||||
@@ -217,13 +241,15 @@ struct FinalizationRegistryObject::Data {
|
||||
FinalizationRecordVector records;
|
||||
FinalizationRecordVector cleanupQueue;
|
||||
bool queuedForCleanup;
|
||||
bool enabled;
|
||||
|
||||
explicit Data(JSObject* cleanupCallback)
|
||||
explicit Data(JSObject* cleanupCallback, bool enabled)
|
||||
: cleanupCallback(cleanupCallback),
|
||||
cleanupJob(nullptr),
|
||||
records(SystemAllocPolicy()),
|
||||
cleanupQueue(SystemAllocPolicy()),
|
||||
queuedForCleanup(false)
|
||||
queuedForCleanup(false),
|
||||
enabled(enabled)
|
||||
{}
|
||||
|
||||
~Data() {
|
||||
@@ -232,11 +258,13 @@ struct FinalizationRegistryObject::Data {
|
||||
}
|
||||
|
||||
void trace(JSTracer* trc) {
|
||||
JS::TraceEdge(trc, &cleanupCallback, "FinalizationRegistry cleanup callback");
|
||||
if (cleanupJob.unbarrieredGet())
|
||||
JS::TraceEdge(trc, &cleanupJob, "FinalizationRegistry cleanup job");
|
||||
for (size_t i = 0; i < records.length(); i++)
|
||||
records[i]->trace(trc);
|
||||
if (enabled) {
|
||||
JS::TraceEdge(trc, &cleanupCallback, "FinalizationRegistry cleanup callback");
|
||||
if (cleanupJob.unbarrieredGet())
|
||||
JS::TraceEdge(trc, &cleanupJob, "FinalizationRegistry cleanup job");
|
||||
for (size_t i = 0; i < records.length(); i++)
|
||||
records[i]->trace(trc);
|
||||
}
|
||||
}
|
||||
|
||||
bool appendRecord(FinalizationRecord* record) {
|
||||
@@ -317,7 +345,7 @@ FinalizationRegistry_register_impl(JSContext* cx, const CallArgs& args)
|
||||
unregisterToken.setUndefined();
|
||||
}
|
||||
|
||||
FinalizationRecord* record = cx->new_<FinalizationRecord>(target, heldValue, unregisterToken);
|
||||
FinalizationRecord* record = cx->new_<FinalizationRecord>(target, heldValue, unregisterToken, cx->options().weakRefs());
|
||||
if (!record)
|
||||
return false;
|
||||
|
||||
@@ -401,7 +429,7 @@ FinalizationRegistryObject::create(JSContext* cx, HandleObject cleanupCallback,
|
||||
if (!obj)
|
||||
return nullptr;
|
||||
|
||||
Data* data = cx->new_<Data>(cleanupCallback);
|
||||
Data* data = cx->new_<Data>(cleanupCallback, cx->options().weakRefs());
|
||||
if (!data)
|
||||
return nullptr;
|
||||
|
||||
|
||||
@@ -8,11 +8,8 @@
|
||||
#include "mozilla/CheckedInt.h"
|
||||
#include "mozilla/TypeTraits.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "jscntxt.h"
|
||||
|
||||
#include "builtin/SelfHostingDefines.h"
|
||||
#include "irregexp/RegExpParser.h"
|
||||
#include "jit/InlinableNatives.h"
|
||||
#include "vm/RegExpStatics.h"
|
||||
@@ -1757,9 +1754,7 @@ js::RegExpGetSubstitution(JSContext* cx, HandleArrayObject matchResult, HandleLi
|
||||
// Step 6.
|
||||
MOZ_ASSERT(position <= string->length());
|
||||
|
||||
// String substitutions can only reference $1 through $99.
|
||||
uint32_t nCaptures = std::min<uint32_t>(matchResultLength - 1,
|
||||
REGEXP_MAX_SUBSTITUTION_CAPTURES);
|
||||
uint32_t nCaptures = matchResultLength - 1;
|
||||
Rooted<CapturesVector> captures(cx, CapturesVector(cx));
|
||||
if (!captures.reserve(nCaptures))
|
||||
return false;
|
||||
|
||||
@@ -463,12 +463,6 @@ function RegExpGetComplexReplacement(result, matched, S, position,
|
||||
// Step 14.k.i (reordered).
|
||||
_DefineDataProperty(captures, capturesLength++, matched);
|
||||
|
||||
// String substitutions can only reference $1 through $99. Keep getting and
|
||||
// stringifying all captures because those operations are observable.
|
||||
var storedCaptures = functionalReplace ?
|
||||
nCaptures :
|
||||
std_Math_min(nCaptures, REGEXP_MAX_SUBSTITUTION_CAPTURES);
|
||||
|
||||
// Step 14.g, 14.i, 14.i.iv.
|
||||
for (var n = 1; n <= nCaptures; n++) {
|
||||
// Step 14.i.i.
|
||||
@@ -479,9 +473,7 @@ function RegExpGetComplexReplacement(result, matched, S, position,
|
||||
capN = ToString(capN);
|
||||
|
||||
// Step 14.i.iii.
|
||||
if (n <= storedCaptures) {
|
||||
_DefineDataProperty(captures, capturesLength++, capN);
|
||||
}
|
||||
_DefineDataProperty(captures, capturesLength++, capN);
|
||||
}
|
||||
|
||||
// Step 14.j.
|
||||
|
||||
@@ -79,8 +79,6 @@
|
||||
|
||||
#define REGEXP_FLAGS_SLOT 2
|
||||
|
||||
#define REGEXP_MAX_SUBSTITUTION_CAPTURES 99
|
||||
|
||||
#define REGEXP_IGNORECASE_FLAG 0x01
|
||||
#define REGEXP_GLOBAL_FLAG 0x02
|
||||
#define REGEXP_MULTILINE_FLAG 0x04
|
||||
|
||||
@@ -140,9 +140,9 @@ WeakRefObject::create(JSContext* cx, HandleValue target, HandleObject proto /* =
|
||||
|
||||
Referent* data;
|
||||
if (target.isObject())
|
||||
data = cx->new_<Referent>(&target.toObject());
|
||||
data = cx->new_<Referent>(&target.toObject(), cx->options().weakRefs());
|
||||
else
|
||||
data = cx->new_<Referent>(target.toSymbol());
|
||||
data = cx->new_<Referent>(target.toSymbol(), cx->options().weakRefs());
|
||||
|
||||
if (!data)
|
||||
return nullptr;
|
||||
@@ -210,7 +210,9 @@ WeakRefObject::trace(JSTracer* trc, JSObject* obj)
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
if (IsInsideNursery(target)) {
|
||||
if (!data->enabled) {
|
||||
// Pref disabled, don't do anything.
|
||||
} else if (IsInsideNursery(target)) {
|
||||
// Weak edges must be tenured; trace strongly while referent is in the nursery.
|
||||
TraceManuallyBarrieredEdge(trc, data->objectTarget.unsafeGet(),
|
||||
"WeakRef nursery referent");
|
||||
@@ -220,7 +222,7 @@ WeakRefObject::trace(JSTracer* trc, JSObject* obj)
|
||||
} else {
|
||||
MOZ_ASSERT(data->isSymbol());
|
||||
JS::Symbol* target = data->symbolTarget.unbarrieredGet();
|
||||
if (target)
|
||||
if (data->enabled && target)
|
||||
TraceWeakEdge(trc, &data->symbolTarget, "WeakRef symbol referent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,17 +22,27 @@ class WeakRefObject : public NativeObject
|
||||
Symbol
|
||||
};
|
||||
|
||||
explicit Referent(JSObject* obj)
|
||||
: kind(Kind::Object), objectTarget(obj), symbolTarget(nullptr) {}
|
||||
explicit Referent(JS::Symbol* sym)
|
||||
: kind(Kind::Symbol), objectTarget(nullptr), symbolTarget(sym) {}
|
||||
|
||||
explicit Referent(JSObject* obj, bool enabled)
|
||||
: kind(Kind::Object)
|
||||
, objectTarget(obj)
|
||||
, symbolTarget(nullptr)
|
||||
, enabled(enabled)
|
||||
{}
|
||||
|
||||
explicit Referent(JS::Symbol* sym, bool enabled)
|
||||
: kind(Kind::Symbol)
|
||||
, objectTarget(nullptr)
|
||||
, symbolTarget(sym)
|
||||
, enabled(enabled)
|
||||
{}
|
||||
|
||||
bool isObject() const { return kind == Kind::Object; }
|
||||
bool isSymbol() const { return kind == Kind::Symbol; }
|
||||
|
||||
Kind kind;
|
||||
WeakRef<JSObject*> objectTarget;
|
||||
WeakRef<JS::Symbol*> symbolTarget;
|
||||
bool enabled;
|
||||
};
|
||||
|
||||
static const Class class_;
|
||||
|
||||
+10
-10
@@ -416,13 +416,13 @@ MapMemoryAt(void* desired, size_t length, int prot = PROT_READ | PROT_WRITE,
|
||||
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
|
||||
|
||||
// Solaris manages 64-bit address space in a different manner from every other
|
||||
// AMD64 operating system, but fortunately the fix is the same one
|
||||
// required for every operating system on 64-bit SPARC, Itanium, and ARM.
|
||||
// AMD64 operating system, but fortunately the fix is the same one
|
||||
// required for every operating system on 64-bit SPARC and ARM.
|
||||
// Most people's intuition failed them here and they thought this couldn't
|
||||
// possibly be correct on AMD64, but for Solaris/illumos it is.
|
||||
|
||||
{
|
||||
#if defined(__ia64__) || defined(__aarch64__) || (defined(__sun) && defined(__x86_64__)) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
|
||||
#if defined(__aarch64__) || (defined(__sun) && defined(__x86_64__)) || (defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
|
||||
MOZ_ASSERT((0xffff800000000000ULL & (uintptr_t(desired) + length - 1)) == 0);
|
||||
#endif
|
||||
void* region = mmap(desired, length, prot, flags, fd, offset);
|
||||
@@ -445,14 +445,14 @@ static inline void*
|
||||
MapMemory(size_t length, int prot = PROT_READ | PROT_WRITE,
|
||||
int flags = MAP_PRIVATE | MAP_ANON, int fd = -1, off_t offset = 0)
|
||||
{
|
||||
#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
|
||||
#if defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__)
|
||||
/*
|
||||
* The JS engine assumes that all allocated pointers have their high 17 bits clear,
|
||||
* which ia64's mmap doesn't support directly. However, we can emulate it by passing
|
||||
* mmap an "addr" parameter with those bits clear. The mmap will return that address,
|
||||
* or the nearest available memory above that address, providing a near-guarantee
|
||||
* that those bits are clear. If they are not, we return nullptr below to indicate
|
||||
* out-of-memory.
|
||||
* which mmap on this platform doesn't support directly. However, we can emulate it
|
||||
* by passing mmap an "addr" parameter with those bits clear. The mmap will return
|
||||
* that address, or the nearest available memory above that address, providing a
|
||||
* near-guarantee that those bits are clear. If they are not, we return nullptr below
|
||||
* to indicate out-of-memory.
|
||||
*
|
||||
* The addr is chosen as 0x0000070000000000, which still allows about 120TB of virtual
|
||||
* address space.
|
||||
@@ -479,7 +479,7 @@ MapMemory(size_t length, int prot = PROT_READ | PROT_WRITE,
|
||||
* different due to the different mmap behavior.
|
||||
*
|
||||
* TODO: Merge with the above code block if this implementation works for
|
||||
* ia64 and sparc64.
|
||||
* sparc64.
|
||||
*/
|
||||
const uintptr_t start = UINT64_C(0x0000070000000000);
|
||||
const uintptr_t end = UINT64_C(0x0000800000000000);
|
||||
|
||||
@@ -494,9 +494,6 @@ OnLeaveBaselineFrame(JSContext* cx, const JitFrameIterator& frame, jsbytecode* p
|
||||
{
|
||||
BaselineFrame* baselineFrame = frame.baselineFrame();
|
||||
if (jit::DebugEpilogue(cx, baselineFrame, pc, frameOk)) {
|
||||
if (!baselineFrame->hasReturnValue()) {
|
||||
baselineFrame->setReturnValue(UndefinedValue());
|
||||
}
|
||||
rfe->kind = ResumeFromException::RESUME_FORCED_RETURN;
|
||||
rfe->framePointer = frame.fp() - BaselineFrame::FramePointerOffset;
|
||||
rfe->stackPointer = reinterpret_cast<uint8_t*>(baselineFrame);
|
||||
|
||||
@@ -320,7 +320,6 @@ size_t AssemblerLOONGARCH64::bytesNeeded() const {
|
||||
|
||||
// write a blob of binary into the instruction stream
|
||||
BufferOffset AssemblerLOONGARCH64::writeInst(uint32_t x, uint32_t* dest) {
|
||||
MOZ_ASSERT(hasCreator());
|
||||
if (dest == nullptr) {
|
||||
return m_buffer.putInt(x);
|
||||
}
|
||||
|
||||
@@ -212,6 +212,8 @@ static constexpr Register WasmTableCallIndexReg = ABINonArgReg3;
|
||||
static constexpr Register WasmIonExitRegCallee = t0;
|
||||
static constexpr Register WasmIonExitRegE0 = a0;
|
||||
static constexpr Register WasmIonExitRegE1 = a1;
|
||||
static constexpr Register WasmIonExitRegReturnData = JSReturnReg_Data;
|
||||
static constexpr Register WasmIonExitRegReturnType = JSReturnReg_Type;
|
||||
static constexpr Register WasmIonExitRegD0 = a0;
|
||||
static constexpr Register WasmIonExitRegD1 = a1;
|
||||
static constexpr Register WasmIonExitRegD2 = t0;
|
||||
|
||||
@@ -1013,8 +1013,8 @@ CodeGeneratorLoongArch64::visitTestI64AndBranch(LTestI64AndBranch* lir)
|
||||
void
|
||||
CodeGeneratorLoongArch64::setReturnDoubleRegs(LiveRegisterSet* regs)
|
||||
{
|
||||
MOZ_ASSERT(ReturnFloat32Reg.reg_ == FloatRegisters::f0);
|
||||
MOZ_ASSERT(ReturnDoubleReg.reg_ == FloatRegisters::f0);
|
||||
MOZ_ASSERT(ReturnFloat32Reg.encoding() == FloatRegisters::f0);
|
||||
MOZ_ASSERT(ReturnDoubleReg.encoding() == FloatRegisters::f0);
|
||||
FloatRegister f1 = { FloatRegisters::f1, FloatRegisters::Single };
|
||||
regs->add(ReturnFloat32Reg);
|
||||
regs->add(f1);
|
||||
|
||||
@@ -2395,7 +2395,7 @@ void MacroAssemblerLOONGARCH64::wasmLoadImpl(const wasm::MemoryAccessDesc& acces
|
||||
Register ptrScratch,
|
||||
AnyRegister output, Register tmp) {
|
||||
uint32_t offset = access.offset();
|
||||
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
|
||||
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
|
||||
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
|
||||
|
||||
// Maybe add the offset.
|
||||
@@ -2442,7 +2442,7 @@ void MacroAssemblerLOONGARCH64::wasmStoreImpl(const wasm::MemoryAccessDesc& acce
|
||||
Register memoryBase, Register ptr,
|
||||
Register ptrScratch, Register tmp) {
|
||||
uint32_t offset = access.offset();
|
||||
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
|
||||
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
|
||||
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
|
||||
|
||||
// Maybe add the offset.
|
||||
@@ -2488,7 +2488,7 @@ void MacroAssemblerLOONGARCH64Compat::wasmLoadI64Impl(
|
||||
const wasm::MemoryAccessDesc& access, Register memoryBase, Register ptr,
|
||||
Register ptrScratch, Register64 output, Register tmp) {
|
||||
uint32_t offset = access.offset();
|
||||
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
|
||||
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
|
||||
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
|
||||
|
||||
// Maybe add the offset.
|
||||
@@ -2534,7 +2534,7 @@ void MacroAssemblerLOONGARCH64Compat::wasmStoreI64Impl(
|
||||
const wasm::MemoryAccessDesc& access, Register64 value, Register memoryBase,
|
||||
Register ptr, Register ptrScratch, Register tmp) {
|
||||
uint32_t offset = access.offset();
|
||||
MOZ_ASSERT(offset < asMasm().wasmMaxOffsetGuardLimit());
|
||||
MOZ_ASSERT(offset < wasm::OffsetGuardLimit);
|
||||
MOZ_ASSERT_IF(offset, ptrScratch != InvalidReg);
|
||||
|
||||
// Maybe add the offset.
|
||||
@@ -2774,12 +2774,13 @@ CodeOffset MacroAssembler::nopPatchableToNearJump() {
|
||||
}
|
||||
|
||||
void MacroAssembler::patchNopToNearJump(uint8_t* jump, uint8_t* target) {
|
||||
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->is<InstNOP>());
|
||||
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->encode() == NopInst);
|
||||
new (jump) InstJump(op_b, JOffImm26(target - jump));
|
||||
}
|
||||
|
||||
void MacroAssembler::patchNearJumpToNop(uint8_t* jump) {
|
||||
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->is<InstJump>());
|
||||
MOZ_ASSERT(reinterpret_cast<Instruction*>(jump)->extractBitField(31, 26) ==
|
||||
(uint32_t)op_b >> 26);
|
||||
new (jump) InstNOP();
|
||||
}
|
||||
|
||||
|
||||
@@ -301,7 +301,7 @@ void unmapPages(void* p, size_t size) { }
|
||||
void*
|
||||
mapMemoryAt(void* desired, size_t length)
|
||||
{
|
||||
#if defined(__ia64__) || defined(__aarch64__) || \
|
||||
#if defined(__aarch64__) || \
|
||||
(defined(__sparc__) && defined(__arch64__) && (defined(__NetBSD__) || defined(__linux__)))
|
||||
MOZ_RELEASE_ASSERT(0xffff800000000000ULL & (uintptr_t(desired) + length - 1) == 0);
|
||||
#endif
|
||||
@@ -324,7 +324,7 @@ mapMemory(size_t length)
|
||||
int fd = -1;
|
||||
off_t offset = 0;
|
||||
// The test code must be aligned with the implementation in gc/Memory.cpp.
|
||||
#if defined(__ia64__) || (defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__))
|
||||
#if defined(__sparc__) && defined(__arch64__) && defined(__NetBSD__)
|
||||
void* region = mmap((void*)0x0000070000000000, length, prot, flags, fd, offset);
|
||||
if (region == MAP_FAILED)
|
||||
return nullptr;
|
||||
|
||||
+6
-3
@@ -999,7 +999,8 @@ class JS_PUBLIC_API(ContextOptions) {
|
||||
strictMode_(false),
|
||||
extraWarnings_(false),
|
||||
arrayProtoValues_(true),
|
||||
streams_(false)
|
||||
streams_(false),
|
||||
weakRefs_(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1139,12 +1140,13 @@ class JS_PUBLIC_API(ContextOptions) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool weakRefs() const { return true; }
|
||||
bool weakRefs() const { return weakRefs_; }
|
||||
ContextOptions& setWeakRefs(bool flag) {
|
||||
(void) flag;
|
||||
weakRefs_ = flag;
|
||||
return *this;
|
||||
}
|
||||
ContextOptions& toggleWeakRefs() {
|
||||
weakRefs_ = !weakRefs_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -1165,6 +1167,7 @@ class JS_PUBLIC_API(ContextOptions) {
|
||||
bool extraWarnings_ : 1;
|
||||
bool arrayProtoValues_ : 1;
|
||||
bool streams_ : 1;
|
||||
bool weakRefs_ : 1;
|
||||
};
|
||||
|
||||
JS_PUBLIC_API(ContextOptions&)
|
||||
|
||||
+4
-5
@@ -312,13 +312,12 @@ cvt_s(SprintfState* ss, const char* s, int width, int prec, int flags)
|
||||
s = generic_null_str(s);
|
||||
|
||||
// Limit string length by precision value
|
||||
size_t slen = strnlen(s, size_t(prec));
|
||||
if (slen > INT_MAX) {
|
||||
return false;
|
||||
}
|
||||
int slen = int(generic_strlen(s));
|
||||
if (0 < prec && prec < slen)
|
||||
slen = prec;
|
||||
|
||||
// and away we go
|
||||
return fill2(ss, s, int(slen), width, flags);
|
||||
return fill2(ss, s, slen, width, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+35
-7
@@ -976,6 +976,12 @@ CanUpperCaseSpecialCasing(Latin1Char charCode)
|
||||
static inline bool
|
||||
CanUpperCaseSpecialCasing(char16_t charCode)
|
||||
{
|
||||
// Update mapping for U+00DF LATIN SMALL LETTER SHARP S inline,
|
||||
// overriding Unicode data files to force the use of
|
||||
// U+1E9E LATIN CAPITAL LETTER SHARP S.
|
||||
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S)
|
||||
return true;
|
||||
|
||||
return unicode::CanUpperCaseSpecialCasing(charCode);
|
||||
}
|
||||
|
||||
@@ -991,6 +997,11 @@ LengthUpperCaseSpecialCasing(Latin1Char charCode)
|
||||
static inline size_t
|
||||
LengthUpperCaseSpecialCasing(char16_t charCode)
|
||||
{
|
||||
// U+00DF LATIN SMALL LETTER SHARP S is uppercased according to ICU or
|
||||
// to U+1E9E LATIN CAPITAL LETTER SHARP S.
|
||||
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S)
|
||||
return 1;
|
||||
|
||||
MOZ_ASSERT(CanUpperCaseSpecialCasing(charCode));
|
||||
|
||||
return unicode::LengthUpperCaseSpecialCasing(charCode);
|
||||
@@ -1010,6 +1021,13 @@ AppendUpperCaseSpecialCasing(char16_t charCode, Latin1Char* elements, size_t* in
|
||||
static inline void
|
||||
AppendUpperCaseSpecialCasing(char16_t charCode, char16_t* elements, size_t* index)
|
||||
{
|
||||
// U+00DF LATIN SMALL LETTER SHARP S is uppercased according to ICU or
|
||||
// to U+1E9E LATIN CAPITAL LETTER SHARP S.
|
||||
if (charCode == unicode::LATIN_SMALL_LETTER_SHARP_S) {
|
||||
elements[(*index)++] = 0x1E9E;
|
||||
return;
|
||||
}
|
||||
|
||||
unicode::AppendUpperCaseSpecialCasing(charCode, elements, index);
|
||||
}
|
||||
|
||||
@@ -1025,6 +1043,7 @@ ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t startIndex,
|
||||
MOZ_ASSERT(srcLength <= destLength);
|
||||
|
||||
size_t j = startIndex;
|
||||
size_t upperLength = srcLength;
|
||||
for (size_t i = startIndex; i < srcLength; i++) {
|
||||
char16_t c = srcChars[i];
|
||||
if (!IsSame<DestChar, Latin1Char>::value) {
|
||||
@@ -1040,9 +1059,10 @@ ToUpperCaseImpl(DestChar* destChars, const SrcChar* srcChars, size_t startIndex,
|
||||
}
|
||||
}
|
||||
|
||||
if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<SrcChar>(c)))) {
|
||||
if (MOZ_UNLIKELY(c > 0x7f && CanUpperCaseSpecialCasing(static_cast<DestChar>(c)))) {
|
||||
// Return if the output buffer is too small.
|
||||
if (srcLength == destLength)
|
||||
upperLength += (LengthUpperCaseSpecialCasing(static_cast<DestChar>(c)) - 1);
|
||||
if (upperLength > destLength)
|
||||
return i;
|
||||
|
||||
AppendUpperCaseSpecialCasing(c, destChars, &j);
|
||||
@@ -1071,14 +1091,18 @@ ToUpperCaseImpl(Latin1Char* destChars, const char16_t* srcChars, size_t startInd
|
||||
|
||||
template <typename CharT>
|
||||
static size_t
|
||||
ToUpperCaseLength(const CharT* chars, size_t startIndex, size_t length)
|
||||
ToUpperCaseLength(const CharT* chars, size_t startIndex, size_t length, bool force16)
|
||||
{
|
||||
size_t upperLength = length;
|
||||
for (size_t i = startIndex; i < length; i++) {
|
||||
char16_t c = chars[i];
|
||||
|
||||
if (c > 0x7f && CanUpperCaseSpecialCasing(static_cast<CharT>(c)))
|
||||
upperLength += LengthUpperCaseSpecialCasing(static_cast<CharT>(c)) - 1;
|
||||
if (c > 0x7f &&
|
||||
(force16 && CanUpperCaseSpecialCasing(c) ||
|
||||
CanUpperCaseSpecialCasing(static_cast<CharT>(c))))
|
||||
upperLength += (force16
|
||||
? LengthUpperCaseSpecialCasing(c)
|
||||
: LengthUpperCaseSpecialCasing(static_cast<CharT>(c))) - 1;
|
||||
}
|
||||
return upperLength;
|
||||
}
|
||||
@@ -1117,7 +1141,7 @@ ToUpperCase(JSContext* cx, const SrcChar* chars, size_t startIndex, size_t lengt
|
||||
|
||||
size_t readChars = ToUpperCaseImpl(buf.get(), chars, startIndex, length, length);
|
||||
if (readChars < length) {
|
||||
size_t actualLength = ToUpperCaseLength(chars, readChars, length);
|
||||
size_t actualLength = ToUpperCaseLength(chars, readChars, length, !IsSame<DestChar, Latin1Char>::value);
|
||||
|
||||
*resultLength = actualLength;
|
||||
DestCharPtr buf2 = ReallocChars(cx, Move(buf), length + 1, actualLength + 1);
|
||||
@@ -1178,7 +1202,8 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
|
||||
//
|
||||
// If the original string is Latin-1, it can -- unless the string
|
||||
// contains U+00B5 MICRO SIGN or U+00FF SMALL LETTER Y WITH DIAERESIS,
|
||||
// the only Latin-1 codepoints that don't uppercase within Latin-1.
|
||||
// the only Latin-1 codepoints that don't uppercase within Latin-1, or
|
||||
// it contains U+00DF LATIN SMALL LETTER SHARP S, which we override.
|
||||
// Search for those codepoints to decide whether the new string can be
|
||||
// Latin-1.
|
||||
// If the original string is a two-byte string, its uppercase form is
|
||||
@@ -1195,6 +1220,9 @@ ToUpperCase(JSContext* cx, JSLinearString* str)
|
||||
MOZ_ASSERT(unicode::ToUpperCase(c) > JSString::MAX_LATIN1_CHAR);
|
||||
resultIsLatin1 = false;
|
||||
break;
|
||||
} else if (c == unicode::LATIN_SMALL_LETTER_SHARP_S) {
|
||||
resultIsLatin1 = false;
|
||||
break;
|
||||
} else {
|
||||
MOZ_ASSERT(unicode::ToUpperCase(c) <= JSString::MAX_LATIN1_CHAR);
|
||||
}
|
||||
|
||||
@@ -839,7 +839,7 @@ wasm::ToggleProfiling(const Code& code, const CallSite& callSite, bool enabled)
|
||||
#elif defined(JS_CODEGEN_LOONGARCH64)
|
||||
uint8_t* caller = callerRetAddr - sizeof(uint32_t);
|
||||
Instruction* callerInsn = reinterpret_cast<Instruction*>(caller);
|
||||
MOZ_ASSERT(callerInsn->extractOpcode() == ((uint32_t)op_bl >> OpcodeShift));
|
||||
MOZ_ASSERT(callerInsn->extractBitField(31, 26) == ((uint32_t)op_bl >> 26));
|
||||
int32_t calleeOffset =
|
||||
int32_t(reinterpret_cast<InstJump*>(callerInsn)->extractImm26Value() << 8) >> 6;
|
||||
void* callee = caller + calleeOffset;
|
||||
|
||||
@@ -1442,6 +1442,7 @@ ReloadPrefsCallback(const char* pref, void* data)
|
||||
bool extraWarnings = Preferences::GetBool(JS_OPTIONS_DOT_STR "strict");
|
||||
|
||||
bool streams = Preferences::GetBool(JS_OPTIONS_DOT_STR "streams");
|
||||
bool weakRefs = Preferences::GetBool(JS_OPTIONS_DOT_STR "weakrefs");
|
||||
|
||||
bool unboxedObjects = Preferences::GetBool(JS_OPTIONS_DOT_STR "unboxed_objects");
|
||||
|
||||
@@ -1468,7 +1469,8 @@ ReloadPrefsCallback(const char* pref, void* data)
|
||||
.setWerror(werror)
|
||||
.setExtraWarnings(extraWarnings)
|
||||
.setArrayProtoValues(arrayProtoValues)
|
||||
.setStreams(streams);
|
||||
.setStreams(streams)
|
||||
.setWeakRefs(weakRefs);
|
||||
|
||||
JS_SetParallelParsingEnabled(cx, parallelParsing);
|
||||
JS_SetOffthreadIonCompilationEnabled(cx, offthreadIonCompilation);
|
||||
|
||||
@@ -411,13 +411,6 @@ DottedCornerFinder::FindBestOverlap(Float aMinR, Float aMinBorderRadius,
|
||||
mCount = mMaxCount;
|
||||
break;
|
||||
}
|
||||
// GetCountAndLastOverlap() failed without writing |count| and
|
||||
// |actualOverlap|: the walk needed more than mMaxCount circles, i.e.
|
||||
// this overlap produces too many circles. Narrow the search toward
|
||||
// smaller overlaps.
|
||||
upper = overlap;
|
||||
overlap = (upper + lower) / 2.0f;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (j == 0) {
|
||||
|
||||
@@ -318,11 +318,7 @@ nsHTMLFramesetFrame::Init(nsIContent* aContent,
|
||||
mChildFrameborder[mChildCount] = GetFrameBorder(child);
|
||||
mChildBorderColors[mChildCount].Set(GetBorderColor(child));
|
||||
}
|
||||
if (MOZ_LIKELY(!child->GetPrimaryFrame())) {
|
||||
// Child might have a pre-existing primary frame if we're doing fixed-pos
|
||||
// replication... So, only set it if there is no primary frame yet.
|
||||
child->SetPrimaryFrame(frame);
|
||||
}
|
||||
child->SetPrimaryFrame(frame);
|
||||
|
||||
mFrames.AppendFrame(nullptr, frame);
|
||||
|
||||
|
||||
@@ -318,7 +318,7 @@ nsCaseTransformTextRunFactory::TransformString(
|
||||
// in the output string
|
||||
uint32_t irishMarkSrc = uint32_t(-1); // corresponding location in source
|
||||
// string (may differ from output due to
|
||||
// expansions like eszet -> 'SS')
|
||||
// expansions)
|
||||
|
||||
for (uint32_t i = 0; i < length; ++i, ++aOffsetInTextRun) {
|
||||
uint32_t ch = str[i];
|
||||
@@ -604,6 +604,13 @@ nsCaseTransformTextRunFactory::TransformString(
|
||||
// to check for special uppercase (ß)
|
||||
}
|
||||
|
||||
// Updated mapping for Germen eszett, not currently reflected in the
|
||||
// Unicode data files.
|
||||
if (ch == 0x00DF) {
|
||||
ch = 0x1E9E;
|
||||
break;
|
||||
}
|
||||
|
||||
mcm = mozilla::unicode::SpecialUpper(ch);
|
||||
if (mcm) {
|
||||
int j = 0;
|
||||
@@ -658,6 +665,12 @@ nsCaseTransformTextRunFactory::TransformString(
|
||||
}
|
||||
}
|
||||
|
||||
// Updated mapping for Germen eszett as a capital letter.
|
||||
if (ch == 0x00DF) {
|
||||
ch = 0x1E9E;
|
||||
break;
|
||||
}
|
||||
|
||||
mcm = mozilla::unicode::SpecialTitle(ch);
|
||||
if (mcm) {
|
||||
int j = 0;
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
*/
|
||||
|
||||
#ifndef SYSV
|
||||
#if defined( hpux ) || defined(XP_SOLARIS) || defined ( sgi ) || defined( SVR4 )
|
||||
#if defined(XP_SOLARIS) || defined ( sgi ) || defined( SVR4 )
|
||||
#define SYSV
|
||||
#endif
|
||||
#endif
|
||||
@@ -82,7 +82,7 @@
|
||||
/*
|
||||
* System V has socket options in filio.h
|
||||
*/
|
||||
#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( hpux ) && !defined( AIX )
|
||||
#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( AIX )
|
||||
#define NEED_FILIO
|
||||
#endif
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
* for select()
|
||||
*/
|
||||
#if !defined(WINSOCK) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
|
||||
#if defined(hpux) || defined(LINUX) || defined(SUNOS4) || defined(XP_BEOS)
|
||||
#if defined(LINUX) || defined(SUNOS4) || defined(XP_BEOS)
|
||||
#include <sys/time.h>
|
||||
#else
|
||||
#include <sys/select.h>
|
||||
@@ -190,7 +190,7 @@
|
||||
* is necessary on some buggy UNIXes.
|
||||
*/
|
||||
#if !defined(NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED) && \
|
||||
( defined(AIX) || defined(IRIX) || defined(HPUX) || defined(SUNOS4) \
|
||||
( defined(AIX) || defined(IRIX) || defined(SUNOS4) \
|
||||
|| defined(XP_SOLARIS) || defined(OSF1) ||defined(freebsd))
|
||||
#define NSLDAPI_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
#endif
|
||||
@@ -208,7 +208,7 @@
|
||||
/*
|
||||
* toupper and tolower macros are different under bsd and sys v
|
||||
*/
|
||||
#if defined( SYSV ) && !defined( hpux )
|
||||
#if defined( SYSV )
|
||||
#define TOUPPER(c) (isascii(c) && islower(c) ? _toupper(c) : c)
|
||||
#define TOLOWER(c) (isascii(c) && isupper(c) ? _tolower(c) : c)
|
||||
#else
|
||||
@@ -236,7 +236,7 @@
|
||||
#define SETFLAGS( tio, flags ) (tio).c_lflag = (flags)
|
||||
#endif
|
||||
|
||||
#if ( !defined( HPUX9 )) && ( !defined( sunos4 )) && ( !defined( SNI )) && \
|
||||
#if ( !defined( sunos4 )) && ( !defined( SNI )) && \
|
||||
( !defined( HAVE_TIME_R ))
|
||||
#define HAVE_TIME_R
|
||||
#endif
|
||||
@@ -267,10 +267,9 @@ int strncasecmp(const char *, const char *, size_t);
|
||||
#define NSLDAPI_NETDB_BUF_SIZE 1024
|
||||
#endif
|
||||
|
||||
#if defined(sgi) || defined(HPUX9) || defined(SCOOS) || \
|
||||
#if defined(sgi) || defined(SCOOS) || \
|
||||
defined(UNIXWARE) || defined(SUNOS4) || defined(SNI) || defined(BSDI) || \
|
||||
defined(NCR) || defined(OSF1) || defined(NEC) || defined(VMS) || \
|
||||
( defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) || \
|
||||
defined(UnixWare) || defined(NETBSD) || \
|
||||
defined(FREEBSD) || defined(OPENBSD) || \
|
||||
(defined(LINUX) && __GLIBC__ < 2) || \
|
||||
@@ -286,9 +285,6 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
|
||||
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) \
|
||||
(memset (&b, 0, l), gethostbyname_r (n, r, &b) ? NULL : r)
|
||||
#elif defined(HPUX10)
|
||||
#define GETHOSTBYNAME_BUF_T struct hostent_data
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) nsldapi_compat_gethostbyname_r( n, r, (char *)&b, l, e )
|
||||
#elif defined(LINUX) || defined(DRAGONFLY)
|
||||
typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
|
||||
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
||||
@@ -299,17 +295,15 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
|
||||
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname_r( n, r, b, l, e )
|
||||
#endif
|
||||
#if defined(HPUX9) || defined(LINUX1_2) || defined(LINUX2_0) || \
|
||||
#if defined(LINUX1_2) || defined(LINUX2_0) || \
|
||||
defined(LINUX2_1) || defined(SUNOS4) || defined(SNI) || \
|
||||
defined(SCOOS) || defined(BSDI) || defined(NCR) || \
|
||||
defined(NEC) || ( defined(HPUX10) && !defined(_REENTRANT)) || \
|
||||
defined(NEC) || \
|
||||
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
|
||||
#define NSLDAPI_CTIME( c, b, l ) ctime( c )
|
||||
#elif defined(HPUX10) && defined(_REENTRANT) && !defined(HPUX11)
|
||||
#define NSLDAPI_CTIME( c, b, l ) nsldapi_compat_ctime_r( c, b, l )
|
||||
#elif defined( IRIX6_2 ) || defined( IRIX6_3 ) || defined(UNIXWARE) \
|
||||
|| defined(OSF1V4) || defined(AIX) || defined(UnixWare) \
|
||||
|| defined(hpux) || defined(HPUX11) || defined(NETBSD) \
|
||||
|| defined(NETBSD) \
|
||||
|| defined(IRIX6) || defined(FREEBSD) || defined(VMS) \
|
||||
|| defined(NTO) || defined(OPENBSD) || defined(DRAGONFLY)
|
||||
#define NSLDAPI_CTIME( c, b, l ) ctime_r( c, b )
|
||||
@@ -318,7 +312,7 @@ typedef char GETHOSTBYNAME_buf_t [NSLDAPI_NETDB_BUF_SIZE];
|
||||
#else
|
||||
#define NSLDAPI_CTIME( c, b, l ) ctime_r( c, b, l )
|
||||
#endif
|
||||
#if defined(hpux9) || defined(SUNOS4) || defined(SNI) || \
|
||||
#if defined(SUNOS4) || defined(SNI) || \
|
||||
defined(SCOOS) || defined(BSDI) || defined(NCR) || defined(VMS) || \
|
||||
defined(NEC) || (defined(LINUX) && __GNU_LIBRARY__ != 6) || \
|
||||
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
|
||||
@@ -366,7 +360,7 @@ extern char *strdup();
|
||||
/*
|
||||
* Define a portable type for IPv4 style Internet addresses (32 bits):
|
||||
*/
|
||||
#if defined(_IN_ADDR_T) || defined(aix) || defined(HPUX11) || defined(OSF1)
|
||||
#if defined(_IN_ADDR_T) || defined(aix) || defined(OSF1)
|
||||
typedef in_addr_t nsldapi_in_addr_t;
|
||||
#else
|
||||
typedef nsldapi_uint_32 nsldapi_in_addr_t;
|
||||
@@ -452,7 +446,7 @@ int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
||||
#define NSLDAPI_FOPEN( filename, mode ) fopen( filename, mode )
|
||||
#endif
|
||||
|
||||
#if defined(LINUX) || defined(AIX) || defined(HPUX) || defined(_WINDOWS)
|
||||
#if defined(LINUX) || defined(AIX) || defined(_WINDOWS)
|
||||
size_t nsldapi_compat_strlcpy(char *dst, const char *src, size_t len);
|
||||
#define STRLCPY nsldapi_compat_strlcpy
|
||||
#else
|
||||
|
||||
@@ -51,39 +51,7 @@ static char copyright[] = "@(#) Copyright (c) 1994 The Regents of the University
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
#if defined( HPUX10 ) && defined( _REENTRANT ) && !defined(HPUX11)
|
||||
extern int h_errno;
|
||||
|
||||
struct hostent *
|
||||
nsldapi_compat_gethostbyname_r( const char *name, struct hostent *result,
|
||||
char *buffer, int buflen, int *h_errnop )
|
||||
{
|
||||
struct hostent_data *hep;
|
||||
|
||||
if ( buflen < sizeof(struct hostent_data)) { /* sanity check */
|
||||
*h_errnop = NO_RECOVERY; /* XXX best error code to use? */
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
hep = (struct hostent_data *)buffer;
|
||||
hep->current = NULL;
|
||||
|
||||
if ( gethostbyname_r( name, result, hep ) == -1) {
|
||||
*h_errnop = h_errno; /* XXX don't see anywhere else to get this */
|
||||
return NULL;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
char *
|
||||
nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen )
|
||||
{
|
||||
NSLDAPI_CTIME1( clock, buf, buflen );
|
||||
return buf;
|
||||
}
|
||||
#endif /* HPUX10 && _REENTRANT && !HPUX11 */
|
||||
|
||||
#if defined(LINUX) || defined(AIX) || defined(HPUX) || defined(_WINDOWS)
|
||||
#if defined(LINUX) || defined(AIX) || defined(_WINDOWS)
|
||||
/*
|
||||
* Copies src to the dstsize buffer at dst. The copy will never
|
||||
* overflow the destination buffer and the buffer will always be null
|
||||
|
||||
@@ -43,9 +43,6 @@
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef hpux
|
||||
#include <strings.h>
|
||||
#endif /* hpux */
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# define FD_SETSIZE 256 /* number of connections we support */
|
||||
@@ -62,9 +59,9 @@
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
# include <netdb.h>
|
||||
#if !defined(hpux) && !defined(SUNOS4) && !defined(XP_BEOS)
|
||||
#if !defined(SUNOS4) && !defined(XP_BEOS)
|
||||
# include <sys/select.h>
|
||||
#endif /* !defined(hpux) and others */
|
||||
#endif /* !defined(SUNOS4) and others */
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
#if defined(IRIX)
|
||||
@@ -818,12 +815,6 @@ void nsldapi_hex_unescape( char *s );
|
||||
/*
|
||||
* in compat.c
|
||||
*/
|
||||
#ifdef hpux
|
||||
char *nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen );
|
||||
struct hostent *nsldapi_compat_gethostbyname_r( const char *name,
|
||||
struct hostent *result, char *buffer, int buflen, int *h_errnop );
|
||||
#endif /* hpux */
|
||||
|
||||
/*
|
||||
* in control.c
|
||||
*/
|
||||
|
||||
@@ -1259,17 +1259,10 @@ nsldapi_iostatus_poll( LDAP *ld, struct timeval *timeout )
|
||||
iosp->ios_status.ios_osinfo.ossi_use_writefds
|
||||
= iosp->ios_status.ios_osinfo.ossi_writefds;
|
||||
|
||||
#ifdef HPUX9
|
||||
rc = NSLDAPI_SELECT( nsldapi_get_select_table_size(),
|
||||
(int *)&iosp->ios_status.ios_osinfo.ossi_use_readfds
|
||||
(int *)&iosp->ios_status.ios_osinfo.ossi_use_writefds,
|
||||
NULL, timeout );
|
||||
#else
|
||||
rc = NSLDAPI_SELECT( nsldapi_get_select_table_size(),
|
||||
&iosp->ios_status.ios_osinfo.ossi_use_readfds,
|
||||
&iosp->ios_status.ios_osinfo.ossi_use_writefds,
|
||||
NULL, timeout );
|
||||
#endif /* else HPUX9 */
|
||||
#endif /* else NSLDAPI_HAVE_POLL */
|
||||
#endif /* NSLDAPI_AVOID_OS_SOCKETS */
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ struct prldap_errormap_entry {
|
||||
#define EOVERFLOW -1
|
||||
#endif
|
||||
|
||||
#if defined(__hpux) || defined(_AIX) || defined(OSF1) || defined(DARWIN) || \
|
||||
#if defined(_AIX) || defined(OSF1) || defined(DARWIN) || \
|
||||
defined(BEOS) || defined(FREEBSD) || defined(BSDI) || defined(VMS) || \
|
||||
defined(OPENBSD) || defined(NETBSD)
|
||||
#define EDEADLOCK -1
|
||||
|
||||
@@ -3964,9 +3964,9 @@ nsMsgDBView::FnSortIdUint32(const void *pItem1, const void *pItem2, void *privat
|
||||
|
||||
|
||||
// XXX are these still correct?
|
||||
//To compensate for memory alignment required for
|
||||
//systems such as HP-UX these values must be 4 bytes
|
||||
//aligned. Don't break this when modify the constants
|
||||
// To compensate for memory alignment required by strict-alignment systems,
|
||||
// these values must be 4 bytes aligned. Don't break this when modifying
|
||||
// the constants.
|
||||
const int kMaxSubjectKey = 160;
|
||||
const int kMaxLocationKey = 160; // also used for account
|
||||
const int kMaxAuthorKey = 160;
|
||||
@@ -4804,8 +4804,8 @@ NS_IMETHODIMP nsMsgDBView::Sort(nsMsgViewSortTypeValue sortType,
|
||||
info->folder = folders ? folders->ObjectAt(numSoFar) : m_folder.get();
|
||||
|
||||
memcpy(info->key, keyValue, actualFieldLen);
|
||||
//In order to align memory for systems that require it, such as HP-UX
|
||||
//calculate the correct value to pad the actualFieldLen value
|
||||
// In order to align memory for systems that require it, calculate the
|
||||
// correct value to pad the actualFieldLen value.
|
||||
const uint32_t align = sizeof(IdKey) - sizeof(IdUint32) - 1;
|
||||
actualFieldLen = (actualFieldLen + align) & ~align;
|
||||
|
||||
|
||||
@@ -0,0 +1,417 @@
|
||||
/* filter_lsx_intrinsics.c - LSX optimized filter functions
|
||||
*
|
||||
* Copyright (c) 2021 Loongson Technology Corporation Limited
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2018 Cosmin Truta
|
||||
* Copyright (c) 2016 Glenn Randers-Pehrson
|
||||
* Contributed by Jin Bo (jinbo@loongson.cn)
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "../pngpriv.h"
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
|
||||
#if PNG_LOONGARCH_LSX_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */
|
||||
|
||||
#include <lsxintrin.h>
|
||||
|
||||
#define LSX_LD(psrc) __lsx_vld((psrc), 0)
|
||||
|
||||
#define LSX_LD_2(psrc, stride, out0, out1) \
|
||||
{ \
|
||||
out0 = LSX_LD(psrc); \
|
||||
out1 = LSX_LD(psrc + stride); \
|
||||
}
|
||||
|
||||
#define LSX_LD_4(psrc, stride, out0, out1, out2, out3) \
|
||||
{ \
|
||||
LSX_LD_2(psrc, stride, out0, out1); \
|
||||
LSX_LD_2(psrc + stride * 2, stride, out2, out3); \
|
||||
}
|
||||
|
||||
#define LSX_ST(in, pdst) __lsx_vst(in, (pdst), 0)
|
||||
|
||||
#define LSX_ST_2(in0, in1, pdst, stride) \
|
||||
{ \
|
||||
LSX_ST(in0, pdst); \
|
||||
LSX_ST(in1, pdst + stride); \
|
||||
}
|
||||
|
||||
#define LSX_ST_4(in0, in1, in2, in3, pdst, stride) \
|
||||
{ \
|
||||
LSX_ST_2(in0, in1, pdst, stride); \
|
||||
LSX_ST_2(in2, in3, pdst + stride * 2, stride); \
|
||||
}
|
||||
|
||||
#define LSX_ADD_B(in0, in1, out0) \
|
||||
{ \
|
||||
out0 = __lsx_vadd_b(in0, in1); \
|
||||
}
|
||||
|
||||
#define LSX_ADD_B_2(in0, in1, in2, in3, out0, out1) \
|
||||
{ \
|
||||
LSX_ADD_B(in0, in1, out0); \
|
||||
LSX_ADD_B(in2, in3, out1); \
|
||||
}
|
||||
|
||||
#define LSX_ADD_B_4(in0, in1, in2, in3, in4, in5, \
|
||||
in6, in7, out0, out1, out2, out3) \
|
||||
{ \
|
||||
LSX_ADD_B_2(in0, in1, in2, in3, out0, out1); \
|
||||
LSX_ADD_B_2(in4, in5, in6, in7, out2, out3); \
|
||||
}
|
||||
|
||||
#define LSX_ABS_B_3(in0, in1, in2, out0, out1, out2) \
|
||||
{ \
|
||||
out0 = __lsx_vadda_h(in0, zero); \
|
||||
out1 = __lsx_vadda_h(in1, zero); \
|
||||
out2 = __lsx_vadda_h(in2, zero); \
|
||||
}
|
||||
|
||||
#define LSX_ILVL_B(in_h, in_l, out0) \
|
||||
{ \
|
||||
out0 = __lsx_vilvl_b(in_h, in_l); \
|
||||
}
|
||||
|
||||
#define LSX_ILVL_B_2(in0_h, in0_l, in1_h, in1_l, out0, out1) \
|
||||
{ \
|
||||
LSX_ILVL_B(in0_h, in0_l, out0); \
|
||||
LSX_ILVL_B(in1_h, in1_l, out1); \
|
||||
}
|
||||
|
||||
#define LSX_HSUB_HU_BU_2(in0, in1, out0, out1) \
|
||||
{ \
|
||||
out0 = __lsx_vhsubw_hu_bu(in0, in0); \
|
||||
out1 = __lsx_vhsubw_hu_bu(in1, in1); \
|
||||
}
|
||||
|
||||
#define LSX_CMP_PICK_SMALLER(in0, in1, in2, in3, in4, in5, out0) \
|
||||
{ \
|
||||
__m128i _cmph, _cmpb, _in0, _in3; \
|
||||
_cmph = __lsx_vslt_h(in1, in0); \
|
||||
_cmpb = __lsx_vpickev_b(_cmph, _cmph); \
|
||||
_in0 = __lsx_vmin_bu(in0,in1); \
|
||||
_in3 = __lsx_vbitsel_v(in3, in4, _cmpb); \
|
||||
_cmph = __lsx_vslt_h(in2, _in0); \
|
||||
_cmpb = __lsx_vpickev_b(_cmph, _cmph); \
|
||||
_in3 = __lsx_vbitsel_v(_in3, in5, _cmpb); \
|
||||
out0 = __lsx_vadd_b(out0, _in3); \
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_up_lsx(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
png_bytep rp = row;
|
||||
png_const_bytep pp = prev_row;
|
||||
__m128i vec_0, vec_1, vec_2, vec_3;
|
||||
__m128i vec_4, vec_5, vec_6, vec_7;
|
||||
|
||||
while (n >= 64)
|
||||
{
|
||||
LSX_LD_4(rp, 16, vec_0, vec_1, vec_2, vec_3);
|
||||
LSX_LD_4(pp, 16, vec_4, vec_5, vec_6, vec_7);
|
||||
pp += 64;
|
||||
LSX_ADD_B_4(vec_0 ,vec_4, vec_1, vec_5, vec_2, vec_6,
|
||||
vec_3, vec_7, vec_0, vec_1, vec_2, vec_3);
|
||||
LSX_ST_4(vec_0, vec_1, vec_2, vec_3, rp, 16);
|
||||
rp += 64;
|
||||
n -= 64;
|
||||
}
|
||||
if (n & 63)
|
||||
{
|
||||
if (n >= 32)
|
||||
{
|
||||
LSX_LD_2(rp, 16, vec_0, vec_1);
|
||||
LSX_LD_2(pp, 16, vec_2, vec_3);
|
||||
pp += 32;
|
||||
LSX_ADD_B_2(vec_0, vec_2, vec_1, vec_3, vec_0, vec_1);
|
||||
LSX_ST_2(vec_0, vec_1, rp, 16);
|
||||
rp += 32;
|
||||
n -= 32;
|
||||
}
|
||||
if (n & 31)
|
||||
{
|
||||
if (n >= 16)
|
||||
{
|
||||
vec_0 = LSX_LD(rp);
|
||||
vec_1 = LSX_LD(pp);
|
||||
pp += 16;
|
||||
LSX_ADD_B(vec_0, vec_1, vec_0);
|
||||
LSX_ST(vec_0, rp);
|
||||
rp += 16;
|
||||
n -= 16;
|
||||
}
|
||||
if (n >= 8)
|
||||
{
|
||||
vec_0 = __lsx_vldrepl_d(rp, 0);
|
||||
vec_1 = __lsx_vldrepl_d(pp, 0);
|
||||
vec_0 = __lsx_vadd_b(vec_0, vec_1);
|
||||
__lsx_vstelm_d(vec_0, rp, 0, 0);
|
||||
rp += 8;
|
||||
pp += 8;
|
||||
n -= 8;
|
||||
}
|
||||
while (n--)
|
||||
{
|
||||
*rp = *rp + *pp++;
|
||||
rp++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_sub3_lsx(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
png_uint_32 tmp;
|
||||
png_bytep nxt = row;
|
||||
__m128i vec_0, vec_1;
|
||||
|
||||
PNG_UNUSED(prev_row);
|
||||
|
||||
vec_0 = __lsx_vldrepl_w(nxt, 0);
|
||||
nxt += 3;
|
||||
n -= 3;
|
||||
|
||||
while (n >= 3)
|
||||
{
|
||||
vec_1 = __lsx_vldrepl_w(nxt, 0);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
__lsx_vstelm_h(vec_1, nxt, 0, 0);
|
||||
vec_0 = vec_1;
|
||||
nxt += 2;
|
||||
__lsx_vstelm_b(vec_1, nxt, 0, 2);
|
||||
nxt += 1;
|
||||
n -= 3;
|
||||
}
|
||||
|
||||
row = nxt - 3;
|
||||
while (n--)
|
||||
{
|
||||
*nxt = *nxt + *row++;
|
||||
nxt++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_sub4_lsx(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
__m128i vec_0, vec_1;
|
||||
|
||||
PNG_UNUSED(prev_row);
|
||||
|
||||
vec_0 = __lsx_vldrepl_w(row, 0);
|
||||
row += 4;
|
||||
n -= 4;
|
||||
|
||||
while (n >= 4)
|
||||
{
|
||||
vec_1 = __lsx_vldrepl_w(row, 0);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
__lsx_vstelm_w(vec_1, row, 0, 0);
|
||||
vec_0 = vec_1;
|
||||
row += 4;
|
||||
n -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_avg3_lsx(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
png_bytep nxt = row;
|
||||
png_const_bytep prev_nxt = prev_row;
|
||||
__m128i vec_0, vec_1, vec_2;
|
||||
|
||||
vec_0 = __lsx_vldrepl_w(nxt, 0);
|
||||
vec_1 = __lsx_vldrepl_w(prev_nxt, 0);
|
||||
prev_nxt += 3;
|
||||
vec_1 = __lsx_vsrli_b(vec_1, 1);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
__lsx_vstelm_h(vec_1, nxt, 0, 0);
|
||||
nxt += 2;
|
||||
__lsx_vstelm_b(vec_1, nxt, 0, 2);
|
||||
nxt += 1;
|
||||
n -= 3;
|
||||
|
||||
while (n >= 3)
|
||||
{
|
||||
vec_2 = vec_1;
|
||||
vec_0 = __lsx_vldrepl_w(nxt, 0);
|
||||
vec_1 = __lsx_vldrepl_w(prev_nxt, 0);
|
||||
prev_nxt += 3;
|
||||
|
||||
vec_1 = __lsx_vavg_bu(vec_1, vec_2);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
|
||||
__lsx_vstelm_h(vec_1, nxt, 0, 0);
|
||||
nxt += 2;
|
||||
__lsx_vstelm_b(vec_1, nxt, 0, 2);
|
||||
nxt += 1;
|
||||
n -= 3;
|
||||
}
|
||||
|
||||
row = nxt - 3;
|
||||
while (n--)
|
||||
{
|
||||
vec_2 = __lsx_vldrepl_b(row, 0);
|
||||
row++;
|
||||
vec_0 = __lsx_vldrepl_b(nxt, 0);
|
||||
vec_1 = __lsx_vldrepl_b(prev_nxt, 0);
|
||||
prev_nxt++;
|
||||
|
||||
vec_1 = __lsx_vavg_bu(vec_1, vec_2);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
|
||||
__lsx_vstelm_b(vec_1, nxt, 0, 0);
|
||||
nxt++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_avg4_lsx(png_row_infop row_info, png_bytep row,
|
||||
png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
__m128i vec_0, vec_1, vec_2;
|
||||
|
||||
vec_0 = __lsx_vldrepl_w(row, 0);
|
||||
vec_1 = __lsx_vldrepl_w(prev_row, 0);
|
||||
prev_row += 4;
|
||||
vec_1 = __lsx_vsrli_b(vec_1, 1);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
__lsx_vstelm_w(vec_1, row, 0, 0);
|
||||
row += 4;
|
||||
n -= 4;
|
||||
|
||||
while (n >= 4)
|
||||
{
|
||||
vec_2 = vec_1;
|
||||
vec_0 = __lsx_vldrepl_w(row, 0);
|
||||
vec_1 = __lsx_vldrepl_w(prev_row, 0);
|
||||
prev_row += 4;
|
||||
|
||||
vec_1 = __lsx_vavg_bu(vec_1, vec_2);
|
||||
vec_1 = __lsx_vadd_b(vec_1, vec_0);
|
||||
|
||||
__lsx_vstelm_w(vec_1, row, 0, 0);
|
||||
row += 4;
|
||||
n -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_paeth3_lsx(png_row_infop row_info,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
png_bytep nxt = row;
|
||||
png_const_bytep prev_nxt = prev_row;
|
||||
__m128i vec_a, vec_b, vec_c, vec_d;
|
||||
__m128i vec_pa, vec_pb, vec_pc;
|
||||
__m128i zero = {0};
|
||||
|
||||
vec_a = __lsx_vldrepl_w(nxt, 0);
|
||||
vec_b = __lsx_vldrepl_w(prev_nxt, 0);
|
||||
prev_nxt += 3;
|
||||
vec_d = __lsx_vadd_b(vec_a, vec_b);
|
||||
__lsx_vstelm_h(vec_d, nxt, 0, 0);
|
||||
nxt += 2;
|
||||
__lsx_vstelm_b(vec_d, nxt, 0, 2);
|
||||
nxt += 1;
|
||||
n -= 3;
|
||||
|
||||
while (n >= 3)
|
||||
{
|
||||
vec_a = vec_d;
|
||||
vec_c = vec_b;
|
||||
vec_b = __lsx_vldrepl_w(prev_nxt, 0);
|
||||
prev_nxt += 3;
|
||||
vec_d = __lsx_vldrepl_w(nxt, 0);
|
||||
|
||||
LSX_ILVL_B_2(vec_b, vec_c, vec_a, vec_c, vec_pa, vec_pb);
|
||||
LSX_HSUB_HU_BU_2(vec_pa, vec_pb, vec_pa, vec_pb);
|
||||
vec_pc = __lsx_vadd_h(vec_pa, vec_pb);
|
||||
LSX_ABS_B_3(vec_pa, vec_pb, vec_pc, vec_pa, vec_pb, vec_pc);
|
||||
LSX_CMP_PICK_SMALLER(vec_pa, vec_pb, vec_pc, vec_a, vec_b, vec_c, vec_d);
|
||||
|
||||
__lsx_vstelm_h(vec_d, nxt, 0, 0);
|
||||
nxt += 2;
|
||||
__lsx_vstelm_b(vec_d, nxt, 0, 2);
|
||||
nxt += 1;
|
||||
n -= 3;
|
||||
}
|
||||
|
||||
prev_row = prev_nxt - 3;
|
||||
row = nxt - 3;
|
||||
while (n--)
|
||||
{
|
||||
vec_a = __lsx_vldrepl_b(row, 0);
|
||||
row++;
|
||||
vec_b = __lsx_vldrepl_b(prev_nxt, 0);
|
||||
prev_nxt++;
|
||||
vec_c = __lsx_vldrepl_b(prev_row, 0);
|
||||
prev_row++;
|
||||
vec_d = __lsx_vldrepl_b(nxt, 0);
|
||||
|
||||
LSX_ILVL_B_2(vec_b, vec_c, vec_a, vec_c, vec_pa, vec_pb);
|
||||
LSX_HSUB_HU_BU_2(vec_pa, vec_pb, vec_pa, vec_pb);
|
||||
vec_pc = __lsx_vadd_h(vec_pa, vec_pb);
|
||||
LSX_ABS_B_3(vec_pa, vec_pb, vec_pc, vec_pa, vec_pb, vec_pc);
|
||||
LSX_CMP_PICK_SMALLER(vec_pa, vec_pb, vec_pc, vec_a, vec_b, vec_c, vec_d);
|
||||
|
||||
__lsx_vstelm_b(vec_d, nxt, 0, 0);
|
||||
nxt++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
png_read_filter_row_paeth4_lsx(png_row_infop row_info,
|
||||
png_bytep row, png_const_bytep prev_row)
|
||||
{
|
||||
size_t n = row_info->rowbytes;
|
||||
__m128i vec_a, vec_b, vec_c, vec_d;
|
||||
__m128i vec_pa, vec_pb, vec_pc;
|
||||
__m128i zero = {0};
|
||||
|
||||
vec_a = __lsx_vldrepl_w(row, 0);
|
||||
vec_b = __lsx_vldrepl_w(prev_row, 0);
|
||||
prev_row += 4;
|
||||
vec_d = __lsx_vadd_b(vec_a, vec_b);
|
||||
__lsx_vstelm_w(vec_d, row, 0, 0);
|
||||
row += 4;
|
||||
n -= 4;
|
||||
|
||||
while (n >= 4)
|
||||
{
|
||||
vec_a = vec_d;
|
||||
vec_c = vec_b;
|
||||
vec_b = __lsx_vldrepl_w(prev_row, 0);
|
||||
prev_row += 4;
|
||||
vec_d = __lsx_vldrepl_w(row, 0);
|
||||
|
||||
LSX_ILVL_B_2(vec_b, vec_c, vec_a, vec_c, vec_pa, vec_pb);
|
||||
LSX_HSUB_HU_BU_2(vec_pa, vec_pb, vec_pa, vec_pb);
|
||||
vec_pc = __lsx_vadd_h(vec_pa, vec_pb);
|
||||
LSX_ABS_B_3(vec_pa, vec_pb, vec_pc, vec_pa, vec_pb, vec_pc);
|
||||
LSX_CMP_PICK_SMALLER(vec_pa, vec_pb, vec_pc, vec_a, vec_b, vec_c, vec_d);
|
||||
|
||||
__lsx_vstelm_w(vec_d, row, 0, 0);
|
||||
row += 4;
|
||||
n -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* PNG_LOONGARCH_LSX_IMPLEMENTATION == 1 (intrinsics) */
|
||||
#endif /* PNG_READ_SUPPORTED */
|
||||
@@ -0,0 +1,66 @@
|
||||
/* loongarch_lsx_init.c - LSX optimized filter functions
|
||||
*
|
||||
* Copyright (c) 2021 Loongson Technology Corporation Limited
|
||||
* All rights reserved.
|
||||
* Contributed by Jin Bo <jinbo@loongson.cn>
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*/
|
||||
|
||||
#include "../pngpriv.h"
|
||||
|
||||
#ifdef PNG_READ_SUPPORTED
|
||||
#if PNG_LOONGARCH_LSX_IMPLEMENTATION == 1
|
||||
|
||||
#include <sys/auxv.h>
|
||||
|
||||
#define LA_HWCAP_LSX (1<<4)
|
||||
static int
|
||||
png_has_lsx(void)
|
||||
{
|
||||
int flags = 0;
|
||||
int flag = (int)getauxval(AT_HWCAP);
|
||||
|
||||
if (flag & LA_HWCAP_LSX)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
png_init_filter_functions_lsx(png_structp pp, unsigned int bpp)
|
||||
{
|
||||
/* IMPORTANT: any new external functions used here must be declared using
|
||||
* PNG_INTERNAL_FUNCTION in ../pngpriv.h. This is required so that the
|
||||
* 'prefix' option to configure works:
|
||||
*
|
||||
* ./configure --with-libpng-prefix=foobar_
|
||||
*
|
||||
* Verify you have got this right by running the above command, doing a build
|
||||
* and examining pngprefix.h; it must contain a #define for every external
|
||||
* function you add. (Notice that this happens automatically for the
|
||||
* initialization function.)
|
||||
*/
|
||||
|
||||
if (png_has_lsx())
|
||||
{
|
||||
pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_lsx;
|
||||
if (bpp == 3)
|
||||
{
|
||||
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_lsx;
|
||||
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_lsx;
|
||||
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth3_lsx;
|
||||
}
|
||||
else if (bpp == 4)
|
||||
{
|
||||
pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_lsx;
|
||||
pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_lsx;
|
||||
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth4_lsx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* PNG_LOONGARCH_LSX_IMPLEMENTATION == 1 */
|
||||
#endif /* PNG_READ_SUPPORTED */
|
||||
+10
-1
@@ -26,7 +26,7 @@ SOURCES += [
|
||||
'pngwutil.c'
|
||||
]
|
||||
|
||||
if CONFIG['CPU_ARCH'] == 'arm':
|
||||
if CONFIG['CPU_ARCH'] in ('arm','aarch64'):
|
||||
DEFINES['MOZ_PNG_USE_ARM_NEON'] = True
|
||||
SOURCES += [
|
||||
'arm/arm_init.c',
|
||||
@@ -45,6 +45,15 @@ if CONFIG['INTEL_ARCHITECTURE']:
|
||||
'sse2/intel_init.c'
|
||||
]
|
||||
|
||||
if CONFIG['CPU_ARCH'] == 'loongarch64':
|
||||
DEFINES['PNG_LOONGARCH_LSX_OPT'] = 1
|
||||
SOURCES += [
|
||||
'loongarch/filter_lsx_intrinsics.c',
|
||||
'loongarch/loongarch_lsx_init.c',
|
||||
]
|
||||
SOURCES['loongarch/filter_lsx_intrinsics.c'].flags += ['-mlsx']
|
||||
SOURCES['loongarch/loongarch_lsx_init.c'].flags += ['-mlsx']
|
||||
|
||||
Library('mozpng')
|
||||
|
||||
if CONFIG['GKMEDIAS_SHARED_LIBRARY']:
|
||||
|
||||
+1
-14
@@ -92,7 +92,7 @@
|
||||
'LIBYUV_MSA',
|
||||
],
|
||||
}],
|
||||
['OS != "ios" and libyuv_disable_jpeg != 1', {
|
||||
['libyuv_disable_jpeg != 1', {
|
||||
'defines': [
|
||||
'HAVE_JPEG'
|
||||
],
|
||||
@@ -135,18 +135,6 @@
|
||||
'include',
|
||||
'.',
|
||||
],
|
||||
'conditions': [
|
||||
['OS == "android" and target_arch == "arm64"', {
|
||||
'ldflags': [
|
||||
'-Wl,--dynamic-linker,/system/bin/linker64',
|
||||
],
|
||||
}],
|
||||
['OS == "android" and target_arch != "arm64"', {
|
||||
'ldflags': [
|
||||
'-Wl,--dynamic-linker,/system/bin/linker',
|
||||
],
|
||||
}],
|
||||
], #conditions
|
||||
},
|
||||
'sources': [
|
||||
'<@(libyuv_sources)',
|
||||
@@ -154,4 +142,3 @@
|
||||
},
|
||||
], # targets.
|
||||
}
|
||||
|
||||
@@ -14,13 +14,8 @@ webrtc_non_unified_sources = [
|
||||
'trunk/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter_c.c', # Because of name clash in the kDampFilter variable
|
||||
'trunk/webrtc/modules/audio_coding/main/acm2/codec_manager.cc', # Because of duplicate IsCodecRED/etc
|
||||
'trunk/webrtc/modules/audio_coding/neteq/audio_vector.cc', # Because of explicit template specializations
|
||||
'trunk/webrtc/modules/audio_device/android/audio_record_jni.cc', # Becuse of commonly named module static vars
|
||||
'trunk/webrtc/modules/audio_device/android/audio_track_jni.cc', # Becuse of commonly named module static vars
|
||||
'trunk/webrtc/modules/audio_device/linux/audio_device_pulse_linux.cc', # Because of LATE()
|
||||
'trunk/webrtc/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc',# Because of LATE()
|
||||
'trunk/webrtc/modules/audio_device/opensl/opensles_input.cc', # Because of name clash in the kOption variable
|
||||
'trunk/webrtc/modules/audio_device/opensl/opensles_output.cc', # Because of name clash in the kOption variable
|
||||
'trunk/webrtc/modules/audio_device/opensl/single_rw_fifo.cc', # Because of name clash with #define FF
|
||||
'trunk/webrtc/modules/audio_device/win/audio_device_core_win.cc', # Because of ordering assumptions in strsafe.h
|
||||
'trunk/webrtc/modules/audio_processing/aec/aec_core.c', # Because of name clash in the ComfortNoise function
|
||||
'trunk/webrtc/modules/audio_processing/aecm/aecm_core.c', # Because of name clash in the ComfortNoise function
|
||||
@@ -66,9 +61,7 @@ if CONFIG['MOZ_WEBRTC_SIGNALING']:
|
||||
'signaling/src/jsep/JsepSessionImpl.cpp',
|
||||
'signaling/src/media-conduit/AudioConduit.cpp',
|
||||
'signaling/src/media-conduit/CodecStatistics.cpp',
|
||||
'signaling/src/media-conduit/MediaCodecVideoCodec.cpp',
|
||||
'signaling/src/media-conduit/VideoConduit.cpp',
|
||||
'signaling/src/media-conduit/WebrtcMediaCodecVP8VideoCodec.cpp',
|
||||
'signaling/src/mediapipeline/MediaPipeline.cpp',
|
||||
'signaling/src/mediapipeline/MediaPipelineFilter.cpp',
|
||||
'signaling/src/mediapipeline/SrtpFlow.cpp',
|
||||
@@ -116,7 +109,6 @@ if CONFIG['MOZ_WEBRTC_SIGNALING']:
|
||||
GYP_DIRS['signalingtest'].variables = gyp_vars.copy()
|
||||
GYP_DIRS['signalingtest'].variables.update(
|
||||
build_for_test=1,
|
||||
moz_webrtc_mediacodec=0,
|
||||
build_for_standalone=0
|
||||
)
|
||||
GYP_DIRS['signalingtest'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
|
||||
|
||||
@@ -219,41 +219,6 @@
|
||||
'../../../netwerk/srtp/src/crypto/include',
|
||||
],
|
||||
}],
|
||||
['moz_webrtc_omx==1', {
|
||||
'sources': [
|
||||
'./src/media-conduit/WebrtcOMXH264VideoCodec.cpp',
|
||||
'./src/media-conduit/OMXVideoCodec.cpp',
|
||||
],
|
||||
'include_dirs': [
|
||||
# hack on hack to re-add it after SrtpFlow removes it
|
||||
'../../../dom/media/omx',
|
||||
'../../../gfx/layers/client',
|
||||
],
|
||||
'cflags_mozilla': [
|
||||
'-I$(ANDROID_SOURCE)/frameworks/av/include/media/stagefright',
|
||||
'-I$(ANDROID_SOURCE)/frameworks/av/include',
|
||||
'-I$(ANDROID_SOURCE)/frameworks/native/include/media/openmax',
|
||||
'-I$(ANDROID_SOURCE)/frameworks/native/include',
|
||||
'-I$(ANDROID_SOURCE)/frameworks/native/opengl/include',
|
||||
],
|
||||
'defines' : [
|
||||
'MOZ_WEBRTC_OMX'
|
||||
],
|
||||
}],
|
||||
['moz_webrtc_mediacodec==1', {
|
||||
'include_dirs': [
|
||||
'../../../widget/android',
|
||||
],
|
||||
'sources': [
|
||||
'./src/media-conduit/MediaCodecVideoCodec.h',
|
||||
'./src/media-conduit/WebrtcMediaCodecVP8VideoCodec.h',
|
||||
'./src/media-conduit/MediaCodecVideoCodec.cpp',
|
||||
'./src/media-conduit/WebrtcMediaCodecVP8VideoCodec.cpp',
|
||||
],
|
||||
'defines' : [
|
||||
'MOZ_WEBRTC_MEDIACODEC',
|
||||
],
|
||||
}],
|
||||
['(build_for_test==0) and (build_for_standalone==0)', {
|
||||
'defines' : [
|
||||
'MOZILLA_INTERNAL_API',
|
||||
@@ -294,7 +259,7 @@
|
||||
'USE_FAKE_PCOBSERVER',
|
||||
],
|
||||
}],
|
||||
['(OS=="linux") or (OS=="android")', {
|
||||
['OS=="linux"', {
|
||||
'include_dirs': [
|
||||
],
|
||||
|
||||
@@ -311,13 +276,6 @@
|
||||
'cflags_mozilla': [
|
||||
],
|
||||
}],
|
||||
['OS=="android"', {
|
||||
'cflags_mozilla': [
|
||||
# This warning complains about important MOZ_EXPORT attributes
|
||||
# on forward declarations for Android API types.
|
||||
'-Wno-error=attributes',
|
||||
],
|
||||
}],
|
||||
['OS=="win"', {
|
||||
'include_dirs': [
|
||||
],
|
||||
@@ -348,7 +306,7 @@
|
||||
'cflags_mozilla': [
|
||||
],
|
||||
}],
|
||||
['OS=="mac" or OS=="ios"', {
|
||||
['OS=="mac"', {
|
||||
'include_dirs': [
|
||||
],
|
||||
'defines': [
|
||||
|
||||
@@ -26,12 +26,7 @@ using mozilla::LogLevel;
|
||||
static int gWebRtcTraceLoggingOn = 0;
|
||||
|
||||
|
||||
#if defined(ANDROID)
|
||||
static const char *default_tmp_dir = "/dev/null";
|
||||
static const char *default_log_name = "nspr";
|
||||
#else // Assume a POSIX environment
|
||||
NS_NAMED_LITERAL_CSTRING(default_log_name, "WebRTC.log");
|
||||
#endif
|
||||
|
||||
static PRLogModuleInfo* GetWebRtcTraceLog()
|
||||
{
|
||||
@@ -110,11 +105,6 @@ void ConfigWebRtcLog(uint32_t trace_mask, nsCString &aLogFile, nsCString &aAECLo
|
||||
return;
|
||||
}
|
||||
|
||||
#if defined(ANDROID)
|
||||
// Special case: use callback to pipe to NSPR logging.
|
||||
aLogFile.Assign(default_log_name);
|
||||
#else
|
||||
|
||||
webrtc::Trace::set_level_filter(trace_mask);
|
||||
|
||||
if (trace_mask != 0) {
|
||||
@@ -133,7 +123,6 @@ void ConfigWebRtcLog(uint32_t trace_mask, nsCString &aLogFile, nsCString &aAECLo
|
||||
tempDir->GetNativePath(aLogFile);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
|
||||
if (XRE_IsParentProcess()) {
|
||||
@@ -208,12 +197,6 @@ void ConfigAecLog(nsCString &aAECLogDir) {
|
||||
if (webrtc::Trace::aec_debug()) {
|
||||
return;
|
||||
}
|
||||
#if defined(ANDROID)
|
||||
// For AEC, do not use a default value: force the user to specify a directory.
|
||||
if (aAECLogDir.IsEmpty()) {
|
||||
aAECLogDir.Assign(default_tmp_dir);
|
||||
}
|
||||
#else
|
||||
if (aAECLogDir.IsEmpty()) {
|
||||
nsCOMPtr<nsIFile> tempDir;
|
||||
nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempDir));
|
||||
@@ -223,7 +206,6 @@ void ConfigAecLog(nsCString &aAECLogDir) {
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
webrtc::Trace::set_aec_debug_filename(aAECLogDir.get());
|
||||
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
|
||||
if (XRE_IsParentProcess()) {
|
||||
|
||||
@@ -2114,12 +2114,7 @@ JsepSessionImpl::SetupDefaultCodecs()
|
||||
48000,
|
||||
2,
|
||||
960,
|
||||
#ifdef WEBRTC_GONK
|
||||
// TODO Move this elsewhere to be adaptive to rate - Bug 1207925
|
||||
16000 // B2G uses lower capture sampling rate
|
||||
#else
|
||||
40000
|
||||
#endif
|
||||
));
|
||||
|
||||
mSupportedCodecs.values.push_back(new JsepAudioCodecDescription(
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#include "CSFLog.h"
|
||||
#include "nspr.h"
|
||||
|
||||
#include "WebrtcMediaCodecVP8VideoCodec.h"
|
||||
#include "MediaCodecVideoCodec.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
static const char* logTag ="MediaCodecVideoCodec";
|
||||
|
||||
VideoEncoder* MediaCodecVideoCodec::CreateEncoder(CodecType aCodecType) {
|
||||
CSFLogDebug(logTag, "%s ", __FUNCTION__);
|
||||
if (aCodecType == CODEC_VP8) {
|
||||
return new WebrtcMediaCodecVP8VideoEncoder();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VideoDecoder* MediaCodecVideoCodec::CreateDecoder(CodecType aCodecType) {
|
||||
CSFLogDebug(logTag, "%s ", __FUNCTION__);
|
||||
if (aCodecType == CODEC_VP8) {
|
||||
return new WebrtcMediaCodecVP8VideoDecoder();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#ifndef MediaCodecVideoCodec_h__
|
||||
#define MediaCodecVideoCodec_h__
|
||||
|
||||
#include "MediaConduitInterface.h"
|
||||
|
||||
namespace mozilla {
|
||||
class MediaCodecVideoCodec {
|
||||
public:
|
||||
enum CodecType {
|
||||
CODEC_VP8,
|
||||
};
|
||||
/**
|
||||
* Create encoder object for codec type |aCodecType|. Return |nullptr| when
|
||||
* failed.
|
||||
*/
|
||||
static VideoEncoder* CreateEncoder(CodecType aCodecType);
|
||||
|
||||
/**
|
||||
* Create decoder object for codec type |aCodecType|. Return |nullptr| when
|
||||
* failed.
|
||||
*/
|
||||
static VideoDecoder* CreateDecoder(CodecType aCodecType);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // MediaCodecVideoCodec_h__
|
||||
@@ -1,30 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#include "OMXVideoCodec.h"
|
||||
|
||||
#ifdef WEBRTC_GONK
|
||||
#include "WebrtcOMXH264VideoCodec.h"
|
||||
#endif
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
VideoEncoder*
|
||||
OMXVideoCodec::CreateEncoder(CodecType aCodecType)
|
||||
{
|
||||
if (aCodecType == CODEC_H264) {
|
||||
return new WebrtcOMXH264VideoEncoder();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VideoDecoder*
|
||||
OMXVideoCodec::CreateDecoder(CodecType aCodecType) {
|
||||
if (aCodecType == CODEC_H264) {
|
||||
return new WebrtcOMXH264VideoDecoder();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#ifndef OMX_VIDEO_CODEC_H_
|
||||
#define OMX_VIDEO_CODEC_H_
|
||||
|
||||
#include "MediaConduitInterface.h"
|
||||
|
||||
namespace mozilla {
|
||||
class OMXVideoCodec {
|
||||
public:
|
||||
enum CodecType {
|
||||
CODEC_H264,
|
||||
};
|
||||
|
||||
/**
|
||||
* Create encoder object for codec type |aCodecType|. Return |nullptr| when
|
||||
* failed.
|
||||
*/
|
||||
static VideoEncoder* CreateEncoder(CodecType aCodecType);
|
||||
|
||||
/**
|
||||
* Create decoder object for codec type |aCodecType|. Return |nullptr| when
|
||||
* failed.
|
||||
*/
|
||||
static VideoDecoder* CreateDecoder(CodecType aCodecType);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // OMX_VIDEO_CODEC_H_
|
||||
@@ -679,15 +679,7 @@ WebrtcVideoConduit::ConfigureSendMediaCodec(const VideoCodecConfig* codecConfig)
|
||||
// width/height will be overridden on the first frame
|
||||
video_codec.width = 320;
|
||||
video_codec.height = 240;
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
if (codecConfig->mType == webrtc::kVideoCodecH264) {
|
||||
video_codec.resolution_divisor = 16;
|
||||
} else {
|
||||
video_codec.resolution_divisor = 1; // We could try using it to handle odd resolutions
|
||||
}
|
||||
#else
|
||||
video_codec.resolution_divisor = 1; // We could try using it to handle odd resolutions
|
||||
#endif
|
||||
video_codec.qpMax = 56;
|
||||
video_codec.numberOfSimulcastStreams = 1;
|
||||
video_codec.simulcastStream[0].jsScaleDownBy =
|
||||
@@ -1896,8 +1888,6 @@ WebrtcVideoConduit::DeliverI420Frame(const webrtc::I420VideoFrame& webrtc_frame)
|
||||
}
|
||||
|
||||
#if 0
|
||||
//#ifndef MOZ_WEBRTC_OMX
|
||||
// XXX - this may not be possible on GONK with textures!
|
||||
if (mVideoLatencyTestEnable && mReceivingWidth && mReceivingHeight) {
|
||||
uint64_t now = PR_Now();
|
||||
uint64_t timestamp = 0;
|
||||
@@ -1967,9 +1957,6 @@ WebrtcVideoConduit::CodecConfigToWebRTCCodec(const VideoCodecConfig* codecInfo,
|
||||
|
||||
if (cinst.codecType == webrtc::kVideoCodecH264)
|
||||
{
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
cinst.resolution_divisor = 16;
|
||||
#endif
|
||||
// cinst.codecSpecific.H264.profile = ?
|
||||
cinst.codecSpecific.H264.profile_byte = codecInfo->mProfile;
|
||||
cinst.codecSpecific.H264.constraints = codecInfo->mConstraints;
|
||||
|
||||
@@ -248,15 +248,9 @@ public:
|
||||
/**
|
||||
* Does DeliverFrame() support a null buffer and non-null handle
|
||||
* (video texture)?
|
||||
* B2G support it (when using HW video decoder with graphic buffer output).
|
||||
* XXX Investigate! Especially for Android
|
||||
*/
|
||||
virtual bool IsTextureSupported() override {
|
||||
#ifdef WEBRTC_GONK
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual uint64_t CodecPluginID() override;
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,114 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#ifndef WebrtcMediaCodecVP8VideoCodec_h__
|
||||
#define WebrtcMediaCodecVP8VideoCodec_h__
|
||||
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "nsThreadUtils.h"
|
||||
#include "nsAutoPtr.h"
|
||||
|
||||
#include "MediaConduitInterface.h"
|
||||
#include "AudioConduit.h"
|
||||
#include "VideoConduit.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
struct EncodedFrame {
|
||||
uint32_t width_;
|
||||
uint32_t height_;
|
||||
uint32_t timeStamp_;
|
||||
uint64_t decode_timestamp_;
|
||||
};
|
||||
|
||||
class WebrtcAndroidMediaCodec;
|
||||
|
||||
class WebrtcMediaCodecVP8VideoEncoder : public WebrtcVideoEncoder {
|
||||
public:
|
||||
WebrtcMediaCodecVP8VideoEncoder();
|
||||
|
||||
virtual ~WebrtcMediaCodecVP8VideoEncoder() override;
|
||||
|
||||
// Implement VideoEncoder interface.
|
||||
virtual uint64_t PluginID() const override { return 0; }
|
||||
|
||||
virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings,
|
||||
int32_t numberOfCores,
|
||||
size_t maxPayloadSize) override;
|
||||
|
||||
virtual int32_t Encode(const webrtc::I420VideoFrame& inputImage,
|
||||
const webrtc::CodecSpecificInfo* codecSpecificInfo,
|
||||
const std::vector<webrtc::VideoFrameType>* frame_types) override;
|
||||
|
||||
virtual int32_t RegisterEncodeCompleteCallback(webrtc::EncodedImageCallback* callback) override;
|
||||
|
||||
virtual int32_t Release() override;
|
||||
|
||||
virtual int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override;
|
||||
|
||||
virtual int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override;
|
||||
|
||||
private:
|
||||
int32_t VerifyAndAllocate(const uint32_t minimumSize);
|
||||
bool ResetInputBuffers();
|
||||
bool ResetOutputBuffers();
|
||||
|
||||
size_t mMaxPayloadSize;
|
||||
uint32_t mTimestamp;
|
||||
webrtc::EncodedImage mEncodedImage;
|
||||
webrtc::EncodedImageCallback* mCallback;
|
||||
uint32_t mFrameWidth;
|
||||
uint32_t mFrameHeight;
|
||||
|
||||
WebrtcAndroidMediaCodec* mMediaCodecEncoder;
|
||||
|
||||
jobjectArray mInputBuffers;
|
||||
jobjectArray mOutputBuffers;
|
||||
};
|
||||
|
||||
class WebrtcMediaCodecVP8VideoDecoder : public WebrtcVideoDecoder {
|
||||
public:
|
||||
WebrtcMediaCodecVP8VideoDecoder();
|
||||
|
||||
virtual ~WebrtcMediaCodecVP8VideoDecoder() override;
|
||||
|
||||
// Implement VideoDecoder interface.
|
||||
virtual uint64_t PluginID() const override { return 0; }
|
||||
|
||||
virtual int32_t InitDecode(const webrtc::VideoCodec* codecSettings,
|
||||
int32_t numberOfCores) override;
|
||||
|
||||
virtual int32_t Decode(const webrtc::EncodedImage& inputImage,
|
||||
bool missingFrames,
|
||||
const webrtc::RTPFragmentationHeader* fragmentation,
|
||||
const webrtc::CodecSpecificInfo*
|
||||
codecSpecificInfo = NULL,
|
||||
int64_t renderTimeMs = -1) override;
|
||||
|
||||
virtual int32_t RegisterDecodeCompleteCallback(webrtc::DecodedImageCallback* callback) override;
|
||||
|
||||
virtual int32_t Release() override;
|
||||
|
||||
virtual int32_t Reset() override;
|
||||
|
||||
private:
|
||||
void DecodeFrame(EncodedFrame* frame);
|
||||
void RunCallback();
|
||||
bool ResetInputBuffers();
|
||||
bool ResetOutputBuffers();
|
||||
|
||||
webrtc::DecodedImageCallback* mCallback;
|
||||
|
||||
uint32_t mFrameWidth;
|
||||
uint32_t mFrameHeight;
|
||||
|
||||
WebrtcAndroidMediaCodec* mMediaCodecDecoder;
|
||||
jobjectArray mInputBuffers;
|
||||
jobjectArray mOutputBuffers;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // WebrtcMediaCodecVP8VideoCodec_h__
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,108 +0,0 @@
|
||||
/* 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/. */
|
||||
|
||||
#ifndef WEBRTC_GONK
|
||||
#pragma error WebrtcOMXH264VideoCodec works only on B2G.
|
||||
#endif
|
||||
|
||||
#ifndef WEBRTC_OMX_H264_CODEC_H_
|
||||
#define WEBRTC_OMX_H264_CODEC_H_
|
||||
|
||||
#include "AudioConduit.h"
|
||||
#include "VideoConduit.h"
|
||||
#include <foundation/ABase.h>
|
||||
#include <utils/RefBase.h>
|
||||
#include "OMXCodecWrapper.h"
|
||||
|
||||
namespace android {
|
||||
class OMXVideoEncoder;
|
||||
}
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
class WebrtcOMXDecoder;
|
||||
class OMXOutputDrain;
|
||||
|
||||
// XXX see if we can reduce this
|
||||
#define WEBRTC_OMX_H264_MIN_DECODE_BUFFERS 10
|
||||
#define OMX_IDR_NEEDED_FOR_BITRATE 0
|
||||
|
||||
class WebrtcOMXH264VideoEncoder : public WebrtcVideoEncoder
|
||||
{
|
||||
public:
|
||||
WebrtcOMXH264VideoEncoder();
|
||||
|
||||
virtual ~WebrtcOMXH264VideoEncoder();
|
||||
|
||||
// Implement VideoEncoder interface.
|
||||
virtual uint64_t PluginID() const override { return 0; }
|
||||
|
||||
virtual int32_t InitEncode(const webrtc::VideoCodec* aCodecSettings,
|
||||
int32_t aNumOfCores,
|
||||
size_t aMaxPayloadSize) override;
|
||||
|
||||
virtual int32_t Encode(const webrtc::I420VideoFrame& aInputImage,
|
||||
const webrtc::CodecSpecificInfo* aCodecSpecificInfo,
|
||||
const std::vector<webrtc::VideoFrameType>* aFrameTypes) override;
|
||||
|
||||
virtual int32_t RegisterEncodeCompleteCallback(webrtc::EncodedImageCallback* aCallback) override;
|
||||
|
||||
virtual int32_t Release() override;
|
||||
|
||||
virtual int32_t SetChannelParameters(uint32_t aPacketLossRate,
|
||||
int64_t aRoundTripTimeMs) override;
|
||||
|
||||
virtual int32_t SetRates(uint32_t aBitRate, uint32_t aFrameRate) override;
|
||||
|
||||
private:
|
||||
nsAutoPtr<android::OMXVideoEncoder> mOMX;
|
||||
android::sp<android::OMXCodecReservation> mReservation;
|
||||
|
||||
webrtc::EncodedImageCallback* mCallback;
|
||||
RefPtr<OMXOutputDrain> mOutputDrain;
|
||||
uint32_t mWidth;
|
||||
uint32_t mHeight;
|
||||
uint32_t mFrameRate;
|
||||
uint32_t mBitRateKbps;
|
||||
#ifdef OMX_IDR_NEEDED_FOR_BITRATE
|
||||
uint32_t mBitRateAtLastIDR;
|
||||
TimeStamp mLastIDRTime;
|
||||
#endif
|
||||
bool mOMXConfigured;
|
||||
bool mOMXReconfigure;
|
||||
webrtc::EncodedImage mEncodedImage;
|
||||
};
|
||||
|
||||
class WebrtcOMXH264VideoDecoder : public WebrtcVideoDecoder
|
||||
{
|
||||
public:
|
||||
WebrtcOMXH264VideoDecoder();
|
||||
|
||||
virtual ~WebrtcOMXH264VideoDecoder();
|
||||
|
||||
// Implement VideoDecoder interface.
|
||||
virtual uint64_t PluginID() const override { return 0; }
|
||||
|
||||
virtual int32_t InitDecode(const webrtc::VideoCodec* aCodecSettings,
|
||||
int32_t aNumOfCores) override;
|
||||
virtual int32_t Decode(const webrtc::EncodedImage& aInputImage,
|
||||
bool aMissingFrames,
|
||||
const webrtc::RTPFragmentationHeader* aFragmentation,
|
||||
const webrtc::CodecSpecificInfo* aCodecSpecificInfo = nullptr,
|
||||
int64_t aRenderTimeMs = -1) override;
|
||||
virtual int32_t RegisterDecodeCompleteCallback(webrtc::DecodedImageCallback* callback) override;
|
||||
|
||||
virtual int32_t Release() override;
|
||||
|
||||
virtual int32_t Reset() override;
|
||||
|
||||
private:
|
||||
webrtc::DecodedImageCallback* mCallback;
|
||||
RefPtr<WebrtcOMXDecoder> mOMX;
|
||||
android::sp<android::OMXCodecReservation> mReservation;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // WEBRTC_OMX_H264_CODEC_H_
|
||||
@@ -28,10 +28,6 @@
|
||||
#include "MediaStreamVideoSink.h"
|
||||
#include "VideoUtils.h"
|
||||
#include "VideoStreamTrack.h"
|
||||
#ifdef WEBRTC_GONK
|
||||
#include "GrallocImages.h"
|
||||
#include "mozilla/layers/GrallocTextureClient.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "nsError.h"
|
||||
@@ -285,72 +281,6 @@ protected:
|
||||
}
|
||||
|
||||
ImageFormat format = aImage->GetFormat();
|
||||
#ifdef WEBRTC_GONK
|
||||
GrallocImage* nativeImage = aImage->AsGrallocImage();
|
||||
if (nativeImage) {
|
||||
android::sp<android::GraphicBuffer> graphicBuffer = nativeImage->GetGraphicBuffer();
|
||||
int pixelFormat = graphicBuffer->getPixelFormat(); /* PixelFormat is an enum == int */
|
||||
mozilla::VideoType destFormat;
|
||||
switch (pixelFormat) {
|
||||
case HAL_PIXEL_FORMAT_YV12:
|
||||
// all android must support this
|
||||
destFormat = mozilla::kVideoYV12;
|
||||
break;
|
||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP:
|
||||
destFormat = mozilla::kVideoNV21;
|
||||
break;
|
||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_P:
|
||||
destFormat = mozilla::kVideoI420;
|
||||
break;
|
||||
default:
|
||||
// XXX Bug NNNNNNN
|
||||
// use http://dxr.mozilla.org/mozilla-central/source/content/media/omx/I420ColorConverterHelper.cpp
|
||||
// to convert unknown types (OEM-specific) to I420
|
||||
MOZ_MTLOG(ML_ERROR, "Un-handled GRALLOC buffer type:" << pixelFormat);
|
||||
MOZ_CRASH();
|
||||
}
|
||||
void *basePtr;
|
||||
graphicBuffer->lock(android::GraphicBuffer::USAGE_SW_READ_MASK, &basePtr);
|
||||
uint32_t width = graphicBuffer->getWidth();
|
||||
uint32_t height = graphicBuffer->getHeight();
|
||||
// XXX gralloc buffer's width and stride could be different depends on implementations.
|
||||
|
||||
if (destFormat != mozilla::kVideoI420) {
|
||||
unsigned char *video_frame = static_cast<unsigned char*>(basePtr);
|
||||
webrtc::I420VideoFrame i420_frame;
|
||||
int stride_y = width;
|
||||
int stride_uv = (width + 1) / 2;
|
||||
int target_width = width;
|
||||
int target_height = height;
|
||||
if (i420_frame.CreateEmptyFrame(target_width,
|
||||
abs(target_height),
|
||||
stride_y,
|
||||
stride_uv, stride_uv) < 0) {
|
||||
MOZ_ASSERT(false, "Can't allocate empty i420frame");
|
||||
return;
|
||||
}
|
||||
webrtc::VideoType commonVideoType =
|
||||
webrtc::RawVideoTypeToCommonVideoVideoType(
|
||||
static_cast<webrtc::RawVideoType>((int)destFormat));
|
||||
if (ConvertToI420(commonVideoType, video_frame, 0, 0, width, height,
|
||||
I420SIZE(width, height), webrtc::kVideoRotation_0,
|
||||
&i420_frame)) {
|
||||
MOZ_ASSERT(false, "Can't convert video type for sending to I420");
|
||||
return;
|
||||
}
|
||||
i420_frame.set_ntp_time_ms(0);
|
||||
VideoFrameConverted(i420_frame);
|
||||
} else {
|
||||
VideoFrameConverted(static_cast<unsigned char*>(basePtr),
|
||||
I420SIZE(width, height),
|
||||
width,
|
||||
height,
|
||||
destFormat, 0);
|
||||
}
|
||||
graphicBuffer->unlock();
|
||||
return;
|
||||
} else
|
||||
#endif
|
||||
if (format == ImageFormat::PLANAR_YCBCR) {
|
||||
// Cast away constness b/c some of the accessors are non-const
|
||||
PlanarYCbCrImage* yuv = const_cast<PlanarYCbCrImage *>(
|
||||
@@ -2198,13 +2128,6 @@ public:
|
||||
|
||||
image_ = yuvImage;
|
||||
}
|
||||
#ifdef WEBRTC_GONK
|
||||
else {
|
||||
// Decoder produced video frame that can be appended to the track directly.
|
||||
MOZ_ASSERT(video_image);
|
||||
image_ = video_image;
|
||||
}
|
||||
#endif // WEBRTC_GONK
|
||||
#endif // MOZILLA_INTERNAL_API
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "logging.h"
|
||||
#include "nsIGfxInfo.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
|
||||
#include "PeerConnectionImpl.h"
|
||||
#include "PeerConnectionMedia.h"
|
||||
@@ -28,18 +26,6 @@
|
||||
#endif
|
||||
|
||||
#include "GmpVideoCodec.h"
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
#include "OMXVideoCodec.h"
|
||||
#include "OMXCodecWrapper.h"
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_WEBRTC_MEDIACODEC
|
||||
#include "MediaCodecVideoCodec.h"
|
||||
#endif
|
||||
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
#include "mozilla/Preferences.h"
|
||||
#endif
|
||||
|
||||
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
|
||||
#include "WebrtcGmpVideoCodec.h"
|
||||
@@ -979,60 +965,7 @@ MediaPipelineFactory::EnsureExternalCodec(VideoSessionConduit& aConduit,
|
||||
bool aIsSend)
|
||||
{
|
||||
if (aConfig->mName == "VP8") {
|
||||
#ifdef MOZ_WEBRTC_MEDIACODEC
|
||||
if (aIsSend) {
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
bool enabled = mozilla::Preferences::GetBool("media.navigator.hardware.vp8_encode.acceleration_enabled", false);
|
||||
#else
|
||||
bool enabled = false;
|
||||
#endif
|
||||
if (enabled) {
|
||||
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
|
||||
if (gfxInfo) {
|
||||
int32_t status;
|
||||
nsCString discardFailureId;
|
||||
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBRTC_HW_ACCELERATION_ENCODE, discardFailureId, &status))) {
|
||||
if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
|
||||
NS_WARNING("VP8 encoder hardware is not whitelisted: disabling.\n");
|
||||
} else {
|
||||
VideoEncoder* encoder = nullptr;
|
||||
encoder = MediaCodecVideoCodec::CreateEncoder(MediaCodecVideoCodec::CodecType::CODEC_VP8);
|
||||
if (encoder) {
|
||||
return aConduit.SetExternalSendCodec(aConfig, encoder);
|
||||
}
|
||||
return kMediaConduitNoError;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
#ifdef MOZILLA_INTERNAL_API
|
||||
bool enabled = mozilla::Preferences::GetBool("media.navigator.hardware.vp8_decode.acceleration_enabled", false);
|
||||
#else
|
||||
bool enabled = false;
|
||||
#endif
|
||||
if (enabled) {
|
||||
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
|
||||
if (gfxInfo) {
|
||||
int32_t status;
|
||||
nsCString discardFailureId;
|
||||
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_WEBRTC_HW_ACCELERATION_DECODE, discardFailureId, &status))) {
|
||||
if (status != nsIGfxInfo::FEATURE_STATUS_OK) {
|
||||
NS_WARNING("VP8 decoder hardware is not whitelisted: disabling.\n");
|
||||
} else {
|
||||
VideoDecoder* decoder;
|
||||
decoder = MediaCodecVideoCodec::CreateDecoder(MediaCodecVideoCodec::CodecType::CODEC_VP8);
|
||||
if (decoder) {
|
||||
return aConduit.SetExternalRecvCodec(aConfig, decoder);
|
||||
}
|
||||
return kMediaConduitNoError;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return kMediaConduitNoError;
|
||||
return kMediaConduitNoError;
|
||||
}
|
||||
if (aConfig->mName == "VP9") {
|
||||
return kMediaConduitNoError;
|
||||
@@ -1043,25 +976,13 @@ MediaPipelineFactory::EnsureExternalCodec(VideoSessionConduit& aConduit,
|
||||
}
|
||||
// Register H.264 codec.
|
||||
if (aIsSend) {
|
||||
VideoEncoder* encoder = nullptr;
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
encoder =
|
||||
OMXVideoCodec::CreateEncoder(OMXVideoCodec::CodecType::CODEC_H264);
|
||||
#else
|
||||
encoder = GmpVideoCodec::CreateEncoder();
|
||||
#endif
|
||||
VideoEncoder* encoder = GmpVideoCodec::CreateEncoder();
|
||||
if (encoder) {
|
||||
return aConduit.SetExternalSendCodec(aConfig, encoder);
|
||||
}
|
||||
return kMediaConduitInvalidSendCodec;
|
||||
}
|
||||
VideoDecoder* decoder = nullptr;
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
decoder =
|
||||
OMXVideoCodec::CreateDecoder(OMXVideoCodec::CodecType::CODEC_H264);
|
||||
#else
|
||||
decoder = GmpVideoCodec::CreateDecoder();
|
||||
#endif
|
||||
VideoDecoder* decoder = GmpVideoCodec::CreateDecoder();
|
||||
if (decoder) {
|
||||
return aConduit.SetExternalRecvCodec(aConfig, decoder);
|
||||
}
|
||||
|
||||
@@ -127,11 +127,6 @@
|
||||
#endif
|
||||
#include "mozilla/dom/PeerConnectionObserverEnumsBinding.h"
|
||||
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
#include "OMXVideoCodec.h"
|
||||
#include "OMXCodecWrapper.h"
|
||||
#endif
|
||||
|
||||
#define ICE_PARSING "In RTCConfiguration passed to RTCPeerConnection constructor"
|
||||
|
||||
using namespace mozilla;
|
||||
@@ -921,34 +916,6 @@ class ConfigureCodec {
|
||||
mRedUlpfecEnabled(false),
|
||||
mDtmfEnabled(false)
|
||||
{
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
// Check to see if what HW codecs are available (not in use) at this moment.
|
||||
// Note that streaming video decode can reserve a decoder
|
||||
|
||||
// XXX See bug 1018791 Implement W3 codec reservation policy
|
||||
// Note that currently, OMXCodecReservation needs to be held by an sp<> because it puts
|
||||
// 'this' into an sp<EventListener> to talk to the resource reservation code
|
||||
|
||||
// This pref is a misnomer; it is solely for h264 _hardware_ support.
|
||||
branch->GetBoolPref("media.peerconnection.video.h264_enabled",
|
||||
&mHardwareH264Enabled);
|
||||
|
||||
if (mHardwareH264Enabled) {
|
||||
// Ok, it is preffed on. Can we actually do it?
|
||||
android::sp<android::OMXCodecReservation> encode = new android::OMXCodecReservation(true);
|
||||
android::sp<android::OMXCodecReservation> decode = new android::OMXCodecReservation(false);
|
||||
|
||||
// Currently we just check if they're available right now, which will fail if we're
|
||||
// trying to call ourself, for example. It will work for most real-world cases, like
|
||||
// if we try to add a person to a 2-way call to make a 3-way mesh call
|
||||
if (encode->ReserveOMXCodec() && decode->ReserveOMXCodec()) {
|
||||
CSFLogDebug( logTag, "%s: H264 hardware codec available", __FUNCTION__);
|
||||
mHardwareH264Supported = true;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // MOZ_WEBRTC_OMX
|
||||
|
||||
#if !defined(MOZILLA_EXTERNAL_LINKAGE)
|
||||
mSoftwareH264Enabled = PeerConnectionCtx::GetInstance()->gmpHasH264();
|
||||
#else
|
||||
@@ -963,11 +930,6 @@ class ConfigureCodec {
|
||||
|
||||
branch->GetIntPref("media.navigator.video.h264.max_br", &mH264MaxBr);
|
||||
|
||||
#ifdef MOZ_WEBRTC_OMX
|
||||
// Level 1.2; but let's allow CIF@30 or QVGA@30+ by default
|
||||
mH264MaxMbps = 11880;
|
||||
#endif
|
||||
|
||||
branch->GetIntPref("media.navigator.video.h264.max_mbps", &mH264MaxMbps);
|
||||
|
||||
branch->GetBoolPref("media.peerconnection.video.vp9_enabled",
|
||||
|
||||
@@ -670,7 +670,6 @@ typedef struct sdp_fmtp {
|
||||
uint16_t par_height;
|
||||
/* PAR=12:11 implies par_width=12, par_height=11 */
|
||||
|
||||
/* CPCF should be a float. IOS does not support float and so it is uint16_t */
|
||||
/* For portable stack, CPCF should be defined as float and the parsing should
|
||||
* be modified accordingly */
|
||||
uint16_t cpcf;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# 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/.
|
||||
|
||||
if CONFIG['OS_TARGET'] in ('Darwin', 'Android'):
|
||||
if CONFIG['OS_TARGET'] == 'Darwin':
|
||||
DEFINES['GTEST_USE_OWN_TR1_TUPLE'] = 1
|
||||
|
||||
for var in ('MOZILLA_EXTERNAL_LINKAGE', 'USE_FAKE_MEDIA_STREAMS', 'USE_FAKE_PCOBSERVER',
|
||||
@@ -42,11 +42,6 @@ LOCAL_INCLUDES += [
|
||||
'/xpcom/base',
|
||||
]
|
||||
|
||||
if CONFIG['OS_TARGET'] == 'Android':
|
||||
LOCAL_INCLUDES += [
|
||||
'/media/mtransport/third_party/nrappkit/src/port/android/include',
|
||||
]
|
||||
|
||||
if CONFIG['OS_TARGET'] == 'Linux':
|
||||
LOCAL_INCLUDES += [
|
||||
'/media/mtransport/third_party/nrappkit/src/port/linux/include',
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
# 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/.
|
||||
|
||||
# TODO: bug 1172551 - get these tests working on iOS
|
||||
if CONFIG['OS_TARGET'] != 'WINNT' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'uikit':
|
||||
GeckoCppUnitTests([
|
||||
'jsep_session_unittest',
|
||||
|
||||
@@ -30,8 +30,7 @@ deps_os = {
|
||||
|
||||
# Define rules for which include paths are allowed in our source.
|
||||
include_rules = [
|
||||
# Base is only used to build Android APK tests and may not be referenced by
|
||||
# WebRTC production code.
|
||||
# Base may not be referenced by WebRTC production code.
|
||||
'-base',
|
||||
'-chromium',
|
||||
'+gflags',
|
||||
@@ -100,4 +99,3 @@ hooks = [
|
||||
Var('extra_gyp_flag')],
|
||||
},
|
||||
]
|
||||
|
||||
@@ -770,7 +770,7 @@ endif
|
||||
|
||||
quiet_cmd_regen_makefile = ACTION Regenerating $@
|
||||
cmd_regen_makefile = ./build/gyp_chromium -fmake --ignore-environment "--toplevel-dir=." -I/home/jesup/src/mozilla/webrtc_import7/webrtc_update/trunk/build/common.gypi -I/home/jesup/src/mozilla/webrtc_import7/webrtc_update/trunk/supplement/supplement.gypi "--depth=." peerconnection_all.gyp
|
||||
Makefile: third_party/webrtc/build/common.gypi third_party/webrtc/common_video/common_video.gyp third_party/webrtc/video_engine/video_engine.gyp third_party/webrtc/modules/audio_coding/neteq/neteq.gypi third_party/libvpx/libvpx_srcs_arm.gypi build/filename_rules.gypi third_party/webrtc/modules/media_file/source/media_file.gypi third_party/jsoncpp/jsoncpp.gyp base/base.gyp third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_tests.gypi third_party/webrtc/modules/audio_processing/audio_processing.gypi third_party/webrtc/modules/video_processing/main/source/video_processing.gypi third_party/webrtc/system_wrappers/source/system_wrappers.gyp supplement/supplement.gypi third_party/webrtc/modules/audio_coding/codecs/ilbc/ilbc.gypi third_party/webrtc/modules/utility/source/utility.gypi third_party/webrtc/voice_engine/test/voice_engine_tests.gypi build/internal/release_impl.gypi third_party/webrtc/modules/audio_coding/codecs/isac/isacfix_test.gypi third_party/yasm/yasm_compile.gypi net/net.gyp third_party/webrtc/modules/audio_coding/codecs/isac/isac_test.gypi third_party/webrtc/modules/audio_coding/codecs/cng/cng.gypi third_party/libvpx/libvpx_srcs_x86_64.gypi third_party/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.gypi third_party/webrtc/modules/audio_device/audio_device.gypi third_party/libjingle/libjingle.gyp build/internal/release_impl_official.gypi build/internal/release_defaults.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp.gypi third_party/webrtc/modules/video_render/main/source/video_render.gypi third_party/libjpeg_turbo/libjpeg.gyp third_party/webrtc/modules/rtp_rtcp/test/testAPI/test_api.gypi third_party/webrtc/modules/udp_transport/source/udp_transport.gypi third_party/libvpx/libvpx_srcs_arm_neon.gypi third_party/webrtc/voice_engine/voice_engine.gyp third_party/webrtc/common_audio/resampler/resampler.gypi third_party/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer.gypi build/win_precompile.gypi third_party/expat/expat.gyp third_party/webrtc/modules/video_coding/main/source/video_coding_test.gypi third_party/yasm/yasm.gyp third_party/webrtc/modules/video_capture/main/source/video_capture.gypi third_party/webrtc/video_engine/test/libvietest/libvietest.gypi third_party/webrtc/modules/video_coding/codecs/vp8/vp8.gyp third_party/webrtc/modules/bitrate_controller/bitrate_controller.gypi third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.gypi build/ios/mac_build.gypi third_party/webrtc/modules/video_coding/main/source/video_coding.gypi third_party/webrtc/modules/audio_coding/main/source/audio_coding_module.gypi build/release.gypi peerconnection.gyp build/common.gypi third_party/webrtc/video_engine/video_engine_core.gypi third_party/webrtc/build/arm_neon.gypi third_party/libvpx/libvpx.gyp third_party/webrtc/common_audio/common_audio.gyp third_party/libyuv/libyuv.gyp third_party/webrtc/modules/audio_coding/codecs/isac/main/source/isac.gypi third_party/webrtc/modules/video_processing/main/test/vpm_tests.gypi third_party/webrtc/voice_engine/voice_engine_core.gypi third_party/webrtc/modules/rtp_rtcp/test/testFec/test_fec.gypi third_party/webrtc/modules/video_coding/codecs/tools/video_codecs_tools.gypi third_party/libsrtp/libsrtp.gyp peerconnection_all.gyp third_party/webrtc/modules/audio_coding/codecs/g711/g711.gypi third_party/webrtc/modules/audio_processing/audio_processing_tests.gypi third_party/libvpx/libvpx_srcs_x86.gypi third_party/webrtc/modules/modules.gyp third_party/webrtc/common_audio/signal_processing/signal_processing.gypi third_party/webrtc/video_engine/test/auto_test/vie_auto_test.gypi third_party/libvpx/libvpx_srcs_mips.gypi third_party/webrtc/common_audio/vad/vad.gypi third_party/webrtc/modules/video_coding/codecs/test/video_codecs_test_framework.gypi third_party/webrtc/modules/video_coding/codecs/i420/main/source/i420.gypi third_party/webrtc/modules/audio_coding/codecs/g722/g722.gypi third_party/webrtc/modules/video_coding/codecs/test_framework/test_framework.gypi third_party/webrtc/build/protoc.gypi third_party/protobuf/protobuf.gyp
|
||||
Makefile: third_party/webrtc/build/common.gypi third_party/webrtc/common_video/common_video.gyp third_party/webrtc/video_engine/video_engine.gyp third_party/webrtc/modules/audio_coding/neteq/neteq.gypi third_party/libvpx/libvpx_srcs_arm.gypi build/filename_rules.gypi third_party/webrtc/modules/media_file/source/media_file.gypi third_party/jsoncpp/jsoncpp.gyp base/base.gyp third_party/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp_tests.gypi third_party/webrtc/modules/audio_processing/audio_processing.gypi third_party/webrtc/modules/video_processing/main/source/video_processing.gypi third_party/webrtc/system_wrappers/source/system_wrappers.gyp supplement/supplement.gypi third_party/webrtc/modules/audio_coding/codecs/ilbc/ilbc.gypi third_party/webrtc/modules/utility/source/utility.gypi third_party/webrtc/voice_engine/test/voice_engine_tests.gypi build/internal/release_impl.gypi third_party/webrtc/modules/audio_coding/codecs/isac/isacfix_test.gypi third_party/yasm/yasm_compile.gypi net/net.gyp third_party/webrtc/modules/audio_coding/codecs/isac/isac_test.gypi third_party/webrtc/modules/audio_coding/codecs/cng/cng.gypi third_party/libvpx/libvpx_srcs_x86_64.gypi third_party/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.gypi third_party/webrtc/modules/audio_device/audio_device.gypi third_party/libjingle/libjingle.gyp build/internal/release_impl_official.gypi build/internal/release_defaults.gypi third_party/webrtc/modules/rtp_rtcp/source/rtp_rtcp.gypi third_party/webrtc/modules/video_render/main/source/video_render.gypi third_party/libjpeg_turbo/libjpeg.gyp third_party/webrtc/modules/rtp_rtcp/test/testAPI/test_api.gypi third_party/webrtc/modules/udp_transport/source/udp_transport.gypi third_party/libvpx/libvpx_srcs_arm_neon.gypi third_party/webrtc/voice_engine/voice_engine.gyp third_party/webrtc/common_audio/resampler/resampler.gypi third_party/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer.gypi build/win_precompile.gypi third_party/expat/expat.gyp third_party/webrtc/modules/video_coding/main/source/video_coding_test.gypi third_party/yasm/yasm.gyp third_party/webrtc/modules/video_capture/main/source/video_capture.gypi third_party/webrtc/video_engine/test/libvietest/libvietest.gypi third_party/webrtc/modules/video_coding/codecs/vp8/vp8.gyp third_party/webrtc/modules/bitrate_controller/bitrate_controller.gypi third_party/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.gypi third_party/webrtc/modules/video_coding/main/source/video_coding.gypi third_party/webrtc/modules/audio_coding/main/source/audio_coding_module.gypi build/release.gypi peerconnection.gyp build/common.gypi third_party/webrtc/video_engine/video_engine_core.gypi third_party/webrtc/build/arm_neon.gypi third_party/libvpx/libvpx.gyp third_party/webrtc/common_audio/common_audio.gyp third_party/libyuv/libyuv.gyp third_party/webrtc/modules/audio_coding/codecs/isac/main/source/isac.gypi third_party/webrtc/modules/video_processing/main/test/vpm_tests.gypi third_party/webrtc/voice_engine/voice_engine_core.gypi third_party/webrtc/modules/rtp_rtcp/test/testFec/test_fec.gypi third_party/webrtc/modules/video_coding/codecs/tools/video_codecs_tools.gypi third_party/libsrtp/libsrtp.gyp peerconnection_all.gyp third_party/webrtc/modules/audio_coding/codecs/g711/g711.gypi third_party/webrtc/modules/audio_processing/audio_processing_tests.gypi third_party/libvpx/libvpx_srcs_x86.gypi third_party/webrtc/modules/modules.gyp third_party/webrtc/common_audio/signal_processing/signal_processing.gypi third_party/webrtc/video_engine/test/auto_test/vie_auto_test.gypi third_party/libvpx/libvpx_srcs_mips.gypi third_party/webrtc/common_audio/vad/vad.gypi third_party/webrtc/modules/video_coding/codecs/test/video_codecs_test_framework.gypi third_party/webrtc/modules/video_coding/codecs/i420/main/source/i420.gypi third_party/webrtc/modules/audio_coding/codecs/g722/g722.gypi third_party/webrtc/modules/video_coding/codecs/test_framework/test_framework.gypi third_party/webrtc/build/protoc.gypi third_party/protobuf/protobuf.gyp
|
||||
$(call do_cmd,regen_makefile)
|
||||
|
||||
# "all" is a concatenation of the "all" targets from all the included
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
'temp_gyp/googleurl.gyp:*',
|
||||
],
|
||||
'conditions': [
|
||||
['OS!="ios"', {
|
||||
['1==1', {
|
||||
'dependencies': [
|
||||
'../cc/cc_tests.gyp:*',
|
||||
'../chrome/chrome.gyp:*',
|
||||
@@ -64,17 +64,17 @@
|
||||
'<(libjpeg_gyp_path):*',
|
||||
],
|
||||
}],
|
||||
['os_posix==1 and OS!="android" and OS!="ios"', {
|
||||
['os_posix==1', {
|
||||
'dependencies': [
|
||||
'../third_party/yasm/yasm.gyp:*#host',
|
||||
],
|
||||
}],
|
||||
['OS=="mac" or OS=="ios" or OS=="win"', {
|
||||
['OS=="mac" or OS=="win"', {
|
||||
'dependencies': [
|
||||
'../third_party/nss/nss.gyp:*',
|
||||
],
|
||||
}],
|
||||
['OS=="win" or OS=="ios" or OS=="linux"', {
|
||||
['OS=="win" or OS=="linux"', {
|
||||
'dependencies': [
|
||||
'../breakpad/breakpad.gyp:*',
|
||||
],
|
||||
@@ -184,7 +184,7 @@
|
||||
'temp_gyp/googleurl.gyp:googleurl_unittests',
|
||||
],
|
||||
'conditions': [
|
||||
['OS!="ios"', {
|
||||
['1==1', {
|
||||
'dependencies': [
|
||||
'../cc/cc_tests.gyp:cc_unittests',
|
||||
'../chrome/chrome.gyp:browser_tests',
|
||||
@@ -246,16 +246,8 @@
|
||||
}, # target_name: chromium_2010_builder_tests
|
||||
],
|
||||
'conditions': [
|
||||
['OS!="ios"', {
|
||||
['1==1', {
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'chromium_builder_nacl_win_integration',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'chromium_builder_qa', # needed for pyauto
|
||||
'chromium_builder_tests',
|
||||
],
|
||||
}, # target_name: chromium_builder_nacl_win_integration
|
||||
{
|
||||
'target_name': 'chromium_builder_perf',
|
||||
'type': 'none',
|
||||
@@ -576,14 +568,6 @@
|
||||
'../webkit/webkit.gyp:pull_in_DumpRenderTree',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'chromium_builder_qa_nacl_win64',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'chromium_builder_qa', # needed for pyauto
|
||||
'../chrome/chrome.gyp:chrome_nacl_win64',
|
||||
],
|
||||
}, # target_name: chromium_builder_qa_nacl_win64
|
||||
], # targets
|
||||
'conditions': [
|
||||
['branding=="Chrome"', {
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
# Copyright (c) 2012 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.
|
||||
|
||||
# This is all.gyp file for Android to prevent breakage in Android and other
|
||||
# platform; It will be churning a lot in the short term and eventually be merged
|
||||
# into all.gyp.
|
||||
|
||||
{
|
||||
'variables': {
|
||||
# A hook that can be overridden in other repositories to add additional
|
||||
# compilation targets to 'All'
|
||||
'android_app_targets%': [],
|
||||
},
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'All',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'../content/content.gyp:content_shell_apk',
|
||||
'<@(android_app_targets)',
|
||||
'android_builder_tests',
|
||||
'../android_webview/android_webview.gyp:android_webview_apk',
|
||||
'../chrome/chrome.gyp:chromium_testshell',
|
||||
],
|
||||
}, # target_name: All
|
||||
{
|
||||
# The current list of tests for android. This is temporary
|
||||
# until the full set supported. If adding a new test here,
|
||||
# please also add it to build/android/run_tests.py, else the
|
||||
# test is not run.
|
||||
#
|
||||
# WARNING:
|
||||
# Do not add targets here without communicating the implications
|
||||
# on tryserver triggers and load. Discuss with jrg please.
|
||||
'target_name': 'android_builder_tests',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'../base/android/jni_generator/jni_generator.gyp:jni_generator_tests',
|
||||
'../base/base.gyp:base_unittests',
|
||||
'../cc/cc_tests.gyp:cc_unittests',
|
||||
'../chrome/chrome.gyp:unit_tests',
|
||||
'../content/content.gyp:content_shell_test_apk',
|
||||
'../content/content.gyp:content_unittests',
|
||||
'../gpu/gpu.gyp:gpu_unittests',
|
||||
'../ipc/ipc.gyp:ipc_tests',
|
||||
'../media/media.gyp:media_unittests',
|
||||
'../net/net.gyp:net_unittests',
|
||||
'../sql/sql.gyp:sql_unittests',
|
||||
'../sync/sync.gyp:sync_unit_tests',
|
||||
'../third_party/WebKit/Source/WebKit/chromium/All.gyp:*',
|
||||
'../tools/android/device_stats_monitor/device_stats_monitor.gyp:device_stats_monitor',
|
||||
'../tools/android/fake_dns/fake_dns.gyp:fake_dns',
|
||||
'../tools/android/forwarder2/forwarder.gyp:forwarder2',
|
||||
'../tools/android/md5sum/md5sum.gyp:md5sum',
|
||||
'../ui/ui.gyp:ui_unittests',
|
||||
# From here down: not added to run_tests.py yet.
|
||||
'../jingle/jingle.gyp:jingle_unittests',
|
||||
# Required by ui_unittests.
|
||||
# TODO(wangxianzhu): It'd better let ui_unittests depend on it, but
|
||||
# this would cause circular gyp dependency which needs refactoring the
|
||||
# gyps to resolve.
|
||||
'../chrome/chrome_resources.gyp:packed_resources',
|
||||
],
|
||||
'conditions': [
|
||||
['linux_breakpad==1', {
|
||||
'dependencies': [
|
||||
'../breakpad/breakpad.gyp:breakpad_unittests',
|
||||
],
|
||||
}],
|
||||
['"<(gtest_target_type)"=="shared_library"', {
|
||||
'dependencies': [
|
||||
# The first item is simply the template. We add as a dep
|
||||
# to make sure it builds in ungenerated form. TODO(jrg):
|
||||
# once stable, transition to a test-only (optional)
|
||||
# target.
|
||||
'../testing/android/native_test.gyp:native_test_apk',
|
||||
# Unit test bundles packaged as an apk.
|
||||
'../base/base.gyp:base_unittests_apk',
|
||||
'../cc/cc_tests.gyp:cc_unittests_apk',
|
||||
'../chrome/chrome.gyp:unit_tests_apk',
|
||||
'../content/content.gyp:content_unittests_apk',
|
||||
'../gpu/gpu.gyp:gpu_unittests_apk',
|
||||
'../ipc/ipc.gyp:ipc_tests_apk',
|
||||
'../media/media.gyp:media_unittests_apk',
|
||||
'../net/net.gyp:net_unittests_apk',
|
||||
'../sql/sql.gyp:sql_unittests_apk',
|
||||
'../sync/sync.gyp:sync_unit_tests_apk',
|
||||
'../ui/ui.gyp:ui_unittests_apk',
|
||||
'../android_webview/android_webview.gyp:android_webview_test_apk',
|
||||
'../chrome/chrome.gyp:chromium_testshell_test_apk',
|
||||
],
|
||||
}],
|
||||
],
|
||||
},
|
||||
{
|
||||
# Experimental / in-progress targets that are expected to fail
|
||||
# but we still try to compile them on bots (turning the stage
|
||||
# orange, not red).
|
||||
'target_name': 'android_experimental',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
],
|
||||
},
|
||||
{
|
||||
# In-progress targets that are expected to fail and are NOT run
|
||||
# on any bot.
|
||||
'target_name': 'android_in_progress',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'../content/content.gyp:content_browsertests',
|
||||
],
|
||||
},
|
||||
], # targets
|
||||
}
|
||||
@@ -1,139 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2012 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.
|
||||
#
|
||||
# A collection of functions useful for maintaining android devices
|
||||
|
||||
|
||||
# Run an adb command on all connected device in parallel.
|
||||
# Usage: adb_all command line to eval. Quoting is optional.
|
||||
#
|
||||
# Examples:
|
||||
# adb_all install Chrome.apk
|
||||
# adb_all 'shell cat /path/to/file'
|
||||
#
|
||||
adb_all() {
|
||||
if [[ $# == 0 ]]; then
|
||||
echo "Usage: adb_all <adb command>. Quoting is optional."
|
||||
echo "Example: adb_all install Chrome.apk"
|
||||
return 1
|
||||
fi
|
||||
local DEVICES=$(adb_get_devices -b)
|
||||
local NUM_DEVICES=$(echo $DEVICES | wc -w)
|
||||
if (( $NUM_DEVICES > 1 )); then
|
||||
echo "Looping over $NUM_DEVICES devices"
|
||||
fi
|
||||
_adb_multi "$DEVICES" "$*"
|
||||
}
|
||||
|
||||
|
||||
# Run a command on each connected device. Quoting the command is suggested but
|
||||
# not required. The script setups up variable DEVICE to correspond to the
|
||||
# current serial number. Intended for complex one_liners that don't work in
|
||||
# adb_all
|
||||
# Usage: adb_device_loop 'command line to eval'
|
||||
adb_device_loop() {
|
||||
if [[ $# == 0 ]]; then
|
||||
echo "Intended for more complex one-liners that cannot be done with" \
|
||||
"adb_all."
|
||||
echo 'Usage: adb_device_loop "echo $DEVICE: $(adb root &&' \
|
||||
'adb shell cat /data/local.prop)"'
|
||||
return 1
|
||||
fi
|
||||
local DEVICES=$(adb_get_devices)
|
||||
if [[ -z $DEVICES ]]; then
|
||||
return
|
||||
fi
|
||||
# Do not change DEVICE variable name - part of api
|
||||
for DEVICE in $DEVICES; do
|
||||
DEV_TYPE=$(adb -s $DEVICE shell getprop ro.product.device | sed 's/\r//')
|
||||
echo "Running on $DEVICE ($DEV_TYPE)"
|
||||
ANDROID_SERIAL=$DEVICE eval "$*"
|
||||
done
|
||||
}
|
||||
|
||||
# Erases data from any devices visible on adb. To preserve a device,
|
||||
# disconnect it or:
|
||||
# 1) Reboot it into fastboot with 'adb reboot bootloader'
|
||||
# 2) Run wipe_all_devices to wipe remaining devices
|
||||
# 3) Restore device it with 'fastboot reboot'
|
||||
#
|
||||
# Usage: wipe_all_devices [-f]
|
||||
#
|
||||
wipe_all_devices() {
|
||||
if [[ -z $(which adb) || -z $(which fastboot) ]]; then
|
||||
echo "aborting: adb and fastboot not in path"
|
||||
return 1
|
||||
elif ! $(groups | grep -q 'plugdev'); then
|
||||
echo "If fastboot fails, run: 'sudo adduser $(whoami) plugdev'"
|
||||
fi
|
||||
|
||||
local DEVICES=$(adb_get_devices -b)
|
||||
|
||||
if [[ $1 != '-f' ]]; then
|
||||
echo "This will ERASE ALL DATA from $(echo $DEVICES | wc -w) device."
|
||||
read -p "Hit enter to continue"
|
||||
fi
|
||||
|
||||
_adb_multi "$DEVICES" "reboot bootloader"
|
||||
# Subshell to isolate job list
|
||||
(
|
||||
for DEVICE in $DEVICES; do
|
||||
fastboot_erase $DEVICE &
|
||||
done
|
||||
wait
|
||||
)
|
||||
|
||||
# Reboot devices together
|
||||
for DEVICE in $DEVICES; do
|
||||
fastboot -s $DEVICE reboot
|
||||
done
|
||||
}
|
||||
|
||||
# Wipe a device in fastboot.
|
||||
# Usage fastboot_erase [serial]
|
||||
fastboot_erase() {
|
||||
if [[ -n $1 ]]; then
|
||||
echo "Wiping $1"
|
||||
local SERIAL="-s $1"
|
||||
else
|
||||
if [ -z $(fastboot devices) ]; then
|
||||
echo "No devices in fastboot, aborting."
|
||||
echo "Check out wipe_all_devices to see if sufficient"
|
||||
echo "You can put a device in fastboot using adb reboot bootloader"
|
||||
return 1
|
||||
fi
|
||||
local SERIAL=""
|
||||
fi
|
||||
fastboot $SERIAL erase cache
|
||||
fastboot $SERIAL erase userdata
|
||||
}
|
||||
|
||||
# Get list of devices connected via adb
|
||||
# Args: -b block until adb detects a device
|
||||
adb_get_devices() {
|
||||
local DEVICES="$(adb devices | grep 'device$')"
|
||||
if [[ -z $DEVICES && $1 == '-b' ]]; then
|
||||
echo '- waiting for device -' >&2
|
||||
local DEVICES="$(adb wait-for-device devices | grep 'device$')"
|
||||
fi
|
||||
echo "$DEVICES" | awk -vORS=' ' '{print $1}' | sed 's/ $/\n/'
|
||||
}
|
||||
|
||||
###################################################
|
||||
## HELPER FUNCTIONS
|
||||
###################################################
|
||||
|
||||
# Run an adb command in parallel over a device list
|
||||
_adb_multi() {
|
||||
local DEVICES=$1
|
||||
local ADB_ARGS=$2
|
||||
(
|
||||
for DEVICE in $DEVICES; do
|
||||
adb -s $DEVICE $ADB_ARGS &
|
||||
done
|
||||
wait
|
||||
)
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2012 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.
|
||||
#
|
||||
# Kill a running content shell.
|
||||
#
|
||||
# Assumes you have sourced the build/android/envsetup.sh script.
|
||||
|
||||
SHELL_PID_LINES=$(adb shell ps | grep ' org.chromium.content_shell')
|
||||
VAL=$(echo "$SHELL_PID_LINES" | wc -l)
|
||||
if [ $VAL -lt 1 ] ; then
|
||||
echo "Not running Content shell."
|
||||
else
|
||||
SHELL_PID=$(echo $SHELL_PID_LINES | awk '{print $2}')
|
||||
if [ "$SHELL_PID" != "" ] ; then
|
||||
set -x
|
||||
adb shell kill $SHELL_PID
|
||||
set -
|
||||
else
|
||||
echo "Content shell does not appear to be running."
|
||||
fi
|
||||
fi
|
||||
@@ -1,155 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (c) 2012 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.
|
||||
|
||||
"""Saves logcats from all connected devices.
|
||||
|
||||
Usage: adb_logcat_monitor.py <base_dir> [<adb_binary_path>]
|
||||
|
||||
This script will repeatedly poll adb for new devices and save logcats
|
||||
inside the <base_dir> directory, which it attempts to create. The
|
||||
script will run until killed by an external signal. To test, run the
|
||||
script in a shell and <Ctrl>-C it after a while. It should be
|
||||
resilient across phone disconnects and reconnects and start the logcat
|
||||
early enough to not miss anything.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
# Map from device_id -> (process, logcat_num)
|
||||
devices = {}
|
||||
|
||||
|
||||
class TimeoutException(Exception):
|
||||
"""Exception used to signal a timeout."""
|
||||
pass
|
||||
|
||||
|
||||
class SigtermError(Exception):
|
||||
"""Exception used to catch a sigterm."""
|
||||
pass
|
||||
|
||||
|
||||
def StartLogcatIfNecessary(device_id, adb_cmd, base_dir):
|
||||
"""Spawns a adb logcat process if one is not currently running."""
|
||||
process, logcat_num = devices[device_id]
|
||||
if process:
|
||||
if process.poll() is None:
|
||||
# Logcat process is still happily running
|
||||
return
|
||||
else:
|
||||
logging.info('Logcat for device %s has died', device_id)
|
||||
error_filter = re.compile('- waiting for device -')
|
||||
for line in process.stderr:
|
||||
if not error_filter.match(line):
|
||||
logging.error(device_id + ': ' + line)
|
||||
|
||||
logging.info('Starting logcat %d for device %s', logcat_num,
|
||||
device_id)
|
||||
logcat_filename = 'logcat_%s_%03d' % (device_id, logcat_num)
|
||||
logcat_file = open(os.path.join(base_dir, logcat_filename), 'w')
|
||||
process = subprocess.Popen([adb_cmd, '-s', device_id,
|
||||
'logcat', '-v', 'threadtime'],
|
||||
stdout=logcat_file,
|
||||
stderr=subprocess.PIPE)
|
||||
devices[device_id] = (process, logcat_num + 1)
|
||||
|
||||
|
||||
def GetAttachedDevices(adb_cmd):
|
||||
"""Gets the device list from adb.
|
||||
|
||||
We use an alarm in this function to avoid deadlocking from an external
|
||||
dependency.
|
||||
|
||||
Args:
|
||||
adb_cmd: binary to run adb
|
||||
|
||||
Returns:
|
||||
list of devices or an empty list on timeout
|
||||
"""
|
||||
signal.alarm(2)
|
||||
try:
|
||||
out, err = subprocess.Popen([adb_cmd, 'devices'],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE).communicate()
|
||||
if err:
|
||||
logging.warning('adb device error %s', err.strip())
|
||||
return re.findall('^(\w+)\tdevice$', out, re.MULTILINE)
|
||||
except TimeoutException:
|
||||
logging.warning('"adb devices" command timed out')
|
||||
return []
|
||||
except (IOError, OSError):
|
||||
logging.exception('Exception from "adb devices"')
|
||||
return []
|
||||
finally:
|
||||
signal.alarm(0)
|
||||
|
||||
|
||||
def main(base_dir, adb_cmd='adb'):
|
||||
"""Monitor adb forever. Expects a SIGINT (Ctrl-C) to kill."""
|
||||
# We create the directory to ensure 'run once' semantics
|
||||
if os.path.exists(base_dir):
|
||||
print('adb_logcat_monitor: %s already exists? Cleaning' % base_dir)
|
||||
shutil.rmtree(base_dir, ignore_errors=True)
|
||||
|
||||
os.makedirs(base_dir)
|
||||
logging.basicConfig(filename=os.path.join(base_dir, 'eventlog'),
|
||||
level=logging.INFO,
|
||||
format='%(asctime)-2s %(levelname)-8s %(message)s')
|
||||
|
||||
# Set up the alarm for calling 'adb devices'. This is to ensure
|
||||
# our script doesn't get stuck waiting for a process response
|
||||
def TimeoutHandler(_, unused_frame):
|
||||
raise TimeoutException()
|
||||
signal.signal(signal.SIGALRM, TimeoutHandler)
|
||||
|
||||
# Handle SIGTERMs to ensure clean shutdown
|
||||
def SigtermHandler(_, unused_frame):
|
||||
raise SigtermError()
|
||||
signal.signal(signal.SIGTERM, SigtermHandler)
|
||||
|
||||
logging.info('Started with pid %d', os.getpid())
|
||||
pid_file_path = os.path.join(base_dir, 'LOGCAT_MONITOR_PID')
|
||||
|
||||
try:
|
||||
with open(pid_file_path, 'w') as f:
|
||||
f.write(str(os.getpid()))
|
||||
while True:
|
||||
for device_id in GetAttachedDevices(adb_cmd):
|
||||
if not device_id in devices:
|
||||
devices[device_id] = (None, 0)
|
||||
|
||||
for device in devices:
|
||||
# This will spawn logcat watchers for any device ever detected
|
||||
StartLogcatIfNecessary(device, adb_cmd, base_dir)
|
||||
|
||||
time.sleep(5)
|
||||
except SigtermError:
|
||||
logging.info('Received SIGTERM, shutting down')
|
||||
except:
|
||||
logging.exception('Unexpected exception in main.')
|
||||
finally:
|
||||
for process, _ in devices.values():
|
||||
if process:
|
||||
try:
|
||||
process.terminate()
|
||||
except OSError:
|
||||
pass
|
||||
os.remove(pid_file_path)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if 2 <= len(sys.argv) <= 3:
|
||||
print('adb_logcat_monitor: Initializing')
|
||||
sys.exit(main(*sys.argv[1:3]))
|
||||
|
||||
print('Usage: %s <base_dir> [<adb_binary_path>]' % sys.argv[0])
|
||||
@@ -1,202 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright (c) 2012 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.
|
||||
|
||||
"""Shutdown adb_logcat_monitor and print accumulated logs.
|
||||
|
||||
To test, call './adb_logcat_printer.py <base_dir>' where
|
||||
<base_dir> contains 'adb logcat -v threadtime' files named as
|
||||
logcat_<deviceID>_<sequenceNum>
|
||||
|
||||
The script will print the files to out, and will combine multiple
|
||||
logcats from a single device if there is overlap.
|
||||
|
||||
Additionally, if a <base_dir>/LOGCAT_MONITOR_PID exists, the script
|
||||
will attempt to terminate the contained PID by sending a SIGINT and
|
||||
monitoring for the deletion of the aforementioned file.
|
||||
"""
|
||||
|
||||
import io
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import signal
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
# Set this to debug for more verbose output
|
||||
LOG_LEVEL = logging.INFO
|
||||
|
||||
|
||||
def CombineLogFiles(list_of_lists, logger):
|
||||
"""Splices together multiple logcats from the same device.
|
||||
|
||||
Args:
|
||||
list_of_lists: list of pairs (filename, list of timestamped lines)
|
||||
logger: handler to log events
|
||||
|
||||
Returns:
|
||||
list of lines with duplicates removed
|
||||
"""
|
||||
cur_device_log = ['']
|
||||
for cur_file, cur_file_lines in list_of_lists:
|
||||
# Ignore files with just the logcat header
|
||||
if len(cur_file_lines) < 2:
|
||||
continue
|
||||
common_index = 0
|
||||
# Skip this step if list just has empty string
|
||||
if len(cur_device_log) > 1:
|
||||
try:
|
||||
line = cur_device_log[-1]
|
||||
# Used to make sure we only splice on a timestamped line
|
||||
if re.match('^\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} ', line):
|
||||
common_index = cur_file_lines.index(line)
|
||||
else:
|
||||
logger.warning('splice error - no timestamp in "%s"?', line.strip())
|
||||
except ValueError:
|
||||
# The last line was valid but wasn't found in the next file
|
||||
cur_device_log += ['***** POSSIBLE INCOMPLETE LOGCAT *****']
|
||||
logger.info('Unable to splice %s. Incomplete logcat?', cur_file)
|
||||
|
||||
cur_device_log += ['*'*30 + ' %s' % cur_file]
|
||||
cur_device_log.extend(cur_file_lines[common_index:])
|
||||
|
||||
return cur_device_log
|
||||
|
||||
|
||||
def FindLogFiles(base_dir):
|
||||
"""Search a directory for logcat files.
|
||||
|
||||
Args:
|
||||
base_dir: directory to search
|
||||
|
||||
Returns:
|
||||
Mapping of device_id to a sorted list of file paths for a given device
|
||||
"""
|
||||
logcat_filter = re.compile('^logcat_(\w+)_(\d+)$')
|
||||
# list of tuples (<device_id>, <seq num>, <full file path>)
|
||||
filtered_list = []
|
||||
for cur_file in os.listdir(base_dir):
|
||||
matcher = logcat_filter.match(cur_file)
|
||||
if matcher:
|
||||
filtered_list += [(matcher.group(1), int(matcher.group(2)),
|
||||
os.path.join(base_dir, cur_file))]
|
||||
filtered_list.sort()
|
||||
file_map = {}
|
||||
for device_id, _, cur_file in filtered_list:
|
||||
if not device_id in file_map:
|
||||
file_map[device_id] = []
|
||||
|
||||
file_map[device_id] += [cur_file]
|
||||
return file_map
|
||||
|
||||
|
||||
def GetDeviceLogs(log_filenames, logger):
|
||||
"""Read log files, combine and format.
|
||||
|
||||
Args:
|
||||
log_filenames: mapping of device_id to sorted list of file paths
|
||||
logger: logger handle for logging events
|
||||
|
||||
Returns:
|
||||
list of formatted device logs, one for each device.
|
||||
"""
|
||||
device_logs = []
|
||||
|
||||
for device, device_files in log_filenames.items():
|
||||
logger.debug('%s: %s', device, str(device_files))
|
||||
device_file_lines = []
|
||||
for cur_file in device_files:
|
||||
with open(cur_file) as f:
|
||||
device_file_lines += [(cur_file, f.read().splitlines())]
|
||||
combined_lines = CombineLogFiles(device_file_lines, logger)
|
||||
# Prepend each line with a short unique ID so it's easy to see
|
||||
# when the device changes. We don't use the start of the device
|
||||
# ID because it can be the same among devices. Example lines:
|
||||
# AB324: foo
|
||||
# AB324: blah
|
||||
device_logs += [('\n' + device[-5:] + ': ').join(combined_lines)]
|
||||
return device_logs
|
||||
|
||||
|
||||
def ShutdownLogcatMonitor(base_dir, logger):
|
||||
"""Attempts to shutdown adb_logcat_monitor and blocks while waiting."""
|
||||
try:
|
||||
monitor_pid_path = os.path.join(base_dir, 'LOGCAT_MONITOR_PID')
|
||||
with open(monitor_pid_path) as f:
|
||||
monitor_pid = int(f.readline())
|
||||
|
||||
logger.info('Sending SIGTERM to %d', monitor_pid)
|
||||
os.kill(monitor_pid, signal.SIGTERM)
|
||||
i = 0
|
||||
while True:
|
||||
time.sleep(.2)
|
||||
if not os.path.exists(monitor_pid_path):
|
||||
return
|
||||
if not os.path.exists('/proc/%d' % monitor_pid):
|
||||
logger.warning('Monitor (pid %d) terminated uncleanly?', monitor_pid)
|
||||
return
|
||||
logger.info('Waiting for logcat process to terminate.')
|
||||
i += 1
|
||||
if i >= 10:
|
||||
logger.warning('Monitor pid did not terminate. Continuing anyway.')
|
||||
return
|
||||
|
||||
except (ValueError, IOError, OSError):
|
||||
logger.exception('Error signaling logcat monitor - continuing')
|
||||
|
||||
|
||||
def main(base_dir, output_file):
|
||||
log_stringio = io.StringIO()
|
||||
logger = logging.getLogger('LogcatPrinter')
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
sh = logging.StreamHandler(log_stringio)
|
||||
sh.setFormatter(logging.Formatter('%(asctime)-2s %(levelname)-8s'
|
||||
' %(message)s'))
|
||||
logger.addHandler(sh)
|
||||
|
||||
try:
|
||||
# Wait at least 5 seconds after base_dir is created before printing.
|
||||
#
|
||||
# The idea is that 'adb logcat > file' output consists of 2 phases:
|
||||
# 1 Dump all the saved logs to the file
|
||||
# 2 Stream log messages as they are generated
|
||||
#
|
||||
# We want to give enough time for phase 1 to complete. There's no
|
||||
# good method to tell how long to wait, but it usually only takes a
|
||||
# second. On most bots, this code path won't occur at all, since
|
||||
# adb_logcat_monitor.py command will have spawned more than 5 seconds
|
||||
# prior to called this shell script.
|
||||
try:
|
||||
sleep_time = 5 - (time.time() - os.path.getctime(base_dir))
|
||||
except OSError:
|
||||
sleep_time = 5
|
||||
if sleep_time > 0:
|
||||
logger.warning('Monitor just started? Sleeping %.1fs', sleep_time)
|
||||
time.sleep(sleep_time)
|
||||
|
||||
assert os.path.exists(base_dir), '%s does not exist' % base_dir
|
||||
ShutdownLogcatMonitor(base_dir, logger)
|
||||
separator = '\n' + '*' * 80 + '\n\n'
|
||||
for log in GetDeviceLogs(FindLogFiles(base_dir), logger):
|
||||
output_file.write(log)
|
||||
output_file.write(separator)
|
||||
with open(os.path.join(base_dir, 'eventlog')) as f:
|
||||
output_file.write('\nLogcat Monitor Event Log\n')
|
||||
output_file.write(f.read())
|
||||
except:
|
||||
logger.exception('Unexpected exception')
|
||||
|
||||
logger.info('Done.')
|
||||
sh.flush()
|
||||
output_file.write('\nLogcat Printer Event Log\n')
|
||||
output_file.write(log_stringio.getvalue())
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) == 1:
|
||||
print('Usage: %s <base_dir>' % sys.argv[0])
|
||||
sys.exit(1)
|
||||
sys.exit(main(sys.argv[1], sys.stdout))
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) 2012 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.
|
||||
|
||||
if [ $# -gt 0 ] ; then
|
||||
INTENT_ARGS='-d "$1"' # e.g. a URL
|
||||
fi
|
||||
|
||||
adb shell am start \
|
||||
-a android.intent.action.VIEW \
|
||||
-n org.chromium.content_shell/.ContentShellActivity \
|
||||
$INTENT_ARGS
|
||||
@@ -1,97 +0,0 @@
|
||||
<!--
|
||||
Copyright (c) 2012 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.
|
||||
-->
|
||||
<project name="chromium-jars" default="dist">
|
||||
<!--
|
||||
Common ant build file for for chromium_*.jars.
|
||||
For creating a new chromium_*.jar :
|
||||
1. Use build/java.gypi action.
|
||||
The jar will be created as chromium_${PACKAGE_NAME} in
|
||||
${PRODUCT_DIR}/lib.java.
|
||||
-->
|
||||
<description>
|
||||
Building ${PROJECT_NAME}/ java source code with ant.
|
||||
</description>
|
||||
|
||||
<import file="common.xml"/>
|
||||
|
||||
<path id="javac.custom.classpath">
|
||||
<filelist files="${INPUT_JARS_PATHS}"/>
|
||||
<pathelement location="${ANDROID_SDK}/android.jar"/>
|
||||
</path>
|
||||
|
||||
<path id="javac.srcdirs.additional">
|
||||
<filelist files="${ADDITIONAL_SRC_DIRS}"/>
|
||||
<filelist files="${GENERATED_SRC_DIRS}"/>
|
||||
</path>
|
||||
|
||||
<property-value
|
||||
name="javac.srcdir"
|
||||
value="src:${toString:javac.srcdirs.additional}"
|
||||
/>
|
||||
|
||||
<property-location
|
||||
name="dest.dir"
|
||||
location="${PRODUCT_DIR}/java/${PACKAGE_NAME}"
|
||||
check-exists="false"
|
||||
/>
|
||||
|
||||
<target name="init">
|
||||
<!-- Create the time stamp -->
|
||||
<tstamp/>
|
||||
<!-- Create the build directory structure used by compile -->
|
||||
<mkdir dir="${dest.dir}"/>
|
||||
|
||||
<!-- Remove all .class files from dest.dir. This prevents inclusion of
|
||||
incorrect .class files in the final .jar. For example, if a .java file
|
||||
was deleted, the .jar should not contain the .class files for that
|
||||
.java from previous builds.
|
||||
-->
|
||||
<delete>
|
||||
<fileset dir="${dest.dir}" includes="**/*.class"/>
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="init" description="Compiles source.">
|
||||
<fail message="Error: javac.custom.classpath is not set. Please set it to
|
||||
classpath for javac.">
|
||||
<condition>
|
||||
<not><isreference refid="javac.custom.classpath"/></not>
|
||||
</condition>
|
||||
</fail>
|
||||
|
||||
<echo>
|
||||
Compiling ${javac.srcdir}, classpath: ${toString:javac.custom.classpath}
|
||||
</echo>
|
||||
|
||||
<javac
|
||||
srcdir="${javac.srcdir}"
|
||||
destdir="${dest.dir}"
|
||||
classpathref="javac.custom.classpath"
|
||||
debug="true"
|
||||
includeantruntime="false"
|
||||
/>
|
||||
</target>
|
||||
|
||||
<target name="dist" depends="compile"
|
||||
description="Generate chromium_${PACKAGE_NAME}.jar.">
|
||||
<!-- Create the distribution directory -->
|
||||
<jar
|
||||
jarfile="${lib.java.dir}/chromium_${PACKAGE_NAME}.jar"
|
||||
basedir="${dest.dir}"
|
||||
/>
|
||||
|
||||
<!-- If Gyp thinks this output is stale but Ant doesn't, the modification
|
||||
time should still be updated. Otherwise, this target will continue to
|
||||
be rebuilt in future builds.
|
||||
-->
|
||||
<touch file="${lib.java.dir}/chromium_${PACKAGE_NAME}.jar"/>
|
||||
</target>
|
||||
|
||||
<target name="clean" description="clean up">
|
||||
<!-- Delete the appropriate directory trees -->
|
||||
<delete dir="${dest.dir}"/>
|
||||
</target>
|
||||
</project>
|
||||
@@ -1,90 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2012 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.
|
||||
-->
|
||||
<project name="chrome_common_defines">
|
||||
<!-- Common build properties for Chrome for android. -->
|
||||
|
||||
<!--
|
||||
Macro for checking that a property is correctly set. Performs checks for:
|
||||
1. Property is set and not null.
|
||||
2. String value of property does not contains any '$' signs.
|
||||
-->
|
||||
<macrodef name="check-property-value">
|
||||
<attribute name="property"/>
|
||||
<sequential>
|
||||
<fail message ="Property @{property} is not set.">
|
||||
<condition>
|
||||
<or>
|
||||
<not><isset property="@{property}"/></not>
|
||||
<length string="${@{property}}" trim="true" when="less" length="1"/>
|
||||
</or>
|
||||
</condition>
|
||||
</fail>
|
||||
<!--
|
||||
Check for $ signs. This catches errors when properties are initialized from environment
|
||||
variables. E.g. if we have <property name="foo" value="${env.bar}" /> but env.bar is
|
||||
not set then foo will have the literal value of '${env.bar}'.
|
||||
-->
|
||||
<fail message="Value checked failed for property: @{property} : ${@{property}}.
|
||||
Property value contains an uninitialized environment variable.">
|
||||
<condition>
|
||||
<contains string="${@{property}}" substring="$"/>
|
||||
</condition>
|
||||
</fail>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
<!--
|
||||
A safe setter for location properties. Checks that a location is not
|
||||
empty and actually exists. For specifying output directories, location
|
||||
check can be disabled by specifying check-exists="false".
|
||||
-->
|
||||
<macrodef name="property-location">
|
||||
<attribute name="name"/>
|
||||
<attribute name="location"/>
|
||||
<attribute name="check-exists" default="true"/>
|
||||
<sequential>
|
||||
<property name="@{name}" location="@{location}"/>
|
||||
<check-property-value property="@{name}"/>
|
||||
<fail message="Location specified for @{name} : @{location} does not exist.">
|
||||
<condition>
|
||||
<and>
|
||||
<equals arg1="@{check-exists}" arg2="true"/>
|
||||
<not><available file="@{location}"/></not>
|
||||
</and>
|
||||
</condition>
|
||||
</fail>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
<!-- A safe setter for property values -->
|
||||
<macrodef name="property-value">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="@{value}"/>
|
||||
<check-property-value property="@{name}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
<!-- Common environment properties. -->
|
||||
<property-location name="sdk.dir" location="${ANDROID_SDK_ROOT}"/>
|
||||
<property-value name="target" value="android-${ANDROID_SDK_VERSION}"/>
|
||||
<property name="source.dir" location="src"/>
|
||||
<property-location name="android.gdbserver" location="${ANDROID_GDBSERVER}"/>
|
||||
<!--
|
||||
Common directories used by SDK Build, when making changes here
|
||||
make sure to update gyp files and test scripts constants in
|
||||
build/android/pylib/constants.py
|
||||
-->
|
||||
<!-- Common directory for chromium_*.jars. -->
|
||||
<property-location name="lib.java.dir" location="${PRODUCT_DIR}/lib.java"/>
|
||||
<!-- Common directory for test jars. -->
|
||||
<property-location name="test.lib.java.dir"
|
||||
location="${PRODUCT_DIR}/test.lib.java"/>
|
||||
<!-- Common directory for apks. -->
|
||||
<property-location name="apks.dir" location="${PRODUCT_DIR}/apks"/>
|
||||
</project>
|
||||
@@ -1,284 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2012 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.
|
||||
-->
|
||||
<project name="chrome_sdk_overrides" >
|
||||
<!--
|
||||
Redefinition of targets used by SDK tools.
|
||||
Supported version: SDK tools revision 20.
|
||||
|
||||
SDK tools do not allow easy way of extending classpaths
|
||||
for aidl and javac. This file defines targets which can be used to
|
||||
override targets used by tools.
|
||||
-->
|
||||
<target name="-pre-compile">
|
||||
<!--
|
||||
Remove all .class files from the output directory. This prevents inclusion of incorrect .class
|
||||
files in the final apk. For example, if a .java file was deleted, the apk should not contain
|
||||
the .class files for that .java from previous builds.
|
||||
-->
|
||||
<delete>
|
||||
<fileset dir="${out.classes.absolute.dir}" includes="**/*.class"/>
|
||||
</delete>
|
||||
</target>
|
||||
|
||||
<!--
|
||||
Override the -compile target.
|
||||
This target requires 'javac.custom.classpath' to be set to reference
|
||||
of classpath to be used for javac. Also accepts custom path for
|
||||
sources: 'javac.custom.sourcepath'.
|
||||
-->
|
||||
<target
|
||||
name="-compile"
|
||||
depends="-build-setup, -pre-build, -code-gen, -pre-compile">
|
||||
<do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..." >
|
||||
<!-- If javac.srcdirs.additional isn't set, set it to an empty path. -->
|
||||
<if>
|
||||
<condition>
|
||||
<not>
|
||||
<isreference refid="javac.srcdirs.additional"/>
|
||||
</not>
|
||||
</condition>
|
||||
<then>
|
||||
<path id="javac.srcdirs.additional"/>
|
||||
</then>
|
||||
</if>
|
||||
<javac
|
||||
bootclasspathref="project.target.class.path"
|
||||
classpathref="javac.custom.classpath"
|
||||
debug="true"
|
||||
destdir="${out.classes.absolute.dir}"
|
||||
encoding="${java.encoding}"
|
||||
extdirs=""
|
||||
fork="${need.javac.fork}"
|
||||
includeantruntime="false"
|
||||
source="${java.source}"
|
||||
target="${java.target}"
|
||||
verbose="${verbose}">
|
||||
<src path="${source.absolute.dir}"/>
|
||||
<src path="${gen.absolute.dir}"/>
|
||||
<src>
|
||||
<path refid="javac.srcdirs.additional"/>
|
||||
</src>
|
||||
<compilerarg line="${java.compilerargs}"/>
|
||||
</javac>
|
||||
<!--
|
||||
If the project is instrumented, then instrument the classes
|
||||
TODO(shashishekhar): Add option to override emma filter.
|
||||
-->
|
||||
<if condition="${build.is.instrumented}">
|
||||
<then>
|
||||
<echo level="info">
|
||||
Instrumenting classes from ${out.absolute.dir}/classes...
|
||||
</echo>
|
||||
<!-- build the default filter to remove R, Manifest, BuildConfig -->
|
||||
<getemmafilter
|
||||
appPackage="${project.app.package}"
|
||||
filterOut="emma.default.filter"
|
||||
libraryPackagesRefId="project.library.packages"/>
|
||||
<!--
|
||||
Define where the .em file is output.
|
||||
This may have been setup already if this is a library.
|
||||
-->
|
||||
<property name="emma.coverage.absolute.file"
|
||||
location="${out.absolute.dir}/coverage.em"/>
|
||||
<!-- It only instruments class files, not any external libs -->
|
||||
|
||||
<emma enabled="true">
|
||||
<instr
|
||||
instrpath="${out.absolute.dir}/classes"
|
||||
metadatafile="${emma.coverage.absolute.file}"
|
||||
mode="overwrite"
|
||||
outdir="${out.absolute.dir}/classes"
|
||||
verbosity="${verbosity}">
|
||||
<filter excludes="${emma.default.filter}"/>
|
||||
<filter value="${emma.filter}"/>
|
||||
</instr>
|
||||
</emma>
|
||||
</then>
|
||||
</if>
|
||||
<!--
|
||||
If the project needs a test jar then generate a jar containing
|
||||
all compiled classes and referenced jars.
|
||||
project.is.testapp is set by Android's ant build system based on the
|
||||
target's manifest. It is true only for instrumentation apks.
|
||||
-->
|
||||
<if condition="${project.is.testapp}">
|
||||
<then>
|
||||
<echo level="info">Creating test jar file:
|
||||
${ant.project.name}-debug.jar</echo>
|
||||
<property-location name="create.test.jar.file"
|
||||
location="${CHROMIUM_SRC}/build/android/ant/create-test-jar.js"/>
|
||||
<script language="javascript" src="${create.test.jar.file}"/>
|
||||
</then>
|
||||
</if>
|
||||
|
||||
</do-only-if-manifest-hasCode>
|
||||
</target>
|
||||
|
||||
<!--
|
||||
For debug builds, the Android SDK tools create a key in ~/.android and sign the build with it.
|
||||
This has caused all kinds of issues. Instead, the debug build should be signed with a key in
|
||||
build/android/ant. The SDK tools do not provide any support for overriding that behavior and so
|
||||
instead one must use the hack below.
|
||||
-->
|
||||
|
||||
<!-- Disables automatic signing. -->
|
||||
<property name="build.is.signing.debug" value="false"/>
|
||||
|
||||
<!-- TODO(cjhopman): Remove this property when all gyp files define the CHROMIUM_SRC property. -->
|
||||
<property name="CHROMIUM_SRC" value="${PRODUCT_DIR}/../.." />
|
||||
|
||||
<property name="key.store" value="${CHROMIUM_SRC}/build/android/ant/chromium-debug.keystore"/>
|
||||
<property name="key.store.password" value="chromium"/>
|
||||
<property name="key.alias" value="chromiumdebugkey"/>
|
||||
<property name="key.alias.password" value="chromium"/>
|
||||
|
||||
<!-- SDK tools assume that out.packaged.file is signed and name it "...-unaligned" -->
|
||||
<property name="out.packaged.file"
|
||||
value="${apks.dir}/${ant.project.name}-debug-unsigned.apk" />
|
||||
<property name="out.unaligned.file"
|
||||
value="${apks.dir}/${ant.project.name}-debug-unaligned.apk" />
|
||||
|
||||
<!-- By default, the SDK tools build only aligns the APK in the -do-debug target. -->
|
||||
<target name="-do-debug"
|
||||
depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
|
||||
<!-- only create apk if *not* a library project -->
|
||||
<do-only-if-not-library elseText="Library project: do not create apk..." >
|
||||
<sequential>
|
||||
<!-- Signs the APK -->
|
||||
<echo level="info">Signing final apk...</echo>
|
||||
<signapk
|
||||
input="${out.packaged.file}"
|
||||
output="${out.unaligned.file}"
|
||||
keystore="${key.store}"
|
||||
storepass="${key.store.password}"
|
||||
alias="${key.alias}"
|
||||
keypass="${key.alias.password}"/>
|
||||
|
||||
<!-- Zip aligns the APK -->
|
||||
<zipalign-helper
|
||||
in.package="${out.unaligned.file}"
|
||||
out.package="${out.final.file}" />
|
||||
<echo level="info">Release Package: ${out.final.file}</echo>
|
||||
</sequential>
|
||||
</do-only-if-not-library>
|
||||
<record-build-info />
|
||||
</target>
|
||||
|
||||
<path id="native.libs.gdbserver">
|
||||
<fileset file="${android.gdbserver}"/>
|
||||
</path>
|
||||
|
||||
<target name="-post-compile">
|
||||
<!--
|
||||
Copy gdbserver to main libs directory if building a non-instrumentation debug apk.
|
||||
TODO(jrg): For now, Chrome on Android always builds native code
|
||||
as Release and java/ant as Debug, which means we always install
|
||||
gdbserver. Resolve this discrepancy, possibly by making this
|
||||
Release Official build java/ant as Release.
|
||||
-->
|
||||
<if>
|
||||
<condition>
|
||||
<and>
|
||||
<equals arg1="${build.target}" arg2="debug"/>
|
||||
<isfalse value="${project.is.testapp}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<then>
|
||||
<echo message="Copying gdbserver to the apk to enable native debugging"/>
|
||||
<copy todir="${out.dir}/libs/${target.abi}">
|
||||
<path refid="native.libs.gdbserver"/>
|
||||
</copy>
|
||||
</then>
|
||||
</if>
|
||||
|
||||
<!-- Package all the compiled .class files into a .jar. -->
|
||||
<jar
|
||||
jarfile="${lib.java.dir}/chromium_apk_${PACKAGE_NAME}.jar"
|
||||
basedir="${out.classes.absolute.dir}"
|
||||
/>
|
||||
</target>
|
||||
|
||||
<!--
|
||||
Override obfuscate target to pass javac.custom.classpath to Proguard. SDK tools do not provide
|
||||
any way to pass custom class paths to Proguard.
|
||||
-->
|
||||
<target name="-obfuscate">
|
||||
<if condition="${proguard.enabled}">
|
||||
<then>
|
||||
<property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard"/>
|
||||
<property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar"/>
|
||||
<property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar"/>
|
||||
<!-- input for dex will be proguard's output -->
|
||||
<property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}"/>
|
||||
|
||||
<!-- Add Proguard Tasks -->
|
||||
<property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar"/>
|
||||
<taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}"/>
|
||||
|
||||
<!-- Set the android classpath Path object into a single property. It'll be
|
||||
all the jar files separated by a platform path-separator.
|
||||
Each path must be quoted if it contains spaces.
|
||||
-->
|
||||
<pathconvert property="project.target.classpath.value" refid="project.target.class.path">
|
||||
<firstmatchmapper>
|
||||
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
|
||||
<identitymapper/>
|
||||
</firstmatchmapper>
|
||||
</pathconvert>
|
||||
|
||||
<!-- Build a path object with all the jar files that must be obfuscated.
|
||||
This include the project compiled source code and any 3rd party jar
|
||||
files. -->
|
||||
<path id="project.all.classes.path">
|
||||
<pathelement location="${preobfuscate.jar.file}"/>
|
||||
<path refid="project.all.jars.path"/>
|
||||
<!-- Pass javac.custom.classpath for apks. -->
|
||||
<path refid="javac.custom.classpath"/>
|
||||
</path>
|
||||
<!-- Set the project jar files Path object into a single property. It'll be
|
||||
all the jar files separated by a platform path-separator.
|
||||
Each path must be quoted if it contains spaces.
|
||||
-->
|
||||
<pathconvert property="project.all.classes.value" refid="project.all.classes.path">
|
||||
<firstmatchmapper>
|
||||
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
|
||||
<identitymapper/>
|
||||
</firstmatchmapper>
|
||||
</pathconvert>
|
||||
|
||||
<!-- Turn the path property ${proguard.config} from an A:B:C property
|
||||
into a series of includes: -include A -include B -include C
|
||||
suitable for processing by the ProGuard task. Note - this does
|
||||
not include the leading '-include "' or the closing '"'; those
|
||||
are added under the <proguard> call below.
|
||||
-->
|
||||
<path id="proguard.configpath">
|
||||
<pathelement path="${proguard.config}"/>
|
||||
</path>
|
||||
<pathconvert pathsep='" -include "' property="proguard.configcmd"
|
||||
refid="proguard.configpath"/>
|
||||
|
||||
<mkdir dir="${obfuscate.absolute.dir}"/>
|
||||
<delete file="${preobfuscate.jar.file}"/>
|
||||
<delete file="${obfuscated.jar.file}"/>
|
||||
<jar basedir="${out.classes.absolute.dir}"
|
||||
destfile="${preobfuscate.jar.file}"/>
|
||||
<proguard>
|
||||
-include "${proguard.configcmd}"
|
||||
-include "${out.absolute.dir}/proguard.txt"
|
||||
-injars ${project.all.classes.value}
|
||||
-outjars "${obfuscated.jar.file}"
|
||||
-libraryjars ${project.target.classpath.value}
|
||||
-dump "${obfuscate.absolute.dir}/dump.txt"
|
||||
-printseeds "${obfuscate.absolute.dir}/seeds.txt"
|
||||
-printusage "${obfuscate.absolute.dir}/usage.txt"
|
||||
-printmapping "${obfuscate.absolute.dir}/mapping.txt"
|
||||
</proguard>
|
||||
</then>
|
||||
</if>
|
||||
</target>
|
||||
</project>
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2012 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.
|
||||
|
||||
# Temporary placeholders to call new buildbot script locations until
|
||||
# buildbot master config can be pointed to new location.
|
||||
|
||||
exec $(dirname $0)/buildbot/bb_fyi_builder.sh "$@"
|
||||
Loaded 100 of 706 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user