| /* |
| * This file is part of FFmpeg. |
| * |
| * FFmpeg is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * FFmpeg is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with FFmpeg; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef AVUTIL_HWCONTEXT_DRM_H |
| #define AVUTIL_HWCONTEXT_DRM_H |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| /** |
| * @file |
| * API-specific header for AV_HWDEVICE_TYPE_DRM. |
| * |
| * Internal frame allocation is not currently supported - all frames |
| * must be allocated by the user. Thus AVHWFramesContext is always |
| * NULL, though this may change if support for frame allocation is |
| * added in future. |
| */ |
| |
| enum { |
| /** |
| * The maximum number of layers/planes in a DRM frame. |
| */ |
| AV_DRM_MAX_PLANES = 4 |
| }; |
| |
| /** |
| * DRM object descriptor. |
| * |
| * Describes a single DRM object, addressing it as a PRIME file |
| * descriptor. |
| */ |
| typedef struct AVDRMObjectDescriptor { |
| /** |
| * DRM PRIME fd for the object. |
| */ |
| int fd; |
| /** |
| * Total size of the object. |
| * |
| * (This includes any parts not which do not contain image data.) |
| */ |
| size_t size; |
| /** |
| * Format modifier applied to the object (DRM_FORMAT_MOD_*). |
| * |
| * If the format modifier is unknown then this should be set to |
| * DRM_FORMAT_MOD_INVALID. |
| */ |
| uint64_t format_modifier; |
| } AVDRMObjectDescriptor; |
| |
| /** |
| * DRM plane descriptor. |
| * |
| * Describes a single plane of a layer, which is contained within |
| * a single object. |
| */ |
| typedef struct AVDRMPlaneDescriptor { |
| /** |
| * Index of the object containing this plane in the objects |
| * array of the enclosing frame descriptor. |
| */ |
| int object_index; |
| /** |
| * Offset within that object of this plane. |
| */ |
| ptrdiff_t offset; |
| /** |
| * Pitch (linesize) of this plane. |
| */ |
| ptrdiff_t pitch; |
| } AVDRMPlaneDescriptor; |
| |
| /** |
| * DRM layer descriptor. |
| * |
| * Describes a single layer within a frame. This has the structure |
| * defined by its format, and will contain one or more planes. |
| */ |
| typedef struct AVDRMLayerDescriptor { |
| /** |
| * Format of the layer (DRM_FORMAT_*). |
| */ |
| uint32_t format; |
| /** |
| * Number of planes in the layer. |
| * |
| * This must match the number of planes required by format. |
| */ |
| int nb_planes; |
| /** |
| * Array of planes in this layer. |
| */ |
| AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES]; |
| } AVDRMLayerDescriptor; |
| |
| /** |
| * DRM frame descriptor. |
| * |
| * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames. |
| * It is also used by user-allocated frame pools - allocating in |
| * AVHWFramesContext.pool must return AVBufferRefs which contain |
| * an object of this type. |
| * |
| * The fields of this structure should be set such it can be |
| * imported directly by EGL using the EGL_EXT_image_dma_buf_import |
| * and EGL_EXT_image_dma_buf_import_modifiers extensions. |
| * (Note that the exact layout of a particular format may vary between |
| * platforms - we only specify that the same platform should be able |
| * to import it.) |
| * |
| * The total number of planes must not exceed AV_DRM_MAX_PLANES, and |
| * the order of the planes by increasing layer index followed by |
| * increasing plane index must be the same as the order which would |
| * be used for the data pointers in the equivalent software format. |
| */ |
| typedef struct AVDRMFrameDescriptor { |
| /** |
| * Number of DRM objects making up this frame. |
| */ |
| int nb_objects; |
| /** |
| * Array of objects making up the frame. |
| */ |
| AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES]; |
| /** |
| * Number of layers in the frame. |
| */ |
| int nb_layers; |
| /** |
| * Array of layers in the frame. |
| */ |
| AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES]; |
| } AVDRMFrameDescriptor; |
| |
| /** |
| * DRM device. |
| * |
| * Allocated as AVHWDeviceContext.hwctx. |
| */ |
| typedef struct AVDRMDeviceContext { |
| /** |
| * File descriptor of DRM device. |
| * |
| * This is used as the device to create frames on, and may also be |
| * used in some derivation and mapping operations. |
| * |
| * If no device is required, set to -1. |
| */ |
| int fd; |
| } AVDRMDeviceContext; |
| |
| #endif /* AVUTIL_HWCONTEXT_DRM_H */ |