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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 const GLXFBConfig& fb_config, | 77 const GLXFBConfig& fb_config, |
78 Display* x_display, | 78 Display* x_display, |
79 int32 picture_buffer_id, | 79 int32 picture_buffer_id, |
80 uint32 texture_id, | 80 uint32 texture_id, |
81 gfx::Size size); | 81 gfx::Size size); |
82 | 82 |
| 83 static linked_ptr<TFPPicture> Create( |
| 84 const base::Callback<bool(void)>& make_context_current, |
| 85 const EGLDisplay egl_display, |
| 86 Display* x_display, |
| 87 int32 picture_buffer_id, |
| 88 uint32 texture_id, |
| 89 gfx::Size size); |
83 int32 picture_buffer_id() { | 90 int32 picture_buffer_id() { |
84 return picture_buffer_id_; | 91 return picture_buffer_id_; |
85 } | 92 } |
86 | 93 |
87 uint32 texture_id() { | 94 uint32 texture_id() { |
88 return texture_id_; | 95 return texture_id_; |
89 } | 96 } |
90 | 97 |
91 gfx::Size size() { | 98 gfx::Size size() { |
92 return size_; | 99 return size_; |
93 } | 100 } |
94 | 101 |
95 int x_pixmap() { | 102 int x_pixmap() { |
96 return x_pixmap_; | 103 return x_pixmap_; |
97 } | 104 } |
98 | 105 |
99 // Bind texture to pixmap. Needs to be called every frame. | 106 // Bind texture to pixmap. Needs to be called every frame. |
100 bool Bind(); | 107 bool Bind(); |
101 | 108 |
102 private: | 109 private: |
103 TFPPicture(const base::Callback<bool(void)>& make_context_current, | 110 TFPPicture(const base::Callback<bool(void)>& make_context_current, |
| 111 GLXFBConfig& fb_config, |
| 112 Display* x_display, |
| 113 int32 picture_buffer_id, |
| 114 uint32 texture_id, |
| 115 gfx::Size size); |
| 116 TFPPicture(const base::Callback<bool(void)>& make_context_current, |
| 117 EGLDisplay egl_display, |
104 Display* x_display, | 118 Display* x_display, |
105 int32 picture_buffer_id, | 119 int32 picture_buffer_id, |
106 uint32 texture_id, | 120 uint32 texture_id, |
107 gfx::Size size); | 121 gfx::Size size); |
108 | 122 |
109 bool Initialize(const GLXFBConfig& fb_config); | 123 bool Initialize(const GLXFBConfig& fb_config); |
| 124 bool Initialize(const EGLDisplay egl_display); |
110 | 125 |
111 base::Callback<bool(void)> make_context_current_; | 126 base::Callback<bool(void)> make_context_current_; |
112 | 127 |
113 Display* x_display_; | 128 Display* x_display_; |
114 | 129 |
115 // Output id for the client. | 130 // Output id for the client. |
116 int32 picture_buffer_id_; | 131 int32 picture_buffer_id_; |
117 uint32 texture_id_; | 132 uint32 texture_id_; |
118 | 133 |
119 gfx::Size size_; | 134 gfx::Size size_; |
120 | 135 |
121 // Pixmaps bound to this texture. | 136 // Pixmaps bound to this texture. |
122 Pixmap x_pixmap_; | 137 Pixmap x_pixmap_; |
| 138 EGLDisplay egl_display_; |
| 139 EGLImageKHR egl_image_; |
123 GLXPixmap glx_pixmap_; | 140 GLXPixmap glx_pixmap_; |
124 | 141 |
125 DISALLOW_COPY_AND_ASSIGN(TFPPicture); | 142 DISALLOW_COPY_AND_ASSIGN(TFPPicture); |
126 }; | 143 }; |
| 144 VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( |
| 145 const base::Callback<bool(void)>& make_context_current, |
| 146 GLXFBConfig& fb_config, |
| 147 Display* x_display, |
| 148 int32 picture_buffer_id, |
| 149 uint32 texture_id, |
| 150 gfx::Size size) |
| 151 : make_context_current_(make_context_current), |
| 152 x_display_(x_display), |
| 153 picture_buffer_id_(picture_buffer_id), |
| 154 texture_id_(texture_id), |
| 155 size_(size), |
| 156 x_pixmap_(0), |
| 157 egl_image_(0), |
| 158 glx_pixmap_(0) { |
| 159 DCHECK(!make_context_current_.is_null()); |
| 160 }; |
127 | 161 |
128 VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( | 162 VaapiVideoDecodeAccelerator::TFPPicture::TFPPicture( |
129 const base::Callback<bool(void)>& make_context_current, | 163 const base::Callback<bool(void)>& make_context_current, |
| 164 EGLDisplay egl_display, |
130 Display* x_display, | 165 Display* x_display, |
131 int32 picture_buffer_id, | 166 int32 picture_buffer_id, |
132 uint32 texture_id, | 167 uint32 texture_id, |
133 gfx::Size size) | 168 gfx::Size size) |
134 : make_context_current_(make_context_current), | 169 : make_context_current_(make_context_current), |
135 x_display_(x_display), | 170 x_display_(x_display), |
136 picture_buffer_id_(picture_buffer_id), | 171 picture_buffer_id_(picture_buffer_id), |
137 texture_id_(texture_id), | 172 texture_id_(texture_id), |
138 size_(size), | 173 size_(size), |
139 x_pixmap_(0), | 174 x_pixmap_(0), |
| 175 egl_display_(egl_display), |
| 176 egl_image_(0), |
140 glx_pixmap_(0) { | 177 glx_pixmap_(0) { |
141 DCHECK(!make_context_current_.is_null()); | 178 DCHECK(!make_context_current_.is_null()); |
142 }; | 179 }; |
143 | 180 |
144 linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> | 181 linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> |
145 VaapiVideoDecodeAccelerator::TFPPicture::Create( | 182 VaapiVideoDecodeAccelerator::TFPPicture::Create( |
146 const base::Callback<bool(void)>& make_context_current, | 183 const base::Callback<bool(void)>& make_context_current, |
147 const GLXFBConfig& fb_config, | 184 const GLXFBConfig& fb_config, |
148 Display* x_display, | 185 Display* x_display, |
149 int32 picture_buffer_id, | 186 int32 picture_buffer_id, |
150 uint32 texture_id, | 187 uint32 texture_id, |
151 gfx::Size size) { | 188 gfx::Size size) { |
152 | 189 |
153 linked_ptr<TFPPicture> tfp_picture( | 190 linked_ptr<TFPPicture> tfp_picture( |
154 new TFPPicture(make_context_current, x_display, picture_buffer_id, | 191 new TFPPicture(make_context_current, fb_config, x_display, |
155 texture_id, size)); | 192 picture_buffer_id, texture_id, size)); |
156 | 193 |
157 if (!tfp_picture->Initialize(fb_config)) | 194 if (!tfp_picture->Initialize(fb_config)) |
158 tfp_picture.reset(); | 195 tfp_picture.reset(); |
159 | 196 |
160 return tfp_picture; | 197 return tfp_picture; |
161 } | 198 } |
162 | 199 |
| 200 linked_ptr<VaapiVideoDecodeAccelerator::TFPPicture> |
| 201 VaapiVideoDecodeAccelerator::TFPPicture::Create( |
| 202 const base::Callback<bool(void)>& make_context_current, |
| 203 const EGLDisplay egl_display, |
| 204 Display* x_display, |
| 205 int32 picture_buffer_id, |
| 206 uint32 texture_id, |
| 207 gfx::Size size) { |
| 208 |
| 209 linked_ptr<TFPPicture> tfp_picture( |
| 210 new TFPPicture(make_context_current, egl_display, x_display, |
| 211 picture_buffer_id, texture_id, size)); |
| 212 |
| 213 if (!tfp_picture->Initialize(egl_display)) |
| 214 tfp_picture.reset(); |
| 215 |
| 216 return tfp_picture; |
| 217 } |
163 bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( | 218 bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
164 const GLXFBConfig& fb_config) { | 219 const GLXFBConfig& fb_config) { |
165 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 220 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
166 DCHECK(ChildThread::current() == NULL || | 221 DCHECK(ChildThread::current() == NULL || |
167 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 222 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
168 | 223 |
169 if (!make_context_current_.Run()) | 224 if (!make_context_current_.Run()) |
170 return false; | 225 return false; |
171 | 226 |
172 XWindowAttributes win_attr; | 227 XWindowAttributes win_attr; |
(...skipping 16 matching lines...) Expand all Loading... |
189 glx_pixmap_ = glXCreatePixmap(x_display_, fb_config, x_pixmap_, pixmap_attr); | 244 glx_pixmap_ = glXCreatePixmap(x_display_, fb_config, x_pixmap_, pixmap_attr); |
190 if (!glx_pixmap_) { | 245 if (!glx_pixmap_) { |
191 // x_pixmap_ will be freed in the destructor. | 246 // x_pixmap_ will be freed in the destructor. |
192 DVLOG(1) << "Failed creating a GLX Pixmap for TFP"; | 247 DVLOG(1) << "Failed creating a GLX Pixmap for TFP"; |
193 return false; | 248 return false; |
194 } | 249 } |
195 | 250 |
196 return true; | 251 return true; |
197 } | 252 } |
198 | 253 |
| 254 bool VaapiVideoDecodeAccelerator::TFPPicture::Initialize( |
| 255 EGLDisplay egl_display) { |
| 256 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
| 257 DCHECK(ChildThread::current() == NULL || |
| 258 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
| 259 |
| 260 if (!make_context_current_.Run()) |
| 261 return false; |
| 262 |
| 263 XWindowAttributes win_attr; |
| 264 int screen = DefaultScreen(x_display_); |
| 265 XGetWindowAttributes(x_display_, RootWindow(x_display_, screen), &win_attr); |
| 266 //TODO(posciak): pass the depth required by libva, not the RootWindow's depth |
| 267 x_pixmap_ = XCreatePixmap(x_display_, RootWindow(x_display_, screen), |
| 268 size_.width(), size_.height(), win_attr.depth); |
| 269 if (!x_pixmap_) { |
| 270 DVLOG(1) << "Failed creating an X Pixmap for TFP"; |
| 271 return false; |
| 272 } |
| 273 |
| 274 egl_display_ = egl_display; |
| 275 EGLint image_attrs[] = { EGL_IMAGE_PRESERVED_KHR, 1 , EGL_NONE }; |
| 276 |
| 277 egl_image_ = eglCreateImageKHR(egl_display_, |
| 278 EGL_NO_CONTEXT, |
| 279 EGL_NATIVE_PIXMAP_KHR, |
| 280 (EGLClientBuffer)x_pixmap_, |
| 281 image_attrs); |
| 282 if (!egl_image_) { |
| 283 DVLOG(1) << "Failed creating a EGLImage from Pixmap for KHR"; |
| 284 return false; |
| 285 } |
| 286 |
| 287 return true; |
| 288 } |
199 VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { | 289 VaapiVideoDecodeAccelerator::TFPPicture::~TFPPicture() { |
200 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 290 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
201 DCHECK(ChildThread::current() == NULL || | 291 DCHECK(ChildThread::current() == NULL || |
202 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 292 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
203 | 293 |
204 // Unbind surface from texture and deallocate resources. | 294 // Unbind surface from texture and deallocate resources. |
205 if (glx_pixmap_ && make_context_current_.Run()) { | 295 if (glx_pixmap_ && make_context_current_.Run()) { |
206 glXReleaseTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT); | 296 glXReleaseTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT); |
207 glXDestroyPixmap(x_display_, glx_pixmap_); | 297 glXDestroyPixmap(x_display_, glx_pixmap_); |
208 } | 298 } |
209 | 299 |
| 300 if (egl_image_ && make_context_current_.Run()) { |
| 301 eglDestroyImageKHR(egl_display_, egl_image_); |
| 302 } |
| 303 |
210 if (x_pixmap_) | 304 if (x_pixmap_) |
211 XFreePixmap(x_display_, x_pixmap_); | 305 XFreePixmap(x_display_, x_pixmap_); |
212 XSync(x_display_, False); // Needed to work around buggy vdpau-driver. | 306 XSync(x_display_, False); // Needed to work around buggy vdpau-driver. |
213 } | 307 } |
214 | 308 |
215 bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { | 309 bool VaapiVideoDecodeAccelerator::TFPPicture::Bind() { |
216 DCHECK(x_pixmap_); | 310 DCHECK(x_pixmap_); |
217 DCHECK(glx_pixmap_); | 311 |
218 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. | 312 // Check for NULL prevents unittests from crashing on nonexistent ChildThread. |
219 DCHECK(ChildThread::current() == NULL || | 313 DCHECK(ChildThread::current() == NULL || |
220 ChildThread::current()->message_loop() == base::MessageLoop::current()); | 314 ChildThread::current()->message_loop() == base::MessageLoop::current()); |
221 | 315 |
222 if (!make_context_current_.Run()) | 316 if (!make_context_current_.Run()) |
223 return false; | 317 return false; |
224 | 318 |
225 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_2D, texture_id_); | 319 gfx::ScopedTextureBinder texture_binder(GL_TEXTURE_2D, texture_id_); |
226 glXBindTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); | 320 if(glx_pixmap_) { |
227 | 321 glXBindTexImageEXT(x_display_, glx_pixmap_, GLX_FRONT_LEFT_EXT, NULL); |
| 322 } else if(egl_image_) { |
| 323 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image_); |
| 324 } else { |
| 325 return false; |
| 326 } |
228 return true; | 327 return true; |
229 } | 328 } |
230 | 329 |
231 VaapiVideoDecodeAccelerator::TFPPicture* | 330 VaapiVideoDecodeAccelerator::TFPPicture* |
232 VaapiVideoDecodeAccelerator::TFPPictureById(int32 picture_buffer_id) { | 331 VaapiVideoDecodeAccelerator::TFPPictureById(int32 picture_buffer_id) { |
233 TFPPictures::iterator it = tfp_pictures_.find(picture_buffer_id); | 332 TFPPictures::iterator it = tfp_pictures_.find(picture_buffer_id); |
234 if (it == tfp_pictures_.end()) { | 333 if (it == tfp_pictures_.end()) { |
235 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist"; | 334 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist"; |
236 return NULL; | 335 return NULL; |
237 } | 336 } |
238 | 337 |
239 return it->second.get(); | 338 return it->second.get(); |
240 } | 339 } |
241 | 340 |
242 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( | 341 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( |
243 Display* x_display, GLXContext glx_context, | 342 Display* x_display, GLXContext glx_context, |
244 Client* client, | 343 Client* client, |
245 const base::Callback<bool(void)>& make_context_current) | 344 const base::Callback<bool(void)>& make_context_current) |
246 : x_display_(x_display), | 345 : x_display_(x_display), |
| 346 egl_context_(0), |
247 glx_context_(glx_context), | 347 glx_context_(glx_context), |
248 make_context_current_(make_context_current), | 348 make_context_current_(make_context_current), |
249 state_(kUninitialized), | 349 state_(kUninitialized), |
250 input_ready_(&lock_), | 350 input_ready_(&lock_), |
251 surfaces_available_(&lock_), | 351 surfaces_available_(&lock_), |
252 message_loop_(base::MessageLoop::current()), | 352 message_loop_(base::MessageLoop::current()), |
253 weak_this_(base::AsWeakPtr(this)), | 353 weak_this_(base::AsWeakPtr(this)), |
254 client_ptr_factory_(client), | 354 client_ptr_factory_(client), |
255 client_(client_ptr_factory_.GetWeakPtr()), | 355 client_(client_ptr_factory_.GetWeakPtr()), |
256 decoder_thread_("VaapiDecoderThread"), | 356 decoder_thread_("VaapiDecoderThread"), |
257 num_frames_at_client_(0), | 357 num_frames_at_client_(0), |
258 num_stream_bufs_at_decoder_(0), | 358 num_stream_bufs_at_decoder_(0), |
259 finish_flush_pending_(false), | 359 finish_flush_pending_(false), |
260 awaiting_va_surfaces_recycle_(false), | 360 awaiting_va_surfaces_recycle_(false), |
261 requested_num_pics_(0) { | 361 requested_num_pics_(0) { |
262 DCHECK(client); | 362 DCHECK(client); |
263 } | 363 } |
264 | 364 |
| 365 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( |
| 366 EGLDisplay egl_display, EGLContext egl_context, |
| 367 Client* client, |
| 368 const base::Callback<bool(void)>& make_context_current) |
| 369 : x_display_(0), |
| 370 egl_display_(egl_display), |
| 371 egl_context_(egl_context), |
| 372 glx_context_(0), |
| 373 make_context_current_(make_context_current), |
| 374 state_(kUninitialized), |
| 375 input_ready_(&lock_), |
| 376 surfaces_available_(&lock_), |
| 377 message_loop_(base::MessageLoop::current()), |
| 378 weak_this_(base::AsWeakPtr(this)), |
| 379 client_ptr_factory_(client), |
| 380 client_(client_ptr_factory_.GetWeakPtr()), |
| 381 decoder_thread_("VaapiDecoderThread"), |
| 382 num_frames_at_client_(0), |
| 383 num_stream_bufs_at_decoder_(0), |
| 384 finish_flush_pending_(false), |
| 385 awaiting_va_surfaces_recycle_(false), |
| 386 requested_num_pics_(0) { |
| 387 DCHECK(client); |
| 388 } |
265 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { | 389 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { |
266 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 390 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
267 } | 391 } |
268 | 392 |
269 class ScopedPtrXFree { | 393 class ScopedPtrXFree { |
270 public: | 394 public: |
271 void operator()(void* x) const { | 395 void operator()(void* x) const { |
272 ::XFree(x); | 396 ::XFree(x); |
273 } | 397 } |
274 }; | 398 }; |
275 | 399 |
276 bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { | 400 bool VaapiVideoDecodeAccelerator::InitializeFBConfig() { |
277 const int fbconfig_attr[] = { | 401 if(glx_context_) { |
278 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, | 402 const int fbconfig_attr[] = { |
279 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, | 403 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, |
280 GLX_BIND_TO_TEXTURE_RGB_EXT, GL_TRUE, | 404 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, |
281 GLX_Y_INVERTED_EXT, GL_TRUE, | 405 GLX_BIND_TO_TEXTURE_RGB_EXT, GL_TRUE, |
282 GL_NONE, | 406 GLX_Y_INVERTED_EXT, GL_TRUE, |
283 }; | 407 GL_NONE, |
| 408 }; |
284 | 409 |
285 int num_fbconfigs; | 410 int num_fbconfigs; |
286 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> glx_fb_configs( | 411 scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> glx_fb_configs( |
287 glXChooseFBConfig(x_display_, DefaultScreen(x_display_), fbconfig_attr, | 412 glXChooseFBConfig(x_display_, DefaultScreen(x_display_), fbconfig_attr, |
288 &num_fbconfigs)); | 413 &num_fbconfigs)); |
289 if (!glx_fb_configs) | 414 if (!glx_fb_configs) |
| 415 return false; |
| 416 if (!num_fbconfigs) |
| 417 return false; |
| 418 |
| 419 fb_config_ = glx_fb_configs.get()[0]; |
| 420 } else if(egl_context_) { |
| 421 x_display_ = base::MessagePumpForUI::GetDefaultXDisplay(); |
| 422 } else { |
290 return false; | 423 return false; |
291 if (!num_fbconfigs) | 424 } |
292 return false; | |
293 | 425 |
294 fb_config_ = glx_fb_configs.get()[0]; | |
295 return true; | 426 return true; |
296 } | 427 } |
297 | 428 |
298 bool VaapiVideoDecodeAccelerator::Initialize( | 429 bool VaapiVideoDecodeAccelerator::Initialize( |
299 media::VideoCodecProfile profile) { | 430 media::VideoCodecProfile profile) { |
300 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 431 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
301 | 432 |
302 base::AutoLock auto_lock(lock_); | 433 base::AutoLock auto_lock(lock_); |
303 DCHECK_EQ(state_, kUninitialized); | 434 DCHECK_EQ(state_, kUninitialized); |
304 DVLOG(2) << "Initializing VAVDA, profile: " << profile; | 435 DVLOG(2) << "Initializing VAVDA, profile: " << profile; |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 vaapi_wrapper_->CreateSurfaces(requested_pic_size_, | 840 vaapi_wrapper_->CreateSurfaces(requested_pic_size_, |
710 buffers.size(), | 841 buffers.size(), |
711 &va_surface_ids), | 842 &va_surface_ids), |
712 "Failed creating VA Surfaces", PLATFORM_FAILURE, ); | 843 "Failed creating VA Surfaces", PLATFORM_FAILURE, ); |
713 DCHECK_EQ(va_surface_ids.size(), buffers.size()); | 844 DCHECK_EQ(va_surface_ids.size(), buffers.size()); |
714 | 845 |
715 for (size_t i = 0; i < buffers.size(); ++i) { | 846 for (size_t i = 0; i < buffers.size(); ++i) { |
716 DVLOG(2) << "Assigning picture id: " << buffers[i].id() | 847 DVLOG(2) << "Assigning picture id: " << buffers[i].id() |
717 << " to texture id: " << buffers[i].texture_id() | 848 << " to texture id: " << buffers[i].texture_id() |
718 << " VASurfaceID: " << va_surface_ids[i]; | 849 << " VASurfaceID: " << va_surface_ids[i]; |
| 850 if(glx_context_) { |
| 851 linked_ptr<TFPPicture> tfp_picture( |
| 852 TFPPicture::Create(make_context_current_, fb_config_, x_display_, |
| 853 buffers[i].id(), buffers[i].texture_id(), |
| 854 requested_pic_size_)); |
719 | 855 |
720 linked_ptr<TFPPicture> tfp_picture( | 856 RETURN_AND_NOTIFY_ON_FAILURE( |
721 TFPPicture::Create(make_context_current_, fb_config_, x_display_, | 857 tfp_picture.get(), "Failed assigning picture buffer to a texture.", |
722 buffers[i].id(), buffers[i].texture_id(), | 858 PLATFORM_FAILURE, ); |
723 requested_pic_size_)); | |
724 | 859 |
725 RETURN_AND_NOTIFY_ON_FAILURE( | 860 bool inserted = tfp_pictures_.insert(std::make_pair( |
726 tfp_picture.get(), "Failed assigning picture buffer to a texture.", | 861 buffers[i].id(), tfp_picture)).second; |
727 PLATFORM_FAILURE, ); | 862 DCHECK(inserted); |
| 863 } else if(egl_context_) { |
| 864 linked_ptr<TFPPicture> tfp_picture( |
| 865 TFPPicture::Create(make_context_current_, egl_display_, x_display_, |
| 866 buffers[i].id(), buffers[i].texture_id(), |
| 867 requested_pic_size_)); |
728 | 868 |
729 bool inserted = tfp_pictures_.insert(std::make_pair( | 869 RETURN_AND_NOTIFY_ON_FAILURE( |
730 buffers[i].id(), tfp_picture)).second; | 870 tfp_picture.get(), "Failed assigning picture buffer to a texture.", |
731 DCHECK(inserted); | 871 PLATFORM_FAILURE, ); |
| 872 |
| 873 bool inserted = tfp_pictures_.insert(std::make_pair( |
| 874 buffers[i].id(), tfp_picture)).second; |
| 875 DCHECK(inserted); |
| 876 } |
732 | 877 |
733 output_buffers_.push(buffers[i].id()); | 878 output_buffers_.push(buffers[i].id()); |
734 available_va_surfaces_.push_back(va_surface_ids[i]); | 879 available_va_surfaces_.push_back(va_surface_ids[i]); |
735 surfaces_available_.Signal(); | 880 surfaces_available_.Signal(); |
736 } | 881 } |
737 | 882 |
738 state_ = kDecoding; | 883 state_ = kDecoding; |
739 decoder_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( | 884 decoder_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
740 &VaapiVideoDecodeAccelerator::DecodeTask, base::Unretained(this))); | 885 &VaapiVideoDecodeAccelerator::DecodeTask, base::Unretained(this))); |
741 } | 886 } |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 state_ = kUninitialized; | 1070 state_ = kUninitialized; |
926 } | 1071 } |
927 | 1072 |
928 void VaapiVideoDecodeAccelerator::Destroy() { | 1073 void VaapiVideoDecodeAccelerator::Destroy() { |
929 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 1074 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
930 Cleanup(); | 1075 Cleanup(); |
931 delete this; | 1076 delete this; |
932 } | 1077 } |
933 | 1078 |
934 } // namespace content | 1079 } // namespace content |
OLD | NEW |