Files
platform-external-webrtc/logging/rtc_event_log/encoder/varint.h
Elad Alon ff43541927 Delta compression efficiency improvement for non-existent base
Before this CL, when we encoded a sequence with a non-existent
base, we pretended that the delta was 0, and the first delta was
based on that. However, in a sequence where the deltas are small,
but where the first element is big, that would produce
unnecessarily wide deltas. Therefore, we change the behavior in
cases where the base is non-existent, to encode the first existent
value (if any) as a varint; the delta width may then be smaller.

This CL include two piggy-backed changes:
1. Varint encoding/decoding moved to its own file (and an
   additional flavor added).
2. The unit tests for delta encoding are further parameterized
   with a random seed.

Bug: webrtc:8111
Change-Id: I76fff577c86d019c8334bf74b76bd35db06ff68d
Reviewed-on: https://webrtc-review.googlesource.com/c/107860
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25395}
2018-10-26 18:17:40 +00:00

46 lines
1.7 KiB
C++

/*
* Copyright (c) 2018 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.
*/
#ifndef LOGGING_RTC_EVENT_LOG_ENCODER_VARINT_H_
#define LOGGING_RTC_EVENT_LOG_ENCODER_VARINT_H_
#include <string>
#include "absl/strings/string_view.h"
#include "rtc_base/bitbuffer.h"
namespace webrtc {
extern const size_t kMaxVarIntLengthBytes;
// Encode a given uint64_t as a varint. From least to most significant,
// each batch of seven bits are put into the lower bits of a byte, and the last
// remaining bit in that byte (the highest one) marks whether additional bytes
// follow (which happens if and only if there are other bits in |input| which
// are non-zero).
// Notes: If input == 0, one byte is used. If input is uint64_t::max, exactly
// kMaxVarIntLengthBytes are used.
std::string EncodeVarInt(uint64_t input);
// Inverse of EncodeVarInt().
// If decoding is successful, a non-zero number is returned, indicating the
// number of bytes read from |input|, and the decoded varint is written
// into |output|.
// If not successful, 0 is returned, and |output| is not modified.
size_t DecodeVarInt(absl::string_view input, uint64_t* output);
// Same as other version, but uses a rtc::BitBuffer for input.
// Some bits may be consumed even if a varint fails to be read.
size_t DecodeVarInt(rtc::BitBuffer* input, uint64_t* output);
} // namespace webrtc
#endif // LOGGING_RTC_EVENT_LOG_ENCODER_VARINT_H_