Blame vaapi/vaapisurfaceallocator.cpp

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