Commit Graph

3008 Commits

Author SHA1 Message Date
7f6a6fc0b2 Enabling spatial layers in VP9Impl. Filter layers in the loopback test.
Handling the case when encoder drops only the higher layer.
Added options to screenshare loopback test to discard high temporal or spatial layers (to view the lower layers).

Review URL: https://codereview.webrtc.org/1287643002

Cr-Commit-Position: refs/heads/master@{#9883}
2015-09-08 09:40:36 +00:00
81db11aa50 copy-red: Fill an rtc::Buffer with bytes the easy way
The easy way also happens to be more efficient if we have to
reallocate, but that's a minor concern here.

Review URL: https://codereview.webrtc.org/1327053002

Cr-Commit-Position: refs/heads/master@{#9876}
2015-09-08 03:14:40 +00:00
86d907cffd Refactor the AudioDevice for iOS and improve the performance and stability
This CL contains major modifications of the audio output parts for WebRTC on iOS:
- general code cleanup
- improves thread handling (added thread checks, remove critical section, atomic ops etc.)
- reduces loopback latency of iPhone 6 from ~90ms to ~60ms ;-)
- improves selection of audio parameters on iOS
- reduces complexity by removing complex and redundant delay estimates
- now instead uses fixed delay estimates if for some reason the SW EAC must be used
- adds AudioFineBuffer to compensate for differences in native output buffer size and
  the 10ms size used by WebRTC. Same class as is used today on Android and we have unit tests for
  this class (the old code was buggy and we have several issue reports of crashes related to it)

Similar improvements will be done for the recording sid as well in a separate CL.
I will also add support for 48kHz in an upcoming CL since that will improve Opus performance.

BUG=webrtc:4796,webrtc:4817,webrtc:4954, webrtc:4212
TEST=AppRTC demo and iOS modules_unittests using --gtest_filter=AudioDevice*
R=pbos@webrtc.org, tkchin@webrtc.org

Review URL: https://codereview.webrtc.org/1254883002 .

Cr-Commit-Position: refs/heads/master@{#9875}
2015-09-07 14:10:10 +00:00
110443c1ec Fix for frame resolution in encoded frame callback.
Scaled resolution for down scaled frames by the quality scaler is not used.

BUG=webrtc:4966
R=pbos@webrtc.org, stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1317463005 .

Cr-Commit-Position: refs/heads/master@{#9873}
2015-09-07 13:04:00 +00:00
d5ae6ae6b5 Fix ScreenCapturerWinGdi to handle DesktopFrameWin::Create() errors.
DesktopFrameWin::Create() may return nullptr when it fails to allocate
windows bitmap. ScreenCapturerWinGdi wasn't handling that case properly.

BUG=527660

Review URL: https://codereview.webrtc.org/1309143007

Cr-Commit-Position: refs/heads/master@{#9865}
2015-09-05 01:38:15 +00:00
242d6384c4 VP9 codec controls for screensharing
Telling the encoder to adjust the parameters for the screen content.
Also, telling the encoder to skip the encoding of very flat/low content blocks. For now only for screensharing. (number 8 in VP8E_SET_STATIC_THRESHOLD is correct)

Review URL: https://codereview.webrtc.org/1308753006

Cr-Commit-Position: refs/heads/master@{#9860}
2015-09-04 13:13:29 +00:00
318673cf5a Update SendTimeHistory to store complete PacketInfo, not just send time
This will be used for the send side bitrate estimation. Storing various
meta-data about packets that can be retreived when arrival time feeback
arrives.

BUG=webrtc:4173

Review URL: https://codereview.webrtc.org/1288033008

Cr-Commit-Position: refs/heads/master@{#9859}
2015-09-04 11:43:23 +00:00
c8a1cccd0a Fixed base time in TransportFeedback message writing.
Value was incorrectly truncated to 16 bits when serializing the message.
Fixed, with added regression tests.

BUG=

Review URL: https://codereview.webrtc.org/1294393002

Cr-Commit-Position: refs/heads/master@{#9858}
2015-09-04 11:38:17 +00:00
b6b0b9268e Rate limit the low bandwidth / min bitrate warning to once every 10 seconds.
R=terelius@webrtc.org

Review URL: https://codereview.webrtc.org/1320763003

Cr-Commit-Position: refs/heads/master@{#9855}
2015-09-04 10:05:02 +00:00
be9b7b6881 Make sure ByteReader and ByteWriter classes (and their specializations) don't perform operations that have implementation-specific or undefined behavior.
Pitfalls:

* Left shift of signed integer has undefined behavior
* Right-shift of signed integer has platform-specific behavior is value is negative
* Cast from unsigned to signed has undefined behavior if value is negative

BUG=webrtc:4824

Review URL: https://codereview.webrtc.org/1226993003

Cr-Commit-Position: refs/heads/master@{#9854}
2015-09-04 08:07:01 +00:00
9743d076ac Reland "Adding unittests to AudioConferenceMixer."
Previous code review, see
https://codereview.chromium.org/1257583011/

Did not pass Mac bots since vector(size_t n) needs copy ctor before C++11.

BUG=

Review URL: https://codereview.webrtc.org/1303273004

Cr-Commit-Position: refs/heads/master@{#9851}
2015-09-03 20:17:20 +00:00
7fabd46a89 Don't set V bit in flexible mode
BUG=webrtc:4914

Review URL: https://codereview.webrtc.org/1291163007

Cr-Commit-Position: refs/heads/master@{#9848}
2015-09-03 11:42:37 +00:00
4df08ff374 GN: Fix compilation with NaCl toolchain
BUG=512899
TBR=kjellander@webrtc.org

Review URL: https://codereview.webrtc.org/1327853002

Cr-Commit-Position: refs/heads/master@{#9846}
2015-09-02 21:22:48 +00:00
6aae75728a On FATAL, log which unsupported encoder the caller wanted us to create
Hopefully, this will make it easier to figure out what's wrong the
next time this happens.

BUG=526478

Review URL: https://codereview.webrtc.org/1313073008

Cr-Commit-Position: refs/heads/master@{#9844}
2015-09-02 12:05:06 +00:00
098c1de578 Fixes for PNaCl build of remoting client plugin with GN.
1. Added support for PNaCl in base.
2. Separated parts of desktop_capture module that need to be
   compiled for PNaCl.

BUG=512899
R=jiayl@chromium.org, jiayl@webrtc.org

Review URL: https://codereview.webrtc.org/1323453003 .

Cr-Commit-Position: refs/heads/master@{#9836}
2015-09-01 18:36:50 +00:00
05f71fcb61 NetEq: Fixing a corner case with depleted sync buffer
In some cases, the number of samples (per channel) in NetEq's sync
buffer could fall below the allowed minimum (5 samples for narrowband,
scaling for other rates). If the number of samples extracted from the
buffer was smaller than the desired number, an error is
returned. However, if the decoder returns fewer samples than expected,
it could happen that the sync buffer level falls under the minimum,
but enough samples are extracted. This triggered an assert. With this
change, the minimum level of the sync buffer is always enforced.

A test is implemented to trigger the problem. It made the assert fire
without this fix, but it now passes.

BUG=webrtc:4840
R=minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1324453002 .

Cr-Commit-Position: refs/heads/master@{#9828}
2015-09-01 09:52:06 +00:00
521875a9a4 Use RtcpPacket to send APP in RtcpSender
BUG=webrtc:2450
R=asapersson@webrtc.org

Review URL: https://codereview.webrtc.org/1311453002 .

Cr-Commit-Position: refs/heads/master@{#9827}
2015-09-01 08:11:36 +00:00
e551f12a41 Revert "Adding unittests to AudioConferenceMixer."
This reverts commit 22c2729607964aa38d6cb4e521994453b6a271c4.

TBR=henrik.lundin@webrtc.org,
BUG=

Review URL: https://codereview.webrtc.org/1326583002 .

Cr-Commit-Position: refs/heads/master@{#9826}
2015-09-01 07:54:49 +00:00
22c2729607 Adding unittests to AudioConferenceMixer.
Unit tests around AudioConferenceMixer was severely missing. This CL is to add some tests.

BUG=
R=ajm@chromium.org, andrew@webrtc.org

Review URL: https://codereview.webrtc.org/1257583011 .

Cr-Commit-Position: refs/heads/master@{#9825}
2015-09-01 07:33:37 +00:00
b7306ae6fe Revert "Avoiding size_t in MIPS."
This reverts commit 32e2f461b13c530d34f9c434e7e76da6ff3eda83.

BUG=526716
TBR=minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1314873004 .

Cr-Commit-Position: refs/heads/master@{#9824}
2015-08-31 18:44:05 +00:00
32e2f461b1 Avoiding size_t in MIPS.
TBR=pkasting@chromium.org

BUG=526716

Review URL: https://codereview.webrtc.org/1310553008 .

Cr-Commit-Position: refs/heads/master@{#9823}
2015-08-31 15:40:17 +00:00
0f4b3731c3 Stylizing AudioConferenceMixer.
Cleaning AudioConferenceMixer APIs to match Chromium style guide.

Main changes:
1. change all mutable references to pointers
2. add const to all non-mutable references
3. add const to as many methods as possible

BUG=
R=andrew@webrtc.org

Review URL: https://codereview.webrtc.org/1311733003 .

Cr-Commit-Position: refs/heads/master@{#9821}
2015-08-31 14:04:44 +00:00
ca28fdcf9f Use RtcpPacket to send XR (RTRR, DLRR, VOIP) in RtcpSender
BUG=webrtc:2450
R=asapersson@webrtc.org

Review URL: https://codereview.webrtc.org/1304123003 .

Cr-Commit-Position: refs/heads/master@{#9820}
2015-08-31 12:01:08 +00:00
c92c23d99a Roll chromium_revision f8d6ba9..a28d8d5 (337800:346100)
Relevant changes:
* src/buildtools: ecc8e25..565d04e
* src/testing/gmock: 2976396..0421b6f
* src/testing/gtest: 23574bf..9855a87
* src/third_party/android_tools: 21f4bcb..4238a28
* src/third_party/boringssl/src: de24aad..12fe1b2
* src/third_party/icu: c81a1a3..6b3ce81
* src/third_party/libjpeg_turbo: f4631b6..631e2dd
* src/third_party/libsrtp: 9c53f85..502e81a
* src/third_party/libvpx: aa9b5f1..a208eca
* src/third_party/libyuv: 6dde4f1..3c4f573
* src/third_party/openmax_dl: 22bb108..2eb98d8
* src/tools/grit: 1dac9ae..15d48e3
* src/tools/gyp: 5122240..6ee91ad
* src/tools/swarming_client: b39a448..2866a22
Details: f8d6ba9..a28d8d5/DEPS

Clang version changed 245402:245965
Details: f8d6ba9..a28d8d5/tools/clang/scripts/update.sh

BUG=None
R=glaznev@webrtc.org
TBR=glaznev@chromium.org, henrika@chromium.org

Review URL: https://codereview.webrtc.org/1308693010 .

Cr-Commit-Position: refs/heads/master@{#9818}
2015-08-31 09:30:29 +00:00
3c4ef29140 NetEq: Allow negative shift in BackgroundNoise::SaveParameters
This change allows a shift factor to be negative.  This is the way it
was in the old (NetEq3) code; see
4d363ae305/webrtc/modules/audio_coding/neteq/bgn_update.c,
lines 183-188.

Some input signals can lead to negative shifts, and would then trigger
an assert. The assert is now removed.

BUG=webrtc:4840
R=minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1315833003 .

Cr-Commit-Position: refs/heads/master@{#9816}
2015-08-31 08:18:45 +00:00
1380e266ff Convert some more things to size_t.
These changes stem from requests by Andrew on https://codereview.webrtc.org/1228823002/ to eliminate some "return -1"s and change to using asserts plus returning size_ts.  I then also converted the relevant connected bits.

This also cleans up a bunch of style issues, e.g. no spaces around operators.

BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, henrik.lundin@webrtc.org, niklas.enbom@webrtc.org

Review URL: https://codereview.webrtc.org/1305983003 .

Cr-Commit-Position: refs/heads/master@{#9813}
2015-08-29 00:31:15 +00:00
f42376c601 Wire up currently-received video codec to stats.
BUG=webrtc:1844, webrtc:4808
R=mflodman@webrtc.org, pthatcher@webrtc.org

Review URL: https://codereview.webrtc.org/1315413002

Cr-Commit-Position: refs/heads/master@{#9810}
2015-08-28 14:35:40 +00:00
9e69abf85e Added logging using the raw variant of the new aec logging macros
Replaced the wav file dumping functionality in aec_core.c with the newly added corresponding macros

Added macros for logging of AEC internal data

BUG=

Review URL: https://codereview.webrtc.org/1272403003

Cr-Commit-Position: refs/heads/master@{#9808}
2015-08-28 11:41:30 +00:00
98f3cc54da NetEq: Removing two asserts
These asserts cover error cases that are also handled by the code
after the assert. Should not have both assert and error handling.

BUG=webrtc:4840

Review URL: https://codereview.webrtc.org/1321023002

Cr-Commit-Position: refs/heads/master@{#9804}
2015-08-28 08:12:26 +00:00
1e346b20c4 NetEq: Minor follow-up fix in StatisticsCalculator
This change follows the recommendation of a post-commit comment in
r9778:
https://codereview.webrtc.org/1296633002/diff/100001/webrtc/modules/audio_coding/neteq/statistics_calculator.cc#newcode198

TBR=pkasting@chromium.org

Review URL: https://codereview.webrtc.org/1319953002

Cr-Commit-Position: refs/heads/master@{#9803}
2015-08-27 20:41:10 +00:00
116c84e1b0 NetEq: Fixing a bug that caused rtc::checked_cast to trigger
This is a bug that was introduced in
https://codereview.webrtc.org/1230503003, where the variable "int
temp_bufsize" was changed to a size_t. If the packet buffer was
flushed while inserting a packet, temp_bufsize became negative, which
was tested later in an if-statement. Now, with size_t instead, it
would just become very large, and the if-statement would never see a
negative value. The effect was that the packet size in samples could
be updated with a very large positive number, causing an overflow
which triggered rtc::checked_cast in
StatisticsCalculator::GetNetworkStatistics, line 220.

Also adding a test to reproduce the crash. Without the fix, the test
results in the above mentioned checked_cast to trigger. With the fix,
everything works fine.

BUG=chromium:525260

Review URL: https://codereview.webrtc.org/1307893004

Cr-Commit-Position: refs/heads/master@{#9802}
2015-08-27 20:14:54 +00:00
9c3efd0052 Reland: Implement NetEq's CurrentDelay function
This was not implemented before. It returns the current total delay
(packet buffer and sync buffer) of NetEq. This is the same information
that was already available in
NetEqNetworkStatistics::current_buffer_size_ms, that can be obtained
through NetEq::NetworkStatistics(). But, since the current delay is a
key metric of NetEq, it is convenient to have it available in a
simpler way.

This is a re-landing of r9359,
https://webrtc-codereview.appspot.com/51149004, which was reverted in
r9360. The refactoring made in r9669 facilitated the relanding.

TBR=minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1313873003

Cr-Commit-Position: refs/heads/master@{#9801}
2015-08-27 20:12:27 +00:00
a567bf3292 Rename local variable to avoid shadowing
See comment here: https://codereview.webrtc.org/1208993010/diff/180001/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h#newcode189

TBR=minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1315333003

Cr-Commit-Position: refs/heads/master@{#9800}
2015-08-27 18:17:40 +00:00
4376648df0 AudioDecoder: Replace Init() with Reset()
The Init() method was previously used to initialize and reset
decoders, and returned an error code. The new Reset() method is used
for reset only; the constructor is now responsible for fully
initializing the AudioDecoder.

Reset() doesn't return an error code; it turned out that none of the
functions it ended up calling could actually fail, so this CL removes
their error return codes as well.

R=henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1319683002 .

Cr-Commit-Position: refs/heads/master@{#9798}
2015-08-27 13:22:21 +00:00
d83df50e95 Use RtcpPacket to send TMMBN in RtcpSender
BUG=webrtc:2450

Review URL: https://codereview.webrtc.org/1302403002

Cr-Commit-Position: refs/heads/master@{#9793}
2015-08-27 08:05:12 +00:00
2f20fbec1d Fix MIPS compile.
BUG=chromium:524885
TEST=none
TBR=turaj

Review URL: https://codereview.webrtc.org/1316843003 .

Cr-Commit-Position: refs/heads/master@{#9790}
2015-08-26 21:38:55 +00:00
0163fb2ad7 AudioCodingModuleImpl::Encode: Use a Buffer instead of a stack-allocated array
The Buffer is saved between calls, so after the initial allocation
it'll already be allocated and of the right size. The stack-allocated
array had the advantage of requiring no heap allocation at all, but
for most popular encoders it ended up allocating about 15 kB too much,
and now that we allow user-defined encoders there was also the
(remote) possibility that the buffer would actually be too small.

R=henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1303413003 .

Cr-Commit-Position: refs/heads/master@{#9789}
2015-08-26 18:24:31 +00:00
3318f984cd VideoFrameBuffer: Make non-const data access explicit
VideoFrameBuffer currently has two overloaded data() functions for pixel access, one for const and one for non-const. Unfortunately, it will default to the non-const version, even when 'const scoped_refptr<VideoFrameBuffer>&' is used. This is a problem, because many subclasses use RTC_NOTREACHED() in the non-const version.

This CL makes the non-const version of data() explicit with a different, longer function name MutableData().

R=tommi@webrtc.org

Review URL: https://codereview.webrtc.org/1304143003 .

Cr-Commit-Position: refs/heads/master@{#9787}
2015-08-26 14:06:30 +00:00
c464f504dc AndroidVideoCapturerJni: Fix threading issues
The primary fix in this CL is to remove the dangling |thread_| pointer in AndroidVideoCapturerJni. That thread is not safe to use after Stop() has been called. Even after Stop() has been called, we must still be able to return late frames to Java in order to not leak them, so that path has been made thread safe instead. To make sure that we always return frames, the Java frame should be wrapped in a scoped_refptr as quickly as possible, so this CL moves the wrapping from AndroidVideoCapturer to AndroidVideoCapturerJni. This also removes the need for the interface function AndroidVideoCapturerDelegate::ReturnBuffer().

Some other minor changes are:
 * Remove |valid_global_refs_| and all logic related to that. Now that rtc::Bind() captures method objects as scoped_refptr, the destructor of AndroidVideoCapturerJni will not be called before all frames are returned.
 * Remove global ref |j_frame_observer_|. No need for this, we don’t call it and it is kept alive with standard Java memory management.
 * Add helper function ShallowCenterCrop() for VideoFrameBuffers. This functionality already exists in the constructor of WrappedI420Buffer, but it’s more convenient to have it as a separate function.

BUG=webrtc:4742,webrtc:4909
R=glaznev@webrtc.org, tommi@webrtc.org

Review URL: https://codereview.webrtc.org/1307973002 .

Cr-Commit-Position: refs/heads/master@{#9784}
2015-08-25 21:22:24 +00:00
9b351151f9 Move mock_nonlinear_beamformer to only be a header
R=andrew@webrtc.org

Review URL: https://codereview.webrtc.org/1305303003 .

Cr-Commit-Position: refs/heads/master@{#9781}
2015-08-25 17:24:51 +00:00
f4772ee436 Get rid of unused types and constants in acm_common_defs.h
R=henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1311743003 .

Cr-Commit-Position: refs/heads/master@{#9779}
2015-08-25 15:31:57 +00:00
1bb8cf846d NetEq/ACM: Refactor how packet waiting times are calculated
With this change, the aggregates for packet waiting times are
calculated in NetEq's StatisticsCalculator insead of in
AcmReceiver. This simplifies things somewhat, and avoids having to
copy the raw data on polling.

R=ivoc@webrtc.org, minyue@webrtc.org

Review URL: https://codereview.webrtc.org/1296633002 .

Cr-Commit-Position: refs/heads/master@{#9778}
2015-08-25 11:08:17 +00:00
b6cac8f5ef Get rid of the manual destructor in AudioCodingModuleImpl
By converting three raw pointers to scoped_ptrs, we can eliminate the
need for a manually-defined destructor, and generally sleep better at
night.

R=henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1310213003 .

Cr-Commit-Position: refs/heads/master@{#9776}
2015-08-25 09:48:33 +00:00
87a8fbbf37 Fixing Pylint errors for plot_dynamics.py
R=pbos@webrtc.org
TBR=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1296793004 .

Cr-Commit-Position: refs/heads/master@{#9775}
2015-08-25 09:01:43 +00:00
dd00f113a9 Remove no-op and unused methods from AudioCodingModule
This CL removes the following no-op and/or unused methods from
AudioCodingModule and AudioCodingModuleImpl:

ConfigISACBandwidthEstimator
DecoderEstimatedBandwidth
IsInternalDTXReplacedWithWebRtc
REDPayloadISAC
ReplaceInternalDTXWithWebRtc
ResetDecoder
ResetEncoder
SendBitrate
SetReceivedEstimatedBandwidth

R=henrik.lundin@webrtc.org

Review URL: https://codereview.webrtc.org/1308283003 .

Cr-Commit-Position: refs/heads/master@{#9773}
2015-08-25 07:37:18 +00:00
bc2296de9e Add a base class to Wav{Reader,Writer} to access shared parameters.
Use it to clean up some code in audioproc_float.cc.

R=kwiberg@webrtc.org

Review URL: https://codereview.webrtc.org/1308893002 .

Cr-Commit-Position: refs/heads/master@{#9771}
2015-08-25 00:29:34 +00:00
41eeff49fa More iOS compile fixes.
BUG=chromium:81439
TEST=none
TBR=niklas.enbom

Review URL: https://codereview.webrtc.org/1314463003 .

Cr-Commit-Position: refs/heads/master@{#9770}
2015-08-24 23:24:22 +00:00
deb4875b74 Fix typos in https://codereview.webrtc.org/1230503003/ not caught by trybots.
BUG=chromium:81439
TEST=none
TBR=niklas.enbom

Review URL: https://codereview.webrtc.org/1308693007 .

Cr-Commit-Position: refs/heads/master@{#9769}
2015-08-24 22:32:03 +00:00
dce40cf804 Update a ton of audio code to use size_t more correctly and in general reduce
use of int16_t/uint16_t.

This is the upshot of a recommendation by henrik.lundin and kwiberg on an original small change ( https://webrtc-codereview.appspot.com/42569004/#ps1 ) to stop using int16_t just because values could fit in it, and is similar in nature to a previous "mass change to use size_t more" ( https://webrtc-codereview.appspot.com/23129004/ ) which also needed to be split up for review but to land all at once, since, like adding "const", such changes tend to cause a lot of transitive effects.

This was be reviewed and approved in pieces:
https://codereview.webrtc.org/1224093003
https://codereview.webrtc.org/1224123002
https://codereview.webrtc.org/1224163002
https://codereview.webrtc.org/1225133003
https://codereview.webrtc.org/1225173002
https://codereview.webrtc.org/1227163003
https://codereview.webrtc.org/1227203003
https://codereview.webrtc.org/1227213002
https://codereview.webrtc.org/1227893002
https://codereview.webrtc.org/1228793004
https://codereview.webrtc.org/1228803003
https://codereview.webrtc.org/1228823002
https://codereview.webrtc.org/1228823003
https://codereview.webrtc.org/1228843002
https://codereview.webrtc.org/1230693002
https://codereview.webrtc.org/1231713002

The change is being landed as TBR to all the folks who reviewed the above.

BUG=chromium:81439
TEST=none
R=andrew@webrtc.org, pbos@webrtc.org
TBR=aluebs, andrew, asapersson, henrika, hlundin, jan.skoglund, kwiberg, minyue, pbos, pthatcher

Review URL: https://codereview.webrtc.org/1230503003 .

Cr-Commit-Position: refs/heads/master@{#9768}
2015-08-24 21:52:45 +00:00
39b8eb3ab0 Fix Chromium GN build problem introduced in 608c3cfe
R=henrikg@webrtc.org

Review URL: https://codereview.webrtc.org/1314593002 .

Cr-Commit-Position: refs/heads/master@{#9766}
2015-08-24 17:50:48 +00:00