/* * Copyright (C) 2015 Intel Corporation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "common/log.h" #include "vaapi/vaapisurfaceallocator.h" #include "vaapi/VaapiUtils.h" #include namespace YamiMediaCodec{ VaapiSurfaceAllocator::VaapiSurfaceAllocator(VADisplay display, uint32_t extraSize) :m_display(display), m_extraSize(extraSize) { } YamiStatus VaapiSurfaceAllocator::doAlloc(SurfaceAllocParams* params) { if (!params) return YAMI_INVALID_PARAM; uint32_t size = params->size; uint32_t width = params->width; uint32_t height = params->height; if (!width || !height || !size) return YAMI_INVALID_PARAM; uint32_t rtFormat = getRtFormat(params->fourcc); if (!rtFormat) { ERROR("unsupported format %x", params->fourcc); return YAMI_UNSUPPORTED; } size += m_extraSize; std::vector v(size); VASurfaceAttrib attrib; attrib.flags = VA_SURFACE_ATTRIB_SETTABLE; attrib.type = VASurfaceAttribPixelFormat; attrib.value.type = VAGenericValueTypeInteger; attrib.value.value.i = params->fourcc; VAStatus status = vaCreateSurfaces(m_display, rtFormat, width, height, &v[0], size, &attrib, 1); if (!checkVaapiStatus(status, "vaCreateSurfaces")) return YAMI_OUT_MEMORY; params->surfaces = new intptr_t[size]; for (uint32_t i = 0; i < size; i++) { params->surfaces[i] = (intptr_t)v[i]; } params->size = size; return YAMI_SUCCESS; } YamiStatus VaapiSurfaceAllocator::doFree(SurfaceAllocParams* params) { if (!params || !params->size || !params->surfaces) return YAMI_INVALID_PARAM; uint32_t size = params->size; std::vector v(size); for (uint32_t i = 0; i < size; i++) { v[i] = (VASurfaceID)params->surfaces[i]; } checkVaapiStatus(vaDestroySurfaces(m_display, &v[0], size), "vaDestroySurfaces"); delete[] params->surfaces; return YAMI_SUCCESS; } void VaapiSurfaceAllocator::doUnref() { delete this; } } //YamiMediaCodec