Adds a histogram metric tracking for how long audio RTP packets are sent
through streams related to a call object.

The Call object does not know directly when packets pass through it, only which
AudioSendStreams are used. Each AudioSendStream has a pointer to the Transport
object through which its packets are send.

This CL:
By registering an internal wrapper class, TimedTransport, the AudioSendStream
can stay up-to-date on when packets have passed through its Transport. This
lifetime (as an interval) is then queried by the Call when the AudioSendStream
is destroyed. When Call is destroyed, all streams are guaranteed to have been
destroyed and hence Call is up-to-date on packet activity.

The class TimeInterval keeps the code in Call and AudioSendStream smaller, with
fewer get methods in their APIs and less code for updating values.

Also modifies the unit test for AudioSendStream: it previously enforced that
the stream registers (with its channel proxy) the same transport that it was
constructed with.

BUG=webrtc:7882

Review-Url: https://codereview.webrtc.org/2979833002
Cr-Commit-Position: refs/heads/master@{#19087}
diff --git a/webrtc/audio/time_interval.h b/webrtc/audio/time_interval.h
new file mode 100644
index 0000000..069127d
--- /dev/null
+++ b/webrtc/audio/time_interval.h
@@ -0,0 +1,65 @@
+/*
+ *  Copyright (c) 2017 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 WEBRTC_AUDIO_TIME_INTERVAL_H_
+#define WEBRTC_AUDIO_TIME_INTERVAL_H_
+
+#include <stdint.h>
+
+#include "webrtc/rtc_base/optional.h"
+
+namespace webrtc {
+
+// This class logs the first and last time its Extend() function is called.
+//
+// This class is not thread-safe; Extend() calls should only be made by a
+// single thread at a time, such as within a lock or destructor.
+//
+// Example usage:
+//   // let x < y < z < u < v
+//   rtc::TimeInterval interval;
+//   ...  //   interval.Extend(); // at time x
+//   ...
+//   interval.Extend(); // at time y
+//   ...
+//   interval.Extend(); // at time u
+//   ...
+//   interval.Extend(z); // at time v
+//   ...
+//   if (!interval.Empty()) {
+//     int64_t active_time = interval.Length(); // returns (u - x)
+//   }
+class TimeInterval {
+ public:
+  TimeInterval();
+  ~TimeInterval();
+  // Extend the interval with the current time.
+  void Extend();
+  // Extend the interval with a given time.
+  void Extend(int64_t time);
+  // Take the convex hull with another interval.
+  void Extend(const TimeInterval& other_interval);
+  // True iff Extend has never been called.
+  bool Empty() const;
+  // Returns the time between the first and the last tick, in milliseconds.
+  int64_t Length() const;
+
+ private:
+  struct Interval {
+    Interval(int64_t first, int64_t last);
+
+    int64_t first, last;
+  };
+  rtc::Optional<Interval> interval_;
+};
+
+}  // namespace webrtc
+
+#endif  // WEBRTC_AUDIO_TIME_INTERVAL_H_