/* * 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