| Index: media/cast/congestion_control/congestion_control.h
|
| diff --git a/media/cast/congestion_control/congestion_control.h b/media/cast/congestion_control/congestion_control.h
|
| index 236300a36bd9c91db166c034f02017a15e705949..54622ab114df197e00c817f5f1e57f5c17527d0f 100644
|
| --- a/media/cast/congestion_control/congestion_control.h
|
| +++ b/media/cast/congestion_control/congestion_control.h
|
| @@ -5,6 +5,8 @@
|
| #ifndef MEDIA_CAST_CONGESTION_CONTROL_CONGESTION_CONTROL_H_
|
| #define MEDIA_CAST_CONGESTION_CONTROL_CONGESTION_CONTROL_H_
|
|
|
| +#include <deque>
|
| +
|
| #include "base/basictypes.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/time/tick_clock.h"
|
| @@ -16,28 +18,65 @@ namespace cast {
|
| class CongestionControl {
|
| public:
|
| CongestionControl(base::TickClock* clock,
|
| - float congestion_control_back_off,
|
| uint32 max_bitrate_configured,
|
| uint32 min_bitrate_configured,
|
| - uint32 start_bitrate);
|
| + size_t max_unacked_frames);
|
|
|
| virtual ~CongestionControl();
|
|
|
| - // Don't call OnAck if the same message contain a NACK.
|
| - // Returns true if the bitrate have changed.
|
| - bool OnAck(base::TimeDelta rtt_ms, uint32* new_bitrate);
|
| + void UpdateRtt(base::TimeDelta rtt);
|
| +
|
| + // Called when an encoded frame is sent to the transport.
|
| + void SendFrameToTransport(uint32 frame_id,
|
| + size_t frame_size,
|
| + base::TimeTicks when);
|
| +
|
| + // Called when we receive an ACK for a frame.
|
| + void AckFrame(uint32 frame_id, base::TimeTicks when);
|
|
|
| - // Returns true if the bitrate have changed.
|
| - bool OnNack(base::TimeDelta rtt_ms, uint32* new_bitrate);
|
| + // Returns the bitrate we should use for the next frame.
|
| + uint32 GetBitrate(base::TimeTicks playout_time,
|
| + base::TimeDelta playout_delay);
|
|
|
| private:
|
| + struct FrameStats {
|
| + FrameStats();
|
| + // Time this frame was sent to the transport.
|
| + base::TimeTicks sent_time;
|
| + // Time this frame was acked.
|
| + base::TimeTicks ack_time;
|
| + // Size of encoded frame in bits.
|
| + size_t frame_size;
|
| + };
|
| +
|
| + // Calculate how much "dead air" (idle time) there is between two frames.
|
| + static base::TimeDelta DeadTime(const FrameStats& a, const FrameStats& b);
|
| + // Get the FrameStats for a given |frame_id|.
|
| + // Note: Older FrameStats will be removed automatically.
|
| + FrameStats* GetFrameStats(uint32 frame_id);
|
| + // Calculata safe bitrate. This is based on how much we've been
|
| + // sending in the past.
|
| + double CalculateSafeBitrate();
|
| +
|
| + // For a given frame, calculate when it might be acked.
|
| + // (Or return the time it was acked, if it was.)
|
| + base::TimeTicks EstimatedAckTime(uint32 frame_id, double bitrate);
|
| + // Calculate when we start sending the data for a given frame.
|
| + // This is done by calculating when we were done sending the previous
|
| + // frame, but obvoiusly can't be less than |sent_time| (if known).
|
| + base::TimeTicks EstimatedSendingTime(uint32 frame_id, double bitrate);
|
| +
|
| base::TickClock* const clock_; // Not owned by this class.
|
| - const float congestion_control_back_off_;
|
| const uint32 max_bitrate_configured_;
|
| const uint32 min_bitrate_configured_;
|
| - uint32 bitrate_;
|
| - base::TimeTicks time_last_increase_;
|
| - base::TimeTicks time_last_decrease_;
|
| + std::deque<FrameStats> frame_stats_;
|
| + uint32 last_frame_stats_;
|
| + uint32 last_acked_frame_;
|
| + uint32 last_encoded_frame_;
|
| + base::TimeDelta rtt_;
|
| + size_t history_size_;
|
| + size_t acked_bits_in_history_;
|
| + base::TimeDelta dead_time_in_history_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CongestionControl);
|
| };
|
|
|