send_statistics_proxy.h revision 00b8f6b3643332cce1ee711715f7fbb824d793ca
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
1600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
1738344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
18ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/common_types.h"
19273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
20891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
21273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/system_wrappers/interface/clock.h"
223e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org#include "webrtc/video_engine/include/vie_base.h"
23ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/video_engine/include/vie_capture.h"
24273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org#include "webrtc/video_engine/include/vie_codec.h"
25ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#include "webrtc/video_send_stream.h"
26ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
27ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.orgnamespace webrtc {
28ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
29ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.orgclass CriticalSectionWrapper;
30ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
313e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.orgclass SendStatisticsProxy : public CpuOveruseMetricsObserver,
323e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org                            public RtcpStatisticsCallback,
331d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org                            public RtcpPacketTypeCounterObserver,
34ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public StreamDataCountersCallback,
35ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public BitrateStatisticsObserver,
36ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public FrameCountObserver,
37ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            public ViEEncoderObserver,
38168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org                            public ViECaptureObserver,
39891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org                            public VideoEncoderRateObserver,
40168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org                            public SendSideDelayObserver {
41ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org public:
42273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  static const int kStatsTimeoutMs;
43273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org
44273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  SendStatisticsProxy(Clock* clock, const VideoSendStream::Config& config);
45ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual ~SendStatisticsProxy();
46ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
47273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  VideoSendStream::Stats GetStats();
48273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org
49273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  virtual void OnSendEncodedImage(const EncodedImage& encoded_image,
50273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org                                  const RTPVideoHeader* rtp_video_header);
51ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
52891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org  // From VideoEncoderRateObserver.
53891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org  void OnSetRates(uint32_t bitrate_bps, int framerate) override;
54891d48393e5ccd2f5e03d509c544c00a3d88cbbcpbos@webrtc.org
55ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org protected:
563e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  // From CpuOveruseMetricsObserver.
573e6e271ec3253e78ae0eb72156e5236d43f8731dpbos@webrtc.org  void CpuOveruseMetricsUpdated(const CpuOveruseMetrics& metrics) OVERRIDE;
58ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From RtcpStatisticsCallback.
59ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void StatisticsUpdated(const RtcpStatistics& statistics,
60ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                                 uint32_t ssrc) OVERRIDE;
61ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  virtual void CNameChanged(const char *cname, uint32_t ssrc) OVERRIDE;
621d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  // From RtcpPacketTypeCounterObserver
631d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org  virtual void RtcpPacketTypesCounterUpdated(
641d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      uint32_t ssrc,
651d0fa5d352fe12092201fade249905c7e1ff974bpbos@webrtc.org      const RtcpPacketTypeCounter& packet_counter) OVERRIDE;
66ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From StreamDataCountersCallback.
67ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void DataCountersUpdated(const StreamDataCounters& counters,
68ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                                   uint32_t ssrc) OVERRIDE;
69ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
70ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From BitrateStatisticsObserver.
710bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org  virtual void Notify(const BitrateStatistics& total_stats,
720bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                      const BitrateStatistics& retransmit_stats,
730bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org                      uint32_t ssrc) OVERRIDE;
74ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
75ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From FrameCountObserver.
76ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  virtual void FrameCountUpdated(const FrameCounts& frame_counts,
77ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org                                 uint32_t ssrc) OVERRIDE;
78ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
79ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From ViEEncoderObserver.
80ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void OutgoingRate(const int video_channel,
81ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            const unsigned int framerate,
82ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                            const unsigned int bitrate) OVERRIDE;
83ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
84b10363f3b63222b0f6ec7e916ef4ccac15d7205bhenrik.lundin@webrtc.org  virtual void SuspendChange(int video_channel, bool is_suspended) OVERRIDE;
85ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
86ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  // From ViECaptureObserver.
87ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void BrightnessAlarm(const int capture_id,
88ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                               const Brightness brightness) OVERRIDE {}
89ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
90ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void CapturedFrameRate(const int capture_id,
91ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                                 const unsigned char frame_rate) OVERRIDE;
92ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
93ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  virtual void NoPictureAlarm(const int capture_id,
94ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org                              const CaptureAlarm alarm) OVERRIDE {}
95ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
96168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  virtual void SendSideDelayUpdated(int avg_delay_ms,
97168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org                                    int max_delay_ms,
98168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org                                    uint32_t ssrc) OVERRIDE;
99168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org
100ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org private:
101273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  struct StatsUpdateTimes {
102273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org    StatsUpdateTimes() : resolution_update_ms(0) {}
103273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org    int64_t resolution_update_ms;
104273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  };
105273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  void PurgeOldStats() EXCLUSIVE_LOCKS_REQUIRED(crit_);
10609c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org  VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
10709c77b95bb62566be64da662f0b3b6a838ec6553pbos@webrtc.org      EXCLUSIVE_LOCKS_REQUIRED(crit_);
108ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
109273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  Clock* const clock_;
110ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org  const VideoSendStream::Config config_;
11100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> crit_;
112de1429e9ad9a3a207ca191e1d748aa7271066860pbos@webrtc.org  VideoSendStream::Stats stats_ GUARDED_BY(crit_);
113273a414b0ec2e58fdf3b817ad8b1a02f4ce15287pbos@webrtc.org  std::map<uint32_t, StatsUpdateTimes> update_times_ GUARDED_BY(crit_);
114ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org};
115ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org
116ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org}  // namespace webrtc
117ccd42840bcee8db145be91b3308912a24f710a6fsprang@webrtc.org#endif  // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
118