| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/android/webmediaplayer_android.h" | 5 #include "content/renderer/media/android/webmediaplayer_android.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // Prefix for histograms related to Encrypted Media Extensions. | 59 // Prefix for histograms related to Encrypted Media Extensions. |
| 60 const char* kMediaEme = "Media.EME."; | 60 const char* kMediaEme = "Media.EME."; |
| 61 } // namespace | 61 } // namespace |
| 62 | 62 |
| 63 namespace content { | 63 namespace content { |
| 64 | 64 |
| 65 // static | 65 // static |
| 66 void WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture( | 66 void WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture( |
| 67 const scoped_refptr<base::MessageLoopProxy>& main_loop, | 67 const scoped_refptr<base::MessageLoopProxy>& main_loop, |
| 68 const base::WeakPtr<WebMediaPlayerAndroid>& player, | 68 const base::WeakPtr<WebMediaPlayerAndroid>& player, |
| 69 uint32 sync_point) { | 69 scoped_ptr<gpu::MailboxHolder> mailbox_holder) { |
| 70 main_loop->PostTask( | 70 main_loop->PostTask( |
| 71 FROM_HERE, | 71 FROM_HERE, |
| 72 base::Bind(&WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture, | 72 base::Bind(&WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture, |
| 73 player, | 73 player, |
| 74 sync_point)); | 74 base::Passed(&mailbox_holder))); |
| 75 } | 75 } |
| 76 | 76 |
| 77 WebMediaPlayerAndroid::WebMediaPlayerAndroid( | 77 WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
| 78 blink::WebFrame* frame, | 78 blink::WebFrame* frame, |
| 79 blink::WebMediaPlayerClient* client, | 79 blink::WebMediaPlayerClient* client, |
| 80 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 80 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
| 81 RendererMediaPlayerManager* manager, | 81 RendererMediaPlayerManager* manager, |
| 82 StreamTextureFactory* factory, | 82 StreamTextureFactory* factory, |
| 83 const scoped_refptr<base::MessageLoopProxy>& media_loop, | 83 const scoped_refptr<base::MessageLoopProxy>& media_loop, |
| 84 media::MediaLog* media_log) | 84 media::MediaLog* media_log) |
| (...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 983 bitmap.getPixels()); | 983 bitmap.getPixels()); |
| 984 } | 984 } |
| 985 | 985 |
| 986 gpu::Mailbox texture_mailbox; | 986 gpu::Mailbox texture_mailbox; |
| 987 context->genMailboxCHROMIUM(texture_mailbox.name); | 987 context->genMailboxCHROMIUM(texture_mailbox.name); |
| 988 context->produceTextureCHROMIUM(texture_target, texture_mailbox.name); | 988 context->produceTextureCHROMIUM(texture_target, texture_mailbox.name); |
| 989 context->flush(); | 989 context->flush(); |
| 990 unsigned texture_mailbox_sync_point = context->insertSyncPoint(); | 990 unsigned texture_mailbox_sync_point = context->insertSyncPoint(); |
| 991 | 991 |
| 992 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( | 992 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( |
| 993 make_scoped_ptr(new VideoFrame::MailboxHolder( | 993 make_scoped_ptr(new gpu::MailboxHolder( |
| 994 texture_mailbox, | 994 texture_mailbox, texture_target, texture_mailbox_sync_point)), |
| 995 texture_mailbox_sync_point, | 995 base::Bind(&WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture, |
| 996 base::Bind(&WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture, | 996 main_loop_, |
| 997 main_loop_, | 997 weak_factory_.GetWeakPtr()), |
| 998 weak_factory_.GetWeakPtr()))), | |
| 999 texture_target, | |
| 1000 canvas_size /* coded_size */, | 998 canvas_size /* coded_size */, |
| 1001 gfx::Rect(canvas_size) /* visible_rect */, | 999 gfx::Rect(canvas_size) /* visible_rect */, |
| 1002 canvas_size /* natural_size */, | 1000 canvas_size /* natural_size */, |
| 1003 base::TimeDelta() /* timestamp */, | 1001 base::TimeDelta() /* timestamp */, |
| 1004 VideoFrame::ReadPixelsCB(), | 1002 VideoFrame::ReadPixelsCB()); |
| 1005 base::Closure() /* no_longer_needed_cb */); | |
| 1006 SetCurrentFrameInternal(new_frame); | 1003 SetCurrentFrameInternal(new_frame); |
| 1007 } | 1004 } |
| 1008 | 1005 |
| 1009 void WebMediaPlayerAndroid::ReallocateVideoFrame() { | 1006 void WebMediaPlayerAndroid::ReallocateVideoFrame() { |
| 1010 if (needs_external_surface_) { | 1007 if (needs_external_surface_) { |
| 1011 // VideoFrame::CreateHoleFrame is only defined under GOOGLE_TV. | 1008 // VideoFrame::CreateHoleFrame is only defined under GOOGLE_TV. |
| 1012 #if defined(GOOGLE_TV) | 1009 #if defined(GOOGLE_TV) |
| 1013 if (!natural_size_.isEmpty()) { | 1010 if (!natural_size_.isEmpty()) { |
| 1014 scoped_refptr<VideoFrame> new_frame = | 1011 scoped_refptr<VideoFrame> new_frame = |
| 1015 VideoFrame::CreateHoleFrame(natural_size_); | 1012 VideoFrame::CreateHoleFrame(natural_size_); |
| 1016 SetCurrentFrameInternal(new_frame); | 1013 SetCurrentFrameInternal(new_frame); |
| 1017 // Force the client to grab the hole frame. | 1014 // Force the client to grab the hole frame. |
| 1018 client_->repaint(); | 1015 client_->repaint(); |
| 1019 } | 1016 } |
| 1020 #else | 1017 #else |
| 1021 NOTIMPLEMENTED() << "Hole punching not supported outside of Google TV"; | 1018 NOTIMPLEMENTED() << "Hole punching not supported outside of Google TV"; |
| 1022 #endif | 1019 #endif |
| 1023 } else if (!is_remote_ && texture_id_) { | 1020 } else if (!is_remote_ && texture_id_) { |
| 1024 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( | 1021 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( |
| 1025 make_scoped_ptr(new VideoFrame::MailboxHolder( | 1022 make_scoped_ptr(new gpu::MailboxHolder(texture_mailbox_, |
| 1026 texture_mailbox_, | 1023 kGLTextureExternalOES, |
| 1027 texture_mailbox_sync_point_, | 1024 texture_mailbox_sync_point_)), |
| 1028 VideoFrame::MailboxHolder::TextureNoLongerNeededCallback())), | 1025 gpu::MailboxHolder::ReleaseCallback(), |
| 1029 kGLTextureExternalOES, | |
| 1030 natural_size_, | 1026 natural_size_, |
| 1031 gfx::Rect(natural_size_), | 1027 gfx::Rect(natural_size_), |
| 1032 natural_size_, | 1028 natural_size_, |
| 1033 base::TimeDelta(), | 1029 base::TimeDelta(), |
| 1034 VideoFrame::ReadPixelsCB(), | 1030 VideoFrame::ReadPixelsCB()); |
| 1035 base::Closure()); | |
| 1036 SetCurrentFrameInternal(new_frame); | 1031 SetCurrentFrameInternal(new_frame); |
| 1037 } | 1032 } |
| 1038 } | 1033 } |
| 1039 | 1034 |
| 1040 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( | 1035 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( |
| 1041 cc::VideoFrameProvider::Client* client) { | 1036 cc::VideoFrameProvider::Client* client) { |
| 1042 // This is called from both the main renderer thread and the compositor | 1037 // This is called from both the main renderer thread and the compositor |
| 1043 // thread (when the main thread is blocked). | 1038 // thread (when the main thread is blocked). |
| 1044 if (video_frame_provider_client_) | 1039 if (video_frame_provider_client_) |
| 1045 video_frame_provider_client_->StopUsingProvider(); | 1040 video_frame_provider_client_->StopUsingProvider(); |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 media::Demuxer* demuxer, | 1411 media::Demuxer* demuxer, |
| 1417 const base::Closure& destroy_demuxer_cb) { | 1412 const base::Closure& destroy_demuxer_cb) { |
| 1418 DCHECK(!demuxer); | 1413 DCHECK(!demuxer); |
| 1419 media_stream_client_ = media_stream_client; | 1414 media_stream_client_ = media_stream_client; |
| 1420 demuxer_ = demuxer; | 1415 demuxer_ = demuxer; |
| 1421 destroy_demuxer_cb_ = destroy_demuxer_cb; | 1416 destroy_demuxer_cb_ = destroy_demuxer_cb; |
| 1422 return true; | 1417 return true; |
| 1423 } | 1418 } |
| 1424 #endif | 1419 #endif |
| 1425 | 1420 |
| 1426 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture(uint32 sync_point) { | 1421 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture( |
| 1422 scoped_ptr<gpu::MailboxHolder> mailbox_holder) { |
| 1427 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1423 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 1428 DCHECK(remote_playback_texture_id_); | 1424 DCHECK(remote_playback_texture_id_); |
| 1429 | 1425 |
| 1430 blink::WebGraphicsContext3D* context = | 1426 blink::WebGraphicsContext3D* context = |
| 1431 stream_texture_factory_->Context3d(); | 1427 stream_texture_factory_->Context3d(); |
| 1432 | 1428 |
| 1433 if (sync_point) | 1429 if (mailbox_holder->sync_point) |
| 1434 context->waitSyncPoint(sync_point); | 1430 context->waitSyncPoint(mailbox_holder->sync_point); |
| 1435 context->deleteTexture(remote_playback_texture_id_); | 1431 context->deleteTexture(remote_playback_texture_id_); |
| 1436 remote_playback_texture_id_ = 0; | 1432 remote_playback_texture_id_ = 0; |
| 1437 } | 1433 } |
| 1438 | 1434 |
| 1439 void WebMediaPlayerAndroid::enterFullscreen() { | 1435 void WebMediaPlayerAndroid::enterFullscreen() { |
| 1440 if (manager_->CanEnterFullscreen(frame_)) { | 1436 if (manager_->CanEnterFullscreen(frame_)) { |
| 1441 manager_->EnterFullscreen(player_id_); | 1437 manager_->EnterFullscreen(player_id_); |
| 1442 SetNeedsEstablishPeer(false); | 1438 SetNeedsEstablishPeer(false); |
| 1443 } | 1439 } |
| 1444 } | 1440 } |
| 1445 | 1441 |
| 1446 void WebMediaPlayerAndroid::exitFullscreen() { | 1442 void WebMediaPlayerAndroid::exitFullscreen() { |
| 1447 manager_->ExitFullscreen(player_id_); | 1443 manager_->ExitFullscreen(player_id_); |
| 1448 } | 1444 } |
| 1449 | 1445 |
| 1450 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1446 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 1451 return manager_->CanEnterFullscreen(frame_); | 1447 return manager_->CanEnterFullscreen(frame_); |
| 1452 } | 1448 } |
| 1453 | 1449 |
| 1454 } // namespace content | 1450 } // namespace content |
| OLD | NEW |