blob: 0692297eb2ce32128d112575c05ff20b876eed49 [file] [log] [blame]
sprang@webrtc.org09315702014-02-07 12:06:29 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
12#define WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
13
14#include <string>
15
Peter Boströmf2f82832015-05-01 13:00:41 +020016#include "webrtc/base/criticalsection.h"
asaperssond89920b2015-07-22 06:52:00 -070017#include "webrtc/base/ratetracker.h"
pbos@webrtc.org38344ed2014-09-24 06:05:00 +000018#include "webrtc/base/thread_annotations.h"
sprang@webrtc.org09315702014-02-07 12:06:29 +000019#include "webrtc/common_types.h"
20#include "webrtc/frame_callback.h"
21#include "webrtc/modules/remote_bitrate_estimator/rate_statistics.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010022#include "webrtc/modules/video_coding/include/video_coding_defines.h"
Peter Boström7623ce42015-12-09 12:13:30 +010023#include "webrtc/video/report_block_stats.h"
24#include "webrtc/video/vie_channel.h"
sprang@webrtc.org09315702014-02-07 12:06:29 +000025#include "webrtc/video_receive_stream.h"
26#include "webrtc/video_renderer.h"
27
28namespace webrtc {
29
30class Clock;
sprang@webrtc.org09315702014-02-07 12:06:29 +000031class ViECodec;
32class ViEDecoderObserver;
asapersson86b01602015-10-20 23:55:26 -070033struct CodecSpecificInfo;
sprang@webrtc.org09315702014-02-07 12:06:29 +000034
pbosf42376c2015-08-28 07:35:32 -070035class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback,
sprang@webrtc.org09315702014-02-07 12:06:29 +000036 public RtcpStatisticsCallback,
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +000037 public RtcpPacketTypeCounterObserver,
pbos@webrtc.org55707692014-12-19 15:45:03 +000038 public StreamDataCountersCallback {
sprang@webrtc.org09315702014-02-07 12:06:29 +000039 public:
pbos@webrtc.org55707692014-12-19 15:45:03 +000040 ReceiveStatisticsProxy(uint32_t ssrc, Clock* clock);
sprang@webrtc.org09315702014-02-07 12:06:29 +000041 virtual ~ReceiveStatisticsProxy();
42
43 VideoReceiveStream::Stats GetStats() const;
44
45 void OnDecodedFrame();
asaperssond89920b2015-07-22 06:52:00 -070046 void OnRenderedFrame(int width, int height);
pbosf42376c2015-08-28 07:35:32 -070047 void OnIncomingPayloadType(int payload_type);
Peter Boströmb7d9a972015-12-18 16:01:11 +010048 void OnDecoderImplementationName(const char* implementation_name);
pbosf42376c2015-08-28 07:35:32 -070049 void OnIncomingRate(unsigned int framerate, unsigned int bitrate_bps);
50 void OnDecoderTiming(int decode_ms,
51 int max_decode_ms,
52 int current_delay_ms,
53 int target_delay_ms,
54 int jitter_buffer_ms,
55 int min_playout_delay_ms,
asapersson13c433c2015-10-06 04:08:15 -070056 int render_delay_ms,
57 int64_t rtt_ms);
sprang@webrtc.org09315702014-02-07 12:06:29 +000058
asapersson86b01602015-10-20 23:55:26 -070059 void OnPreDecode(const EncodedImage& encoded_image,
60 const CodecSpecificInfo* codec_specific_info);
61
asaperssond89920b2015-07-22 06:52:00 -070062 // Overrides VCMReceiveStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000063 void OnReceiveRatesUpdated(uint32_t bitRate, uint32_t frameRate) override;
64 void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
65 void OnDiscardedPacketsUpdated(int discarded_packets) override;
pbos@webrtc.org55707692014-12-19 15:45:03 +000066
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000067 // Overrides RtcpStatisticsCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000068 void StatisticsUpdated(const webrtc::RtcpStatistics& statistics,
69 uint32_t ssrc) override;
70 void CNameChanged(const char* cname, uint32_t ssrc) override;
sprang@webrtc.org09315702014-02-07 12:06:29 +000071
asaperssond89920b2015-07-22 06:52:00 -070072 // Overrides RtcpPacketTypeCounterObserver.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000073 void RtcpPacketTypesCounterUpdated(
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +000074 uint32_t ssrc,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000075 const RtcpPacketTypeCounter& packet_counter) override;
sprang@webrtc.org09315702014-02-07 12:06:29 +000076 // Overrides StreamDataCountersCallback.
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +000077 void DataCountersUpdated(const webrtc::StreamDataCounters& counters,
78 uint32_t ssrc) override;
sprang@webrtc.org09315702014-02-07 12:06:29 +000079
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +000080 private:
asaperssond89920b2015-07-22 06:52:00 -070081 struct SampleCounter {
82 SampleCounter() : sum(0), num_samples(0) {}
83 void Add(int sample);
84 int Avg(int min_required_samples) const;
85
86 private:
87 int sum;
88 int num_samples;
89 };
asapersson86b01602015-10-20 23:55:26 -070090 struct QpCounters {
91 SampleCounter vp8;
92 };
asaperssond89920b2015-07-22 06:52:00 -070093
94 void UpdateHistograms() EXCLUSIVE_LOCKS_REQUIRED(crit_);
95
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000096 Clock* const clock_;
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000097
pbos5ad935c2016-01-25 03:52:44 -080098 rtc::CriticalSection crit_;
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000099 VideoReceiveStream::Stats stats_ GUARDED_BY(crit_);
100 RateStatistics decode_fps_estimator_ GUARDED_BY(crit_);
101 RateStatistics renders_fps_estimator_ GUARDED_BY(crit_);
Tim Psiaki63046262015-09-14 10:38:08 -0700102 rtc::RateTracker render_fps_tracker_ GUARDED_BY(crit_);
asaperssonf839dcc2015-10-08 00:41:59 -0700103 rtc::RateTracker render_pixel_tracker_ GUARDED_BY(crit_);
asaperssond89920b2015-07-22 06:52:00 -0700104 SampleCounter render_width_counter_ GUARDED_BY(crit_);
105 SampleCounter render_height_counter_ GUARDED_BY(crit_);
asapersson6718e972015-07-24 00:20:58 -0700106 SampleCounter decode_time_counter_ GUARDED_BY(crit_);
asapersson13c433c2015-10-06 04:08:15 -0700107 SampleCounter delay_counter_ GUARDED_BY(crit_);
Åsa Persson3c391cb2015-04-27 10:09:49 +0200108 ReportBlockStats report_block_stats_ GUARDED_BY(crit_);
asapersson86b01602015-10-20 23:55:26 -0700109 QpCounters qp_counters_; // Only accessed on the decoding thread.
sprang@webrtc.org09315702014-02-07 12:06:29 +0000110};
111
sprang@webrtc.org09315702014-02-07 12:06:29 +0000112} // namespace webrtc
113#endif // WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_