1c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org/*
2c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *
4c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  Use of this source code is governed by a BSD-style license
5c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  that can be found in the LICENSE file in the root of the source
6c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  tree. An additional intellectual property rights grant can be found
7c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  in the file PATENTS.  All contributing project authors may
8c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org */
10c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
11c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#ifndef WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
12c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#define WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
13c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
14c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include <string>
15c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
16d54aa969545bd9c5ccc0077dd6645e742bf11418pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
17c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/common_types.h"
18c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/frame_callback.h"
19c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/rate_statistics.h"
20c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/video_engine/include/vie_codec.h"
21c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
22c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/video_receive_stream.h"
23c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#include "webrtc/video_renderer.h"
24c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
25c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgnamespace webrtc {
26c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
27c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgclass Clock;
28c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgclass CriticalSectionWrapper;
29c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgclass ViECodec;
30c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgclass ViEDecoderObserver;
31c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
32c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgnamespace internal {
33c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
34c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.orgclass ReceiveStatisticsProxy : public ViEDecoderObserver,
35c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                               public RtcpStatisticsCallback,
36c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                               public StreamDataCountersCallback {
37c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org public:
38c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  ReceiveStatisticsProxy(uint32_t ssrc,
39c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                         Clock* clock,
40c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                         ViERTP_RTCP* rtp_rtcp,
41c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                         ViECodec* codec,
42c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                         int channel);
43c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual ~ReceiveStatisticsProxy();
44c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
45c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  VideoReceiveStream::Stats GetStats() const;
46c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
47c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  void OnDecodedFrame();
48c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  void OnRenderedFrame();
49c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
50c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  // Overrides ViEDecoderObserver.
51c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void IncomingCodecChanged(const int video_channel,
52c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                                    const VideoCodec& video_codec) OVERRIDE {}
53c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void IncomingRate(const int video_channel,
54c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                            const unsigned int framerate,
55c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                            const unsigned int bitrate) OVERRIDE;
56c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void DecoderTiming(int decode_ms,
57c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int max_decode_ms,
58c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int current_delay_ms,
59c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int target_delay_ms,
60c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int jitter_buffer_ms,
61c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int min_playout_delay_ms,
62c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                             int render_delay_ms) OVERRIDE {}
63c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void RequestNewKeyFrame(const int video_channel) OVERRIDE {}
64c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
65c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  // Overrides RtcpStatisticsBallback.
66c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void StatisticsUpdated(const webrtc::RtcpStatistics& statistics,
67c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                                 uint32_t ssrc) OVERRIDE;
68c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
69c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  // Overrides StreamDataCountersCallback.
70c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  virtual void DataCountersUpdated(const webrtc::StreamDataCounters& counters,
71c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org                                   uint32_t ssrc) OVERRIDE;
72c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
73c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org private:
74c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  std::string GetCName() const;
75c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
76c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org  const int channel_;
77c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  Clock* const clock_;
78c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  ViECodec* const codec_;
79c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  ViERTP_RTCP* const rtp_rtcp_;
80c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org
81c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  scoped_ptr<CriticalSectionWrapper> crit_;
82c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  VideoReceiveStream::Stats stats_ GUARDED_BY(crit_);
83c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  RateStatistics decode_fps_estimator_ GUARDED_BY(crit_);
84c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org  RateStatistics renders_fps_estimator_ GUARDED_BY(crit_);
85c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org};
86c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org
87c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org}  // namespace internal
88c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org}  // namespace webrtc
89c8ab7215c005f95e375f6e07f2a08ab6c7431f51sprang@webrtc.org#endif  // WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
90