Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: content/common/gpu/media/vaapi_h264_decoder.cc

Issue 10827173: Only dlopen() OMX/VAAPI libs in the GPU process, and only lazily dlsym() their symbols. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add include_dirs for new gpu_main.cc deps. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <dlfcn.h> 5 #include <dlfcn.h>
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 15 matching lines...) Expand all
26 do { \ 26 do { \
27 if ((va_res) != VA_STATUS_SUCCESS) { \ 27 if ((va_res) != VA_STATUS_SUCCESS) { \
28 DVLOG(1) << err_msg \ 28 DVLOG(1) << err_msg \
29 << " VA error: " << VAAPI_ErrorStr(va_res); \ 29 << " VA error: " << VAAPI_ErrorStr(va_res); \
30 return (ret); \ 30 return (ret); \
31 } \ 31 } \
32 } while (0) 32 } while (0)
33 33
34 namespace content { 34 namespace content {
35 35
36 void *vaapi_handle = dlopen("libva.so", RTLD_NOW); 36 void *vaapi_handle = NULL;
37 void *vaapi_x11_handle = dlopen("libva-x11.so", RTLD_NOW); 37 void *vaapi_x11_handle = NULL;
38 38
39 typedef VADisplay (*VaapiGetDisplay)(Display *dpy); 39 typedef VADisplay (*VaapiGetDisplay)(Display *dpy);
40 typedef int (*VaapiDisplayIsValid)(VADisplay dpy); 40 typedef int (*VaapiDisplayIsValid)(VADisplay dpy);
41 typedef VAStatus (*VaapiInitialize)(VADisplay dpy, 41 typedef VAStatus (*VaapiInitialize)(VADisplay dpy,
42 int *major_version, 42 int *major_version,
43 int *minor_version); 43 int *minor_version);
44 typedef VAStatus (*VaapiTerminate)(VADisplay dpy); 44 typedef VAStatus (*VaapiTerminate)(VADisplay dpy);
45 typedef VAStatus (*VaapiGetConfigAttributes)(VADisplay dpy, 45 typedef VAStatus (*VaapiGetConfigAttributes)(VADisplay dpy,
46 VAProfile profile, 46 VAProfile profile,
47 VAEntrypoint entrypoint, 47 VAEntrypoint entrypoint,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 typedef VAStatus (*VaapiCreateBuffer)(VADisplay dpy, 98 typedef VAStatus (*VaapiCreateBuffer)(VADisplay dpy,
99 VAContextID context, 99 VAContextID context,
100 VABufferType type, 100 VABufferType type,
101 unsigned int size, 101 unsigned int size,
102 unsigned int num_elements, 102 unsigned int num_elements,
103 void *data, 103 void *data,
104 VABufferID *buf_id); 104 VABufferID *buf_id);
105 typedef VAStatus (*VaapiDestroyBuffer)(VADisplay dpy, VABufferID buffer_id); 105 typedef VAStatus (*VaapiDestroyBuffer)(VADisplay dpy, VABufferID buffer_id);
106 typedef const char* (*VaapiErrorStr)(VAStatus error_status); 106 typedef const char* (*VaapiErrorStr)(VAStatus error_status);
107 107
108 #define VAAPI_DLSYM(name, handle) \ 108 #define VAAPI_SYM(name, handle) Vaapi##name VAAPI_##name = NULL
109 Vaapi##name VAAPI_##name = \
110 reinterpret_cast<Vaapi##name>(dlsym((handle), "va"#name))
111 109
112 VAAPI_DLSYM(GetDisplay, vaapi_x11_handle); 110 VAAPI_SYM(GetDisplay, vaapi_x11_handle);
113 VAAPI_DLSYM(DisplayIsValid, vaapi_handle); 111 VAAPI_SYM(DisplayIsValid, vaapi_handle);
114 VAAPI_DLSYM(Initialize, vaapi_handle); 112 VAAPI_SYM(Initialize, vaapi_handle);
115 VAAPI_DLSYM(Terminate, vaapi_handle); 113 VAAPI_SYM(Terminate, vaapi_handle);
116 VAAPI_DLSYM(GetConfigAttributes, vaapi_handle); 114 VAAPI_SYM(GetConfigAttributes, vaapi_handle);
117 VAAPI_DLSYM(CreateConfig, vaapi_handle); 115 VAAPI_SYM(CreateConfig, vaapi_handle);
118 VAAPI_DLSYM(DestroyConfig, vaapi_handle); 116 VAAPI_SYM(DestroyConfig, vaapi_handle);
119 VAAPI_DLSYM(CreateSurfaces, vaapi_handle); 117 VAAPI_SYM(CreateSurfaces, vaapi_handle);
120 VAAPI_DLSYM(DestroySurfaces, vaapi_handle); 118 VAAPI_SYM(DestroySurfaces, vaapi_handle);
121 VAAPI_DLSYM(CreateContext, vaapi_handle); 119 VAAPI_SYM(CreateContext, vaapi_handle);
122 VAAPI_DLSYM(DestroyContext, vaapi_handle); 120 VAAPI_SYM(DestroyContext, vaapi_handle);
123 VAAPI_DLSYM(PutSurface, vaapi_x11_handle); 121 VAAPI_SYM(PutSurface, vaapi_x11_handle);
124 VAAPI_DLSYM(SyncSurface, vaapi_x11_handle); 122 VAAPI_SYM(SyncSurface, vaapi_x11_handle);
125 VAAPI_DLSYM(BeginPicture, vaapi_handle); 123 VAAPI_SYM(BeginPicture, vaapi_handle);
126 VAAPI_DLSYM(RenderPicture, vaapi_handle); 124 VAAPI_SYM(RenderPicture, vaapi_handle);
127 VAAPI_DLSYM(EndPicture, vaapi_handle); 125 VAAPI_SYM(EndPicture, vaapi_handle);
128 VAAPI_DLSYM(CreateBuffer, vaapi_handle); 126 VAAPI_SYM(CreateBuffer, vaapi_handle);
129 VAAPI_DLSYM(DestroyBuffer, vaapi_handle); 127 VAAPI_SYM(DestroyBuffer, vaapi_handle);
130 VAAPI_DLSYM(ErrorStr, vaapi_handle); 128 VAAPI_SYM(ErrorStr, vaapi_handle);
131 129
132 static bool AreVaapiFunctionPointersInitialized() { 130 // static
133 return VAAPI_GetDisplay && 131 bool VaapiH264Decoder::pre_sandbox_init_done_ = false;
134 VAAPI_DisplayIsValid &&
135 VAAPI_Initialize &&
136 VAAPI_Terminate &&
137 VAAPI_GetConfigAttributes &&
138 VAAPI_CreateConfig &&
139 VAAPI_DestroyConfig &&
140 VAAPI_CreateSurfaces &&
141 VAAPI_DestroySurfaces &&
142 VAAPI_CreateContext &&
143 VAAPI_DestroyContext &&
144 VAAPI_PutSurface &&
145 VAAPI_SyncSurface &&
146 VAAPI_BeginPicture &&
147 VAAPI_RenderPicture &&
148 VAAPI_EndPicture &&
149 VAAPI_CreateBuffer &&
150 VAAPI_DestroyBuffer &&
151 VAAPI_ErrorStr;
152 }
153 132
154 class VaapiH264Decoder::DecodeSurface { 133 class VaapiH264Decoder::DecodeSurface {
155 public: 134 public:
156 DecodeSurface(const GLXFBConfig& fb_config, 135 DecodeSurface(const GLXFBConfig& fb_config,
157 Display* x_display, 136 Display* x_display,
158 VADisplay va_display, 137 VADisplay va_display,
159 const base::Callback<bool(void)>& make_context_current, 138 const base::Callback<bool(void)>& make_context_current,
160 VASurfaceID va_surface_id, 139 VASurfaceID va_surface_id,
161 int32 picture_buffer_id, 140 int32 picture_buffer_id,
162 uint32 texture_id, 141 uint32 texture_id,
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 make_context_current_ = make_context_current; 468 make_context_current_ = make_context_current;
490 469
491 if (!make_context_current_.Run()) 470 if (!make_context_current_.Run())
492 return false; 471 return false;
493 472
494 if (!SetProfile(profile)) { 473 if (!SetProfile(profile)) {
495 DVLOG(1) << "Unsupported profile"; 474 DVLOG(1) << "Unsupported profile";
496 return false; 475 return false;
497 } 476 }
498 477
499 if (!AreVaapiFunctionPointersInitialized()) {
500 DVLOG(1) << "Could not load libva";
501 return false;
502 }
503
504 if (!InitializeFBConfig()) { 478 if (!InitializeFBConfig()) {
505 DVLOG(1) << "Could not get a usable FBConfig"; 479 DVLOG(1) << "Could not get a usable FBConfig";
506 return false; 480 return false;
507 } 481 }
508 482
509 va_display_ = VAAPI_GetDisplay(x_display_); 483 va_display_ = VAAPI_GetDisplay(x_display_);
510 if (!VAAPI_DisplayIsValid(va_display_)) { 484 if (!VAAPI_DisplayIsValid(va_display_)) {
511 DVLOG(1) << "Could not get a valid VA display"; 485 DVLOG(1) << "Could not get a valid VA display";
512 return false; 486 return false;
513 } 487 }
(...skipping 1577 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 return kDecodedFrame; 2065 return kDecodedFrame;
2092 } 2066 }
2093 } 2067 }
2094 } 2068 }
2095 2069
2096 // static 2070 // static
2097 size_t VaapiH264Decoder::GetRequiredNumOfPictures() { 2071 size_t VaapiH264Decoder::GetRequiredNumOfPictures() {
2098 return kNumReqPictures; 2072 return kNumReqPictures;
2099 } 2073 }
2100 2074
2075 // static
2076 void VaapiH264Decoder::PreSandboxInitialization() {
2077 DCHECK(!pre_sandbox_init_done_);
2078 vaapi_handle = dlopen("libva.so", RTLD_NOW);
2079 vaapi_x11_handle = dlopen("libva-x11.so", RTLD_NOW);
2080 pre_sandbox_init_done_ = vaapi_handle && vaapi_x11_handle;
2081 }
2082
2083 // static
2084 bool VaapiH264Decoder::PostSandboxInitialization() {
2085 if (!pre_sandbox_init_done_)
2086 return false;
2087 #define VAAPI_DLSYM(name, handle) \
2088 VAAPI_##name = reinterpret_cast<Vaapi##name>(dlsym((handle), "va"#name)) \
2089
2090 VAAPI_DLSYM(GetDisplay, vaapi_x11_handle);
2091 VAAPI_DLSYM(DisplayIsValid, vaapi_handle);
2092 VAAPI_DLSYM(Initialize, vaapi_handle);
2093 VAAPI_DLSYM(Terminate, vaapi_handle);
2094 VAAPI_DLSYM(GetConfigAttributes, vaapi_handle);
2095 VAAPI_DLSYM(CreateConfig, vaapi_handle);
2096 VAAPI_DLSYM(DestroyConfig, vaapi_handle);
2097 VAAPI_DLSYM(CreateSurfaces, vaapi_handle);
2098 VAAPI_DLSYM(DestroySurfaces, vaapi_handle);
2099 VAAPI_DLSYM(CreateContext, vaapi_handle);
2100 VAAPI_DLSYM(DestroyContext, vaapi_handle);
2101 VAAPI_DLSYM(PutSurface, vaapi_x11_handle);
2102 VAAPI_DLSYM(SyncSurface, vaapi_x11_handle);
2103 VAAPI_DLSYM(BeginPicture, vaapi_handle);
2104 VAAPI_DLSYM(RenderPicture, vaapi_handle);
2105 VAAPI_DLSYM(EndPicture, vaapi_handle);
2106 VAAPI_DLSYM(CreateBuffer, vaapi_handle);
2107 VAAPI_DLSYM(DestroyBuffer, vaapi_handle);
2108 VAAPI_DLSYM(ErrorStr, vaapi_handle);
2109 #undef VAAPI_DLSYM
2110
2111 return VAAPI_GetDisplay &&
2112 VAAPI_DisplayIsValid &&
2113 VAAPI_Initialize &&
2114 VAAPI_Terminate &&
2115 VAAPI_GetConfigAttributes &&
2116 VAAPI_CreateConfig &&
2117 VAAPI_DestroyConfig &&
2118 VAAPI_CreateSurfaces &&
2119 VAAPI_DestroySurfaces &&
2120 VAAPI_CreateContext &&
2121 VAAPI_DestroyContext &&
2122 VAAPI_PutSurface &&
2123 VAAPI_SyncSurface &&
2124 VAAPI_BeginPicture &&
2125 VAAPI_RenderPicture &&
2126 VAAPI_EndPicture &&
2127 VAAPI_CreateBuffer &&
2128 VAAPI_DestroyBuffer &&
2129 VAAPI_ErrorStr;
2130 }
2131
2101 } // namespace content 2132 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/media/vaapi_h264_decoder.h ('k') | content/common/gpu/media/vaapi_video_decode_accelerator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698