| Index: webrtc/video/send_delay_stats.h
 | 
| diff --git a/webrtc/video/send_delay_stats.h b/webrtc/video/send_delay_stats.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..20a97814c72e808b3acfd5a920290e01a993cc8d
 | 
| --- /dev/null
 | 
| +++ b/webrtc/video/send_delay_stats.h
 | 
| @@ -0,0 +1,93 @@
 | 
| +/*
 | 
| + *  Copyright (c) 2016 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_VIDEO_SEND_DELAY_STATS_H_
 | 
| +#define WEBRTC_VIDEO_SEND_DELAY_STATS_H_
 | 
| +
 | 
| +#include <map>
 | 
| +#include <memory>
 | 
| +#include <set>
 | 
| +
 | 
| +#include "webrtc/base/criticalsection.h"
 | 
| +#include "webrtc/base/thread_annotations.h"
 | 
| +#include "webrtc/common_types.h"
 | 
| +#include "webrtc/modules/include/module_common_types.h"
 | 
| +#include "webrtc/system_wrappers/include/clock.h"
 | 
| +#include "webrtc/video_send_stream.h"
 | 
| +
 | 
| +namespace webrtc {
 | 
| +
 | 
| +class SendDelayStats : public SendPacketObserver {
 | 
| + public:
 | 
| +  explicit SendDelayStats(Clock* clock);
 | 
| +  virtual ~SendDelayStats();
 | 
| +
 | 
| +  // Adds the configured ssrcs for the rtp streams.
 | 
| +  // Stats will be calculated for these streams.
 | 
| +  void AddSsrcs(const VideoSendStream::Config& config);
 | 
| +
 | 
| +  // Called when a packet is sent (leaving socket).
 | 
| +  bool OnSentPacket(int packet_id, int64_t time_ms);
 | 
| +
 | 
| + protected:
 | 
| +  // From SendPacketObserver.
 | 
| +  // Called when a packet is sent to the transport.
 | 
| +  void OnSendPacket(uint16_t packet_id,
 | 
| +                    int64_t capture_time_ms,
 | 
| +                    uint32_t ssrc) override;
 | 
| +
 | 
| + private:
 | 
| +  // Map holding sent packets (mapped by sequence number).
 | 
| +  struct SequenceNumberOlderThan {
 | 
| +    bool operator()(uint16_t seq1, uint16_t seq2) const {
 | 
| +      return IsNewerSequenceNumber(seq2, seq1);
 | 
| +    }
 | 
| +  };
 | 
| +  struct Packet {
 | 
| +    Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms)
 | 
| +        : ssrc(ssrc),
 | 
| +          capture_time_ms(capture_time_ms),
 | 
| +          send_time_ms(send_time_ms) {}
 | 
| +    uint32_t ssrc;
 | 
| +    int64_t capture_time_ms;
 | 
| +    int64_t send_time_ms;
 | 
| +  };
 | 
| +  typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap;
 | 
| +
 | 
| +  class SampleCounter {
 | 
| +   public:
 | 
| +    SampleCounter() : sum(0), num_samples(0) {}
 | 
| +    ~SampleCounter() {}
 | 
| +    void Add(int sample);
 | 
| +    int Avg(int min_required_samples) const;
 | 
| +
 | 
| +   private:
 | 
| +    int sum;
 | 
| +    int num_samples;
 | 
| +  };
 | 
| +
 | 
| +  void UpdateHistograms();
 | 
| +  void RemoveOld(int64_t now, PacketMap* packets)
 | 
| +      EXCLUSIVE_LOCKS_REQUIRED(crit_);
 | 
| +
 | 
| +  Clock* const clock_;
 | 
| +  rtc::CriticalSection crit_;
 | 
| +
 | 
| +  PacketMap packets_ GUARDED_BY(crit_);
 | 
| +  size_t num_old_packets_ GUARDED_BY(crit_);
 | 
| +  size_t num_skipped_packets_ GUARDED_BY(crit_);
 | 
| +
 | 
| +  std::set<uint32_t> ssrcs_ GUARDED_BY(crit_);
 | 
| +  std::map<uint32_t, SampleCounter> send_delay_counters_
 | 
| +      GUARDED_BY(crit_);  // Mapped by SSRC.
 | 
| +};
 | 
| +
 | 
| +}  // namespace webrtc
 | 
| +#endif  // WEBRTC_VIDEO_SEND_DELAY_STATS_H_
 | 
| 
 |