OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 5 #include "base/bind.h" |
6 #include "base/debug/trace_event.h" | 6 #include "base/debug/trace_event.h" |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 // at the end of decode (or when a new set of PictureBuffers is required). | 67 // at the end of decode (or when a new set of PictureBuffers is required). |
68 // | 68 // |
69 // TFPPictures are used for output, contents of VASurfaces passed from decoder | 69 // TFPPictures are used for output, contents of VASurfaces passed from decoder |
70 // are put into the associated pixmap memory and sent to client. | 70 // are put into the associated pixmap memory and sent to client. |
71 class VaapiVideoDecodeAccelerator::TFPPicture { | 71 class VaapiVideoDecodeAccelerator::TFPPicture { |
72 public: | 72 public: |
73 ~TFPPicture(); | 73 ~TFPPicture(); |
74 | 74 |
75 static linked_ptr<TFPPicture> Create( | 75 static linked_ptr<TFPPicture> Create( |
76 const base::Callback<bool(void)>& make_context_current, | 76 const base::Callback<bool(void)>& make_context_current, |
| 77 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
77 const GLXFBConfig& fb_config, | 78 const GLXFBConfig& fb_config, |
| 79 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 80 EGLDisplay egl_display, |
| 81 #endif |
78 Display* x_display, | 82 Display* x_display, |
79 int32 picture_buffer_id, | 83 int32 picture_buffer_id, |
80 uint32 texture_id, | 84 uint32 texture_id, |
81 gfx::Size size); | 85 gfx::Size size); |
82 | 86 |
83 int32 picture_buffer_id() { | 87 int32 picture_buffer_id() { |
84 return picture_buffer_id_; | 88 return picture_buffer_id_; |
85 } | 89 } |
86 | 90 |
87 uint32 texture_id() { | 91 uint32 texture_id() { |
(...skipping 10 matching lines...) Expand all Loading... |
98 | 102 |
99 // Bind texture to pixmap. Needs to be called every frame. | 103 // Bind texture to pixmap. Needs to be called every frame. |
100 bool Bind(); | 104 bool Bind(); |
101 | 105 |
102 private: | 106 private: |
103 TFPPicture(const base::Callback<bool(void)>& make_context_current, | 107 TFPPicture(const base::Callback<bool(void)>& make_context_current, |
104 Display* x_display, | 108 Display* x_display, |
105 int32 picture_buffer_id, | 109 int32 picture_buffer_id, |
106 uint32 texture_id, | 110 uint32 texture_id, |
107 gfx::Size size); | 111 gfx::Size size); |
108 | 112 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
109 bool Initialize(const GLXFBConfig& fb_config); | 113 bool Initialize(const GLXFBConfig& fb_config); |
| 114 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 115 bool Initialize(EGLDisplay egl_display); |
| 116 #endif |
110 | 117 |
111 base::Callback<bool(void)> make_context_current_; | 118 base::Callback<bool(void)> make_context_current_; |
112 | 119 |
113 Display* x_display_; | 120 Display* x_display_; |
114 | 121 |
115 // Output id for the client. | 122 // Output id for the client. |
116 int32 picture_buffer_id_; | 123 int32 picture_buffer_id_; |
117 uint32 texture_id_; | 124 uint32 texture_id_; |
118 | 125 |
119 gfx::Size size_; | 126 gfx::Size size_; |
120 | 127 |
121 // Pixmaps bound to this texture. | 128 // Pixmaps bound to this texture. |
122 Pixmap x_pixmap_; | 129 Pixmap x_pixmap_; |
| 130 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
123 GLXPixmap glx_pixmap_; | 131 GLXPixmap glx_pixmap_; |
124 | 132 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 133 EGLDisplay egl_display_; |
| 134 EGLImageKHR egl_image_; |
| 135 #endif |
125 DISALLOW_COPY_AND_ASSIGN(TFPPicture); | 136 DISALLOW_COPY_AND_ASSIGN(TFPPicture); |
126 }; | 137 }; |
127 | 138 |
128 VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( | 139 VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( |
129 const base::Callback<bool(void)>& make_context_current, | 140 const base::Callback<bool(void)>& make_context_current, |
130 Display* x_display, | 141 Display* x_display, |
131 int32 picture_buffer_id, | 142 int32 picture_buffer_id, |
132 uint32 texture_id, | 143 uint32 texture_id, |
133 gfx::Size size) | 144 gfx::Size size) |
134 : make_context_current_(make_context_current), | 145 : make_context_current_(make_context_current), |
135 x_display_(x_display), | 146 x_display_(x_display), |
136 picture_buffer_id_(picture_buffer_id), | 147 picture_buffer_id_(picture_buffer_id), |
137 texture_id_(texture_id), | 148 texture_id_(texture_id), |
138 size_(size), | 149 size_(size), |
139 x_pixmap_(0), | 150 x_pixmap_(0), |
140 glx_pixmap_(0) { | 151 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
| 152 glx_pixmap_(0) |
| 153 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 154 egl_display_(0), |
| 155 egl_image_(0) |
| 156 #endif |
| 157 { |
141 DCHECK(!make_context_current_.is_null()); | 158 DCHECK(!make_context_current_.is_null()); |
142 }; | 159 }; |
143 | 160 |
144 linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> | 161 linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> |
145 VaapiVideoDecodeAccelerator::TFPPicture::Create( | 162 VaapiVideoDecodeAccelerator::TFPPicture::Create( |
146 const base::Callback<bool(void)>& make_context_current, | 163 const base::Callback<bool(void)>& make_context_current, |
| 164 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
147 const GLXFBConfig& fb_config, | 165 const GLXFBConfig& fb_config, |
| 166 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 167 EGLDisplay egl_display, |
| 168 #endif |
148 Display* x_display, | 169 Display* x_display, |
149 int32 picture_buffer_id, | 170 int32 picture_buffer_id, |
150 uint32 texture_id, | 171 uint32 texture_id, |
151 gfx::Size size) { | 172 gfx::Size size) { |
152 | 173 |
153 linked_ptr<TFPPicture> tfp_picture( | 174 linked_ptr<TFPPicture> tfp_picture( |
154 new TFPPicture(make_context_current, x_display, picture_buffer_id, | 175 new TFPPicture(make_context_current, x_display, picture_buffer_id, |
155 texture_id, size)); | 176 texture_id, size)); |
156 | 177 |
| 178 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
157 if (!tfp_picture->Initialize(fb_config)) | 179 if (!tfp_picture->Initialize(fb_config)) |
| 180 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 181 if (!tfp_picture->Initialize(egl_display)) |
| 182 #endif |
158 tfp_picture.reset(); | 183 tfp_picture.reset(); |
159 | 184 |
160 return tfp_picture; | 185 return tfp_picture; |
161 } | 186 } |
162 | 187 |
163 bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( | 188 bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
| 189 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
164 const GLXFBConfig& fb_config) { | 190 const GLXFBConfig& fb_config) { |
| 191 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 192 EGLDisplay egl_display) { |
| 193 #endif |
165 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 194 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
166 DCHECK(ChildThread::current() == NULL || | 195 DCHECK(ChildThread::current() == NULL || |
167 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 196 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
168 | 197 |
169 if (!make_context_current_.Run()) | 198 if (!make_context_current_.Run()) |
170 return false; | 199 return false; |
171 | 200 |
172 XWindowAttributes win_attr; | 201 XWindowAttributes win_attr; |
173 int screen = DefaultScreen(x_display_); | 202 int screen = DefaultScreen(x_display_); |
174 XGetWindowAttributes(x_display_, RootWindow(x_display_, screen), &win_attr); | 203 XGetWindowAttributes(x_display_, RootWindow(x_display_, screen), &win_attr); |
175 //TODO(posciak): pass the depth required by libva, not the RootWindow's depth | 204 //TODO(posciak): pass the depth required by libva, not the RootWindow's depth |
176 x_pixmap_ = XCreatePixmap(x_display_, RootWindow(x_display_, screen), | 205 x_pixmap_ = XCreatePixmap(x_display_, RootWindow(x_display_, screen), |
177 size_.width(), size_.height(), win_attr.depth); | 206 size_.width(), size_.height(), win_attr.depth); |
178 if (!x_pixmap_) { | 207 if (!x_pixmap_) { |
179 DVLOG(1) << "Failed creating an X Pixmap for TFP"; | 208 DVLOG(1) << "Failed creating an X Pixmap for TFP"; |
180 return false; | 209 return false; |
181 } | 210 } |
182 | 211 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
183 static const int pixmap_attr[] = { | 212 static const int pixmap_attr[] = { |
184 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, | 213 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, |
185 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, | 214 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT, |
186 GL_NONE, | 215 GL_NONE, |
187 }; | 216 }; |
188 | 217 |
189 glx_pixmap_ = glXCreatePixmap(x_display_, fb_config, x_pixmap_, pixmap_attr); | 218 glx_pixmap_ = glXCreatePixmap(x_display_, fb_config, x_pixmap_, pixmap_attr); |
190 if (!glx_pixmap_) { | 219 if (!glx_pixmap_) { |
191 // x_pixmap_ will be freed in the destructor. | 220 // x_pixmap_ will be freed in the destructor. |
192 DVLOG(1) << "Failed creating a GLX Pixmap for TFP"; | 221 DVLOG(1) << "Failed creating a GLX Pixmap for TFP"; |
193 return false; | 222 return false; |
194 } | 223 } |
| 224 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 225 egl_display_ = egl_display; |
| 226 EGLint image_attrs[] = { EGL_IMAGE_PRESERVED_KHR, 1 , EGL_NONE }; |
| 227 |
| 228 egl_image_ = eglCreateImageKHR(egl_display_, |
| 229 EGL_NO_CONTEXT, |
| 230 EGL_NATIVE_PIXMAP_KHR, |
| 231 (EGLClientBuffer)x_pixmap_, |
| 232 image_attrs); |
| 233 if (!egl_image_) { |
| 234 DVLOG(1) << "Failed creating a EGLImage from Pixmap for KHR"; |
| 235 return false; |
| 236 } |
| 237 #endif |
195 | 238 |
196 return true; | 239 return true; |
197 } | 240 } |
198 | 241 |
199 VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { | 242 VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { |
200 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 243 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
201 DCHECK(ChildThread::current() == NULL || | 244 DCHECK(ChildThread::current() == NULL || |
202 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 245 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
203 | 246 |
204 // Unbind surface from texture and deallocate resources. | 247 // Unbind surface from texture and deallocate resources. |
| 248 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
205 if (glx_pixmap_ && make_context_current_.Run()) { | 249 if (glx_pixmap_ && make_context_current_.Run()) { |
206 glXReleaseTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT); | 250 glXReleaseTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT); |
207 glXDestroyPixmap(x_display_, glx_pixmap_); | 251 glXDestroyPixmap(x_display_, glx_pixmap_); |
208 } | 252 } |
| 253 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 254 if (egl_image_ && make_context_current_.Run()) { |
| 255 eglDestroyImageKHR(egl_display_, egl_image_); |
| 256 } |
| 257 #endif |
209 | 258 |
210 if (x_pixmap_) | 259 if (x_pixmap_) |
211 XFreePixmap(x_display_, x_pixmap_); | 260 XFreePixmap(x_display_, x_pixmap_); |
212 XSync(x_display_, False); // Needed to work around buggy vdpau-driver. | 261 XSync(x_display_, False); // Needed to work around buggy vdpau-driver. |
213 } | 262 } |
214 | 263 |
215 bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { | 264 bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { |
216 DCHECK(x_pixmap_); | 265 DCHECK(x_pixmap_); |
| 266 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
217 DCHECK(glx_pixmap_); | 267 DCHECK(glx_pixmap_); |
| 268 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 269 DCHECK(egl_image_); |
| 270 #endif |
218 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 271 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
219 DCHECK(ChildThread::current() == NULL || | 272 DCHECK(ChildThread::current() == NULL || |
220 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 273 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
221 | 274 |
222 if (!make_context_current_.Run()) | 275 if (!make_context_current_.Run()) |
223 return false; | 276 return false; |
224 | 277 |
225 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_2D, texture_id_); | 278 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_2D, texture_id_); |
| 279 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
226 glXBindTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); | 280 glXBindTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); |
227 | 281 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 282 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image_); |
| 283 #endif |
228 return true; | 284 return true; |
229 } | 285 } |
230 | 286 |
231 VaapiVideoDecodeAccelerator::TFPPicture* | 287 VaapiVideoDecodeAccelerator::TFPPicture* |
232 VaapiVideoDecodeAccelerator::TFPPictureById(int32 picture_buffer_id) { | 288 VaapiVideoDecodeAccelerator::TFPPictureById(int32 picture_buffer_id) { |
233 TFPPictures::iterator it = tfp_pictures_.find(picture_buffer_id); | 289 TFPPictures::iterator it = tfp_pictures_.find(picture_buffer_id); |
234 if (it == tfp_pictures_.end()) { | 290 if (it == tfp_pictures_.end()) { |
235 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist"; | 291 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist"; |
236 return NULL; | 292 return NULL; |
237 } | 293 } |
238 | 294 |
239 return it->second.get(); | 295 return it->second.get(); |
240 } | 296 } |
241 | 297 |
242 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( | 298 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( |
| 299 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
243 Display* x_display, GLXContext glx_context, | 300 Display* x_display, GLXContext glx_context, |
| 301 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 302 EGLDisplay egl_display, EGLContext egl_context, |
| 303 #endif |
244 Client* client, | 304 Client* client, |
245 const base::Callback<bool(void)>& make_context_current) | 305 const base::Callback<bool(void)>& make_context_current) |
| 306 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
246 : x_display_(x_display), | 307 : x_display_(x_display), |
247 glx_context_(glx_context), | 308 glx_context_(glx_context), |
| 309 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 310 : x_display_(0), |
| 311 egl_display_(egl_display), |
| 312 egl_context_(egl_context), |
| 313 #endif |
248 make_context_current_(make_context_current), | 314 make_context_current_(make_context_current), |
249 state_(kUninitialized), | 315 state_(kUninitialized), |
250 input_ready_(&lock_), | 316 input_ready_(&lock_), |
251 surfaces_available_(&lock_), | 317 surfaces_available_(&lock_), |
252 message_loop_(base::MessageLoop::current()), | 318 message_loop_(base::MessageLoop::current()), |
253 weak_this_(base::AsWeakPtr(this)), | 319 weak_this_(base::AsWeakPtr(this)), |
254 client_ptr_factory_(client), | 320 client_ptr_factory_(client), |
255 client_(client_ptr_factory_.GetWeakPtr()), | 321 client_(client_ptr_factory_.GetWeakPtr()), |
256 decoder_thread_("VaapiDecoderThread"), | 322 decoder_thread_("VaapiDecoderThread"), |
257 num_frames_at_client_(0), | 323 num_frames_at_client_(0), |
258 num_stream_bufs_at_decoder_(0), | 324 num_stream_bufs_at_decoder_(0), |
259 finish_flush_pending_(false), | 325 finish_flush_pending_(false), |
260 awaiting_va_surfaces_recycle_(false), | 326 awaiting_va_surfaces_recycle_(false), |
261 requested_num_pics_(0) { | 327 requested_num_pics_(0) { |
262 DCHECK(client); | 328 DCHECK(client); |
263 } | 329 } |
264 | 330 |
265 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { | 331 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { |
266 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 332 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
267 } | 333 } |
268 | 334 |
269 class ScopedPtrXFree { | 335 class ScopedPtrXFree { |
270 public: | 336 public: |
271 void operator()(void* x) const { | 337 void operator()(void* x) const { |
272 ::XFree(x); | 338 ::XFree(x); |
273 } | 339 } |
274 }; | 340 }; |
275 | 341 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
276 bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { | 342 bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { |
277 const int fbconfig_attr[] = { | 343 const int fbconfig_attr[] = { |
278 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, | 344 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, |
279 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, | 345 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, |
280 GLX_BIND_TO_TEXTURE_RGB_EXT, GL_TRUE, | 346 GLX_BIND_TO_TEXTURE_RGB_EXT, GL_TRUE, |
281 GLX_Y_INVERTED_EXT, GL_TRUE, | 347 GLX_Y_INVERTED_EXT, GL_TRUE, |
282 GL_NONE, | 348 GL_NONE, |
283 }; | 349 }; |
284 | 350 |
285 int num_fbconfigs; | 351 int num_fbconfigs; |
286 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> glx_fb_configs( | 352 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> glx_fb_configs( |
287 glXChooseFBConfig(x_display_, DefaultScreen(x_display_), fbconfig_attr, | 353 glXChooseFBConfig(x_display_, DefaultScreen(x_display_), fbconfig_attr, |
288 &num_fbconfigs)); | 354 &num_fbconfigs)); |
289 if (!glx_fb_configs) | 355 if (!glx_fb_configs) |
290 return false; | 356 return false; |
291 if (!num_fbconfigs) | 357 if (!num_fbconfigs) |
292 return false; | 358 return false; |
293 | 359 |
294 fb_config_ = glx_fb_configs.get()[0]; | 360 fb_config_ = glx_fb_configs.get()[0]; |
295 return true; | 361 return true; |
296 } | 362 } |
297 | 363 #endif |
298 bool VaapiVideoDecodeAccelerator::Initialize( | 364 bool VaapiVideoDecodeAccelerator::Initialize( |
299 media::VideoCodecProfile profile) { | 365 media::VideoCodecProfile profile) { |
300 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 366 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
301 | 367 |
302 base::AutoLock auto_lock(lock_); | 368 base::AutoLock auto_lock(lock_); |
303 DCHECK_EQ(state_, kUninitialized); | 369 DCHECK_EQ(state_, kUninitialized); |
304 DVLOG(2) << "Initializing VAVDA, profile: " << profile; | 370 DVLOG(2) << "Initializing VAVDA, profile: " << profile; |
305 | 371 |
306 if (!make_context_current_.Run()) | 372 if (!make_context_current_.Run()) |
307 return false; | 373 return false; |
308 | 374 |
| 375 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
309 if (!InitializeFBConfig()) { | 376 if (!InitializeFBConfig()) { |
310 DVLOG(1) << "Could not get a usable FBConfig"; | 377 DVLOG(1) << "Could not get a usable FBConfig"; |
311 return false; | 378 return false; |
312 } | 379 } |
| 380 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 381 x_display_ = base::MessagePumpForUI::GetDefaultXDisplay(); |
| 382 #endif |
313 | 383 |
314 vaapi_wrapper_ = VaapiWrapper::Create( | 384 vaapi_wrapper_ = VaapiWrapper::Create( |
315 profile, x_display_, | 385 profile, x_display_, |
316 base::Bind(&ReportToUMA, content::VaapiH264Decoder::VAAPI_ERROR)); | 386 base::Bind(&ReportToUMA, content::VaapiH264Decoder::VAAPI_ERROR)); |
317 | 387 |
318 if (!vaapi_wrapper_.get()) { | 388 if (!vaapi_wrapper_.get()) { |
319 DVLOG(1) << "Failed initializing VAAPI"; | 389 DVLOG(1) << "Failed initializing VAAPI"; |
320 return false; | 390 return false; |
321 } | 391 } |
322 | 392 |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 &va_surface_ids), | 781 &va_surface_ids), |
712 "Failed creating VA Surfaces", PLATFORM_FAILURE, ); | 782 "Failed creating VA Surfaces", PLATFORM_FAILURE, ); |
713 DCHECK_EQ(va_surface_ids.size(), buffers.size()); | 783 DCHECK_EQ(va_surface_ids.size(), buffers.size()); |
714 | 784 |
715 for (size_t i = 0; i < buffers.size(); ++i) { | 785 for (size_t i = 0; i < buffers.size(); ++i) { |
716 DVLOG(2) << "Assigning picture id: " << buffers[i].id() | 786 DVLOG(2) << "Assigning picture id: " << buffers[i].id() |
717 << " to texture id: " << buffers[i].texture_id() | 787 << " to texture id: " << buffers[i].texture_id() |
718 << " VASurfaceID: " << va_surface_ids[i]; | 788 << " VASurfaceID: " << va_surface_ids[i]; |
719 | 789 |
720 linked_ptr<TFPPicture> tfp_picture( | 790 linked_ptr<TFPPicture> tfp_picture( |
| 791 #if defined(VIDEO_TEXTURE_GLX_BACKEND) |
721 TFPPicture::Create(make_context_current_, fb_config_, x_display_, | 792 TFPPicture::Create(make_context_current_, fb_config_, x_display_, |
| 793 #elif defined(VIDEO_TEXTURE_EGL_BACKEND) |
| 794 TFPPicture::Create(make_context_current_, egl_display_, x_display_, |
| 795 #endif |
722 buffers[i].id(), buffers[i].texture_id(), | 796 buffers[i].id(), buffers[i].texture_id(), |
723 requested_pic_size_)); | 797 requested_pic_size_)); |
724 | 798 |
725 RETURN_AND_NOTIFY_ON_FAILURE( | 799 RETURN_AND_NOTIFY_ON_FAILURE( |
726 tfp_picture.get(), "Failed assigning picture buffer to a texture.", | 800 tfp_picture.get(), "Failed assigning picture buffer to a texture.", |
727 PLATFORM_FAILURE, ); | 801 PLATFORM_FAILURE, ); |
728 | 802 |
729 bool inserted = tfp_pictures_.insert(std::make_pair( | 803 bool inserted = tfp_pictures_.insert(std::make_pair( |
730 buffers[i].id(), tfp_picture)).second; | 804 buffers[i].id(), tfp_picture)).second; |
731 DCHECK(inserted); | 805 DCHECK(inserted); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 state_ = kUninitialized; | 999 state_ = kUninitialized; |
926 } | 1000 } |
927 | 1001 |
928 void VaapiVideoDecodeAccelerator::Destroy() { | 1002 void VaapiVideoDecodeAccelerator::Destroy() { |
929 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 1003 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
930 Cleanup(); | 1004 Cleanup(); |
931 delete this; | 1005 delete this; |
932 } | 1006 } |
933 | 1007 |
934 } // namespace content | 1008 } // namespace content |
OLD | NEW |