send_statistics_proxy.h revision 6304626268238a074051910d201e9a77aae677e0
1ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org/*
2ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *
4ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  Use of this source code is governed by a BSD-style license
5ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  that can be found in the LICENSE file in the root of the source
6ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  tree. An additional intellectual property rights grant can be found
7ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  in the file PATENTS.  All contributing project authors may
8ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org */
10ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
11ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#ifndef WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
12ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#define WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
13ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
14ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include <string>
15ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
16f2f828374c3ee1e1834c72bb27eaae88ef67bb40Peter Boström#include "webrtc/base/criticalsection.h"
17af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org#include "webrtc/base/ratetracker.h"
1800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1938344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
20ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/common_types.h"
21273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
22891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
23273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/system_wrappers/interface/clock.h"
24300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_engine/overuse_frame_detector.h"
25300eeb68f55c5091c7045e377578586733cddf16Peter Boström#include "webrtc/video_engine/vie_encoder.h"
26ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/video_send_stream.h"
27ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
28ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.orgnamespace webrtc {
29ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
303e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.orgclass SendStatisticsProxy : public CpuOveruseMetricsObserver,
313e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org                            public RtcpStatisticsCallback,
321d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org                            public RtcpPacketTypeCounterObserver,
33ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public StreamDataCountersCallback,
34ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public BitrateStatisticsObserver,
35ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public FrameCountObserver,
36ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public ViEEncoderObserver,
37891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org                            public VideoEncoderRateObserver,
38168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org                            public SendSideDelayObserver {
39ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public:
40273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  static const int kStatsTimeoutMs;
41273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org
42273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  SendStatisticsProxy(Clock* clock, const VideoSendStream::Config& config);
43ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual ~SendStatisticsProxy();
44ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
45273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  VideoSendStream::Stats GetStats();
46273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org
47273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  virtual void OnSendEncodedImage(const EncodedImage& encoded_image,
48273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org                                  const RTPVideoHeader* rtp_video_header);
49af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  // Used to update incoming frame rate.
50d89920b74a173b7bf80c6760908a382c095a66ccasapersson  void OnIncomingFrame(int width, int height);
51ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
526718e97e730dfeb0c4290128b5682e123dd75866asapersson  // Used to update encode time of frames.
536718e97e730dfeb0c4290128b5682e123dd75866asapersson  void OnEncodedFrame(int encode_time_ms);
546718e97e730dfeb0c4290128b5682e123dd75866asapersson
55891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org  // From VideoEncoderRateObserver.
56891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org  void OnSetRates(uint32_t bitrate_bps, int framerate) override;
57891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org
5820f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström  void OnInactiveSsrc(uint32_t ssrc);
5920f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström
60ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org protected:
613e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  // From CpuOveruseMetricsObserver.
6214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) override;
63ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From RtcpStatisticsCallback.
6414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void StatisticsUpdated(const RtcpStatistics& statistics,
6514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         uint32_t ssrc) override;
6614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void CNameChanged(const char* cname, uint32_t ssrc) override;
67d89920b74a173b7bf80c6760908a382c095a66ccasapersson  // From RtcpPacketTypeCounterObserver.
6814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void RtcpPacketTypesCounterUpdated(
691d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      uint32_t ssrc,
7014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org      const RtcpPacketTypeCounter& packet_counter) override;
71ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From StreamDataCountersCallback.
7214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void DataCountersUpdated(const StreamDataCounters& counters,
7314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                           uint32_t ssrc) override;
74ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
75ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From BitrateStatisticsObserver.
7614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void Notify(const BitrateStatistics& total_stats,
7714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org              const BitrateStatistics& retransmit_stats,
7814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org              uint32_t ssrc) override;
79ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
80ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From FrameCountObserver.
8114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void FrameCountUpdated(const FrameCounts& frame_counts,
8214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         uint32_t ssrc) override;
83ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
84ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From ViEEncoderObserver.
8514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void OutgoingRate(const int video_channel,
8614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    const unsigned int framerate,
8714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                    const unsigned int bitrate) override;
88ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
8914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void SuspendChange(int video_channel, bool is_suspended) override;
90ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
9114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void SendSideDelayUpdated(int avg_delay_ms,
9214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            int max_delay_ms,
9314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                            uint32_t ssrc) override;
94168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org
95ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org private:
96d89920b74a173b7bf80c6760908a382c095a66ccasapersson  struct SampleCounter {
97d89920b74a173b7bf80c6760908a382c095a66ccasapersson    SampleCounter() : sum(0), num_samples(0) {}
98d89920b74a173b7bf80c6760908a382c095a66ccasapersson    void Add(int sample);
99d89920b74a173b7bf80c6760908a382c095a66ccasapersson    int Avg(int min_required_samples) const;
100d89920b74a173b7bf80c6760908a382c095a66ccasapersson
101d89920b74a173b7bf80c6760908a382c095a66ccasapersson   private:
102d89920b74a173b7bf80c6760908a382c095a66ccasapersson    int sum;
103d89920b74a173b7bf80c6760908a382c095a66ccasapersson    int num_samples;
104d89920b74a173b7bf80c6760908a382c095a66ccasapersson  };
105273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  struct StatsUpdateTimes {
106273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org    StatsUpdateTimes() : resolution_update_ms(0) {}
107273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org    int64_t resolution_update_ms;
10820f3f942a05a4b37d39891ff28be67d984c345f7Peter Boström    int64_t bitrate_update_ms;
109273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  };
110273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_);
11109c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org  VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
11209c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org      EXCLUSIVE_LOCKS_REQUIRED(crit_);
11324b4eda6f4fdfd33d2c3e82df1390bad55953f5dÅsa Persson  void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_);
114ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
115273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  Clock* const clock_;
116ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  const VideoSendStream::Config config_;
117f2f828374c3ee1e1834c72bb27eaae88ef67bb40Peter Boström  mutable rtc::CriticalSection crit_;
118de1429e9ad9a3a207ca191e1d748aa7271066860pbos@webrtc.org  VideoSendStream::Stats stats_ GUARDED_BY(crit_);
119af612d5e0769571544952cbe55e675748afa9bddperkj@webrtc.org  rtc::RateTracker input_frame_rate_tracker_ GUARDED_BY(crit_);
1206304626268238a074051910d201e9a77aae677e0Tim Psiaki  rtc::RateTracker sent_frame_rate_tracker_ GUARDED_BY(crit_);
12124b4eda6f4fdfd33d2c3e82df1390bad55953f5dÅsa Persson  uint32_t last_sent_frame_timestamp_ GUARDED_BY(crit_);
122273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_);
123d89920b74a173b7bf80c6760908a382c095a66ccasapersson
124d89920b74a173b7bf80c6760908a382c095a66ccasapersson  int max_sent_width_per_timestamp_ GUARDED_BY(crit_);
125d89920b74a173b7bf80c6760908a382c095a66ccasapersson  int max_sent_height_per_timestamp_ GUARDED_BY(crit_);
126d89920b74a173b7bf80c6760908a382c095a66ccasapersson  SampleCounter input_width_counter_ GUARDED_BY(crit_);
127d89920b74a173b7bf80c6760908a382c095a66ccasapersson  SampleCounter input_height_counter_ GUARDED_BY(crit_);
128d89920b74a173b7bf80c6760908a382c095a66ccasapersson  SampleCounter sent_width_counter_ GUARDED_BY(crit_);
129d89920b74a173b7bf80c6760908a382c095a66ccasapersson  SampleCounter sent_height_counter_ GUARDED_BY(crit_);
1306718e97e730dfeb0c4290128b5682e123dd75866asapersson  SampleCounter encode_time_counter_ GUARDED_BY(crit_);
131ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org};
132ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
133ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org}  // namespace webrtc
134ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#endif  // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
135