VdpStatus yuv_prepare(video_surface_ctx_t *video_surface) { if (video_surface->yuv->ref_count > 1) { video_surface->yuv->ref_count--; return yuv_new(video_surface); } return VDP_STATUS_OK; }
VdpStatus vdp_video_surface_create(VdpDevice device, VdpChromaType chroma_type, uint32_t width, uint32_t height, VdpVideoSurface *surface) { if (!surface) return VDP_STATUS_INVALID_POINTER; if (width < 1 || width > 8192 || height < 1 || height > 8192) return VDP_STATUS_INVALID_SIZE; device_ctx_t *dev = handle_get(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; video_surface_ctx_t *vs = calloc(1, sizeof(video_surface_ctx_t)); if (!vs) return VDP_STATUS_RESOURCES; vs->device = dev; vs->width = width; vs->height = height; vs->chroma_type = chroma_type; vs->luma_size = ALIGN(width, 32) * ALIGN(height, 32); VdpStatus ret = yuv_new(vs); if (ret != VDP_STATUS_OK) { free(vs); return ret; } int handle = handle_create(vs); if (handle == -1) { ve_free(vs->yuv->data); free(vs->yuv); free(vs); return VDP_STATUS_RESOURCES; } *surface = handle; return VDP_STATUS_OK; }
VdpStatus vdp_video_surface_create(VdpDevice device, VdpChromaType chroma_type, uint32_t width, uint32_t height, VdpVideoSurface *surface) { if (!surface) return VDP_STATUS_INVALID_POINTER; if (width < 1 || width > 8192 || height < 1 || height > 8192) return VDP_STATUS_INVALID_SIZE; device_ctx_t *dev = handle_get(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; video_surface_ctx_t *vs = handle_create(sizeof(*vs), surface); if (!vs) return VDP_STATUS_RESOURCES; vs->device = dev; vs->width = width; vs->height = height; vs->chroma_type = chroma_type; vs->luma_size = ALIGN(width, 32) * ALIGN(height, 32); VdpStatus ret = yuv_new(vs); if (ret != VDP_STATUS_OK) { handle_destroy(*surface); return ret; } return VDP_STATUS_OK; }