11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CHROMECAST_MEDIA_CMA_BASE_BUFFERING_CONTROLLER_H 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CHROMECAST_MEDIA_CMA_BASE_BUFFERING_CONTROLLER_H 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <list> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/callback.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/weak_ptr.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread_checker.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferingConfig; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferingState; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferingController { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Callback<void(bool)> BufferingNotificationCB; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Creates a buffering controller where the conditions to trigger rebuffering 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // are given by |config|. The whole point of the buffering controller is to 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // derive a single buffering state from the buffering state of various 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // streams. 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |buffering_notification_cb| is a callback invoked to inform about possible 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // changes of the buffering state. 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingController( 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<BufferingConfig>& config, 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BufferingNotificationCB& buffering_notification_cb); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~BufferingController(); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Creates a buffering state for one stream. This state is added to the list 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // of streams monitored by the buffering controller. 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BufferingState> AddStream(); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets the playback time. 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetMediaTime(base::TimeDelta time); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the maximum media time available for rendering. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Return kNoTimestamp() if unknown. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta GetMaxRenderingTime() const; 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns whether there is an active buffering phase. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsBuffering() const { return is_buffering_; } 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Resets the buffering controller. This includes removing all the streams 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that were previously added. 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Reset(); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Invoked each time the buffering state of one of the streams has changed. 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If |force_notification| is set, |buffering_notification_cb_| is invoked 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // regardless whether the buffering state has changed or not. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If |buffering_timeout| is set, then the condition to leave the buffering 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // state is relaxed (we don't want to wait more). 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnBufferingStateChanged(bool force_notification, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool buffering_timeout); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Updates the high buffer level threshold to |high_level_threshold| 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // if needed. 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This condition is triggered when one of the stream reached its maximum 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // capacity. In that case, to avoid possible race condition (the buffering 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // controller waits for more data to come but the buffer is to small to 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // accomodate additional data), the thresholds in |config_| are adjusted 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // accordingly. 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void UpdateHighLevelThreshold(base::TimeDelta high_level_threshold); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Determines the overall buffer level based on the buffer level of each 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // stream. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsHighBufferLevel(); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsLowBufferLevel(); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Logs the state of the buffering controller. 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DumpState() const; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ThreadChecker thread_checker_; 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Settings used to determine when to start/stop buffering. 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BufferingConfig> config_; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Callback invoked each time there is a change of the buffering state. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingNotificationCB buffering_notification_cb_; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // State of the buffering controller. 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_buffering_; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start time of a re-buffering phase. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time begin_buffering_time_; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Buffering level for each individual stream. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::list<scoped_refptr<BufferingState> > StreamList; 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StreamList stream_list_; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<BufferingController> weak_factory_; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtr<BufferingController> weak_this_; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BufferingController); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromecast 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CHROMECAST_MEDIA_CMA_BASE_BUFFERING_CONTROLLER_H 109