/* FIXME it is nearly common with VAAPI */ bool VideoDecoderDXVAPrivate::getBuffer(void **opaque, uint8_t **data)//vlc_va_t *external, AVFrame *ff) { // check pix fmt DXVA2_VLD and h264 profile? HRESULT hr = devmng->TestDevice(device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { if (!DxResetVideoDecoder()) return false; } else if (FAILED(hr)) { qWarning() << "IDirect3DDeviceManager9.TestDevice (" << hr << "): " << qt_error_string(hr); return false; } /* Grab an unused surface, in case none are, try the oldest * XXX using the oldest is a workaround in case a problem happens with libavcodec */ unsigned i, old; for (i = 0, old = 0; i < surface_count; i++) { va_surface_t *surface = &surfaces[i]; if (!surface->refcount) break; if (surface->order < surfaces[old].order) old = i; } if (i >= surface_count) i = old; va_surface_t *surface = &surfaces[i]; surface->refcount = 1; surface->order = surface_order++; *data = (uint8_t*)surface->d3d;/* Yummie */ *opaque = surface; return true; }
static int CheckDevice(vlc_va_t *va) { vlc_va_sys_t *sys = va->sys; /* Check the device */ HRESULT hr = IDirect3DDeviceManager9_TestDevice(sys->devmng, sys->device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { if (DxResetVideoDecoder(va)) return VLC_EGENERIC; } else if (FAILED(hr)) { msg_Err(va, "IDirect3DDeviceManager9_TestDevice %u", (unsigned)hr); return VLC_EGENERIC; } return VLC_SUCCESS; }
static int CheckDevice(vlc_va_t *va) { VLC_UNUSED(va); #ifdef TODO /* Check the device */ /* see MFCreateDXGIDeviceManager in mfplat.dll, not avail in Win7 */ HRESULT hr = IDirect3DDeviceManager9_TestDevice(sys->devmng, sys->device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { if (DxResetVideoDecoder(va)) return VLC_EGENERIC; } else if (FAILED(hr)) { msg_Err(va, "IDirect3DDeviceManager9_TestDevice %u", (unsigned)hr); return VLC_EGENERIC; } #endif return VLC_SUCCESS; }
/* FIXME it is nearly common with VAAPI */ static int Get(vlc_va_t *external, AVFrame *ff) { vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external); /* Check the device */ HRESULT hr = IDirect3DDeviceManager9_TestDevice(va->devmng, va->device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { if (DxResetVideoDecoder(va)) return VLC_EGENERIC; } else if (FAILED(hr)) { msg_Err(va->log, "IDirect3DDeviceManager9_TestDevice %u", (unsigned)hr); return VLC_EGENERIC; } /* Grab an unused surface, in case none are, try the oldest * XXX using the oldest is a workaround in case a problem happens with libavcodec */ unsigned i, old; for (i = 0, old = 0; i < va->surface_count; i++) { vlc_va_surface_t *surface = &va->surface[i]; if (!surface->refcount) break; if (surface->order < va->surface[old].order) old = i; } if (i >= va->surface_count) i = old; vlc_va_surface_t *surface = &va->surface[i]; surface->refcount = 1; surface->order = va->surface_order++; /* */ for (int i = 0; i < 4; i++) { ff->data[i] = NULL; ff->linesize[i] = 0; if (i == 0 || i == 3) ff->data[i] = (void*)surface->d3d;/* Yummie */ } return VLC_SUCCESS; }
static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) { vlc_va_sys_t *sys = va->sys; /* Check the device */ HRESULT hr = IDirect3DDeviceManager9_TestDevice(sys->devmng, sys->device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { msg_Warn(va, "New video device detected."); if (DxResetVideoDecoder(va)) return VLC_EGENERIC; } else if (FAILED(hr)) { msg_Err(va, "IDirect3DDeviceManager9_TestDevice %u", (unsigned)hr); return VLC_EGENERIC; } int res = va_pool_Get(&sys->dx_sys.va_pool, pic); if (likely(res==VLC_SUCCESS)) *data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface; return res; }
/* FIXME it is nearly common with VAAPI */ static int Get(vlc_va_t *va, void **opaque, uint8_t **data) { vlc_va_sys_t *sys = va->sys; /* Check the device */ HRESULT hr = IDirect3DDeviceManager9_TestDevice(sys->devmng, sys->device); if (hr == DXVA2_E_NEW_VIDEO_DEVICE) { if (DxResetVideoDecoder(va)) return VLC_EGENERIC; } else if (FAILED(hr)) { msg_Err(va, "IDirect3DDeviceManager9_TestDevice %u", (unsigned)hr); return VLC_EGENERIC; } /* Grab an unused surface, in case none are, try the oldest * XXX using the oldest is a workaround in case a problem happens with libavcodec */ unsigned i, old; for (i = 0, old = 0; i < sys->surface_count; i++) { vlc_va_surface_t *surface = &sys->surface[i]; if (!surface->refcount) break; if (surface->order < sys->surface[old].order) old = i; } if (i >= sys->surface_count) i = old; vlc_va_surface_t *surface = &sys->surface[i]; surface->refcount = 1; surface->order = sys->surface_order++; *data = (void *)surface->d3d; *opaque = surface; return VLC_SUCCESS; }