| 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 <dlfcn.h> | 5 #include <dlfcn.h> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "content/common/gpu/media/vaapi_wrapper.h" | 9 #include "content/common/gpu/media/vaapi_wrapper.h" |
| 10 | 10 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 int num_surfaces, | 69 int num_surfaces, |
| 70 VASurfaceID *surfaces); | 70 VASurfaceID *surfaces); |
| 71 typedef VAStatus (*VaapiCreateSurfaces8)(VADisplay dpy, | 71 typedef VAStatus (*VaapiCreateSurfaces8)(VADisplay dpy, |
| 72 unsigned int format, | 72 unsigned int format, |
| 73 unsigned int width, | 73 unsigned int width, |
| 74 unsigned int height, | 74 unsigned int height, |
| 75 VASurfaceID *surfaces, | 75 VASurfaceID *surfaces, |
| 76 unsigned int num_surfaces, | 76 unsigned int num_surfaces, |
| 77 VASurfaceAttrib *attrib_list, | 77 VASurfaceAttrib *attrib_list, |
| 78 unsigned int num_attribs); | 78 unsigned int num_attribs); |
| 79 typedef VAStatus (*VaapiDeriveImage)(VADisplay dpy, |
| 80 VASurfaceID surface, |
| 81 VAImage* image); |
| 79 typedef VAStatus (*VaapiDestroyBuffer)(VADisplay dpy, VABufferID buffer_id); | 82 typedef VAStatus (*VaapiDestroyBuffer)(VADisplay dpy, VABufferID buffer_id); |
| 80 typedef VAStatus (*VaapiDestroyConfig)(VADisplay dpy, VAConfigID config_id); | 83 typedef VAStatus (*VaapiDestroyConfig)(VADisplay dpy, VAConfigID config_id); |
| 81 typedef VAStatus (*VaapiDestroyContext)(VADisplay dpy, VAContextID context); | 84 typedef VAStatus (*VaapiDestroyContext)(VADisplay dpy, VAContextID context); |
| 85 typedef VAStatus (*VaapiDestroyImage)(VADisplay dpy, VAImageID image); |
| 82 typedef VAStatus (*VaapiDestroySurfaces)(VADisplay dpy, | 86 typedef VAStatus (*VaapiDestroySurfaces)(VADisplay dpy, |
| 83 VASurfaceID *surfaces, | 87 VASurfaceID *surfaces, |
| 84 int num_surfaces); | 88 int num_surfaces); |
| 85 typedef int (*VaapiDisplayIsValid)(VADisplay dpy); | 89 typedef int (*VaapiDisplayIsValid)(VADisplay dpy); |
| 86 typedef VAStatus (*VaapiEndPicture)(VADisplay dpy, VAContextID context); | 90 typedef VAStatus (*VaapiEndPicture)(VADisplay dpy, VAContextID context); |
| 87 typedef const char* (*VaapiErrorStr)(VAStatus error_status); | 91 typedef const char* (*VaapiErrorStr)(VAStatus error_status); |
| 88 typedef VAStatus (*VaapiGetConfigAttributes)(VADisplay dpy, | 92 typedef VAStatus (*VaapiGetConfigAttributes)(VADisplay dpy, |
| 89 VAProfile profile, | 93 VAProfile profile, |
| 90 VAEntrypoint entrypoint, | 94 VAEntrypoint entrypoint, |
| 91 VAConfigAttrib *attrib_list, | 95 VAConfigAttrib *attrib_list, |
| 92 int num_attribs); | 96 int num_attribs); |
| 93 typedef VADisplay (*VaapiGetDisplay)(Display *dpy); | 97 typedef VADisplay (*VaapiGetDisplay)(Display *dpy); |
| 94 typedef VAStatus (*VaapiInitialize)(VADisplay dpy, | 98 typedef VAStatus (*VaapiInitialize)(VADisplay dpy, |
| 95 int *major_version, | 99 int *major_version, |
| 96 int *minor_version); | 100 int *minor_version); |
| 101 typedef VAStatus (*VaapiMapBuffer)(VADisplay dpy, |
| 102 VABufferID buf_id, |
| 103 void** pbuf); |
| 97 typedef VAStatus (*VaapiPutSurface)(VADisplay dpy, | 104 typedef VAStatus (*VaapiPutSurface)(VADisplay dpy, |
| 98 VASurfaceID surface, | 105 VASurfaceID surface, |
| 99 Drawable draw, | 106 Drawable draw, |
| 100 short srcx, | 107 short srcx, |
| 101 short srcy, | 108 short srcy, |
| 102 unsigned short srcw, | 109 unsigned short srcw, |
| 103 unsigned short srch, | 110 unsigned short srch, |
| 104 short destx, | 111 short destx, |
| 105 short desty, | 112 short desty, |
| 106 unsigned short destw, | 113 unsigned short destw, |
| 107 unsigned short desth, | 114 unsigned short desth, |
| 108 VARectangle *cliprects, | 115 VARectangle *cliprects, |
| 109 unsigned int number_cliprects, | 116 unsigned int number_cliprects, |
| 110 unsigned int flags); | 117 unsigned int flags); |
| 111 typedef VAStatus (*VaapiRenderPicture)(VADisplay dpy, | 118 typedef VAStatus (*VaapiRenderPicture)(VADisplay dpy, |
| 112 VAContextID context, | 119 VAContextID context, |
| 113 VABufferID *buffers, | 120 VABufferID *buffers, |
| 114 int num_buffers); | 121 int num_buffers); |
| 115 typedef VAStatus (*VaapiSetDisplayAttributes)(VADisplay dpy, | 122 typedef VAStatus (*VaapiSetDisplayAttributes)(VADisplay dpy, |
| 116 VADisplayAttribute *type, | 123 VADisplayAttribute *type, |
| 117 int num_attributes); | 124 int num_attributes); |
| 118 typedef VAStatus (*VaapiSyncSurface)(VADisplay dpy, VASurfaceID render_target); | 125 typedef VAStatus (*VaapiSyncSurface)(VADisplay dpy, VASurfaceID render_target); |
| 119 typedef VAStatus (*VaapiTerminate)(VADisplay dpy); | 126 typedef VAStatus (*VaapiTerminate)(VADisplay dpy); |
| 127 typedef VAStatus (*VaapiUnmapBuffer)(VADisplay dpy, VABufferID buf_id); |
| 120 | 128 |
| 121 #define VAAPI_SYM(name, handle) Vaapi##name VAAPI_##name = NULL | 129 #define VAAPI_SYM(name, handle) Vaapi##name VAAPI_##name = NULL |
| 122 | 130 |
| 123 VAAPI_SYM(BeginPicture, vaapi_handle); | 131 VAAPI_SYM(BeginPicture, vaapi_handle); |
| 124 VAAPI_SYM(CreateBuffer, vaapi_handle); | 132 VAAPI_SYM(CreateBuffer, vaapi_handle); |
| 125 VAAPI_SYM(CreateConfig, vaapi_handle); | 133 VAAPI_SYM(CreateConfig, vaapi_handle); |
| 126 VAAPI_SYM(CreateContext, vaapi_handle); | 134 VAAPI_SYM(CreateContext, vaapi_handle); |
| 127 VAAPI_SYM(CreateSurfaces, vaapi_handle); | 135 VAAPI_SYM(CreateSurfaces, vaapi_handle); |
| 136 VAAPI_SYM(DeriveImage, vaapi_handle); |
| 128 VAAPI_SYM(DestroyBuffer, vaapi_handle); | 137 VAAPI_SYM(DestroyBuffer, vaapi_handle); |
| 129 VAAPI_SYM(DestroyConfig, vaapi_handle); | 138 VAAPI_SYM(DestroyConfig, vaapi_handle); |
| 130 VAAPI_SYM(DestroyContext, vaapi_handle); | 139 VAAPI_SYM(DestroyContext, vaapi_handle); |
| 140 VAAPI_SYM(DestroyImage, vaapi_handle); |
| 131 VAAPI_SYM(DestroySurfaces, vaapi_handle); | 141 VAAPI_SYM(DestroySurfaces, vaapi_handle); |
| 132 VAAPI_SYM(DisplayIsValid, vaapi_handle); | 142 VAAPI_SYM(DisplayIsValid, vaapi_handle); |
| 133 VAAPI_SYM(EndPicture, vaapi_handle); | 143 VAAPI_SYM(EndPicture, vaapi_handle); |
| 134 VAAPI_SYM(ErrorStr, vaapi_handle); | 144 VAAPI_SYM(ErrorStr, vaapi_handle); |
| 135 VAAPI_SYM(GetConfigAttributes, vaapi_handle); | 145 VAAPI_SYM(GetConfigAttributes, vaapi_handle); |
| 136 VAAPI_SYM(GetDisplay, vaapi_x11_handle); | 146 VAAPI_SYM(GetDisplay, vaapi_x11_handle); |
| 137 VAAPI_SYM(Initialize, vaapi_handle); | 147 VAAPI_SYM(Initialize, vaapi_handle); |
| 148 VAAPI_SYM(MapBuffer, vaapi_handle); |
| 138 VAAPI_SYM(PutSurface, vaapi_x11_handle); | 149 VAAPI_SYM(PutSurface, vaapi_x11_handle); |
| 139 VAAPI_SYM(RenderPicture, vaapi_handle); | 150 VAAPI_SYM(RenderPicture, vaapi_handle); |
| 140 VAAPI_SYM(SetDisplayAttributes, vaapi_handle); | 151 VAAPI_SYM(SetDisplayAttributes, vaapi_handle); |
| 141 VAAPI_SYM(SyncSurface, vaapi_x11_handle); | 152 VAAPI_SYM(SyncSurface, vaapi_x11_handle); |
| 142 VAAPI_SYM(Terminate, vaapi_handle); | 153 VAAPI_SYM(Terminate, vaapi_handle); |
| 154 VAAPI_SYM(UnmapBuffer, vaapi_handle); |
| 143 | 155 |
| 144 #undef VAAPI_SYM | 156 #undef VAAPI_SYM |
| 145 | 157 |
| 146 // Maps Profile enum values to VaProfile values. | 158 // Maps Profile enum values to VaProfile values. |
| 147 static bool ProfileToVAProfile(media::VideoCodecProfile profile, | 159 static bool ProfileToVAProfile(media::VideoCodecProfile profile, |
| 148 VAProfile* va_profile) { | 160 VAProfile* va_profile) { |
| 149 switch (profile) { | 161 switch (profile) { |
| 150 case media::H264PROFILE_BASELINE: | 162 case media::H264PROFILE_BASELINE: |
| 151 *va_profile = VAProfileH264Baseline; | 163 *va_profile = VAProfileH264Baseline; |
| 152 break; | 164 break; |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 va_surface_id, | 456 va_surface_id, |
| 445 x_pixmap, | 457 x_pixmap, |
| 446 0, 0, dest_size.width(), dest_size.height(), | 458 0, 0, dest_size.width(), dest_size.height(), |
| 447 0, 0, dest_size.width(), dest_size.height(), | 459 0, 0, dest_size.width(), dest_size.height(), |
| 448 NULL, 0, 0); | 460 NULL, 0, 0); |
| 449 VA_SUCCESS_OR_RETURN(va_res, "Failed putting decode surface to pixmap", | 461 VA_SUCCESS_OR_RETURN(va_res, "Failed putting decode surface to pixmap", |
| 450 false); | 462 false); |
| 451 return true; | 463 return true; |
| 452 } | 464 } |
| 453 | 465 |
| 466 bool VaapiWrapper::GetVaImageForTesting(VASurfaceID va_surface_id, |
| 467 VAImage* image, |
| 468 void** mem) { |
| 469 base::AutoLock auto_lock(va_lock_); |
| 470 |
| 471 VAStatus va_res = VAAPI_SyncSurface(va_display_, va_surface_id); |
| 472 VA_SUCCESS_OR_RETURN(va_res, "Failed syncing surface", false); |
| 473 |
| 474 // Derive a VAImage from the VASurface |
| 475 va_res = VAAPI_DeriveImage(va_display_, va_surface_id, image); |
| 476 VA_LOG_ON_ERROR(va_res, "vaDeriveImage failed"); |
| 477 if (va_res != VA_STATUS_SUCCESS) |
| 478 return false; |
| 479 |
| 480 // Map the VAImage into memory |
| 481 va_res = VAAPI_MapBuffer(va_display_, image->buf, mem); |
| 482 VA_LOG_ON_ERROR(va_res, "vaMapBuffer failed"); |
| 483 if (va_res == VA_STATUS_SUCCESS) |
| 484 return true; |
| 485 |
| 486 VAAPI_DestroyImage(va_display_, image->image_id); |
| 487 return false; |
| 488 } |
| 489 |
| 490 void VaapiWrapper::ReturnVaImageForTesting(VAImage* image) { |
| 491 base::AutoLock auto_lock(va_lock_); |
| 492 |
| 493 VAAPI_UnmapBuffer(va_display_, image->buf); |
| 494 VAAPI_DestroyImage(va_display_, image->image_id); |
| 495 } |
| 496 |
| 454 // static | 497 // static |
| 455 bool VaapiWrapper::PostSandboxInitialization() { | 498 bool VaapiWrapper::PostSandboxInitialization() { |
| 456 vaapi_handle = dlopen("libva.so.1", RTLD_NOW); | 499 vaapi_handle = dlopen("libva.so.1", RTLD_NOW); |
| 457 vaapi_x11_handle = dlopen("libva-x11.so.1", RTLD_NOW); | 500 vaapi_x11_handle = dlopen("libva-x11.so.1", RTLD_NOW); |
| 458 | 501 |
| 459 if (!vaapi_handle || !vaapi_x11_handle) | 502 if (!vaapi_handle || !vaapi_x11_handle) |
| 460 return false; | 503 return false; |
| 461 #define VAAPI_DLSYM_OR_RETURN_ON_ERROR(name, handle) \ | 504 #define VAAPI_DLSYM_OR_RETURN_ON_ERROR(name, handle) \ |
| 462 do { \ | 505 do { \ |
| 463 VAAPI_##name = reinterpret_cast<Vaapi##name>(dlsym((handle), "va"#name)); \ | 506 VAAPI_##name = reinterpret_cast<Vaapi##name>(dlsym((handle), "va"#name)); \ |
| 464 if (VAAPI_##name == NULL) { \ | 507 if (VAAPI_##name == NULL) { \ |
| 465 DVLOG(1) << "Failed to dlsym va"#name; \ | 508 DVLOG(1) << "Failed to dlsym va"#name; \ |
| 466 return false; \ | 509 return false; \ |
| 467 } \ | 510 } \ |
| 468 } while (0) | 511 } while (0) |
| 469 | 512 |
| 470 VAAPI_DLSYM_OR_RETURN_ON_ERROR(BeginPicture, vaapi_handle); | 513 VAAPI_DLSYM_OR_RETURN_ON_ERROR(BeginPicture, vaapi_handle); |
| 471 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateBuffer, vaapi_handle); | 514 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateBuffer, vaapi_handle); |
| 472 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateConfig, vaapi_handle); | 515 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateConfig, vaapi_handle); |
| 473 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateContext, vaapi_handle); | 516 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateContext, vaapi_handle); |
| 474 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateSurfaces, vaapi_handle); | 517 VAAPI_DLSYM_OR_RETURN_ON_ERROR(CreateSurfaces, vaapi_handle); |
| 518 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DeriveImage, vaapi_handle); |
| 475 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyBuffer, vaapi_handle); | 519 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyBuffer, vaapi_handle); |
| 476 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyConfig, vaapi_handle); | 520 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyConfig, vaapi_handle); |
| 477 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyContext, vaapi_handle); | 521 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyContext, vaapi_handle); |
| 522 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroyImage, vaapi_handle); |
| 478 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroySurfaces, vaapi_handle); | 523 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DestroySurfaces, vaapi_handle); |
| 479 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DisplayIsValid, vaapi_handle); | 524 VAAPI_DLSYM_OR_RETURN_ON_ERROR(DisplayIsValid, vaapi_handle); |
| 480 VAAPI_DLSYM_OR_RETURN_ON_ERROR(EndPicture, vaapi_handle); | 525 VAAPI_DLSYM_OR_RETURN_ON_ERROR(EndPicture, vaapi_handle); |
| 481 VAAPI_DLSYM_OR_RETURN_ON_ERROR(ErrorStr, vaapi_handle); | 526 VAAPI_DLSYM_OR_RETURN_ON_ERROR(ErrorStr, vaapi_handle); |
| 482 VAAPI_DLSYM_OR_RETURN_ON_ERROR(GetConfigAttributes, vaapi_handle); | 527 VAAPI_DLSYM_OR_RETURN_ON_ERROR(GetConfigAttributes, vaapi_handle); |
| 483 VAAPI_DLSYM_OR_RETURN_ON_ERROR(GetDisplay, vaapi_x11_handle); | 528 VAAPI_DLSYM_OR_RETURN_ON_ERROR(GetDisplay, vaapi_x11_handle); |
| 484 VAAPI_DLSYM_OR_RETURN_ON_ERROR(Initialize, vaapi_handle); | 529 VAAPI_DLSYM_OR_RETURN_ON_ERROR(Initialize, vaapi_handle); |
| 530 VAAPI_DLSYM_OR_RETURN_ON_ERROR(MapBuffer, vaapi_handle); |
| 485 VAAPI_DLSYM_OR_RETURN_ON_ERROR(PutSurface, vaapi_x11_handle); | 531 VAAPI_DLSYM_OR_RETURN_ON_ERROR(PutSurface, vaapi_x11_handle); |
| 486 VAAPI_DLSYM_OR_RETURN_ON_ERROR(RenderPicture, vaapi_handle); | 532 VAAPI_DLSYM_OR_RETURN_ON_ERROR(RenderPicture, vaapi_handle); |
| 487 VAAPI_DLSYM_OR_RETURN_ON_ERROR(SetDisplayAttributes, vaapi_handle); | 533 VAAPI_DLSYM_OR_RETURN_ON_ERROR(SetDisplayAttributes, vaapi_handle); |
| 488 VAAPI_DLSYM_OR_RETURN_ON_ERROR(SyncSurface, vaapi_handle); | 534 VAAPI_DLSYM_OR_RETURN_ON_ERROR(SyncSurface, vaapi_handle); |
| 489 VAAPI_DLSYM_OR_RETURN_ON_ERROR(Terminate, vaapi_handle); | 535 VAAPI_DLSYM_OR_RETURN_ON_ERROR(Terminate, vaapi_handle); |
| 536 VAAPI_DLSYM_OR_RETURN_ON_ERROR(UnmapBuffer, vaapi_handle); |
| 490 #undef VAAPI_DLSYM | 537 #undef VAAPI_DLSYM |
| 491 | 538 |
| 492 return true; | 539 return true; |
| 493 } | 540 } |
| 494 | 541 |
| 495 } // namespace content | 542 } // namespace content |
| OLD | NEW |