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) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback_helpers.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/debug/alias.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/debug/crash_logging.h" 178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/debug/trace_event.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/single_thread_task_runner.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/blink/web_layer_impl.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/common/mailbox_holder.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/null_audio_sink.h" 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "media/base/audio_hardware_config.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/limits.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_log.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/pipeline.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/text_renderer.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h" 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/buffered_data_source.h" 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/encrypted_media_player_support.h" 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/texttrack_impl.h" 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webaudiosourceprovider_impl.h" 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webinbandtexttrack_impl.h" 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_delegate.h" 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_params.h" 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediaplayer_util.h" 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/webmediasource_impl.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/audio_renderer_impl.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/chunk_demuxer.h" 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/ffmpeg_audio_decoder.h" 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/ffmpeg_demuxer.h" 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/ffmpeg_video_decoder.h" 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/filters/gpu_video_accelerator_factories.h" 49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "media/filters/gpu_video_decoder.h" 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/opus_audio_decoder.h" 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/filters/renderer_impl.h" 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/filters/video_renderer_impl.h" 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/filters/vpx_video_decoder.h" 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaSource.h" 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMediaPlayer; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect; 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSize; 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limits the range of playback rate. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kylep): Revisit these. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Vista has substantially lower performance than XP or Windows7. If you speed 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// up a video too much, it can't keep up, and rendering stops updating except on 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the time bar. For really high speeds, audio becomes a bottleneck and we just 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use up the data we have, which may not achieve the speed requested, but will 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not crash the tab. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A very slow speed, ie 0.00000001x, causes the machine to lock up. (It seems 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// like a busy loop). It gets unresponsive, although its not completely dead. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also our timers are not very accurate (especially for ogg), which becomes 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// evident at low speeds and on Vista. Since other speeds are risky and outside 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the norms, we think 1/16x to 16x is a safe and useful range for now. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const double kMinRate = 0.0625; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const double kMaxRate = 16.0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit SyncPointClientImpl( 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebGraphicsContext3D* web_graphics_context) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : web_graphics_context_(web_graphics_context) {} 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~SyncPointClientImpl() {} 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual uint32 InsertSyncPoint() OVERRIDE { 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return web_graphics_context_->insertSyncPoint(); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) web_graphics_context_->waitSyncPoint(sync_point); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blink::WebGraphicsContext3D* web_graphics_context_; 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BufferedDataSourceHostImpl; 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(name) \ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMediaPlayer::CORSMode ## name) == \ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(BufferedResourceLoader::k ## name), \ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(Unspecified); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(Anonymous); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(UseCredentials); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPILE_ASSERT_MATCHING_ENUM 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BIND_TO_RENDER_LOOP(function) \ 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define BIND_TO_RENDER_LOOP1(function, arg1) \ 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& error) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerImpl::WebMediaPlayerImpl( 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch blink::WebLocalFrame* frame, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayerClient* client, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<WebMediaPlayerDelegate> delegate, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebMediaPlayerParams& params) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : frame_(frame), 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_state_(WebMediaPlayer::NetworkStateEmpty), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci preload_(BufferedDataSource::AUTO), 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_task_runner_(base::MessageLoopProxy::current()), 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_(params.media_task_runner()), 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_(params.media_log()), 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pipeline_(media_task_runner_, media_log_.get()), 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) load_type_(LoadTypeURL), 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch opaque_(false), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_(true), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seeking_(false), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) playback_rate_(0.0f), 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ended_(false), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_seek_(false), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_seek_seconds_(0.0f), 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch should_notify_time_changed_(false), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_(client), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch defer_load_cb_(params.defer_load_cb()), 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gpu_factories_(params.gpu_factories()), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) supports_save_(true), 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chunk_demuxer_(NULL), 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor_task_runner_(params.compositor_task_runner()), 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) compositor_(new VideoFrameCompositor( 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) text_track_index_(0), 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_( 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params.CreateEncryptedMediaPlayerSupport(client)), 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_hardware_config_(params.audio_hardware_config()) { 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(encrypted_media_support_); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Threaded compositing isn't enabled universally yet. 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!compositor_task_runner_.get()) 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor_task_runner_ = base::MessageLoopProxy::current(); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent( 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // |gpu_factories_| requires that its entry points be called on its 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |GetTaskRunner()|. Since |pipeline_| will own decoders created from the 1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // factories, require that their message loops are identical. 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!gpu_factories_.get() || 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (gpu_factories_->GetTaskRunner() == media_task_runner_.get())); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Use the null sink if no sink was provided. 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_source_provider_ = new WebAudioSourceProviderImpl( 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) params.audio_renderer_sink().get() 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ? params.audio_renderer_sink() 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : new NullAudioSink(media_task_runner_)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerImpl::~WebMediaPlayerImpl() { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->setWebLayer(NULL); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent( 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delegate_) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->PlayerGone(this); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Abort any pending IO so stopping the pipeline doesn't get blocked. 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data_source_) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_source_->Abort(); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (chunk_demuxer_) { 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chunk_demuxer_->Shutdown(); 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chunk_demuxer_ = NULL; 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gpu_factories_ = NULL; 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Make sure to kill the pipeline so there's no more media threads running. 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note: stopping the pipeline might block for a long time. 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WaitableEvent waiter(false, false); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.Stop( 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) waiter.Wait(); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebMediaPlayerImpl::load(LoadType load_type, const blink::WebURL& url, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CORSMode cors_mode) { 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", " 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) << cors_mode << ")"; 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!defer_load_cb_.is_null()) { 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch defer_load_cb_.Run(base::Bind( 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode)); 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DoLoad(load_type, url, cors_mode); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebMediaPlayerImpl::DoLoad(LoadType load_type, 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CORSMode cors_mode) { 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL gurl(url); 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReportMediaSchemeUma(gurl); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set subresource URL for crash reporting. 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::debug::SetCrashKeyValue("subresource_url", gurl.spec()); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) load_type_ = load_type; 2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateLoading); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Media source pipelines can start immediately. 2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (load_type == LoadTypeMediaSource) { 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch supports_save_ = false; 2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartPipeline(); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Otherwise it's a regular request which requires resolving the URL first. 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch data_source_.reset(new BufferedDataSource( 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url, 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static_cast<BufferedResourceLoader::CORSMode>(cors_mode), 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_task_runner_, 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch frame_, 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch media_log_.get(), 266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &buffered_data_source_host_, 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch data_source_->Initialize( 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr())); 2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) data_source_->SetPreload(preload_); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::play() { 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_ = false; 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.SetPlaybackRate(playback_rate_); 2798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (data_source_) 2808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_source_->MediaIsPlaying(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delegate_ && playback_rate_ > 0) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidPlay(this); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::pause() { 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const bool was_already_paused = paused_ || playback_rate_ == 0; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_ = true; 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.SetPlaybackRate(0.0f); 2958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (data_source_) 2968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_source_->MediaIsPaused(); 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paused_time_ = pipeline_.GetMediaTime(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!was_already_paused && delegate_) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->DidPause(this); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::supportsSave() const { 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return supports_save_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerImpl::seek(double seconds) { 31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ended_ = false; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ready_state_ > WebMediaPlayer::ReadyStateHaveMetadata) 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (seeking_) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_seek_ = true; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_seek_seconds_ = seconds; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chunk_demuxer_) 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chunk_demuxer_->CancelPendingSeek(seek_time); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update our paused time. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (paused_) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paused_time_ = seek_time; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seeking_ = true; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (chunk_demuxer_) 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chunk_demuxer_->StartWaitingForSeek(seek_time); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Kick off the asynchronous seek! 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.Seek( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_time, 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, true)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerImpl::setRate(double rate) { 34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << rate << ")"; 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kylep): Remove when support for negatives is added. Also, modify the 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // following checks so rewind uses reasonable values also. 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (rate < 0.0) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Limit rates to reasonable values by clamping. 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (rate != 0.0) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rate < kMinRate) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rate = kMinRate; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (rate > kMaxRate) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rate = kMaxRate; 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (playback_rate_ == 0 && !paused_ && delegate_) 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->DidPlay(this); 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (playback_rate_ != 0 && !paused_ && delegate_) { 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate_->DidPause(this); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) playback_rate_ = rate; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!paused_) { 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.SetPlaybackRate(rate); 3708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (data_source_) 3718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) data_source_->MediaPlaybackRateChanged(rate); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebMediaPlayerImpl::setVolume(double volume) { 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << volume << ")"; 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.SetVolume(volume); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, chromium_name) \ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMediaPlayer::webkit_name) == \ 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<int>(BufferedDataSource::chromium_name), \ 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(PreloadNone, NONE); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(PreloadMetaData, METADATA); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(PreloadAuto, AUTO); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPILE_ASSERT_MATCHING_ENUM 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::setPreload(WebMediaPlayer::Preload preload) { 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << preload << ")"; 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci preload_ = static_cast<BufferedDataSource::Preload>(preload); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_source_) 3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) data_source_->SetPreload(preload_); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::hasVideo() const { 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return pipeline_metadata_.has_video; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::hasAudio() const { 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return pipeline_metadata_.has_audio; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebSize WebMediaPlayerImpl::naturalSize() const { 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return blink::WebSize(pipeline_metadata_.natural_size); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::paused() const { 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return pipeline_.GetPlaybackRate() == 0.0f; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::seeking() const { 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return seeking_; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerImpl::duration() const { 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::numeric_limits<double>::quiet_NaN(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetPipelineDuration(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdouble WebMediaPlayerImpl::timelineOffset() const { 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (pipeline_metadata_.timeline_offset.is_null()) 4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return std::numeric_limits<double>::quiet_NaN(); 4470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return pipeline_metadata_.timeline_offset.ToJsTime(); 4490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerImpl::currentTime() const { 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(scherkus): Replace with an explicit ended signal to HTMLMediaElement, 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // see http://crbug.com/409280 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ended_) 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return duration(); 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return network_state_; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ready_state_; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)blink::WebTimeRanges WebMediaPlayerImpl::buffered() const { 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 47503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Ranges<base::TimeDelta> buffered_time_ranges = 477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pipeline_.GetBufferedTimeRanges(); 47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 47903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::TimeDelta duration = pipeline_.GetMediaDuration(); 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (duration != kInfiniteDuration()) { 48103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) buffered_data_source_host_.AddBufferedTimeRanges( 48203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &buffered_time_ranges, duration); 48303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ConvertToWebTimeRanges(buffered_time_ranges); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerImpl::maxTimeSeekable() const { 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we haven't even gotten to ReadyStateHaveMetadata yet then just 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // return 0 so that the seekable range is empty. 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0.0; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't support seeking in streaming media. 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_source_ && data_source_->IsStreaming()) 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0.0; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebMediaPlayerImpl::didLoadingProgress() { 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool pipeline_progress = pipeline_.DidLoadingProgress(); 504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool data_progress = buffered_data_source_host_.DidLoadingProgress(); 505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return pipeline_progress || data_progress; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WebMediaPlayerImpl::paint(blink::WebCanvas* canvas, 50903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const blink::WebRect& rect, 51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unsigned char alpha) { 51103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) paint(canvas, rect, alpha, SkXfermode::kSrcOver_Mode); 51203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 51303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 51403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WebMediaPlayerImpl::paint(blink::WebCanvas* canvas, 51503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const blink::WebRect& rect, 51603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned char alpha, 51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SkXfermode::Mode mode) { 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TRACE_EVENT0("media", "WebMediaPlayerImpl:paint"); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 521effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // TODO(scherkus): Clarify paint() API contract to better understand when and 522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // why it's being called. For example, today paint() is called when: 523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // - We haven't reached HAVE_CURRENT_DATA and need to paint black 524effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // - We're painting to a canvas 525effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // See http://crbug.com/341225 http://crbug.com/342621 for details. 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<VideoFrame> video_frame = 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetCurrentFrameFromCompositor(); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect gfx_rect(rect); 5306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci skcanvas_video_renderer_.Paint(video_frame, 5326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) canvas, 5336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx_rect, 5346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) alpha, 53503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) mode, 5366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pipeline_metadata_.video_rotation); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_source_) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data_source_->HasSingleOrigin(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebMediaPlayerImpl::didPassCORSAccessCheck() const { 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_source_) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data_source_->DidPassCORSAccessCheck(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)double WebMediaPlayerImpl::mediaTimeForTimeValue(double timeValue) const { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ConvertSecondsToTimestamp(timeValue).InSecondsF(); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerImpl::decodedFrameCount() const { 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PipelineStatistics stats = pipeline_.GetStatistics(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stats.video_frames_decoded; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerImpl::droppedFrameCount() const { 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PipelineStatistics stats = pipeline_.GetStatistics(); 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return stats.video_frames_dropped; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerImpl::audioDecodedByteCount() const { 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PipelineStatistics stats = pipeline_.GetStatistics(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stats.audio_bytes_decoded; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned WebMediaPlayerImpl::videoDecodedByteCount() const { 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PipelineStatistics stats = pipeline_.GetStatistics(); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stats.video_bytes_decoded; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebMediaPlayerImpl::copyVideoTextureToPlatformTexture( 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGraphicsContext3D* web_graphics_context, 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int texture, 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int level, 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int internal_format, 588a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) unsigned int type, 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool premultiply_alpha, 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_y) { 5918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TRACE_EVENT0("media", "WebMediaPlayerImpl:copyVideoTextureToPlatformTexture"); 5928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<VideoFrame> video_frame = 594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetCurrentFrameFromCompositor(); 595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!video_frame.get()) 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (video_frame->format() != VideoFrame::NATIVE_TEXTURE) 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gpu::MailboxHolder* mailbox_holder = video_frame->mailbox_holder(); 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (mailbox_holder->texture_target != GL_TEXTURE_2D) 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_graphics_context->waitSyncPoint(mailbox_holder->sync_point); 6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32 source_texture = web_graphics_context->createAndConsumeTextureCHROMIUM( 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GL_TEXTURE_2D, mailbox_holder->mailbox.name); 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The video is stored in a unmultiplied format, so premultiply 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // if necessary. 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch premultiply_alpha); 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Application itself needs to take care of setting the right flip_y 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // value down to get the expected result. 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // flip_y==true means to reverse the video orientation while 616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // flip_y==false means to keep the intrinsic orientation. 617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); 618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, 619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_texture, 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch texture, 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch level, 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch internal_format, 623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type); 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false); 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->deleteTexture(source_texture); 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_graphics_context->flush(); 6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncPointClientImpl client(web_graphics_context); 6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) video_frame->UpdateReleaseSyncPoint(&client); 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::MediaKeyException 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayerImpl::generateKeyRequest(const WebString& key_system, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* init_data, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned init_data_length) { 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return encrypted_media_support_->GenerateKeyRequest( 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_, key_system, init_data, init_data_length); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey( 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& key_system, 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* key, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned key_length, 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* init_data, 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned init_data_length, 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& session_id) { 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return encrypted_media_support_->AddKey( 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci key_system, key, key_length, init_data, init_data_length, session_id); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest( 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& key_system, 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebString& session_id) { 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return encrypted_media_support_->CancelKeyRequest(key_system, session_id); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebMediaPlayerImpl::setContentDecryptionModule( 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebContentDecryptionModule* cdm) { 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_->SetContentDecryptionModule(cdm); 6726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebMediaPlayerImpl::setContentDecryptionModule( 6756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) blink::WebContentDecryptionModule* cdm, 6766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) blink::WebContentDecryptionModuleResult result) { 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 6786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_->SetContentDecryptionModule(cdm, result); 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 682116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebMediaPlayerImpl::OnPipelineSeeked(bool time_changed, 683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PipelineStatus status) { 684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << __FUNCTION__ << "(" << time_changed << ", " << status << ")"; 6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seeking_ = false; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pending_seek_) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_seek_ = false; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek(pending_seek_seconds_); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (status != PIPELINE_OK) { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPipelineError(status); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update our paused time. 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (paused_) 700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paused_time_ = pipeline_.GetMediaTime(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch should_notify_time_changed_ = time_changed; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebMediaPlayerImpl::OnPipelineEnded() { 70646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Ignore state changes until we've completed all outstanding seeks. 7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (seeking_ || pending_seek_) 7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ended_ = true; 7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->timeChanged(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { 7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(error, PIPELINE_OK); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) { 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Any error that occurs before reaching ReadyStateHaveMetadata should 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be considered a format error. 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetNetworkState(PipelineErrorToNetworkState(error)); 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (error == PIPELINE_ERROR_DECRYPT) 7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_->OnPipelineDecryptError(); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebMediaPlayerImpl::OnPipelineMetadata( 7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PipelineMetadata metadata) { 73646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pipeline_metadata_ = metadata; 739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UMA_HISTOGRAM_ENUMERATION("Media.VideoRotation", 741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch metadata.video_rotation, 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci VIDEO_ROTATION_MAX + 1); 743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 745effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (hasVideo()) { 746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!video_weblayer_); 7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<cc::VideoLayer> layer = 7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) cc::VideoLayer::Create(compositor_, pipeline_metadata_.video_rotation); 7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pipeline_metadata_.video_rotation == VIDEO_ROTATION_90 || 7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pipeline_metadata_.video_rotation == VIDEO_ROTATION_270) { 7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Size size = pipeline_metadata_.natural_size; 7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pipeline_metadata_.natural_size = gfx::Size(size.height(), size.width()); 7546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 7556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 75603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) video_weblayer_.reset(new cc_blink::WebLayerImpl(layer)); 757a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch video_weblayer_->setOpaque(opaque_); 7580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch client_->setWebLayer(video_weblayer_.get()); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebMediaPlayerImpl::OnPipelineBufferingStateChanged( 7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingState buffering_state) { 764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << __FUNCTION__ << "(" << buffering_state << ")"; 765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ignore buffering state changes until we've completed all outstanding seeks. 767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (seeking_ || pending_seek_) 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(scherkus): Handle other buffering states when Pipeline starts using 771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // them and translate them ready state changes http://crbug.com/144683 7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(buffering_state, BUFFERING_HAVE_ENOUGH); 773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Blink expects a timeChanged() in response to a seek(). 776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (should_notify_time_changed_) 777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_->timeChanged(); 778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebMediaPlayerImpl::OnDemuxerOpened() { 7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->mediaSourceOpened(new WebMediaSourceImpl( 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_))); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebMediaPlayerImpl::OnAddTextTrack( 7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const TextTrackConfig& config, 7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const AddTextTrackDoneCB& done_cb) { 7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const WebInbandTextTrackImpl::Kind web_kind = 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<WebInbandTextTrackImpl::Kind>(config.kind()); 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString web_label = 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(config.label()); 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString web_language = 796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(config.language()); 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString web_id = 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8(config.id()); 79990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<WebInbandTextTrackImpl> web_inband_text_track( 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new WebInbandTextTrackImpl(web_kind, web_label, web_language, web_id, 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) text_track_index_++)); 80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<TextTrack> text_track(new TextTrackImpl( 8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_task_runner_, client_, web_inband_text_track.Pass())); 806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) done_cb.Run(text_track.Pass()); 80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WebMediaPlayerImpl::DataSourceInitialized(bool success) { 8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!success) { 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartPipeline(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateIdle); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateLoading); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->AddEvent( 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_log_->CreateBooleanEvent( 8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MediaLogEvent::NETWORK_ACTIVITY_SET, 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "is_downloading_data", is_downloading)); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(xhwang): Move this to a factory class so that we can create different 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// renderers. 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetDecryptorReadyCB set_decryptor_ready_cb = 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_->CreateSetDecryptorReadyCB(); 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create our audio decoders and renderer. 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<AudioDecoder> audio_decoders; 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_decoders.push_back(new media::FFmpegAudioDecoder( 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_, base::Bind(&LogMediaSourceError, media_log_))); 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_decoders.push_back(new media::OpusAudioDecoder(media_task_runner_)); 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<AudioRenderer> audio_renderer( 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new AudioRendererImpl(media_task_runner_, 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_source_provider_.get(), 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_decoders.Pass(), 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_decryptor_ready_cb, 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_hardware_config_, 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_)); 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create our video decoders and renderer. 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<VideoDecoder> video_decoders; 8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (gpu_factories_.get()) 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_decoders.push_back(new GpuVideoDecoder(gpu_factories_)); 8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(MEDIA_DISABLE_LIBVPX) 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_decoders.push_back(new VpxVideoDecoder(media_task_runner_)); 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // !defined(MEDIA_DISABLE_LIBVPX) 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_decoders.push_back(new FFmpegVideoDecoder(media_task_runner_)); 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<VideoRenderer> video_renderer(new VideoRendererImpl( 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_, 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_decoders.Pass(), 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set_decryptor_ready_cb, 8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, 8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_)); 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create renderer. 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Renderer>(new RendererImpl( 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_, 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_.get(), 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci audio_renderer.Pass(), 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci video_renderer.Pass())); 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebMediaPlayerImpl::StartPipeline() { 8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 884868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Keep track if this is a MSE or non-MSE playback. 8853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", 8863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) (load_type_ == LoadTypeMediaSource)); 887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LogCB mse_log_cb; 8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Demuxer::NeedKeyCB need_key_cb = 8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci encrypted_media_support_->CreateNeedKeyCB(); 891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Figure out which demuxer to use. 8933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (load_type_ != LoadTypeMediaSource) { 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!chunk_demuxer_); 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(data_source_); 896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_.reset(new FFmpegDemuxer( 8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_, data_source_.get(), 8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci need_key_cb, 900a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) media_log_)); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!chunk_demuxer_); 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!data_source_); 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mse_log_cb = base::Bind(&LogMediaSourceError, media_log_); 906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chunk_demuxer_ = new ChunkDemuxer( 9083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), 9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci need_key_cb, 910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mse_log_cb, 9115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu true); 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) demuxer_.reset(chunk_demuxer_); 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ... and we're ready to go! 9166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) seeking_ = true; 917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pipeline_.Start( 9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci demuxer_.get(), 9191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateRenderer(), 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), 922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), 923effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), 924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), 9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), 9261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { 93046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << state << ")"; 9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_state_ = state; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always notify to ensure client has the latest value. 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->networkStateChanged(); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebMediaPlayerImpl::SetReadyState(WebMediaPlayer::ReadyState state) { 93846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << state << ")"; 9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (state == WebMediaPlayer::ReadyStateHaveEnoughData && data_source_ && 94246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) data_source_->assume_fully_buffered() && 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) network_state_ == WebMediaPlayer::NetworkStateLoading) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNetworkState(WebMediaPlayer::NetworkStateLoaded); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ready_state_ = state; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Always notify to ensure client has the latest value. 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->readyStateChanged(); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebAudioSourceProvider* WebMediaPlayerImpl::audioSourceProvider() { 952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return audio_source_provider_.get(); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double WebMediaPlayerImpl::GetPipelineDuration() const { 956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta duration = pipeline_.GetMediaDuration(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return positive infinity if the resource is unbounded. 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#dom-media-duration 9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (duration == kInfiniteDuration()) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::numeric_limits<double>::infinity(); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration.InSecondsF(); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WebMediaPlayerImpl::OnDurationChanged() { 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->durationChanged(); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 973a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WebMediaPlayerImpl::OnNaturalSizeChanged(gfx::Size size) { 9741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); 9774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media_log_->AddEvent( 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); 980effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pipeline_metadata_.natural_size = size; 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_->sizeChanged(); 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { 9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(main_task_runner_->BelongsToCurrentThread()); 987a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); 988a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 989a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch opaque_ = opaque; 990a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (video_weblayer_) 991a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch video_weblayer_->setOpaque(opaque_); 992a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 993a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebMediaPlayerImpl::FrameReady( 9951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<VideoFrame>& frame) { 996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) compositor_task_runner_->PostTask( 997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&VideoFrameCompositor::UpdateCurrentFrame, 999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(compositor_), 1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) frame)); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void GetCurrentFrameAndSignal( 1004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VideoFrameCompositor* compositor, 10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<VideoFrame>* video_frame_out, 1006010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WaitableEvent* event) { 1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); 1008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *video_frame_out = compositor->GetCurrentFrame(); 1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event->Signal(); 1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_refptr<VideoFrame> 1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { 1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); 1015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (compositor_task_runner_->BelongsToCurrentThread()) 1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return compositor_->GetCurrentFrame(); 1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1018010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Use a posted task and waitable event instead of a lock otherwise 1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // WebGL/Canvas can see different content than what the compositor is seeing. 10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<VideoFrame> video_frame; 1021010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WaitableEvent event(false, false); 1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) compositor_task_runner_->PostTask(FROM_HERE, 1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&GetCurrentFrameAndSignal, 1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Unretained(compositor_), 1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &video_frame, 1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &event)); 1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event.Wait(); 1028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return video_frame; 1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 1032