DisplayPtr DisplayCache::createDisplay(const NativeDisplay& nativeDisplay) { NativeDisplayPtr nativeDisplayObj; VADisplay vaDisplay = NULL; DisplayPtr vaapiDisplay; YamiMediaCodec::AutoLock locker(m_lock); m_cache.remove_if(expired); //lockup first list<weak_ptr<VaapiDisplay> >::iterator it; for (it = m_cache.begin(); it != m_cache.end(); ++it) { vaapiDisplay = (*it).lock(); if (vaapiDisplay->isCompatible(nativeDisplay)) { return vaapiDisplay; } } vaapiDisplay.reset(); //crate new one DEBUG("nativeDisplay: (type : %d), (handle : 0x%x)", nativeDisplay.type, nativeDisplay.handle); switch (nativeDisplay.type) { case NATIVE_DISPLAY_AUTO: #if __ENABLE_X11__ case NATIVE_DISPLAY_X11: nativeDisplayObj.reset (new NativeDisplayX11()); if (nativeDisplayObj && nativeDisplayObj->initialize(nativeDisplay)) vaDisplay = vaGetDisplay((Display*)(nativeDisplayObj->nativeHandle())); if (vaDisplay) INFO("use vaapi x11 backend"); if(vaDisplay || nativeDisplay.type == NATIVE_DISPLAY_X11) break; INFO("try to init va with x11 display (%p) but failed", (Display*)(nativeDisplayObj->nativeHandle())); // NATIVE_DISPLAY_AUTO continue, no break #endif case NATIVE_DISPLAY_DRM: nativeDisplayObj.reset (new NativeDisplayDrm()); if (nativeDisplayObj && nativeDisplayObj->initialize(nativeDisplay)) vaDisplay = vaGetDisplayDRM(nativeDisplayObj->nativeHandle()); INFO("use vaapi drm backend"); break; default: break; } if (vaDisplay == NULL) { ERROR("vaGetDisplay failed."); return vaapiDisplay; } if (vaInit(vaDisplay)) vaapiDisplay.reset(new VaapiDisplay(nativeDisplayObj, vaDisplay)); if (vaapiDisplay) { weak_ptr<VaapiDisplay> weak(vaapiDisplay); m_cache.push_back(weak); } return vaapiDisplay; }
bool isCompatible(const DisplayPtr display, const NativeDisplay& native) { return display->isCompatible(native); }