static void destroy_heap( const char *name, object_heap_p heap, destroy_heap_func_t destroy_func, void *user_data ) { object_base_p obj; object_heap_iterator iter; if (!heap) return; obj = object_heap_first(heap, &iter); while (obj) { xvba_information_message("vaTerminate(): %s ID 0x%08x is still allocated, destroying\n", name, obj->id); if (destroy_func) destroy_func(obj, user_data); else object_heap_free(heap, obj); obj = object_heap_next(heap, &iter); } object_heap_destroy(heap); }
VOID media_destroy_buffer (struct object_heap *heap, struct object_base *obj) { struct object_buffer *obj_buffer = (struct object_buffer *) obj; MEDIA_DRV_ASSERT (obj_buffer->buffer_store); media_release_buffer_store (&obj_buffer->buffer_store); object_heap_free (heap, obj); }
// Destroy VA buffer object void destroy_va_buffer( vdpau_driver_data_t *driver_data, object_buffer_p obj_buffer ) { if (!obj_buffer) return; if (obj_buffer->buffer_data) { free(obj_buffer->buffer_data); obj_buffer->buffer_data = NULL; } object_heap_free(&driver_data->buffer_heap, (object_base_p)obj_buffer); }
VOID media_destroy_surface (struct object_heap * heap, struct object_base * obj) { struct object_surface *obj_surface = (struct object_surface *) obj; dri_bo_unreference (obj_surface->bo); obj_surface->bo = NULL; if (obj_surface->free_private_data != NULL) { obj_surface->free_private_data (&obj_surface->private_data); if(obj_surface->private_data!=NULL) { media_drv_free_memory(obj_surface->private_data); } obj_surface->private_data = NULL; } object_heap_free (heap, obj); }
VAStatus rockchip_DestroyImage( VADriverContextP ctx, VAImageID image_id ) { INIT_DRIVER_DATA object_image_p obj_image = IMAGE(image_id); if (!obj_image) return VA_STATUS_ERROR_INVALID_IMAGE; ASSERT(obj_image->ref_cnt); --obj_image->ref_cnt; if (obj_image->ref_cnt) return VA_STATUS_SUCCESS; VABufferID buf = obj_image->image.buf; object_heap_free(&driver_data->image_heap, (object_base_p)obj_image); return rockchip_DestroyBuffer(ctx, buf); }
void media_destroy_subpic(struct object_heap *heap, struct object_base *obj) { object_heap_free(heap, obj); }
VOID media_destroy_config (struct object_heap *heap, struct object_base *obj) { object_heap_free (heap, obj); }
VOID media_destroy_context (struct object_heap *heap, struct object_base *obj) { struct object_context *obj_context = (struct object_context *) obj; INT i; if (obj_context->hw_context) { obj_context->hw_context->destroy (obj_context->hw_context); obj_context->hw_context = NULL; } if (obj_context->codec_type == CODEC_ENC) { MEDIA_DRV_ASSERT (obj_context->codec_state.encode.num_slice_params <= obj_context->codec_state.encode.max_slice_params); media_release_buffer_store (&obj_context->codec_state.encode.pic_param); media_release_buffer_store (&obj_context->codec_state.encode.seq_param); media_release_buffer_store (&obj_context->codec_state.encode.q_matrix); for (i = 0; i < obj_context->codec_state.encode.num_slice_params; i++) media_release_buffer_store (&obj_context->codec_state.encode. slice_params[i]); media_drv_free_memory (obj_context->codec_state.encode.slice_params); MEDIA_DRV_ASSERT (obj_context->codec_state.encode. num_slice_params_ext <= obj_context->codec_state.encode.max_slice_params_ext); media_release_buffer_store (&obj_context->codec_state.encode. pic_param_ext); media_release_buffer_store (&obj_context->codec_state.encode. seq_param_ext); media_release_buffer_store (&obj_context->codec_state. encode.frame_update_param); for (i = 0; i < ARRAY_ELEMS (obj_context->codec_state.encode.packed_header_param); i++) media_release_buffer_store (&obj_context->codec_state.encode. packed_header_param[i]); for (i = 0; i < ARRAY_ELEMS (obj_context->codec_state.encode.packed_header_data); i++) media_release_buffer_store (&obj_context->codec_state.encode. packed_header_data[i]); for (i = 0; i < ARRAY_ELEMS (obj_context->codec_state.encode.misc_param); i++) media_release_buffer_store (&obj_context->codec_state.encode. misc_param[i]); for (i = 0; i < obj_context->codec_state.encode.num_slice_params_ext; i++) media_release_buffer_store (&obj_context->codec_state.encode. slice_params_ext[i]); media_drv_free_memory (obj_context->codec_state.encode. slice_params_ext); } else if (obj_context->codec_type == CODEC_DEC) { media_release_buffer_store(&obj_context->codec_state.decode.pic_param); media_release_buffer_store(&obj_context->codec_state.decode.iq_matrix); media_release_buffer_store(&obj_context->codec_state.decode.bit_plane); media_release_buffer_store(&obj_context->codec_state.decode.huffman_table); for (i = 0; i < obj_context->codec_state.decode.num_slice_params; i++) { media_release_buffer_store(&obj_context->codec_state.decode.slice_params[i]); media_release_buffer_store(&obj_context->codec_state.decode.slice_datas[i]); } media_drv_free_memory (obj_context->codec_state.decode.slice_params); media_drv_free_memory (obj_context->codec_state.decode.slice_datas); } media_drv_free_memory (obj_context->render_targets); object_heap_free (heap, obj); }