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

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: cc2a95fe Android fixes. Created 7 years 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) {
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698