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