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 |
| 1429 const uint32 sync_point = mailbox_holder->sync_point(); |
1433 if (sync_point) | 1430 if (sync_point) |
1434 context->waitSyncPoint(sync_point); | 1431 context->waitSyncPoint(sync_point); |
1435 context->deleteTexture(remote_playback_texture_id_); | 1432 context->deleteTexture(remote_playback_texture_id_); |
1436 remote_playback_texture_id_ = 0; | 1433 remote_playback_texture_id_ = 0; |
1437 } | 1434 } |
1438 | 1435 |
1439 void WebMediaPlayerAndroid::enterFullscreen() { | 1436 void WebMediaPlayerAndroid::enterFullscreen() { |
1440 if (manager_->CanEnterFullscreen(frame_)) { | 1437 if (manager_->CanEnterFullscreen(frame_)) { |
1441 manager_->EnterFullscreen(player_id_); | 1438 manager_->EnterFullscreen(player_id_); |
1442 SetNeedsEstablishPeer(false); | 1439 SetNeedsEstablishPeer(false); |
1443 } | 1440 } |
1444 } | 1441 } |
1445 | 1442 |
1446 void WebMediaPlayerAndroid::exitFullscreen() { | 1443 void WebMediaPlayerAndroid::exitFullscreen() { |
1447 manager_->ExitFullscreen(player_id_); | 1444 manager_->ExitFullscreen(player_id_); |
1448 } | 1445 } |
1449 | 1446 |
1450 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1447 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
1451 return manager_->CanEnterFullscreen(frame_); | 1448 return manager_->CanEnterFullscreen(frame_); |
1452 } | 1449 } |
1453 | 1450 |
1454 } // namespace content | 1451 } // namespace content |
OLD | NEW |