| Index: webrtc/modules/rtp_rtcp/source/rtp_sender.h | 
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.h b/webrtc/modules/rtp_rtcp/source/rtp_sender.h | 
| index a672a06398a5772b9ef64914914a5946e8410536..49d98729ee27b356c3c644e4bc1d6f6a3ef813a5 100644 | 
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.h | 
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.h | 
| @@ -16,6 +16,7 @@ | 
| #include <utility> | 
| #include <vector> | 
|  | 
| +#include "webrtc/base/criticalsection.h" | 
| #include "webrtc/base/random.h" | 
| #include "webrtc/base/thread_annotations.h" | 
| #include "webrtc/common_types.h" | 
| @@ -30,8 +31,6 @@ | 
|  | 
| namespace webrtc { | 
|  | 
| -class BitrateAggregator; | 
| -class CriticalSectionWrapper; | 
| class RTPSenderAudio; | 
| class RTPSenderVideo; | 
| class RtcEventLog; | 
| @@ -196,7 +195,7 @@ class RTPSender : public RTPSenderInterface { | 
| const RTPHeader& rtp_header, | 
| size_t extension_length_bytes, | 
| size_t* extension_offset) const | 
| -      EXCLUSIVE_LOCKS_REQUIRED(send_critsect_.get()); | 
| +      EXCLUSIVE_LOCKS_REQUIRED(send_critsect_); | 
|  | 
| bool UpdateAudioLevel(uint8_t* rtp_packet, | 
| size_t rtp_packet_length, | 
| @@ -386,22 +385,54 @@ class RTPSender : public RTPSenderInterface { | 
| bool is_retransmit); | 
| bool IsFecPacket(const uint8_t* buffer, const RTPHeader& header) const; | 
|  | 
| -  Clock* clock_; | 
| -  int64_t clock_delta_ms_; | 
| +  class BitrateAggregator { | 
| +   public: | 
| +    explicit BitrateAggregator(BitrateStatisticsObserver* bitrate_callback); | 
| + | 
| +    void OnStatsUpdated() const; | 
| + | 
| +    Bitrate::Observer* total_bitrate_observer(); | 
| +    Bitrate::Observer* retransmit_bitrate_observer(); | 
| +    void set_ssrc(uint32_t ssrc); | 
| + | 
| +   private: | 
| +    // We assume that these observers are called on the same thread, which is | 
| +    // true for RtpSender as they are called on the Process thread. | 
| +    class BitrateObserver : public Bitrate::Observer { | 
| +     public: | 
| +      explicit BitrateObserver(const BitrateAggregator& aggregator); | 
| + | 
| +      // Implements Bitrate::Observer. | 
| +      void BitrateUpdated(const BitrateStatistics& stats) override; | 
| +      const BitrateStatistics& statistics() const; | 
| + | 
| +     private: | 
| +      BitrateStatistics statistics_; | 
| +      const BitrateAggregator& aggregator_; | 
| +    }; | 
| + | 
| +    BitrateStatisticsObserver* const callback_; | 
| +    BitrateObserver total_bitrate_observer_; | 
| +    BitrateObserver retransmit_bitrate_observer_; | 
| +    uint32_t ssrc_; | 
| +  }; | 
| + | 
| +  Clock* const clock_; | 
| +  const int64_t clock_delta_ms_; | 
| Random random_ GUARDED_BY(send_critsect_); | 
|  | 
| -  rtc::scoped_ptr<BitrateAggregator> bitrates_; | 
| +  BitrateAggregator bitrates_; | 
| Bitrate total_bitrate_sent_; | 
|  | 
| const bool audio_configured_; | 
| -  rtc::scoped_ptr<RTPSenderAudio> audio_; | 
| -  rtc::scoped_ptr<RTPSenderVideo> video_; | 
| +  const rtc::scoped_ptr<RTPSenderAudio> audio_; | 
| +  const rtc::scoped_ptr<RTPSenderVideo> video_; | 
|  | 
| RtpPacketSender* const paced_sender_; | 
| TransportSequenceNumberAllocator* const transport_sequence_number_allocator_; | 
| TransportFeedbackObserver* const transport_feedback_observer_; | 
| int64_t last_capture_time_ms_sent_; | 
| -  rtc::scoped_ptr<CriticalSectionWrapper> send_critsect_; | 
| +  rtc::CriticalSection send_critsect_; | 
|  | 
| Transport *transport_; | 
| bool sending_media_ GUARDED_BY(send_critsect_); | 
| @@ -440,7 +471,7 @@ class RTPSender : public RTPSenderInterface { | 
| // RTP variables | 
| bool start_timestamp_forced_ GUARDED_BY(send_critsect_); | 
| uint32_t start_timestamp_ GUARDED_BY(send_critsect_); | 
| -  SSRCDatabase& ssrc_db_ GUARDED_BY(send_critsect_); | 
| +  SSRCDatabase* const ssrc_db_; | 
| uint32_t remote_ssrc_ GUARDED_BY(send_critsect_); | 
| bool sequence_number_forced_ GUARDED_BY(send_critsect_); | 
| uint16_t sequence_number_ GUARDED_BY(send_critsect_); | 
|  |