Add support for optional fields in FixedLengthDeltaEncoder

Optional fields are those which only occur sometimes. For example,
the sequence number field in an RTP packet always occurs, but
fields in optional RTP extensions only occur sometimes.

Bug: webrtc:8111
Change-Id: Iff2c35b73530c0a1db68e547b4caf34434aa4ace
Reviewed-on: https://webrtc-review.googlesource.com/c/103362
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25336}
This commit is contained in:
Elad Alon
2018-10-24 14:06:34 +02:00
committed by Commit Bot
parent c6ec4b1fa9
commit 257ed437f0
3 changed files with 355 additions and 163 deletions

View File

@ -14,6 +14,8 @@
#include <string>
#include <vector>
#include "absl/types/optional.h"
namespace webrtc {
// Encode |values| as a sequence of deltas following on |base| and return it.
@ -22,7 +24,9 @@ namespace webrtc {
// |base| is not guaranteed to be written into |output|, and must therefore
// be provided separately to the decoder.
// This function never fails.
std::string EncodeDeltas(uint64_t base, const std::vector<uint64_t>& values);
// TODO(eladalon): Split into optional and non-optional variants (efficiency).
std::string EncodeDeltas(absl::optional<uint64_t> base,
const std::vector<absl::optional<uint64_t>>& values);
// EncodeDeltas() and DecodeDeltas() are inverse operations;
// invoking DecodeDeltas() over the output of EncodeDeltas(), will return
@ -30,9 +34,11 @@ std::string EncodeDeltas(uint64_t base, const std::vector<uint64_t>& values);
// |num_of_deltas| must be greater than zero. If input is not a valid encoding
// of |num_of_deltas| elements based on |base|, the function returns an empty
// vector, which signals an error.
std::vector<uint64_t> DecodeDeltas(const std::string& input,
uint64_t base,
size_t num_of_deltas);
// TODO(eladalon): Split into optional and non-optional variants (efficiency).
std::vector<absl::optional<uint64_t>> DecodeDeltas(
const std::string& input,
absl::optional<uint64_t> base,
size_t num_of_deltas);
} // namespace webrtc