static struct pipe_video_buffer * vlVaApplyDeint(vlVaDriver *drv, vlVaContext *context, VAProcPipelineParameterBuffer *param, struct pipe_video_buffer *current, unsigned field) { vlVaSurface *prevprev, *prev, *next; if (param->num_forward_references < 1 || param->num_backward_references < 2) return current; prevprev = handle_table_get(drv->htab, param->backward_references[1]); prev = handle_table_get(drv->htab, param->backward_references[0]); next = handle_table_get(drv->htab, param->forward_references[0]); if (!prevprev || !prev || !next) return current; if (context->deint && (context->deint->video_width != current->width || context->deint->video_height != current->height)) { vl_deint_filter_cleanup(context->deint); FREE(context->deint); context->deint = NULL; } if (!context->deint) { context->deint = MALLOC(sizeof(struct vl_deint_filter)); if (!vl_deint_filter_init(context->deint, drv->pipe, current->width, current->height, false, false)) { FREE(context->deint); context->deint = NULL; return current; } } if (!vl_deint_filter_check_buffers(context->deint, prevprev->buffer, prev->buffer, current, next->buffer)) return current; vl_deint_filter_render(context->deint, prevprev->buffer, prev->buffer, current, next->buffer, field); return context->deint->video_buffer; }
VAStatus vlVaDestroyContext(VADriverContextP ctx, VAContextID context_id) { vlVaDriver *drv; vlVaContext *context; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; drv = VL_VA_DRIVER(ctx); pipe_mutex_lock(drv->mutex); context = handle_table_get(drv->htab, context_id); if (!context) { pipe_mutex_unlock(drv->mutex); return VA_STATUS_ERROR_INVALID_CONTEXT; } if (context->decoder) { if (context->desc.base.entry_point != PIPE_VIDEO_ENTRYPOINT_ENCODE) { if (u_reduce_video_profile(context->decoder->profile) == PIPE_VIDEO_FORMAT_MPEG4_AVC) { FREE(context->desc.h264.pps->sps); FREE(context->desc.h264.pps); } if (u_reduce_video_profile(context->decoder->profile) == PIPE_VIDEO_FORMAT_HEVC) { FREE(context->desc.h265.pps->sps); FREE(context->desc.h265.pps); } } context->decoder->destroy(context->decoder); } if (context->deint) { vl_deint_filter_cleanup(context->deint); FREE(context->deint); } FREE(context); handle_table_remove(drv->htab, context_id); pipe_mutex_unlock(drv->mutex); return VA_STATUS_SUCCESS; }
/** * 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->deint.filter) { vl_deint_filter_cleanup(vmixer->deint.filter); FREE(vmixer->deint.filter); } 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); DeviceReference(&vmixer->device, NULL); FREE(vmixer); return VDP_STATUS_OK; }
static void vlVdpVideoMixerUpdateDeinterlaceFilter(vlVdpVideoMixer *vmixer) { struct pipe_context *pipe = vmixer->device->context; assert(vmixer); /* remove existing filter */ if (vmixer->deint.filter) { vl_deint_filter_cleanup(vmixer->deint.filter); FREE(vmixer->deint.filter); vmixer->deint.filter = NULL; } /* create a new filter if requested */ if (vmixer->deint.enabled && vmixer->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) { vmixer->deint.filter = MALLOC(sizeof(struct vl_deint_filter)); vmixer->deint.enabled = vl_deint_filter_init(vmixer->deint.filter, pipe, vmixer->video_width, vmixer->video_height, vmixer->skip_chroma_deint, vmixer->deint.spatial); if (!vmixer->deint.enabled) { FREE(vmixer->deint.filter); } } }