mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2026-01-23 23:21:06 +01:00
Introduce AVRKMPPDRMFrameDescriptor This is exactly like AVDRMFrameDescriptor but attionally it holds MppBuffer instance used on each index. With that, AVDRMObjectDescriptor can be kept as is, and no need to modify the existing API.
169 lines
4.6 KiB
C
169 lines
4.6 KiB
C
/*
|
|
* 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 */
|