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) { |
danakj
2014/01/06 20:13:42
I'm a little uncertain about returning a scoped_pt
sheu
2014/01/06 22:44:44
Well, it's scoped_ptr-ing the MailboxHolder, not t
danakj
2014/01/06 23:28:33
I understand, but I don't think scoped_ptr is addi
sheu
2014/01/07 01:41:00
I think the ownership transfer semantics are reall
| |
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 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
990 bitmap.getPixels()); | 990 bitmap.getPixels()); |
991 } | 991 } |
992 | 992 |
993 gpu::Mailbox texture_mailbox; | 993 gpu::Mailbox texture_mailbox; |
994 context->genMailboxCHROMIUM(texture_mailbox.name); | 994 context->genMailboxCHROMIUM(texture_mailbox.name); |
995 context->produceTextureCHROMIUM(texture_target, texture_mailbox.name); | 995 context->produceTextureCHROMIUM(texture_target, texture_mailbox.name); |
996 context->flush(); | 996 context->flush(); |
997 unsigned texture_mailbox_sync_point = context->insertSyncPoint(); | 997 unsigned texture_mailbox_sync_point = context->insertSyncPoint(); |
998 | 998 |
999 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( | 999 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( |
1000 make_scoped_ptr(new VideoFrame::MailboxHolder( | 1000 make_scoped_ptr(new gpu::MailboxHolder( |
1001 texture_mailbox, | 1001 texture_mailbox, texture_target, texture_mailbox_sync_point)), |
1002 texture_mailbox_sync_point, | 1002 base::Bind(&WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture, |
1003 base::Bind(&WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture, | 1003 main_loop_, |
1004 main_loop_, | 1004 weak_factory_.GetWeakPtr()), |
1005 weak_factory_.GetWeakPtr()))), | |
1006 texture_target, | |
1007 canvas_size /* coded_size */, | 1005 canvas_size /* coded_size */, |
1008 gfx::Rect(canvas_size) /* visible_rect */, | 1006 gfx::Rect(canvas_size) /* visible_rect */, |
1009 canvas_size /* natural_size */, | 1007 canvas_size /* natural_size */, |
1010 base::TimeDelta() /* timestamp */, | 1008 base::TimeDelta() /* timestamp */, |
1011 VideoFrame::ReadPixelsCB(), | 1009 VideoFrame::ReadPixelsCB()); |
1012 base::Closure() /* no_longer_needed_cb */); | |
1013 SetCurrentFrameInternal(new_frame); | 1010 SetCurrentFrameInternal(new_frame); |
1014 } | 1011 } |
1015 | 1012 |
1016 void WebMediaPlayerAndroid::ReallocateVideoFrame() { | 1013 void WebMediaPlayerAndroid::ReallocateVideoFrame() { |
1017 if (needs_external_surface_) { | 1014 if (needs_external_surface_) { |
1018 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE. | 1015 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE. |
1019 #if defined(VIDEO_HOLE) | 1016 #if defined(VIDEO_HOLE) |
1020 if (!natural_size_.isEmpty()) { | 1017 if (!natural_size_.isEmpty()) { |
1021 scoped_refptr<VideoFrame> new_frame = | 1018 scoped_refptr<VideoFrame> new_frame = |
1022 VideoFrame::CreateHoleFrame(natural_size_); | 1019 VideoFrame::CreateHoleFrame(natural_size_); |
1023 SetCurrentFrameInternal(new_frame); | 1020 SetCurrentFrameInternal(new_frame); |
1024 // Force the client to grab the hole frame. | 1021 // Force the client to grab the hole frame. |
1025 client_->repaint(); | 1022 client_->repaint(); |
1026 } | 1023 } |
1027 #else | 1024 #else |
1028 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag"; | 1025 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag"; |
1029 #endif // defined(VIDEO_HOLE) | 1026 #endif // defined(VIDEO_HOLE) |
1030 } else if (!is_remote_ && texture_id_) { | 1027 } else if (!is_remote_ && texture_id_) { |
1031 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( | 1028 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( |
1032 make_scoped_ptr(new VideoFrame::MailboxHolder( | 1029 make_scoped_ptr(new gpu::MailboxHolder(texture_mailbox_, |
1033 texture_mailbox_, | 1030 kGLTextureExternalOES, |
1034 texture_mailbox_sync_point_, | 1031 texture_mailbox_sync_point_)), |
1035 VideoFrame::MailboxHolder::TextureNoLongerNeededCallback())), | 1032 media::VideoFrame::ReleaseMailboxCB(), |
1036 kGLTextureExternalOES, | |
1037 natural_size_, | 1033 natural_size_, |
1038 gfx::Rect(natural_size_), | 1034 gfx::Rect(natural_size_), |
1039 natural_size_, | 1035 natural_size_, |
1040 base::TimeDelta(), | 1036 base::TimeDelta(), |
1041 VideoFrame::ReadPixelsCB(), | 1037 VideoFrame::ReadPixelsCB()); |
1042 base::Closure()); | |
1043 SetCurrentFrameInternal(new_frame); | 1038 SetCurrentFrameInternal(new_frame); |
1044 } | 1039 } |
1045 } | 1040 } |
1046 | 1041 |
1047 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( | 1042 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( |
1048 cc::VideoFrameProvider::Client* client) { | 1043 cc::VideoFrameProvider::Client* client) { |
1049 // This is called from both the main renderer thread and the compositor | 1044 // This is called from both the main renderer thread and the compositor |
1050 // thread (when the main thread is blocked). | 1045 // thread (when the main thread is blocked). |
1051 if (video_frame_provider_client_) | 1046 if (video_frame_provider_client_) |
1052 video_frame_provider_client_->StopUsingProvider(); | 1047 video_frame_provider_client_->StopUsingProvider(); |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1423 media::Demuxer* demuxer, | 1418 media::Demuxer* demuxer, |
1424 const base::Closure& destroy_demuxer_cb) { | 1419 const base::Closure& destroy_demuxer_cb) { |
1425 DCHECK(!demuxer); | 1420 DCHECK(!demuxer); |
1426 media_stream_client_ = media_stream_client; | 1421 media_stream_client_ = media_stream_client; |
1427 demuxer_ = demuxer; | 1422 demuxer_ = demuxer; |
1428 destroy_demuxer_cb_ = destroy_demuxer_cb; | 1423 destroy_demuxer_cb_ = destroy_demuxer_cb; |
1429 return true; | 1424 return true; |
1430 } | 1425 } |
1431 #endif | 1426 #endif |
1432 | 1427 |
1433 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture(uint32 sync_point) { | 1428 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture( |
1429 scoped_ptr<gpu::MailboxHolder> mailbox_holder) { | |
1434 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1430 DCHECK(main_thread_checker_.CalledOnValidThread()); |
1435 DCHECK(remote_playback_texture_id_); | 1431 DCHECK(remote_playback_texture_id_); |
1436 | 1432 |
1437 blink::WebGraphicsContext3D* context = | 1433 blink::WebGraphicsContext3D* context = |
1438 stream_texture_factory_->Context3d(); | 1434 stream_texture_factory_->Context3d(); |
1439 | 1435 |
1440 if (sync_point) | 1436 if (mailbox_holder->sync_point) |
1441 context->waitSyncPoint(sync_point); | 1437 context->waitSyncPoint(mailbox_holder->sync_point); |
1442 context->deleteTexture(remote_playback_texture_id_); | 1438 context->deleteTexture(remote_playback_texture_id_); |
1443 remote_playback_texture_id_ = 0; | 1439 remote_playback_texture_id_ = 0; |
1444 } | 1440 } |
1445 | 1441 |
1446 void WebMediaPlayerAndroid::enterFullscreen() { | 1442 void WebMediaPlayerAndroid::enterFullscreen() { |
1447 if (manager_->CanEnterFullscreen(frame_)) { | 1443 if (manager_->CanEnterFullscreen(frame_)) { |
1448 manager_->EnterFullscreen(player_id_); | 1444 manager_->EnterFullscreen(player_id_); |
1449 SetNeedsEstablishPeer(false); | 1445 SetNeedsEstablishPeer(false); |
1450 } | 1446 } |
1451 } | 1447 } |
1452 | 1448 |
1453 void WebMediaPlayerAndroid::exitFullscreen() { | 1449 void WebMediaPlayerAndroid::exitFullscreen() { |
1454 manager_->ExitFullscreen(player_id_); | 1450 manager_->ExitFullscreen(player_id_); |
1455 } | 1451 } |
1456 | 1452 |
1457 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1453 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
1458 return manager_->CanEnterFullscreen(frame_); | 1454 return manager_->CanEnterFullscreen(frame_); |
1459 } | 1455 } |
1460 | 1456 |
1461 } // namespace content | 1457 } // namespace content |
OLD | NEW |