Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/file_descriptor_posix.h" | 5 #include "base/file_descriptor_posix.h" |
| 6 #include "content/common/gpu/media/va_surface.h" | 6 #include "content/common/gpu/media/va_surface.h" |
| 7 #include "content/common/gpu/media/vaapi_drm_picture.h" | 7 #include "content/common/gpu/media/vaapi_drm_picture.h" |
| 8 #include "content/common/gpu/media/vaapi_wrapper.h" | 8 #include "content/common/gpu/media/vaapi_wrapper.h" |
| 9 #include "third_party/libva/va/drm/va_drm.h" | 9 #include "third_party/libva/va/drm/va_drm.h" |
| 10 #include "third_party/libva/va/va.h" | 10 #include "third_party/libva/va/va.h" |
| 11 #include "third_party/libva/va/va_drmcommon.h" | 11 #include "third_party/libva/va/va_drmcommon.h" |
| 12 #include "ui/gfx/gpu_memory_buffer.h" | 12 #include "ui/gfx/gpu_memory_buffer.h" |
| 13 #include "ui/gl/gl_bindings.h" | 13 #include "ui/gl/gl_bindings.h" |
| 14 #include "ui/gl/gl_image_ozone_native_pixmap.h" | 14 #include "ui/gl/gl_image_ozone_native_pixmap.h" |
| 15 #include "ui/gl/scoped_binders.h" | 15 #include "ui/gl/scoped_binders.h" |
| 16 #include "ui/ozone/public/native_pixmap.h" | 16 #include "ui/ozone/public/native_pixmap.h" |
| 17 #include "ui/ozone/public/ozone_platform.h" | 17 #include "ui/ozone/public/ozone_platform.h" |
| 18 #include "ui/ozone/public/surface_factory_ozone.h" | 18 #include "ui/ozone/public/surface_factory_ozone.h" |
| 19 | 19 |
| 20 namespace content { | 20 namespace content { |
| 21 | 21 |
| 22 VaapiDrmPicture::VaapiDrmPicture( | 22 VaapiDrmPicture::VaapiDrmPicture( |
| 23 VaapiWrapper* vaapi_wrapper, | 23 scoped_refptr<VaapiWrapper> vaapi_wrapper, |
| 24 const base::Callback<bool(void)>& make_context_current, | 24 const base::Callback<bool(void)>& make_context_current, |
| 25 int32 picture_buffer_id, | 25 int32 picture_buffer_id, |
| 26 uint32 texture_id, | 26 uint32 texture_id, |
| 27 const gfx::Size& size) | 27 const gfx::Size& size) |
| 28 : VaapiPicture(picture_buffer_id, texture_id, size), | 28 : VaapiPicture(picture_buffer_id, texture_id, size), |
| 29 vaapi_wrapper_(vaapi_wrapper), | 29 vaapi_wrapper_(vaapi_wrapper), |
| 30 make_context_current_(make_context_current), | 30 make_context_current_(make_context_current) {} |
| 31 weak_this_factory_(this) { | |
| 32 } | |
| 33 | 31 |
| 34 VaapiDrmPicture::~VaapiDrmPicture() { | 32 VaapiDrmPicture::~VaapiDrmPicture() { |
| 35 if (gl_image_ && make_context_current_.Run()) { | 33 if (gl_image_ && make_context_current_.Run()) { |
| 36 gl_image_->ReleaseTexImage(GL_TEXTURE_EXTERNAL_OES); | 34 gl_image_->ReleaseTexImage(GL_TEXTURE_EXTERNAL_OES); |
| 37 gl_image_->Destroy(true); | 35 gl_image_->Destroy(true); |
| 38 | 36 |
| 37 LOG(WARNING) << "qxie2:" << __FUNCTION__ << ", gl_image:" << gl_image_; | |
| 39 DCHECK_EQ(glGetError(), static_cast<GLenum>(GL_NO_ERROR)); | 38 DCHECK_EQ(glGetError(), static_cast<GLenum>(GL_NO_ERROR)); |
| 40 } | 39 } |
| 41 } | 40 } |
| 42 | 41 |
| 43 scoped_refptr<VASurface> VaapiDrmPicture::CreateVASurfaceForPixmap( | 42 scoped_refptr<VASurface> VaapiDrmPicture::CreateVASurfaceForPixmap( |
| 44 scoped_refptr<ui::NativePixmap> pixmap, | 43 scoped_refptr<ui::NativePixmap> pixmap, |
| 45 gfx::Size pixmap_size) { | 44 gfx::Size pixmap_size) { |
| 46 // Get the dmabuf of the created buffer. | 45 // Get the dmabuf of the created buffer. |
| 47 int dmabuf_fd = pixmap->GetDmaBufFd(); | 46 int dmabuf_fd = pixmap->GetDmaBufFd(); |
| 48 if (dmabuf_fd < 0) { | 47 if (dmabuf_fd < 0) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 LOG(ERROR) << "Failed creating an Ozone NativePixmap"; | 108 LOG(ERROR) << "Failed creating an Ozone NativePixmap"; |
| 110 return false; | 109 return false; |
| 111 } | 110 } |
| 112 | 111 |
| 113 va_surface_ = CreateVASurfaceForPixmap(pixmap_, size()); | 112 va_surface_ = CreateVASurfaceForPixmap(pixmap_, size()); |
| 114 if (!va_surface_) { | 113 if (!va_surface_) { |
| 115 LOG(ERROR) << "Failed creating VASurface for NativePixmap"; | 114 LOG(ERROR) << "Failed creating VASurface for NativePixmap"; |
| 116 return false; | 115 return false; |
| 117 } | 116 } |
| 118 | 117 |
| 119 // Weak pointers can only bind to methods without return values, | 118 scoped_refptr<VaapiDrmPicture> ref = this; |
|
Pawel Osciak
2015/11/16 04:24:35
This shouldn't be required. You should be able to
william.xie1
2015/11/16 08:07:25
Done.
| |
| 120 // hence we cannot bind ScalePixmap here. Instead we use a | 119 pixmap_->SetScalingCallback(base::Bind(&VaapiDrmPicture::ScalePixmap, ref)); |
| 121 // static function to solve this problem. | |
| 122 pixmap_->SetScalingCallback(base::Bind(&VaapiDrmPicture::CallScalePixmap, | |
| 123 weak_this_factory_.GetWeakPtr())); | |
| 124 | 120 |
| 125 if (!make_context_current_.Run()) | 121 if (!make_context_current_.Run()) |
| 126 return false; | 122 return false; |
| 127 | 123 |
| 128 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_EXTERNAL_OES, | 124 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_EXTERNAL_OES, |
| 129 texture_id()); | 125 texture_id()); |
| 130 scoped_refptr<gfx::GLImageOzoneNativePixmap> image( | 126 scoped_refptr<gfx::GLImageOzoneNativePixmap> image( |
| 131 new gfx::GLImageOzoneNativePixmap(size(), GL_BGRA_EXT)); | 127 new gfx::GLImageOzoneNativePixmap(size(), GL_BGRA_EXT)); |
| 132 if (!image->Initialize(pixmap_.get(), gfx::BufferFormat::BGRX_8888)) { | 128 if (!image->Initialize(pixmap_.get(), gfx::BufferFormat::BGRX_8888)) { |
| 133 LOG(ERROR) << "Failed to create GLImage"; | 129 LOG(ERROR) << "Failed to create GLImage"; |
| 134 return false; | 130 return false; |
| 135 } | 131 } |
| 136 gl_image_ = image; | 132 gl_image_ = image; |
| 137 if (!gl_image_->BindTexImage(GL_TEXTURE_EXTERNAL_OES)) { | 133 if (!gl_image_->BindTexImage(GL_TEXTURE_EXTERNAL_OES)) { |
| 138 LOG(ERROR) << "Failed to bind texture to GLImage"; | 134 LOG(ERROR) << "Failed to bind texture to GLImage"; |
| 139 return false; | 135 return false; |
| 140 } | 136 } |
| 141 | 137 |
| 142 return true; | 138 return true; |
| 143 } | 139 } |
| 144 | 140 |
| 145 bool VaapiDrmPicture::DownloadFromSurface( | 141 bool VaapiDrmPicture::DownloadFromSurface( |
| 146 const scoped_refptr<VASurface>& va_surface) { | 142 const scoped_refptr<VASurface>& va_surface) { |
| 147 return vaapi_wrapper_->BlitSurface(va_surface, va_surface_); | 143 return vaapi_wrapper_->BlitSurface(va_surface, va_surface_); |
| 148 } | 144 } |
| 149 | 145 |
| 150 // static | |
| 151 scoped_refptr<ui::NativePixmap> VaapiDrmPicture::CallScalePixmap( | |
| 152 base::WeakPtr<VaapiDrmPicture> weak_ptr, | |
| 153 gfx::Size new_size) { | |
| 154 if (!weak_ptr.get()) { | |
| 155 LOG(ERROR) << "Failed scaling NativePixmap as scaling " | |
| 156 "unit(VaapiDrmPicture) is deleted"; | |
| 157 return nullptr; | |
| 158 } | |
| 159 return weak_ptr->ScalePixmap(new_size); | |
| 160 } | |
| 161 | |
| 162 scoped_refptr<ui::NativePixmap> VaapiDrmPicture::ScalePixmap( | 146 scoped_refptr<ui::NativePixmap> VaapiDrmPicture::ScalePixmap( |
| 163 gfx::Size new_size) { | 147 gfx::Size new_size) { |
| 164 if (!scaled_va_surface_.get() || scaled_va_surface_->size() != new_size) { | 148 if (!scaled_va_surface_.get() || scaled_va_surface_->size() != new_size) { |
| 165 scaled_pixmap_ = CreateNativePixmap(new_size); | 149 scaled_pixmap_ = CreateNativePixmap(new_size); |
| 166 if (!scaled_pixmap_) { | 150 if (!scaled_pixmap_) { |
| 167 LOG(ERROR) << "Failed creating an Ozone NativePixmap for scaling"; | 151 LOG(ERROR) << "Failed creating an Ozone NativePixmap for scaling"; |
| 168 scaled_va_surface_ = nullptr; | 152 scaled_va_surface_ = nullptr; |
| 169 return nullptr; | 153 return nullptr; |
| 170 } | 154 } |
| 171 scaled_va_surface_ = CreateVASurfaceForPixmap(scaled_pixmap_, new_size); | 155 scaled_va_surface_ = CreateVASurfaceForPixmap(scaled_pixmap_, new_size); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 191 | 175 |
| 192 scoped_refptr<gl::GLImage> VaapiDrmPicture::GetImageToBind() { | 176 scoped_refptr<gl::GLImage> VaapiDrmPicture::GetImageToBind() { |
| 193 return gl_image_; | 177 return gl_image_; |
| 194 } | 178 } |
| 195 | 179 |
| 196 bool VaapiDrmPicture::AllowOverlay() const { | 180 bool VaapiDrmPicture::AllowOverlay() const { |
| 197 return true; | 181 return true; |
| 198 } | 182 } |
| 199 | 183 |
| 200 } // namespace | 184 } // namespace |
| OLD | NEW |