/** * Destroy a VdpVideoMixer. */ VdpStatus vlVdpVideoMixerDestroy(VdpVideoMixer mixer) { vlVdpVideoMixer *vmixer; vmixer = vlGetDataHTAB(mixer); if (!vmixer) return VDP_STATUS_INVALID_HANDLE; pipe_mutex_lock(vmixer->device->mutex); vlVdpResolveDelayedRendering(vmixer->device, NULL, NULL); vlRemoveDataHTAB(mixer); vl_compositor_cleanup_state(&vmixer->cstate); if (vmixer->noise_reduction.filter) { vl_median_filter_cleanup(vmixer->noise_reduction.filter); FREE(vmixer->noise_reduction.filter); } if (vmixer->sharpness.filter) { vl_matrix_filter_cleanup(vmixer->sharpness.filter); FREE(vmixer->sharpness.filter); } pipe_mutex_unlock(vmixer->device->mutex); FREE(vmixer); return VDP_STATUS_OK; }
static void vlVdpVideoMixerUpdateSharpnessFilter(vlVdpVideoMixer *vmixer) { assert(vmixer); /* if present remove the old filter first */ if (vmixer->sharpness.filter) { vl_matrix_filter_cleanup(vmixer->sharpness.filter); FREE(vmixer->sharpness.filter); vmixer->sharpness.filter = NULL; } /* and create a new filter as needed */ if (vmixer->sharpness.enabled && vmixer->sharpness.value != 0.0f) { float matrix[9]; unsigned i; if (vmixer->sharpness.value > 0.0f) { matrix[0] = -1.0f; matrix[1] = -1.0f; matrix[2] = -1.0f; matrix[3] = -1.0f; matrix[4] = 8.0f; matrix[5] = -1.0f; matrix[6] = -1.0f; matrix[7] = -1.0f; matrix[8] = -1.0f; for (i = 0; i < 9; ++i) matrix[i] *= vmixer->sharpness.value; matrix[4] += 1.0f; } else { matrix[0] = 1.0f; matrix[1] = 2.0f; matrix[2] = 1.0f; matrix[3] = 2.0f; matrix[4] = 4.0f; matrix[5] = 2.0f; matrix[6] = 1.0f; matrix[7] = 2.0f; matrix[8] = 1.0f; for (i = 0; i < 9; ++i) matrix[i] *= fabsf(vmixer->sharpness.value) / 16.0f; matrix[4] += 1.0f - fabsf(vmixer->sharpness.value); } vmixer->sharpness.filter = MALLOC(sizeof(struct vl_matrix_filter)); vl_matrix_filter_init(vmixer->sharpness.filter, vmixer->device->context, vmixer->video_width, vmixer->video_height, 3, 3, matrix); } }