bool VaapiSurfaceGLXImpl::update(boost::shared_ptr<VaapiSurface> surface) { GNASH_REPORT_FUNCTION; if (!this->surface()) { return false; } VaapiGlobalContext * gvactx = VaapiGlobalContext::get(); if (!gvactx) { return false; } VAStatus status; status = vaSyncSurface(gvactx->display(), surface->get()); if (!vaapi_check_status(status, "vaSyncSurface()")) return false; status = vaCopySurfaceGLX(gvactx->display(), this->surface(), surface->get(), VA_FRAME_PICTURE); if (!vaapi_check_status(status, "vaCopySurfaceGLX()")) { return false; } return true; }
bool VaApiMixer::upload(const VideoFrame &frame, bool deint) { if (!m_glSurface) return false; static const int specs[MP_CSP_COUNT] = { 0, //MP_CSP_AUTO, VA_SRC_BT601, //MP_CSP_BT_601, VA_SRC_BT709, //MP_CSP_BT_709, VA_SRC_SMPTE_240, //MP_CSP_SMPTE_240M, 0, //MP_CSP_RGB, 0, //MP_CSP_XYZ, 0, //MP_CSP_YCGCO, }; static const int field[] = { // Picture = 0, Top = 1, Bottom = 2 VA_FRAME_PICTURE, VA_TOP_FIELD, VA_BOTTOM_FIELD, VA_FRAME_PICTURE }; const auto id = (VASurfaceID)(quintptr)frame.data(3); int flags = specs[frame.format().colorspace()]; if (deint) flags |= field[frame.field() & VideoFrame::Interlaced]; if (!check(vaCopySurfaceGLX(VaApi::glx(), m_glSurface, id, flags), "Cannot copy OpenGL surface.")) return false; if (!check(vaSyncSurface(VaApi::glx(), id), "Cannot sync video surface.")) return false; return true; }
static int load_image(struct gl_hwdec *hw, struct mp_image *hw_image, GLuint *out_textures) { struct priv *p = hw->priv; VAStatus status; if (!p->vaglx_surface) return -1; status = vaCopySurfaceGLX(p->display, p->vaglx_surface, va_surface_id_in_mp_image(hw_image), va_get_colorspace_flag(hw_image->colorspace)); if (!check_va_status(status, "vaCopySurfaceGLX()")) return -1; out_textures[0] = p->gl_texture; return 0; }
static int map_image(struct gl_hwdec *hw, struct mp_image *hw_image, GLuint *out_textures) { struct priv *p = hw->priv; VAStatus status; if (!p->vaglx_surface) return -1; va_lock(p->ctx); status = vaCopySurfaceGLX(p->display, p->vaglx_surface, va_surface_id(hw_image), va_get_colorspace_flag(hw_image->params.colorspace)); va_unlock(p->ctx); if (!CHECK_VA_STATUS(p, "vaCopySurfaceGLX()")) return -1; out_textures[0] = p->gl_texture; return 0; }
bool VAAPIContext::CopySurfaceToTexture(const void* buf, uint texture, uint texture_type, FrameScanType scan) { if (!buf || (m_dispType != kVADisplayGLX)) return false; const vaapi_surface *surf = (vaapi_surface*)buf; void* glx_surface = GetGLXSurface(texture, texture_type); if (!glx_surface) return false; int field = VA_FRAME_PICTURE; if (scan == kScan_Interlaced) field = VA_TOP_FIELD; else if (scan == kScan_Intr2ndField) field = VA_BOTTOM_FIELD; m_display->m_x_disp->Lock(); INIT_ST; va_status = vaCopySurfaceGLX(m_ctx.display, glx_surface, surf->m_id, field); CHECK_ST; m_display->m_x_disp->Unlock(); return true; }