1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#ifndef AVUTIL_HWCONTEXT_INTERNAL_H 20cabdff1aSopenharmony_ci#define AVUTIL_HWCONTEXT_INTERNAL_H 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include <stddef.h> 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "buffer.h" 25cabdff1aSopenharmony_ci#include "hwcontext.h" 26cabdff1aSopenharmony_ci#include "frame.h" 27cabdff1aSopenharmony_ci#include "pixfmt.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_citypedef struct HWContextType { 30cabdff1aSopenharmony_ci enum AVHWDeviceType type; 31cabdff1aSopenharmony_ci const char *name; 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci /** 34cabdff1aSopenharmony_ci * An array of pixel formats supported by the AVHWFramesContext instances 35cabdff1aSopenharmony_ci * Terminated by AV_PIX_FMT_NONE. 36cabdff1aSopenharmony_ci */ 37cabdff1aSopenharmony_ci const enum AVPixelFormat *pix_fmts; 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci /** 40cabdff1aSopenharmony_ci * size of the public hardware-specific context, 41cabdff1aSopenharmony_ci * i.e. AVHWDeviceContext.hwctx 42cabdff1aSopenharmony_ci */ 43cabdff1aSopenharmony_ci size_t device_hwctx_size; 44cabdff1aSopenharmony_ci /** 45cabdff1aSopenharmony_ci * size of the private data, i.e. 46cabdff1aSopenharmony_ci * AVHWDeviceInternal.priv 47cabdff1aSopenharmony_ci */ 48cabdff1aSopenharmony_ci size_t device_priv_size; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci /** 51cabdff1aSopenharmony_ci * Size of the hardware-specific device configuration. 52cabdff1aSopenharmony_ci * (Used to query hwframe constraints.) 53cabdff1aSopenharmony_ci */ 54cabdff1aSopenharmony_ci size_t device_hwconfig_size; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci /** 57cabdff1aSopenharmony_ci * size of the public frame pool hardware-specific context, 58cabdff1aSopenharmony_ci * i.e. AVHWFramesContext.hwctx 59cabdff1aSopenharmony_ci */ 60cabdff1aSopenharmony_ci size_t frames_hwctx_size; 61cabdff1aSopenharmony_ci /** 62cabdff1aSopenharmony_ci * size of the private data, i.e. 63cabdff1aSopenharmony_ci * AVHWFramesInternal.priv 64cabdff1aSopenharmony_ci */ 65cabdff1aSopenharmony_ci size_t frames_priv_size; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci int (*device_create)(AVHWDeviceContext *ctx, const char *device, 68cabdff1aSopenharmony_ci AVDictionary *opts, int flags); 69cabdff1aSopenharmony_ci int (*device_derive)(AVHWDeviceContext *dst_ctx, 70cabdff1aSopenharmony_ci AVHWDeviceContext *src_ctx, 71cabdff1aSopenharmony_ci AVDictionary *opts, int flags); 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci int (*device_init)(AVHWDeviceContext *ctx); 74cabdff1aSopenharmony_ci void (*device_uninit)(AVHWDeviceContext *ctx); 75cabdff1aSopenharmony_ci 76cabdff1aSopenharmony_ci int (*frames_get_constraints)(AVHWDeviceContext *ctx, 77cabdff1aSopenharmony_ci const void *hwconfig, 78cabdff1aSopenharmony_ci AVHWFramesConstraints *constraints); 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci int (*frames_init)(AVHWFramesContext *ctx); 81cabdff1aSopenharmony_ci void (*frames_uninit)(AVHWFramesContext *ctx); 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci int (*frames_get_buffer)(AVHWFramesContext *ctx, AVFrame *frame); 84cabdff1aSopenharmony_ci int (*transfer_get_formats)(AVHWFramesContext *ctx, 85cabdff1aSopenharmony_ci enum AVHWFrameTransferDirection dir, 86cabdff1aSopenharmony_ci enum AVPixelFormat **formats); 87cabdff1aSopenharmony_ci int (*transfer_data_to)(AVHWFramesContext *ctx, AVFrame *dst, 88cabdff1aSopenharmony_ci const AVFrame *src); 89cabdff1aSopenharmony_ci int (*transfer_data_from)(AVHWFramesContext *ctx, AVFrame *dst, 90cabdff1aSopenharmony_ci const AVFrame *src); 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci int (*map_to)(AVHWFramesContext *ctx, AVFrame *dst, 93cabdff1aSopenharmony_ci const AVFrame *src, int flags); 94cabdff1aSopenharmony_ci int (*map_from)(AVHWFramesContext *ctx, AVFrame *dst, 95cabdff1aSopenharmony_ci const AVFrame *src, int flags); 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci int (*frames_derive_to)(AVHWFramesContext *dst_ctx, 98cabdff1aSopenharmony_ci AVHWFramesContext *src_ctx, int flags); 99cabdff1aSopenharmony_ci int (*frames_derive_from)(AVHWFramesContext *dst_ctx, 100cabdff1aSopenharmony_ci AVHWFramesContext *src_ctx, int flags); 101cabdff1aSopenharmony_ci} HWContextType; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_cistruct AVHWDeviceInternal { 104cabdff1aSopenharmony_ci const HWContextType *hw_type; 105cabdff1aSopenharmony_ci void *priv; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci /** 108cabdff1aSopenharmony_ci * For a derived device, a reference to the original device 109cabdff1aSopenharmony_ci * context it was derived from. 110cabdff1aSopenharmony_ci */ 111cabdff1aSopenharmony_ci AVBufferRef *source_device; 112cabdff1aSopenharmony_ci}; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_cistruct AVHWFramesInternal { 115cabdff1aSopenharmony_ci const HWContextType *hw_type; 116cabdff1aSopenharmony_ci void *priv; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci AVBufferPool *pool_internal; 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci /** 121cabdff1aSopenharmony_ci * For a derived context, a reference to the original frames 122cabdff1aSopenharmony_ci * context it was derived from. 123cabdff1aSopenharmony_ci */ 124cabdff1aSopenharmony_ci AVBufferRef *source_frames; 125cabdff1aSopenharmony_ci /** 126cabdff1aSopenharmony_ci * Flags to apply to the mapping from the source to the derived 127cabdff1aSopenharmony_ci * frame context when trying to allocate in the derived context. 128cabdff1aSopenharmony_ci */ 129cabdff1aSopenharmony_ci int source_allocation_map_flags; 130cabdff1aSopenharmony_ci}; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_citypedef struct HWMapDescriptor { 133cabdff1aSopenharmony_ci /** 134cabdff1aSopenharmony_ci * A reference to the original source of the mapping. 135cabdff1aSopenharmony_ci */ 136cabdff1aSopenharmony_ci AVFrame *source; 137cabdff1aSopenharmony_ci /** 138cabdff1aSopenharmony_ci * A reference to the hardware frames context in which this 139cabdff1aSopenharmony_ci * mapping was made. May be the same as source->hw_frames_ctx, 140cabdff1aSopenharmony_ci * but need not be. 141cabdff1aSopenharmony_ci */ 142cabdff1aSopenharmony_ci AVBufferRef *hw_frames_ctx; 143cabdff1aSopenharmony_ci /** 144cabdff1aSopenharmony_ci * Unmap function. 145cabdff1aSopenharmony_ci */ 146cabdff1aSopenharmony_ci void (*unmap)(AVHWFramesContext *ctx, 147cabdff1aSopenharmony_ci struct HWMapDescriptor *hwmap); 148cabdff1aSopenharmony_ci /** 149cabdff1aSopenharmony_ci * Hardware-specific private data associated with the mapping. 150cabdff1aSopenharmony_ci */ 151cabdff1aSopenharmony_ci void *priv; 152cabdff1aSopenharmony_ci} HWMapDescriptor; 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ciint ff_hwframe_map_create(AVBufferRef *hwframe_ref, 155cabdff1aSopenharmony_ci AVFrame *dst, const AVFrame *src, 156cabdff1aSopenharmony_ci void (*unmap)(AVHWFramesContext *ctx, 157cabdff1aSopenharmony_ci HWMapDescriptor *hwmap), 158cabdff1aSopenharmony_ci void *priv); 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci/** 161cabdff1aSopenharmony_ci * Replace the current hwmap of dst with the one from src, used for indirect 162cabdff1aSopenharmony_ci * mappings like VAAPI->(DRM)->OpenCL/Vulkan where a direct interop is missing 163cabdff1aSopenharmony_ci */ 164cabdff1aSopenharmony_ciint ff_hwframe_map_replace(AVFrame *dst, const AVFrame *src); 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_cuda; 167cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_d3d11va; 168cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_drm; 169cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_dxva2; 170cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_opencl; 171cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_qsv; 172cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_vaapi; 173cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_vdpau; 174cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_videotoolbox; 175cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_mediacodec; 176cabdff1aSopenharmony_ciextern const HWContextType ff_hwcontext_type_vulkan; 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci#endif /* AVUTIL_HWCONTEXT_INTERNAL_H */ 179