FFmpeg
Loading...
Searching...
No Matches
vf_scale_cuda.c File Reference
#include <float.h>
#include <stdio.h>
#include <string.h>
#include "libavutil/common.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_cuda_internal.h"
#include "libavutil/cuda_check.h"
#include "libavutil/internal.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/refstruct.h"
#include "libswscale/filters.h"
#include "avfilter.h"
#include "filters.h"
#include "scale_eval.h"
#include "video.h"
#include "cuda/load_helper.h"
#include "vf_scale_cuda.h"

Go to the source code of this file.

Data Structures

struct  format_entry
 
struct  CUDAScaleFilter
 
struct  CUDATex
 
struct  CUDAScaleContext
 

Macros

#define DIV_UP(a, b)
 
#define BLOCKX   32
 
#define BLOCKY   16
 
#define CHECK_CU(x)
 
#define OFFSET(x)
 
#define FLAGS   (AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM)
 

Enumerations

enum  {
  INTERP_ALGO_DEFAULT , INTERP_ALGO_NEAREST , INTERP_ALGO_BILINEAR , INTERP_ALGO_BICUBIC ,
  INTERP_ALGO_LANCZOS , INTERP_ALGO_COUNT
}
 
enum  { FILTER_OUT , FILTER_TMP , FILTER_NB }
 

Functions

static av_cold int cudascale_init (AVFilterContext *ctx)
 
static void filter_uninit (CudaFunctions *cu, CUDAScaleFilter *filter)
 
static void cuda_tex_uninit (CudaFunctions *cu, CUDATex *t)
 
static av_cold void cudascale_uninit (AVFilterContext *ctx)
 
static av_cold int init_hwframe_ctx (CUDAScaleContext *s, AVBufferRef *device_ctx, int width, int height)
 
static av_cold int inter_buf_init (AVFilterContext *ctx, int out_width, int in_height)
 
static int format_is_supported (enum AVPixelFormat fmt)
 
static const char * get_format_name (enum AVPixelFormat fmt)
 
static av_cold void set_format_info (AVFilterContext *ctx, enum AVPixelFormat in_format, enum AVPixelFormat out_format)
 
static av_cold int init_processing_chain (AVFilterContext *ctx, int in_width, int in_height, int out_width, int out_height)
 
static av_cold int cudascale_load_functions (AVFilterContext *ctx)
 
static av_cold int cudascale_filter_init (AVFilterContext *ctx, CUDAScaleFilter *f, int src_size, int dst_size, double virtual_size)
 
static av_cold int cudascale_setup_filters (AVFilterContext *ctx)
 
static av_cold int cudascale_config_props (AVFilterLink *outlink)
 
static int cuda_tex_map_frame (AVFilterContext *ctx, const AVFrame *frame, const int depths[4], const int channels[4], CUDATex *tex)
 
static int call_resize_kernel (AVFilterContext *ctx, CUfunction func, const CUtexObject src_tex[4], int src_left, int src_top, int src_width, int src_height, const CUdeviceptr out_data[4], int dst_width, int dst_height, int dst_pitch, int mpeg_range, const CUDAScaleFilter *filter)
 
static int scalecuda_resize (AVFilterContext *ctx, int pass, const CUDATex *out, const CUDATex *in)
 
static int cudascale_scale (AVFilterContext *ctx, AVFrame *out, AVFrame *in)
 
static int cudascale_filter_frame (AVFilterLink *link, AVFrame *in)
 
static AVFramecudascale_get_video_buffer (AVFilterLink *inlink, int w, int h)
 

Variables

static const struct format_entry supported_formats []
 
static const AVOption options []
 
static const AVClass cudascale_class
 
static const AVFilterPad cudascale_inputs []
 
static const AVFilterPad cudascale_outputs []
 
const FFFilter ff_vf_scale_cuda
 

Macro Definition Documentation

◆ DIV_UP

#define DIV_UP ( a,
b )
Value:
( ((a) + (b) - 1) / (b) )
int a
#define b
Definition input.c:43

Definition at line 76 of file vf_scale_cuda.c.

Referenced by call_resize_kernel().

◆ BLOCKX

#define BLOCKX   32

Definition at line 77 of file vf_scale_cuda.c.

◆ BLOCKY

#define BLOCKY   16

Definition at line 78 of file vf_scale_cuda.c.

◆ CHECK_CU

#define CHECK_CU ( x)
Value:
FF_CUDA_CHECK_DL(ctx, s->hwctx->internal->cuda_dl, x)
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CUDA_CHECK_DL(avclass, cudl, x)
Convenience wrapper for ff_cuda_check when dynamically loading cuda symbols.
Definition cuda_check.h:65
static AVFormatContext * ctx
Definition movenc.c:49

Definition at line 80 of file vf_scale_cuda.c.

Referenced by call_resize_kernel(), cuda_tex_map_frame(), cudascale_filter_frame(), cudascale_filter_init(), cudascale_load_functions(), cudascale_setup_filters(), cudascale_uninit(), and inter_buf_init().

◆ OFFSET

#define OFFSET ( x)
Value:

Definition at line 1012 of file vf_scale_cuda.c.

◆ FLAGS

Definition at line 1013 of file vf_scale_cuda.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
INTERP_ALGO_DEFAULT 
INTERP_ALGO_NEAREST 
INTERP_ALGO_BILINEAR 
INTERP_ALGO_BICUBIC 
INTERP_ALGO_LANCZOS 
INTERP_ALGO_COUNT 

Definition at line 82 of file vf_scale_cuda.c.

◆ anonymous enum

anonymous enum
Enumerator
FILTER_OUT 
FILTER_TMP 
FILTER_NB 

Definition at line 93 of file vf_scale_cuda.c.

Function Documentation

◆ cudascale_init()

static av_cold int cudascale_init ( AVFilterContext * ctx)
static

Definition at line 164 of file vf_scale_cuda.c.

◆ filter_uninit()

static void filter_uninit ( CudaFunctions * cu,
CUDAScaleFilter * filter )
static

Definition at line 179 of file vf_scale_cuda.c.

Referenced by cudascale_uninit().

◆ cuda_tex_uninit()

static void cuda_tex_uninit ( CudaFunctions * cu,
CUDATex * t )
static

◆ cudascale_uninit()

static av_cold void cudascale_uninit ( AVFilterContext * ctx)
static

Definition at line 200 of file vf_scale_cuda.c.

◆ init_hwframe_ctx()

static av_cold int init_hwframe_ctx ( CUDAScaleContext * s,
AVBufferRef * device_ctx,
int width,
int height )
static

Definition at line 229 of file vf_scale_cuda.c.

Referenced by init_processing_chain().

◆ inter_buf_init()

static av_cold int inter_buf_init ( AVFilterContext * ctx,
int out_width,
int in_height )
static

Definition at line 266 of file vf_scale_cuda.c.

Referenced by cudascale_setup_filters().

◆ format_is_supported()

static int format_is_supported ( enum AVPixelFormat fmt)
static

Definition at line 329 of file vf_scale_cuda.c.

Referenced by init_processing_chain().

◆ get_format_name()

static const char * get_format_name ( enum AVPixelFormat fmt)
static

Definition at line 337 of file vf_scale_cuda.c.

Referenced by cudascale_load_functions().

◆ set_format_info()

static av_cold void set_format_info ( AVFilterContext * ctx,
enum AVPixelFormat in_format,
enum AVPixelFormat out_format )
static

Definition at line 345 of file vf_scale_cuda.c.

Referenced by init_processing_chain().

◆ init_processing_chain()

static av_cold int init_processing_chain ( AVFilterContext * ctx,
int in_width,
int in_height,
int out_width,
int out_height )
static

Definition at line 371 of file vf_scale_cuda.c.

Referenced by cudascale_config_props().

◆ cudascale_load_functions()

static av_cold int cudascale_load_functions ( AVFilterContext * ctx)
static

Definition at line 436 of file vf_scale_cuda.c.

Referenced by cudascale_config_props().

◆ cudascale_filter_init()

static av_cold int cudascale_filter_init ( AVFilterContext * ctx,
CUDAScaleFilter * f,
int src_size,
int dst_size,
double virtual_size )
static

Definition at line 531 of file vf_scale_cuda.c.

Referenced by cudascale_setup_filters().

◆ cudascale_setup_filters()

static av_cold int cudascale_setup_filters ( AVFilterContext * ctx)
static

Definition at line 608 of file vf_scale_cuda.c.

Referenced by cudascale_config_props().

◆ cudascale_config_props()

static av_cold int cudascale_config_props ( AVFilterLink * outlink)
static

Definition at line 680 of file vf_scale_cuda.c.

◆ cuda_tex_map_frame()

static int cuda_tex_map_frame ( AVFilterContext * ctx,
const AVFrame * frame,
const int depths[4],
const int channels[4],
CUDATex * tex )
static

Definition at line 757 of file vf_scale_cuda.c.

Referenced by cudascale_scale().

◆ call_resize_kernel()

static int call_resize_kernel ( AVFilterContext * ctx,
CUfunction func,
const CUtexObject src_tex[4],
int src_left,
int src_top,
int src_width,
int src_height,
const CUdeviceptr out_data[4],
int dst_width,
int dst_height,
int dst_pitch,
int mpeg_range,
const CUDAScaleFilter * filter )
static

Definition at line 819 of file vf_scale_cuda.c.

Referenced by scalecuda_resize().

◆ scalecuda_resize()

static int scalecuda_resize ( AVFilterContext * ctx,
int pass,
const CUDATex * out,
const CUDATex * in )
static

Definition at line 861 of file vf_scale_cuda.c.

Referenced by cudascale_scale().

◆ cudascale_scale()

static int cudascale_scale ( AVFilterContext * ctx,
AVFrame * out,
AVFrame * in )
static

Definition at line 901 of file vf_scale_cuda.c.

Referenced by cudascale_filter_frame().

◆ cudascale_filter_frame()

static int cudascale_filter_frame ( AVFilterLink * link,
AVFrame * in )
static

Definition at line 956 of file vf_scale_cuda.c.

◆ cudascale_get_video_buffer()

static AVFrame * cudascale_get_video_buffer ( AVFilterLink * inlink,
int w,
int h )
static

Definition at line 1003 of file vf_scale_cuda.c.

Variable Documentation

◆ supported_formats

const struct format_entry supported_formats[]
static
Initial value:
= {
{AV_PIX_FMT_YUV420P, "planar8"},
{AV_PIX_FMT_YUV422P, "planar8"},
{AV_PIX_FMT_YUV444P, "planar8"},
{AV_PIX_FMT_YUV420P10,"planar10"},
{AV_PIX_FMT_YUV422P10,"planar10"},
{AV_PIX_FMT_YUV444P10,"planar10"},
{AV_PIX_FMT_YUV444P16,"planar16"},
{AV_PIX_FMT_NV12, "semiplanar8"},
{AV_PIX_FMT_NV16, "semiplanar8"},
{AV_PIX_FMT_P010, "semiplanar10"},
{AV_PIX_FMT_P210, "semiplanar10"},
{AV_PIX_FMT_P012, "semiplanar16"},
{AV_PIX_FMT_P212, "semiplanar16"},
{AV_PIX_FMT_P016, "semiplanar16"},
{AV_PIX_FMT_P216, "semiplanar16"},
{AV_PIX_FMT_0RGB32, "bgr0"},
{AV_PIX_FMT_0BGR32, "rgb0"},
{AV_PIX_FMT_RGB32, "bgra"},
{AV_PIX_FMT_BGR32, "rgba"},
}
#define AV_PIX_FMT_0RGB32
Definition pixfmt.h:521
#define AV_PIX_FMT_P212
Definition pixfmt.h:624
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_P210
Definition pixfmt.h:622
#define AV_PIX_FMT_P012
Definition pixfmt.h:609
#define AV_PIX_FMT_P216
Definition pixfmt.h:626
#define AV_PIX_FMT_P010
Definition pixfmt.h:608
#define AV_PIX_FMT_P016
Definition pixfmt.h:610
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_YUV444P12MSB
Definition pixfmt.h:561
#define AV_PIX_FMT_BGR32
Definition pixfmt.h:519
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition pixfmt.h:96
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:198
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_YUV444P10MSB
Definition pixfmt.h:560
#define AV_PIX_FMT_0BGR32
Definition pixfmt.h:522
#define AV_PIX_FMT_RGB32
Definition pixfmt.h:517
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548

Definition at line 52 of file vf_scale_cuda.c.

◆ options

const AVOption options[]
static
Initial value:
= {
{ "w", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS },
{ "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS },
{ "interp_algo", "Interpolation algorithm used for resizing", OFFSET(interp_algo), AV_OPT_TYPE_INT, { .i64 = INTERP_ALGO_DEFAULT }, 0, INTERP_ALGO_COUNT - 1, FLAGS, .unit = "interp_algo" },
{ "nearest", "nearest neighbour", 0, AV_OPT_TYPE_CONST, { .i64 = INTERP_ALGO_NEAREST }, 0, 0, FLAGS, .unit = "interp_algo" },
{ "bilinear", "bilinear", 0, AV_OPT_TYPE_CONST, { .i64 = INTERP_ALGO_BILINEAR }, 0, 0, FLAGS, .unit = "interp_algo" },
{ "bicubic", "bicubic", 0, AV_OPT_TYPE_CONST, { .i64 = INTERP_ALGO_BICUBIC }, 0, 0, FLAGS, .unit = "interp_algo" },
{ "lanczos", "lanczos", 0, AV_OPT_TYPE_CONST, { .i64 = INTERP_ALGO_LANCZOS }, 0, 0, FLAGS, .unit = "interp_algo" },
{ "format", "Output video pixel format", OFFSET(format), AV_OPT_TYPE_PIXEL_FMT, { .i64 = AV_PIX_FMT_NONE }, INT_MIN, INT_MAX, .flags=FLAGS },
{ "passthrough", "Do not process frames at all if parameters match", OFFSET(passthrough), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
{ "use_filters", "Use generic filters instead of fixed function kernels", OFFSET(use_filters), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, FLAGS, .unit = "use_filters" },
{ "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = -1}, 0, 0, FLAGS, .unit = "use_filters" },
{ "param", "Algorithm-Specific parameter", OFFSET(param), AV_OPT_TYPE_FLOAT, { .dbl = SCALE_CUDA_PARAM_DEFAULT }, -FLT_MAX, FLT_MAX, FLAGS },
{ "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, SCALE_FORCE_OAR_NB-1, FLAGS, .unit = "force_oar" },
{ "disable", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_DISABLE }, 0, 0, FLAGS, .unit = "force_oar" },
{ "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_DECREASE }, 0, 0, FLAGS, .unit = "force_oar" },
{ "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_INCREASE }, 0, 0, FLAGS, .unit = "force_oar" },
{ "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 256, FLAGS },
{ "reset_sar", "reset SAR to 1 and scale to square pixels if scaling proportionally", OFFSET(reset_sar), AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1, FLAGS },
{ NULL },
}
static const char *const format[]
Definition af_aiir.c:444
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
#define OFFSET(x)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_PIXEL_FMT
Underlying C type is enum AVPixelFormat.
Definition opt.h:306
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
Definition opt.h:270
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition opt.h:275
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ SCALE_FORCE_OAR_DISABLE
Definition scale_eval.h:25
@ SCALE_FORCE_OAR_NB
Definition scale_eval.h:28
@ SCALE_FORCE_OAR_INCREASE
Definition scale_eval.h:27
@ SCALE_FORCE_OAR_DECREASE
Definition scale_eval.h:26
@ INTERP_ALGO_LANCZOS
@ INTERP_ALGO_BICUBIC
@ INTERP_ALGO_DEFAULT
@ INTERP_ALGO_BILINEAR
@ INTERP_ALGO_COUNT
@ INTERP_ALGO_NEAREST
#define SCALE_CUDA_PARAM_DEFAULT

Definition at line 1014 of file vf_scale_cuda.c.

◆ cudascale_class

const AVClass cudascale_class
static
Initial value:
= {
.class_name = "cudascale",
.item_name = av_default_item_name,
.option = options,
}
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
#define LIBAVUTIL_VERSION_INT
Definition version.h:85

Definition at line 1036 of file vf_scale_cuda.c.

◆ cudascale_inputs

const AVFilterPad cudascale_inputs[]
static
Initial value:
= {
{
.name = "default",
.filter_frame = cudascale_filter_frame,
.get_buffer.video = cudascale_get_video_buffer,
},
}
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
static AVFrame * cudascale_get_video_buffer(AVFilterLink *inlink, int w, int h)
static int cudascale_filter_frame(AVFilterLink *link, AVFrame *in)

Definition at line 1043 of file vf_scale_cuda.c.

◆ cudascale_outputs

const AVFilterPad cudascale_outputs[]
static
Initial value:
= {
{
.name = "default",
.config_props = cudascale_config_props,
},
}
static av_cold int cudascale_config_props(AVFilterLink *outlink)

Definition at line 1052 of file vf_scale_cuda.c.

◆ ff_vf_scale_cuda

const FFFilter ff_vf_scale_cuda
Initial value:
= {
.p.name = "scale_cuda",
.p.description = NULL_IF_CONFIG_SMALL("GPU accelerated video resizer"),
.p.priv_class = &cudascale_class,
.init = cudascale_init,
.uninit = cudascale_uninit,
.priv_size = sizeof(CUDAScaleContext),
.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
}
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition filters.h:208
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition filters.h:254
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition pixfmt.h:260
static av_cold void cudascale_uninit(AVFilterContext *ctx)
static av_cold int cudascale_init(AVFilterContext *ctx)
static const AVClass cudascale_class
static const AVFilterPad cudascale_outputs[]
static const AVFilterPad cudascale_inputs[]

Definition at line 1060 of file vf_scale_cuda.c.