Home | History | Annotate | Download | only in media
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // An extremely simple implementation of DataSource that downloads the entire
      6 // media resource into memory before signaling that initialization has finished.
      7 // Primarily used to test <audio> and <video> with buffering/caching removed
      8 // from the equation.
      9 
     10 #ifndef WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_
     11 #define WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_
     12 
     13 #include <algorithm>
     14 #include <string>
     15 
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/message_loop.h"
     18 #include "media/base/filter_factories.h"
     19 #include "media/base/filters.h"
     20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
     21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h"
     22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h"
     23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
     24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
     25 #include "webkit/glue/media/web_data_source.h"
     26 
     27 class MessageLoop;
     28 class WebMediaPlayerDelegateImpl;
     29 
     30 namespace webkit_glue {
     31 
     32 class SimpleDataSource : public WebDataSource,
     33                          public WebKit::WebURLLoaderClient {
     34  public:
     35   // Creates a DataSourceFactory for building SimpleDataSource objects.
     36   static media::DataSourceFactory* CreateFactory(
     37       MessageLoop* render_loop,
     38       WebKit::WebFrame* frame,
     39       WebDataSourceBuildObserverHack* build_observer);
     40 
     41   SimpleDataSource(MessageLoop* render_loop, WebKit::WebFrame* frame);
     42   virtual ~SimpleDataSource();
     43 
     44   // media::Filter implementation.
     45   virtual void set_host(media::FilterHost* host);
     46   virtual void Stop(media::FilterCallback* callback);
     47 
     48   // media::DataSource implementation.
     49   virtual const media::MediaFormat& media_format();
     50   virtual void Read(int64 position, size_t size,
     51                     uint8* data, ReadCallback* read_callback);
     52   virtual bool GetSize(int64* size_out);
     53   virtual bool IsStreaming();
     54   virtual void SetPreload(media::Preload preload);
     55 
     56   // Used to inject a mock used for unittests.
     57   virtual void SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader);
     58 
     59   // WebKit::WebURLLoaderClient implementations.
     60   virtual void willSendRequest(
     61       WebKit::WebURLLoader* loader,
     62       WebKit::WebURLRequest& newRequest,
     63       const WebKit::WebURLResponse& redirectResponse);
     64   virtual void didSendData(
     65       WebKit::WebURLLoader* loader,
     66       unsigned long long bytesSent,
     67       unsigned long long totalBytesToBeSent);
     68   virtual void didReceiveResponse(
     69       WebKit::WebURLLoader* loader,
     70       const WebKit::WebURLResponse& response);
     71   virtual void didDownloadData(
     72       WebKit::WebURLLoader* loader,
     73       int dataLength);
     74   virtual void didReceiveData(
     75       WebKit::WebURLLoader* loader,
     76       const char* data,
     77       int dataLength,
     78       int encodedDataLength);
     79   virtual void didReceiveCachedMetadata(
     80       WebKit::WebURLLoader* loader,
     81       const char* data, int dataLength);
     82   virtual void didFinishLoading(
     83       WebKit::WebURLLoader* loader,
     84       double finishTime);
     85   virtual void didFail(
     86       WebKit::WebURLLoader* loader,
     87       const WebKit::WebURLError&);
     88 
     89   // webkit_glue::WebDataSource implementation.
     90   virtual void Initialize(const std::string& url,
     91                           media::PipelineStatusCallback* callback);
     92   virtual void CancelInitialize();
     93   virtual bool HasSingleOrigin();
     94   virtual void Abort();
     95 
     96  private:
     97   // Updates |url_| and |media_format_| with the given URL.
     98   void SetURL(const GURL& url);
     99 
    100   // Creates and starts the resource loading on the render thread.
    101   void StartTask();
    102 
    103   // Cancels and deletes the resource loading on the render thread.
    104   void CancelTask();
    105 
    106   // Perform initialization completion tasks under a lock.
    107   void DoneInitialization_Locked(bool success);
    108 
    109   // Update host() stats like total bytes & buffered bytes.
    110   void UpdateHostState();
    111 
    112   // Primarily used for asserting the bridge is loading on the render thread.
    113   MessageLoop* render_loop_;
    114 
    115   // A webframe for loading.
    116   WebKit::WebFrame* frame_;
    117 
    118   // Does the work of loading and sends data back to this client.
    119   scoped_ptr<WebKit::WebURLLoader> url_loader_;
    120 
    121   media::MediaFormat media_format_;
    122   GURL url_;
    123   std::string data_;
    124   int64 size_;
    125   bool single_origin_;
    126 
    127   // Simple state tracking variable.
    128   enum State {
    129     UNINITIALIZED,
    130     INITIALIZING,
    131     INITIALIZED,
    132     STOPPED,
    133   };
    134   State state_;
    135 
    136   // Used for accessing |state_|.
    137   base::Lock lock_;
    138 
    139   // Filter callbacks.
    140   scoped_ptr<media::PipelineStatusCallback> initialize_callback_;
    141 
    142   // Used to ensure mocks for unittests are used instead of reset in Start().
    143   bool keep_test_loader_;
    144 
    145   DISALLOW_COPY_AND_ASSIGN(SimpleDataSource);
    146 };
    147 
    148 }  // namespace webkit_glue
    149 
    150 #endif  // WEBKIT_GLUE_MEDIA_SIMPLE_DATA_SOURCE_H_
    151