webmediaplayer_ms.cc revision 3551c9c881056c480085172ff9840cab31610854
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_ms.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/media_stream_audio_renderer.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/media_stream_client.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/video_frame_provider.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_delegate.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_log.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaPlayerClient.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCanvas;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaPlayer;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSize;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerMS::WebMediaPlayerMS(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebFrame* frame,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebMediaPlayerClient* client,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WeakPtr<WebMediaPlayerDelegate> delegate,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaStreamClient* media_stream_client,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    media::MediaLog* media_log)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : frame_(frame),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_state_(WebMediaPlayer::NetworkStateEmpty),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffered_(static_cast<size_t>(1)),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      client_(client),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_stream_client_(media_stream_client),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      paused_(true),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_frame_used_(false),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_repaint_(false),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      video_frame_provider_client_(NULL),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      received_first_frame_(false),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_started_(false),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      total_frame_count_(0),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dropped_frame_count_(0),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_log_(media_log) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::ctor";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(media_stream_client);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_log_->AddEvent(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerMS::~WebMediaPlayerMS() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::dtor";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetVideoFrameProviderClient(NULL);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetClient()->setWebLayer(NULL);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (video_frame_provider_.get()) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    video_frame_provider_->Stop();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (audio_renderer_.get()) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (audio_renderer_->IsLocalRenderer()) {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      audio_renderer_->Stop();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (!paused_) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // The |audio_renderer_| can be shared by multiple remote streams, and
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // pause the |audio_renderer_| here to avoid re-creating the
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // |audio_renderer_|.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      audio_renderer_->Pause();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_log_->AddEvent(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_.get())
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->PlayerGone(this);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebMediaPlayerMS::load(LoadType load_type,
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const WebKit::WebURL& url,
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            CORSMode cors_mode) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::load";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(acolwell): Change this to DCHECK_EQ(load_type,
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // LoadTypeMediaStream) once Blink-side changes land.
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_NE(load_type, LoadTypeMediaSource);
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gurl(url);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setVolume(GetClient()->volume());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNetworkState(WebMediaPlayer::NetworkStateLoading);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if this url is media stream.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  video_frame_provider_ = media_stream_client_->GetVideoFrameProvider(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr()));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_renderer_ = media_stream_client_->GetAudioRenderer(url);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (video_frame_provider_.get() || audio_renderer_.get()) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetClient()->setOpaque(true);
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (audio_renderer_.get())
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      audio_renderer_->Start();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (video_frame_provider_.get()) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      video_frame_provider_->Start();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This is audio-only mode.
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(audio_renderer_.get());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetNetworkState(WebMediaPlayer::NetworkStateNetworkError);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::play() {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::play";
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (paused_) {
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (video_frame_provider_.get())
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      video_frame_provider_->Play();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (audio_renderer_.get())
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      audio_renderer_->Play();
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (delegate_.get())
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      delegate_->DidPlay(this);
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paused_ = false;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::pause() {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::pause";
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (video_frame_provider_.get())
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    video_frame_provider_->Pause();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!paused_) {
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (audio_renderer_.get())
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      audio_renderer_->Pause();
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (delegate_.get())
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      delegate_->DidPause(this);
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paused_ = true;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::supportsFullscreen() const {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::supportsSave() const {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::seek(double seconds) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::setRate(double rate) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::setVolume(double volume) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!audio_renderer_.get())
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::setVolume(volume=" << volume << ")";
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  audio_renderer_->SetVolume(volume);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::setPreload(WebMediaPlayer::Preload preload) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasVideo() const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return (video_frame_provider_.get() != NULL);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasAudio() const {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return (audio_renderer_.get() != NULL);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSize WebMediaPlayerMS::naturalSize() const {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size;
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (current_frame_.get())
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = current_frame_->natural_size();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(3) << "WebMediaPlayerMS::naturalSize, " << size.ToString();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebKit::WebSize(size);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::paused() const {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return paused_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::seeking() const {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::duration() const {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return std::numeric_limits<double>::infinity();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::currentTime() const {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (current_frame_.get()) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return current_frame_->GetTimestamp().InSecondsF();
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (audio_renderer_.get()) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return audio_renderer_->GetCurrentRenderTime().InSecondsF();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return 0.0;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::NetworkState WebMediaPlayerMS::networkState() const {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::networkState, state:" << network_state_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return network_state_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::ReadyState WebMediaPlayerMS::readyState() const {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::readyState, state:" << ready_state_;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ready_state_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const WebKit::WebTimeRanges& WebMediaPlayerMS::buffered() {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffered_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::maxTimeSeekable() const {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return 0.0;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::didLoadingProgress() const {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::paint(WebCanvas* canvas,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const WebRect& rect,
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                             unsigned char alpha) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(3) << "WebMediaPlayerMS::paint";
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height);
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  video_renderer_.Paint(current_frame_.get(), canvas, dest_rect, alpha);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoLock auto_lock(current_frame_lock_);
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (current_frame_.get())
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_frame_used_ = true;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasSingleSecurityOrigin() const {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::didPassCORSAccessCheck() const {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::mediaTimeForTimeValue(double timeValue) const {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertSecondsToTimestamp(timeValue).InSecondsF();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::decodedFrameCount() const {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::decodedFrameCount, " << total_frame_count_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return total_frame_count_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::droppedFrameCount() const {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::droppedFrameCount, " << dropped_frame_count_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dropped_frame_count_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::audioDecodedByteCount() const {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::videoDecodedByteCount() const {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaPlayerMS::SetVideoFrameProviderClient(
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cc::VideoFrameProvider::Client* client) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is called from both the main renderer thread and the compositor
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread (when the main thread is blocked).
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (video_frame_provider_client_)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    video_frame_provider_client_->StopUsingProvider();
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  video_frame_provider_client_ = client;
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<media::VideoFrame> WebMediaPlayerMS::GetCurrentFrame() {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(3) << "WebMediaPlayerMS::GetCurrentFrame";
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AutoLock auto_lock(current_frame_lock_);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!pending_repaint_);
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!current_frame_.get())
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_repaint_ = true;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_frame_used_ = true;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return current_frame_;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaPlayerMS::PutCurrentFrame(
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<media::VideoFrame>& frame) {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame";
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(pending_repaint_);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pending_repaint_ = false;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::OnFrameAvailable(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const scoped_refptr<media::VideoFrame>& frame) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(3) << "WebMediaPlayerMS::OnFrameAvailable";
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++total_frame_count_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!received_first_frame_) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_first_frame_ = true;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::AutoLock auto_lock(current_frame_lock_);
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(!current_frame_used_);
3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      current_frame_ = frame;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetClient()->sizeChanged();
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (video_frame_provider_.get() && GetClient()->needsWebLayerForVideo()) {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      video_weblayer_.reset(
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new webkit::WebLayerImpl(cc::VideoLayer::Create(this)));
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetClient()->setWebLayer(video_weblayer_.get());
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not update |current_frame_| when paused.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (paused_)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sequence_started_) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence_started_ = true;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_time_ = frame->GetTimestamp();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool size_changed = !current_frame_.get() ||
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      current_frame_->natural_size() != frame->natural_size();
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoLock auto_lock(current_frame_lock_);
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!current_frame_used_ && current_frame_.get())
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ++dropped_frame_count_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_frame_ = frame;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_frame_->SetTimestamp(frame->GetTimestamp() - start_time_);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_frame_used_ = false;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_changed)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetClient()->sizeChanged();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetClient()->repaint();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::RepaintInternal() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::RepaintInternal";
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetClient()->repaint();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::OnSourceError() {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "WebMediaPlayerMS::OnSourceError";
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNetworkState(WebMediaPlayer::NetworkStateFormatError);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepaintInternal();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::SetNetworkState(WebMediaPlayer::NetworkState state) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_ = state;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always notify to ensure client has the latest value.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClient()->networkStateChanged();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::SetReadyState(WebMediaPlayer::ReadyState state) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ready_state_ = state;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always notify to ensure client has the latest value.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetClient()->readyStateChanged();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(client_);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return client_;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace content
443