webmediaplayer_ms.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/renderer/render_view.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/renderer/compositor_bindings/web_layer_impl.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/media_stream_audio_renderer.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/media_stream_renderer_factory.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/video_frame_provider.h" 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_delegate.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/webmediaplayer_util.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_log.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h" 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "media/base/video_util.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMediaPlayer; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSize; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace { 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// This function copies a YV12 or NATIVE_TEXTURE to a new YV12 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// media::VideoFrame. 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<media::VideoFrame> CopyFrameToYV12( 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const scoped_refptr<media::VideoFrame>& frame) { 44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(frame->format() == media::VideoFrame::YV12 || 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame->format() == media::VideoFrame::I420 || 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->format() == media::VideoFrame::NATIVE_TEXTURE); 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<media::VideoFrame> new_frame = 48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch media::VideoFrame::CreateFrame(media::VideoFrame::YV12, 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->coded_size(), 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->visible_rect(), 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->natural_size(), 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame->timestamp()); 53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (frame->format() == media::VideoFrame::NATIVE_TEXTURE) { 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SkBitmap bitmap; 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bitmap.allocN32Pixels(frame->visible_rect().width(), 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->visible_rect().height()); 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->ReadPixelsFromNativeTexture(bitmap); 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch media::CopyRGBToVideoFrame( 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch reinterpret_cast<uint8*>(bitmap.getPixels()), 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bitmap.rowBytes(), 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->visible_rect(), 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new_frame.get()); 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch size_t number_of_planes = 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch media::VideoFrame::NumPlanes(frame->format()); 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (size_t i = 0; i < number_of_planes; ++i) { 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch media::CopyPlane(i, frame->data(i), frame->stride(i), 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame->rows(i), new_frame.get()); 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return new_frame; 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // anonymous namespace 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerMS::WebMediaPlayerMS( 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayerClient* client, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<WebMediaPlayerDelegate> delegate, 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) media::MediaLog* media_log, 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<MediaStreamRendererFactory> factory) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : frame_(frame), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_state_(WebMediaPlayer::NetworkStateEmpty), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_(static_cast<size_t>(1)), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_(client), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_(true), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_frame_used_(false), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_repaint_(false), 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame_provider_client_(NULL), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_first_frame_(false), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_frame_count_(0), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dropped_frame_count_(0), 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) media_log_(media_log), 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) renderer_factory_(factory.Pass()) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::ctor"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerMS::~WebMediaPlayerMS() { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::dtor"; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetVideoFrameProviderClient(NULL); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetClient()->setWebLayer(NULL); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (video_frame_provider_.get()) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_frame_provider_->Stop(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (audio_renderer_.get()) 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) audio_renderer_->Stop(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (delegate_.get()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PlayerGone(this); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebMediaPlayerMS::load(LoadType load_type, 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CORSMode cors_mode) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::load"; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(acolwell): Change this to DCHECK_EQ(load_type, 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // LoadTypeMediaStream) once Blink-side changes land. 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_NE(load_type, LoadTypeMediaSource); 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl(url); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setVolume(GetClient()->volume()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateLoading); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) video_frame_provider_ = renderer_factory_->GetVideoFrameProvider( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr())); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrame* frame = RenderFrame::FromWebFrame(frame_); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) audio_renderer_ = renderer_factory_->GetAudioRenderer( 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame->GetRenderView()->GetRoutingID(), 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame->GetRoutingID()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_frame_provider_.get() || audio_renderer_.get()) { 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (audio_renderer_.get()) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_renderer_->Start(); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_frame_provider_.get()) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_frame_provider_->Start(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is audio-only mode. 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(audio_renderer_.get()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateNetworkError); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::play() { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::play"; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (paused_) { 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_frame_provider_.get()) 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) video_frame_provider_->Play(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (audio_renderer_.get()) 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) audio_renderer_->Play(); 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (delegate_.get()) 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->DidPlay(this); 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_ = false; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PLAY)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::pause() { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::pause"; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_frame_provider_.get()) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_frame_provider_->Pause(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!paused_) { 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (audio_renderer_.get()) 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) audio_renderer_->Pause(); 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (delegate_.get()) 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_->DidPause(this); 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_ = true; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent(media_log_->CreateEvent(media::MediaLogEvent::PAUSE)); 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!current_frame_) 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Copy the frame so that rendering can show the last received frame. 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The original frame must not be referenced when the player is paused since 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // there might be a finite number of available buffers. E.g, video that 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // originates from a video camera. 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<media::VideoFrame> new_frame = CopyFrameToYV12(current_frame_); 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::AutoLock auto_lock(current_frame_lock_); 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch current_frame_ = new_frame; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::supportsSave() const { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::seek(double seconds) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::setRate(double rate) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerMS::setVolume(double volume) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!audio_renderer_.get()) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::setVolume(volume=" << volume << ")"; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_renderer_->SetVolume(volume); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::setPreload(WebMediaPlayer::Preload preload) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasVideo() const { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return (video_frame_provider_.get() != NULL); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasAudio() const { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return (audio_renderer_.get() != NULL); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebSize WebMediaPlayerMS::naturalSize() const { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size; 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (current_frame_.get()) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = current_frame_->natural_size(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "WebMediaPlayerMS::naturalSize, " << size.ToString(); 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return blink::WebSize(size); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::paused() const { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return paused_; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::seeking() const { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::duration() const { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::numeric_limits<double>::infinity(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::currentTime() const { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (current_time_.ToInternalValue() != 0) { 285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return current_time_.InSecondsF(); 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (audio_renderer_.get()) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return audio_renderer_->GetCurrentRenderTime().InSecondsF(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0.0; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::NetworkState WebMediaPlayerMS::networkState() const { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::networkState, state:" << network_state_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_state_; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::ReadyState WebMediaPlayerMS::readyState() const { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::readyState, state:" << ready_state_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ready_state_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebTimeRanges WebMediaPlayerMS::buffered() const { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffered_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::maxTimeSeekable() const { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0.0; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebMediaPlayerMS::didLoadingProgress() { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::paint(WebCanvas* canvas, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebRect& rect, 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unsigned char alpha) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "WebMediaPlayerMS::paint"; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_renderer_.Paint(current_frame_.get(), canvas, dest_rect, alpha); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(current_frame_lock_); 330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (current_frame_.get()) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_frame_used_ = true; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::hasSingleSecurityOrigin() const { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerMS::didPassCORSAccessCheck() const { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerMS::mediaTimeForTimeValue(double timeValue) const { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ConvertSecondsToTimestamp(timeValue).InSecondsF(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::decodedFrameCount() const { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::decodedFrameCount, " << total_frame_count_; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return total_frame_count_; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::droppedFrameCount() const { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::droppedFrameCount, " << dropped_frame_count_; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dropped_frame_count_; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::audioDecodedByteCount() const { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerMS::videoDecodedByteCount() const { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaPlayerMS::SetVideoFrameProviderClient( 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::VideoFrameProvider::Client* client) { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is called from both the main renderer thread and the compositor 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // thread (when the main thread is blocked). 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (video_frame_provider_client_) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame_provider_client_->StopUsingProvider(); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_frame_provider_client_ = client; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<media::VideoFrame> WebMediaPlayerMS::GetCurrentFrame() { 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(3) << "WebMediaPlayerMS::GetCurrentFrame"; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(current_frame_lock_); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!pending_repaint_); 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!current_frame_.get()) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_repaint_ = true; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_frame_used_ = true; 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return current_frame_; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaPlayerMS::PutCurrentFrame( 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame) { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame"; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(pending_repaint_); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_repaint_ = false; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::OnFrameAvailable( 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "WebMediaPlayerMS::OnFrameAvailable"; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++total_frame_count_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!received_first_frame_) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_first_frame_ = true; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(current_frame_lock_); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!current_frame_used_); 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch current_frame_ = frame; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetClient()->sizeChanged(); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (video_frame_provider_) { 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) video_weblayer_.reset(new WebLayerImpl(cc::VideoLayer::Create(this))); 418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch video_weblayer_->setOpaque(true); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetClient()->setWebLayer(video_weblayer_.get()); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not update |current_frame_| when paused. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (paused_) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool size_changed = !current_frame_.get() || 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) current_frame_->natural_size() != frame->natural_size(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(current_frame_lock_); 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!current_frame_used_ && current_frame_.get()) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++dropped_frame_count_; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_frame_ = frame; 435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) current_time_ = frame->timestamp(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_frame_used_ = false; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size_changed) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetClient()->sizeChanged(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetClient()->repaint(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::RepaintInternal() { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::RepaintInternal"; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetClient()->repaint(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::OnSourceError() { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "WebMediaPlayerMS::OnSourceError"; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepaintInternal(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::SetNetworkState(WebMediaPlayer::NetworkState state) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_state_ = state; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always notify to ensure client has the latest value. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetClient()->networkStateChanged(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerMS::SetReadyState(WebMediaPlayer::ReadyState state) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_state_ = state; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always notify to ensure client has the latest value. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetClient()->readyStateChanged(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(client_); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return client_; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace content 479