1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_H_ 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "media/base/filter_factories.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "media/base/filters.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/glue/media/buffered_resource_loader.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue { 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass BufferedDataSource : public WebDataSource { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Creates a DataSourceFactory for building BufferedDataSource objects. 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static media::DataSourceFactory* CreateFactory( 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop* render_loop, 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebKit::WebFrame* frame, 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataSourceBuildObserverHack* build_observer); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BufferedDataSource(MessageLoop* render_loop, 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebFrame* frame); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual ~BufferedDataSource(); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // media::Filter implementation. 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void set_host(media::FilterHost* host); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Stop(media::FilterCallback* callback); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetPlaybackRate(float playback_rate); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // media::DataSource implementation. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called from demuxer thread. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void Read(int64 position, size_t size, 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8* data, 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch media::DataSource::ReadCallback* read_callback); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool GetSize(int64* size_out); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool IsStreaming(); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SetPreload(media::Preload preload); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const media::MediaFormat& media_format() { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return media_format_; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // webkit_glue::WebDataSource implementation. 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void Initialize(const std::string& url, 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media::PipelineStatusCallback* callback); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void CancelInitialize(); 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool HasSingleOrigin(); 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void Abort(); 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A factory method to create a BufferedResourceLoader based on the read 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // parameters. We can override this file to object a mock 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BufferedResourceLoader for testing. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual BufferedResourceLoader* CreateResourceLoader( 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 first_byte_position, int64 last_byte_position); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Gets the number of milliseconds to declare a request timeout since 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the request was made. This method is made virtual so as to inject a 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different number for testing purpose. 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual base::TimeDelta GetTimeoutMilliseconds(); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Posted to perform initialization on render thread and start resource 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // loading. 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InitializeTask(); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Task posted to perform actual reading on the render thread. 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void ReadTask(int64 position, int read_size, uint8* read_buffer); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Task posted when Stop() is called. Stops |watch_dog_timer_| and 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |loader_|, reset Read() variables, and set |stopped_on_render_loop_| 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to signal any remaining tasks to stop. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CleanupTask(); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Restart resource loading on render thread. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RestartLoadingTask(); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This task monitors the current active read request. If the current read 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // request has timed out, this task will destroy the current loader and 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // creates a new one to accommodate the read request. 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void WatchDogTask(); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This task uses the current playback rate with the previous playback rate 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to determine whether we are going from pause to play and play to pause, 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and signals the buffered resource loader accordingly. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetPlaybackRateTask(float playback_rate); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This task saves the preload value for the media. 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void SetPreloadTask(media::Preload preload); 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Decides which DeferStrategy to used based on the current state of the 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // BufferedDataSource. 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BufferedResourceLoader::DeferStrategy ChooseDeferStrategy(); 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The method that performs actual read. This method can only be executed on 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the render thread. 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ReadInternal(); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Calls |read_callback_| and reset all read parameters. 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DoneRead_Locked(int error); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Calls |initialize_callback_| and reset it. 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void DoneInitialization_Locked(media::PipelineStatus status); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method for |loader_| if URL for the resource requested is using 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HTTP protocol. This method is called when response for initial request is 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // received. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HttpInitialStartCallback(int error); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method for |loader_| if URL for the resource requested is using 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a non-HTTP protocol, e.g. local files. This method is called when response 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for initial request is received. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NonHttpInitialStartCallback(int error); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method to be passed to BufferedResourceLoader during range 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // request. Once a resource request has started, this method will be called 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // with the error code. This method will be executed on the thread 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BufferedResourceLoader lives, i.e. render thread. 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PartialReadStartCallback(int error); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method for making a read request to BufferedResourceLoader. 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If data arrives or the request has failed, this method is called with 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the error code or the number of bytes read. 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ReadCallback(int error); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method when a network event is received. 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NetworkEventCallback(); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void UpdateHostState(); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch media::MediaFormat media_format_; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URL of the resource requested. 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Members for total bytes of the requested object. It is written once on 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // render thread but may be read from any thread. However reading of this 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // member is guaranteed to happen after it is first written, so we don't 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // need to protect it. 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 total_bytes_; 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64 buffered_bytes_; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if this data source is considered loaded. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool loaded_; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This value will be true if this data source can only support streaming. 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // i.e. range request is not supported. 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool streaming_; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // A webframe for loading. 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebFrame* frame_; 15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A resource loader for the media resource. 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<BufferedResourceLoader> loader_; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if network is active. 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool network_activity_; 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback method from the pipeline for initialization. 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<media::PipelineStatusCallback> initialize_callback_; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Read parameters received from the Read() method call. 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<media::DataSource::ReadCallback> read_callback_; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 read_position_; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int read_size_; 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8* read_buffer_; 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time read_submitted_time_; 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int read_attempts_; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This buffer is intermediate, we use it for BufferedResourceLoader to write 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to. And when read in BufferedResourceLoader is done, we copy data from 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this buffer to |read_buffer_|. The reason for an additional copy is that 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we don't own |read_buffer_|. But since the read operation is asynchronous, 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |read_buffer| can be destroyed at any time, so we only copy into 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |read_buffer| in the final step when it is safe. 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Memory is allocated for this member during initialization of this object 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // because we want buffer to be passed into BufferedResourceLoader to be 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // always non-null. And by initializing this member with a default size we can 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // avoid creating zero-sized buffered if the first read has zero size. 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_array<uint8> intermediate_read_buffer_; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int intermediate_read_buffer_size_; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The message loop of the render thread. 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop* render_loop_; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Protects |stopped_|. 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Lock lock_; 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Stop signal to suppressing activities. This variable is set on the pipeline 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // thread and read from the render thread. 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool stop_signal_received_; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This variable is set by CleanupTask() that indicates this object is stopped 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // on the render thread and work should no longer progress. 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool stopped_on_render_loop_; 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This variable is true when we are in a paused state and false when we 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // are in a playing state. 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool media_is_paused_; 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This variable is true when the user has requested the video to play at 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // least once. 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool media_has_played_; 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This variable holds the value of the preload attribute for the video 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // element. 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen media::Preload preload_; 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This timer is to run the WatchDogTask repeatedly. We use a timer instead 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of doing PostDelayedTask() reduce the extra reference held by the message 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // loop. The RepeatingTimer does PostDelayedTask() internally, by using it 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the message loop doesn't hold a reference for the watch dog task. 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::RepeatingTimer<BufferedDataSource> watch_dog_timer_; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Keeps track of whether we used a Range header in the initialization 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // request. 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool using_range_request_; 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BufferedDataSource); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace webkit_glue 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_H_ 232