void CVDPAU::FiniVDPAUOutput() { FiniOutputMethod(); if (vdp_device == VDP_INVALID_HANDLE || !vdpauConfigured) return; CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); VdpStatus vdp_st; vdp_st = vdp_decoder_destroy(decoder); if (CheckStatus(vdp_st, __LINE__)) return; decoder = VDP_INVALID_HANDLE; while (!m_videoSurfaces.empty()) { vdpau_render_state *render = m_videoSurfaces.back(); m_videoSurfaces.pop_back(); if (render->bitstream_buffers_allocated) m_dllAvUtil.av_freep(&render->bitstream_buffers); render->bitstream_buffers_allocated = 0; vdp_st = vdp_video_surface_destroy(render->surface); render->surface = VDP_INVALID_HANDLE; free(render); if (CheckStatus(vdp_st, __LINE__)) return; } }
VDPAUDecoder::~VDPAUDecoder() { if (m_VDPMixer != VDP_INVALID_HANDLE) { vdp_video_mixer_destroy(m_VDPMixer); } if (m_VDPDecoder != VDP_INVALID_HANDLE) { vdp_decoder_destroy(m_VDPDecoder); } for (unsigned i = 0; i < m_RenderStates.size(); i++) { vdp_video_surface_destroy(m_RenderStates[i]->surface); delete m_RenderStates[i]; } }
void CVDPAU::FiniVDPAUOutput() { if (vdp_device == VDP_INVALID_HANDLE || !vdpauConfigured) return; CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); VdpStatus vdp_st; vdp_st = vdp_decoder_destroy(decoder); CheckStatus(vdp_st, __LINE__); decoder = VDP_INVALID_HANDLE; vdp_st = vdp_presentation_queue_destroy(vdp_flip_queue); CheckStatus(vdp_st, __LINE__); vdp_flip_queue = VDP_INVALID_HANDLE; vdp_st = vdp_presentation_queue_target_destroy(vdp_flip_target); CheckStatus(vdp_st, __LINE__); vdp_flip_target = VDP_INVALID_HANDLE; outputSurface = presentSurface = VDP_INVALID_HANDLE; for (int i = 0; i < totalAvailableOutputSurfaces; i++) { vdp_st = vdp_output_surface_destroy(outputSurfaces[i]); CheckStatus(vdp_st, __LINE__); outputSurfaces[i] = VDP_INVALID_HANDLE; } vdp_st = vdp_video_mixer_destroy(videoMixer); CheckStatus(vdp_st, __LINE__); videoMixer = VDP_INVALID_HANDLE; for(unsigned int i = 0; i < m_videoSurfaces.size(); i++) { vdp_st = vdp_video_surface_destroy(m_videoSurfaces[i]->surface); CheckStatus(vdp_st, __LINE__); m_videoSurfaces[i]->surface = VDP_INVALID_HANDLE; free(m_videoSurfaces[i]); } m_videoSurfaces.clear(); while (!m_DVDVideoPics.empty()) m_DVDVideoPics.pop(); }
static vlc_vdp_video_field_t *CreateSurface(vlc_va_t *va) { vlc_va_sys_t *sys = va->sys; VdpVideoSurface surface; VdpStatus err; err = vdp_video_surface_create(sys->vdp, sys->device, sys->type, sys->width, sys->height, &surface); if (err != VDP_STATUS_OK) { msg_Err(va, "%s creation failure: %s", "video surface", vdp_get_error_string(sys->vdp, err)); return NULL; } vlc_vdp_video_field_t *field = vlc_vdp_video_create(sys->vdp, surface); if (unlikely(field == NULL)) vdp_video_surface_destroy(sys->vdp, surface); return field; }