Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(239)

Side by Side Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 105743004: Add gpu::MailboxHolder to hold state for a gpu::Mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: c301e01d Rebase. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698