/*
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of NVIDIA CORPORATION nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* NVIDIA Multimedia API: Buffer API
*
* @b Description: This file declares the NvBuffer APIs.
*/
#ifndef __NV_BUFFER_H__
#define __NV_BUFFER_H__
#include
#include
#include
#include "v4l2_nv_extensions.h"
/**
*
* @defgroup l4t_mm_nvbuffer_group Buffer API
*
* The @c %NvBuffer API provides buffer functionality, including reference
* count functionality and convenience methods.
* @ingroup aa_framework_api_group
* @{
*/
/**
* Specifies the maximum number of planes a buffer can contain.
*/
#define MAX_PLANES 3
/**
* @brief Class representing a buffer.
*
* The NvBuffer class is modeled on the basis of the @c v4l2_buffer
* structure. The buffer has @c buf_type @c v4l2_buf_type, @c
* memory_type @c v4l2_memory, and an index. It contains an
* NvBufferPlane array similar to the array of @c v4l2_plane
* structures in @c v4l2_buffer.m.planes. It also contains a
* corresponding NvBufferPlaneFormat array that describes the
* format of each of the planes.
*
* Even though @c %NvBuffer closely resembles v4l2 structures, it can
* be easily used with other non-v4l2 components. @c %NvBuffer
* contains data pointers, buffer length, file descriptor (FD) of
* buffer planes, buffer format (height, width, stride, etc.), and
* other members that are required by such components.
*
* This class also provides buffer reference count functionality. This
* is useful when the same buffer is being used by multiple elements.
*
* In the case of a V4L2 MMAP, this class provides convenience methods
* for mapping or unmapping the contents of the buffer to or from
* memory, allocating or deallocating software memory depending on its
* format.
*/
class NvBuffer
{
public:
/**
* Holds the buffer plane format.
*/
typedef struct
{
uint32_t width; /**< Holds the width of the plane in pixels. */
uint32_t height; /**< Holds the height of the plane in pixels. */
uint32_t bytesperpixel; /**< Holds the bytes used to represent one
pixel in the plane. */
uint32_t stride; /**< Holds the stride of the plane in bytes. */
uint32_t sizeimage; /**< Holds the size of the plane in bytes. */
} NvBufferPlaneFormat;
/**
* Holds the buffer plane parameters.
*/
typedef struct
{
NvBufferPlaneFormat fmt; /**< Holds the format of the plane. */
unsigned char *data; /**< Holds a pointer to the plane memory. */
uint32_t bytesused; /**< Holds the number of valid bytes in the plane. */
int fd; /**< Holds the file descriptor (FD) of the plane of the
exported buffer, in the case of V4L2 MMAP buffers. */
uint32_t mem_offset; /**< Holds the offset of the first valid byte
from the data pointer. */
uint32_t length; /**< Holds the size of the buffer in bytes. */
} NvBufferPlane;
/**
* Creates a new NvBuffer object.
*
* This convenience method for V4L2 elements creates a new buffer
* with the planes array memset to zero and the refcount
* initialized to zero.
*
* @param[in] buf_type Type of buffer, enumerated as @c
* v4l2_buf_type.
* @param[in] memory_type @c %NvBuffer memory, enumerated as an
* @c v4l2_memory enum.
* @param[in] n_planes Number of planes in the buffer.
* @param[in] fmt Specifies a pointer to the array of buffer plane formats.
* Should contain at least @a n_planes elements.
* @param[in] index Index of the buffer in the plane.
*/
NvBuffer(enum v4l2_buf_type buf_type, enum v4l2_memory memory_type,
uint32_t n_planes, NvBufferPlaneFormat *fmt, uint32_t index);
/**
* Creates a new NvBuffer for raw pixel formats.
*
* This convenience method for V4L2 elements is an @c %NvBuffer
* constructor for raw pixel formats only. It requires width,
* height, and pixel format to be specified.
*
* The planes array is memset to zero and the refcount is
* initialized to zero.
*
* @attention The memory must be allocated by the application
* by calling NvBuffer::allocateMemory.
*
* @param[in] pixfmt Pixel format of the buffer.
* @param[in] width Width of the buffer in pixels.
* @param[in] height Height of the buffer in pixels.
* @param[in] index Index/ID of the buffer.
*/
NvBuffer(uint32_t pixfmt, uint32_t width, uint32_t height, uint32_t index);
/**
* Creates a new NvBuffer object for non-raw pixel formats.
*
* This convenience method for V4L2 elements is an @c %NvBuffer
* constructor for non raw pixel formats. It requires size of the
* buffer to be supplied.
*
* The planes array is memset to zero and refcount initialized to
* zero.
*
* @attention The memory needs to be allocated by the application
* by calling NvBuffer::allocateMemory.
*
* @param[in] size Size of the buffer in bytes.
* @param[in] index Index/ID of the buffer.
*/
NvBuffer(uint32_t size, uint32_t index);
/**
* Destroys an NvBuffer object.
*
* This method cleans up class instances, unmapping any mapped
* planes.
*/
~NvBuffer();
/**
* Maps the contents of the buffer to memory.
*
* This method maps the file descriptor (FD) of the planes to
* a data pointer of @c planes. (MMAP buffers only.)
*
* @return 0 on success, -1 otherwise.
*/
int map();
/**
* Unmaps the contents of the buffer from memory. (MMAP buffers only.)
*
*/
void unmap();
/**
* Allocates software memory for the buffer.
*
* @warning This method works only for @c V4L2_MEMORY_USERPTR memory.
*
* This method allocates memory on the basis of the buffer format:
* @a height, @a width, @a bytesperpixel, and @a sizeimage.
*
* @return 0 for success, -1 otherwise.
*/
int allocateMemory();
/**
* Deallocates buffer memory.
*
* @warning This method works only for @c V4L2_MEMORY_USERPTR memory and if
* the memory was previously allocated using NvBuffer::allocateMemory.
*/
void deallocateMemory();
/**
* Increases the reference count of the buffer.
*
* This method is thread safe.
*
* @return Reference count of the buffer after the operation.
*/
int ref();
/**
* Decreases the reference count of the buffer.
*
* This thread-safe method decreases the buffer reference count if the
* buffer reference count is above 0.
*
* @return Reference count of the buffer after the operation.
*/
int unref();
const enum v4l2_buf_type buf_type; /**< Type of the buffer. */
const enum v4l2_memory memory_type; /**< Type of memory associated
with the buffer. */
const uint32_t index; /**< Holds the buffer index. */
uint32_t n_planes; /**< Holds the number of planes in the buffer. */
NvBufferPlane planes[MAX_PLANES]; /**< Holds the data pointer, plane file
descriptor (FD), plane format, etc. */
/**
* Fills the NvBuffer::NvBufferPlaneFormat array.
*
* This convenience method populates the
* @c %NvBuffer::NvBufferPlaneFormat array on the basis of @a width,
* @a height and pixel format (@a raw_pixfmt). It also returns the number of planes
* required for the pixel format in @a num_planes.
*
*
* @param[out] num_planes The number of planes. Must not be NULL.
* @param[in,out] planefmts Array of %NvBuffer::NvBufferPlaneFormat to
* fill. Must be at least \a num_planes in length. For best
* results, pass an array of length #MAX_PLANES.
* @param[in] width Width of the buffer in pixels.
* @param[in] height Height of the buffer in pixels.
* @param[in] raw_pixfmt Raw V4L2 pixel formats.
* @return 0 for success, -1 for an unsupported pixel format.
*/
static int fill_buffer_plane_format(uint32_t *num_planes,
NvBuffer::NvBufferPlaneFormat *planefmts,
uint32_t width, uint32_t height, uint32_t raw_pixfmt);
private:
uint32_t ref_count; /**< Holds the reference count of the buffer. */
pthread_mutex_t ref_lock; /**< Mutex to synchronize increment/
decrement operations of @c ref_count. */
bool mapped; /**< Indicates if the buffer is mapped to
memory. */
bool allocated; /**< Indicates if the buffer is allocated
memory. */
NvBuffer *shared_buffer; /**< If this is a DMABUF buffer, @c shared_buffer
points to the MMAP @c NvBuffer whose FD was
sent when this buffer was queued. */
/**
* Disallows copy constructor.
*/
NvBuffer(const NvBuffer& that);
/**
* Disallows assignment.
*/
void operator=(NvBuffer const&);
friend class NvV4l2ElementPlane;
};
/** @} */
#endif