13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef MEDIA_CAST_CONGESTION_CONTROL_CONGESTION_CONTROL_H_ 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define MEDIA_CAST_CONGESTION_CONTROL_CONGESTION_CONTROL_H_ 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <deque> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/time/tick_clock.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/time/time.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media { 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace cast { 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class CongestionControl { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CongestionControl(base::TickClock* clock, 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) uint32 max_bitrate_configured, 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) uint32 min_bitrate_configured, 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t max_unacked_frames); 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~CongestionControl(); 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void UpdateRtt(base::TimeDelta rtt); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Called when an encoded frame is sent to the transport. 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SendFrameToTransport(uint32 frame_id, 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t frame_size, 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeTicks when); 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Called when we receive an ACK for a frame. 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void AckFrame(uint32 frame_id, base::TimeTicks when); 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns the bitrate we should use for the next frame. 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 GetBitrate(base::TimeTicks playout_time, 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta playout_delay); 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) struct FrameStats { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FrameStats(); 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Time this frame was sent to the transport. 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeTicks sent_time; 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Time this frame was acked. 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeTicks ack_time; 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Size of encoded frame in bits. 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t frame_size; 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Calculate how much "dead air" (idle time) there is between two frames. 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static base::TimeDelta DeadTime(const FrameStats& a, const FrameStats& b); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Get the FrameStats for a given |frame_id|. 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Note: Older FrameStats will be removed automatically. 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FrameStats* GetFrameStats(uint32 frame_id); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Calculata safe bitrate. This is based on how much we've been 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // sending in the past. 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) double CalculateSafeBitrate(); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // For a given frame, calculate when it might be acked. 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (Or return the time it was acked, if it was.) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeTicks EstimatedAckTime(uint32 frame_id, double bitrate); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Calculate when we start sending the data for a given frame. 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This is done by calculating when we were done sending the previous 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // frame, but obvoiusly can't be less than |sent_time| (if known). 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeTicks EstimatedSendingTime(uint32 frame_id, double bitrate); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::TickClock* const clock_; // Not owned by this class. 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const uint32 max_bitrate_configured_; 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const uint32 min_bitrate_configured_; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::deque<FrameStats> frame_stats_; 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 last_frame_stats_; 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 last_acked_frame_; 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 last_encoded_frame_; 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta rtt_; 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t history_size_; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t acked_bits_in_history_; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta dead_time_in_history_; 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CongestionControl); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace cast 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace media 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // MEDIA_CAST_CONGESTION_CONTROL_CONGESTION_CONTROL_H_ 88