Chromium Code Reviews| 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/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 RendererMediaPlayerManager* player_manager, | 89 RendererMediaPlayerManager* player_manager, |
| 90 RendererCdmManager* cdm_manager, | 90 RendererCdmManager* cdm_manager, |
| 91 scoped_refptr<StreamTextureFactory> factory, | 91 scoped_refptr<StreamTextureFactory> factory, |
| 92 const scoped_refptr<base::MessageLoopProxy>& media_loop, | 92 const scoped_refptr<base::MessageLoopProxy>& media_loop, |
| 93 media::MediaLog* media_log) | 93 media::MediaLog* media_log) |
| 94 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), | 94 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), |
| 95 frame_(frame), | 95 frame_(frame), |
| 96 client_(client), | 96 client_(client), |
| 97 delegate_(delegate), | 97 delegate_(delegate), |
| 98 buffered_(static_cast<size_t>(1)), | 98 buffered_(static_cast<size_t>(1)), |
| 99 main_loop_(base::MessageLoopProxy::current()), | |
| 99 media_loop_(media_loop), | 100 media_loop_(media_loop), |
| 100 ignore_metadata_duration_change_(false), | 101 ignore_metadata_duration_change_(false), |
| 101 pending_seek_(false), | 102 pending_seek_(false), |
| 102 seeking_(false), | 103 seeking_(false), |
| 103 did_loading_progress_(false), | 104 did_loading_progress_(false), |
| 104 player_manager_(player_manager), | 105 player_manager_(player_manager), |
| 105 cdm_manager_(cdm_manager), | 106 cdm_manager_(cdm_manager), |
| 106 network_state_(WebMediaPlayer::NetworkStateEmpty), | 107 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 107 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 108 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 108 texture_id_(0), | 109 texture_id_(0), |
| (...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1024 remote_playback_texture_id)), | 1025 remote_playback_texture_id)), |
| 1025 canvas_size /* coded_size */, | 1026 canvas_size /* coded_size */, |
| 1026 gfx::Rect(canvas_size) /* visible_rect */, | 1027 gfx::Rect(canvas_size) /* visible_rect */, |
| 1027 canvas_size /* natural_size */, | 1028 canvas_size /* natural_size */, |
| 1028 base::TimeDelta() /* timestamp */, | 1029 base::TimeDelta() /* timestamp */, |
| 1029 VideoFrame::ReadPixelsCB()); | 1030 VideoFrame::ReadPixelsCB()); |
| 1030 SetCurrentFrameInternal(new_frame); | 1031 SetCurrentFrameInternal(new_frame); |
| 1031 } | 1032 } |
| 1032 | 1033 |
| 1033 void WebMediaPlayerAndroid::ReallocateVideoFrame() { | 1034 void WebMediaPlayerAndroid::ReallocateVideoFrame() { |
| 1035 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
| 1034 if (needs_external_surface_) { | 1036 if (needs_external_surface_) { |
| 1035 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE. | 1037 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE. |
| 1036 #if defined(VIDEO_HOLE) | 1038 #if defined(VIDEO_HOLE) |
| 1037 if (!natural_size_.isEmpty()) { | 1039 if (!natural_size_.isEmpty()) { |
| 1038 scoped_refptr<VideoFrame> new_frame = | 1040 scoped_refptr<VideoFrame> new_frame = |
| 1039 VideoFrame::CreateHoleFrame(natural_size_); | 1041 VideoFrame::CreateHoleFrame(natural_size_); |
| 1040 SetCurrentFrameInternal(new_frame); | 1042 SetCurrentFrameInternal(new_frame); |
| 1041 // Force the client to grab the hole frame. | 1043 // Force the client to grab the hole frame. |
| 1042 client_->repaint(); | 1044 client_->repaint(); |
| 1043 } | 1045 } |
| 1044 #else | 1046 #else |
| 1045 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag"; | 1047 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag"; |
| 1046 #endif // defined(VIDEO_HOLE) | 1048 #endif // defined(VIDEO_HOLE) |
| 1047 } else if (!is_remote_ && texture_id_) { | 1049 } else if (!is_remote_ && texture_id_) { |
| 1048 GLES2Interface* gl = stream_texture_factory_->ContextGL(); | 1050 GLES2Interface* gl = stream_texture_factory_->ContextGL(); |
| 1049 GLuint texture_id_ref = 0; | 1051 GLuint texture_id_ref = 0; |
| 1052 // FIXME: reuse texture pool like gpu_video_decoder. | |
|
dshwang
2014/06/03 15:39:40
Currently every frame create new texture. We can a
| |
| 1050 gl->GenTextures(1, &texture_id_ref); | 1053 gl->GenTextures(1, &texture_id_ref); |
| 1051 GLuint texture_target = kGLTextureExternalOES; | 1054 GLuint texture_target = kGLTextureExternalOES; |
| 1052 gl->BindTexture(texture_target, texture_id_ref); | 1055 gl->BindTexture(texture_target, texture_id_ref); |
| 1053 gl->ConsumeTextureCHROMIUM(texture_target, texture_mailbox_.name); | 1056 gl->ConsumeTextureCHROMIUM(texture_target, texture_mailbox_.name); |
| 1054 gl->Flush(); | 1057 gl->Flush(); |
| 1055 GLuint texture_mailbox_sync_point = gl->InsertSyncPointCHROMIUM(); | 1058 GLuint texture_mailbox_sync_point = gl->InsertSyncPointCHROMIUM(); |
| 1056 | 1059 |
| 1057 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( | 1060 scoped_refptr<VideoFrame> new_frame = VideoFrame::WrapNativeTexture( |
| 1058 make_scoped_ptr(new gpu::MailboxHolder( | 1061 make_scoped_ptr(new gpu::MailboxHolder( |
| 1059 texture_mailbox_, texture_target, texture_mailbox_sync_point)), | 1062 texture_mailbox_, texture_target, texture_mailbox_sync_point)), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1102 stream_texture_factory_->SetStreamTextureSize(stream_id_, natural_size); | 1105 stream_texture_factory_->SetStreamTextureSize(stream_id_, natural_size); |
| 1103 stream_texture_proxy_initialized_ = true; | 1106 stream_texture_proxy_initialized_ = true; |
| 1104 cached_stream_texture_size_ = natural_size; | 1107 cached_stream_texture_size_ = natural_size; |
| 1105 } | 1108 } |
| 1106 | 1109 |
| 1107 return video_frame; | 1110 return video_frame; |
| 1108 } | 1111 } |
| 1109 | 1112 |
| 1110 void WebMediaPlayerAndroid::PutCurrentFrame( | 1113 void WebMediaPlayerAndroid::PutCurrentFrame( |
| 1111 const scoped_refptr<media::VideoFrame>& frame) { | 1114 const scoped_refptr<media::VideoFrame>& frame) { |
| 1115 // Create new VideoFrame when a client return the previous frame. | |
| 1116 DCHECK(!main_thread_checker_.CalledOnValidThread()); | |
| 1117 // FIXME: instead of here, VideoFrameProvider::Client::DidReceiveFrame() can | |
| 1118 // handle it. | |
|
dshwang
2014/06/03 15:39:40
I use PutCurrentFrame() as the end of each frame,
| |
| 1119 main_loop_->PostTask(FROM_HERE, | |
| 1120 base::Bind(&WebMediaPlayerAndroid::ReallocateVideoFrame, | |
| 1121 weak_factory_.GetWeakPtr())); | |
| 1112 } | 1122 } |
| 1113 | 1123 |
| 1114 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { | 1124 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { |
| 1115 // Already created. | 1125 // Already created. |
| 1116 if (stream_texture_proxy_) | 1126 if (stream_texture_proxy_) |
| 1117 return; | 1127 return; |
| 1118 | 1128 |
| 1119 // No factory to create proxy. | 1129 // No factory to create proxy. |
| 1120 if (!stream_texture_factory_) | 1130 if (!stream_texture_factory_) |
| 1121 return; | 1131 return; |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1565 | 1575 |
| 1566 void WebMediaPlayerAndroid::exitFullscreen() { | 1576 void WebMediaPlayerAndroid::exitFullscreen() { |
| 1567 player_manager_->ExitFullscreen(player_id_); | 1577 player_manager_->ExitFullscreen(player_id_); |
| 1568 } | 1578 } |
| 1569 | 1579 |
| 1570 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1580 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 1571 return player_manager_->CanEnterFullscreen(frame_); | 1581 return player_manager_->CanEnterFullscreen(frame_); |
| 1572 } | 1582 } |
| 1573 | 1583 |
| 1574 } // namespace content | 1584 } // namespace content |
| OLD | NEW |