Beispiel #1
0
SurfacePtr VaapiEncoderBase::createSurface(VideoFrameRawData* frame)
{
    SurfacePtr surface = createSurface(frame->fourcc);
    SurfacePtr nil;
    if (!surface)
        return nil;

    ImagePtr image = VaapiImage::derive(surface);
    if (!image) {
        ERROR("VaapiImage::derive() failed");
        return nil;
    }
    ImageRawPtr raw = mapVaapiImage(image);
    if (!raw) {
        ERROR("image->map() failed");
        return nil;
    }

    uint8_t* src = reinterpret_cast<uint8_t*>(frame->handle);
    if (!raw->copyFrom(src, frame->offset, frame->pitch)) {
        ERROR("copyfrom in buffer failed");
        return nil;
    }
    return surface;
}
Beispiel #2
0
ImageRawPtr VaapiImageRaw::create(const DisplayPtr& display, const ImagePtr& image, VideoDataMemoryType memoryType)
{
    ImageRawPtr raw;
    RealeaseCallback release;
    uintptr_t handle;
    VAStatus status;
    VAImagePtr& vaImage = image->m_image;
    if (memoryType == VIDEO_DATA_MEMORY_TYPE_RAW_POINTER || memoryType == VIDEO_DATA_MEMORY_TYPE_RAW_COPY) {
        void* data;
        status = vaMapBuffer(display->getID(), vaImage->buf, &data);
        release = vaUnmapBuffer;
        handle = (uintptr_t)data;
    } else {
        VABufferInfo bufferInfo;
        if (memoryType == VIDEO_DATA_MEMORY_TYPE_DRM_NAME)
            bufferInfo.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM;
        else if (memoryType == VIDEO_DATA_MEMORY_TYPE_DMA_BUF)
            bufferInfo.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
        else
            ASSERT(0);

        status = vaAcquireBufferHandle(display->getID(), vaImage->buf, &bufferInfo);
        release = vaReleaseBufferHandle;
        handle = (uintptr_t)bufferInfo.handle;
    }
    if (!checkVaapiStatus(status, "VaapiImageRaw::create()"))
        return raw;
    raw.reset(new VaapiImageRaw(display, image, memoryType, handle, release));
    return raw;
}
Beispiel #3
0
ImageRawPtr VaapiImage::map(VideoDataMemoryType memoryType)
{
    ImageRawPtr raw = m_rawImage.lock();
    if (raw) {
        if (raw->getMemoryType() != memoryType) {
            ERROR("map image to different memory type, wanted %d, mapped = %d", memoryType, raw->getMemoryType());
            raw.reset();
        }
        return raw;
    }
    raw = VaapiImageRaw::create(m_display, shared_from_this(), memoryType);
    m_rawImage = raw;
    return raw;
}
Beispiel #4
0
ImageRawPtr mapVaapiImage(ImagePtr img, VideoDataMemoryType memoryType)
{
    ImageRawPtr raw = img->m_rawImage.lock();
    if (raw) {
        if (raw->getMemoryType() != memoryType) {
            ERROR("map image to different memory type, wanted %d, mapped = %d", memoryType, raw->getMemoryType());
            raw.reset();
        }
        return raw;
    }
    raw = VaapiImageRaw::create(img->m_display, img, memoryType);
    img->m_rawImage = raw;
    return raw;
}