FFmpeg
Loading...
Searching...
No Matches
cuviddec.c File Reference
#include "config_components.h"
#include <stdatomic.h>
#include "compat/cuda/dynlink_loader.h"
#include "libavutil/buffer.h"
#include "libavutil/mathematics.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_cuda_internal.h"
#include "libavutil/cuda_check.h"
#include "libavutil/fifo.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "bsf.h"
#include "codec_internal.h"
#include "decode.h"
#include "hwconfig.h"
#include "nvdec.h"
#include "internal.h"

Go to the source code of this file.

Data Structures

struct  CuvidContext
 
struct  CuvidParsedFrame
 

Macros

#define cudaVideoSurfaceFormat_YUV444   2
 
#define cudaVideoSurfaceFormat_YUV444_16Bit   3
 
#define CHECK_CU(x)
 
#define CUVID_MAX_DISPLAY_DELAY   (4)
 
#define CUVID_DEFAULT_NUM_SURFACES   (CUVID_MAX_DISPLAY_DELAY + 1)
 
#define OFFSET(x)
 
#define VD   AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 
#define DEFINE_CUVID_CODEC(x, X, bsf_name)
 

Functions

static int cuvid_get_requested_hw_format (AVCodecContext *avctx, CuvidContext *ctx, enum AVPixelFormat *fmt)
 
static void cuvid_prepare_format_list (enum AVPixelFormat *pix_fmts, enum AVPixelFormat hw_format, enum AVPixelFormat sw_format)
 
static int CUDAAPI cuvid_handle_video_sequence (void *opaque, CUVIDEOFORMAT *format)
 
static int CUDAAPI cuvid_handle_picture_decode (void *opaque, CUVIDPICPARAMS *picparams)
 
static int CUDAAPI cuvid_handle_picture_display (void *opaque, CUVIDPARSERDISPINFO *dispinfo)
 
static int cuvid_is_buffer_full (AVCodecContext *avctx)
 
static int cuvid_decode_packet (AVCodecContext *avctx, const AVPacket *avpkt)
 
static int cuvid_output_frame (AVCodecContext *avctx, AVFrame *frame)
 
static av_cold int cuvid_decode_end (AVCodecContext *avctx)
 
static int cuvid_test_capabilities (AVCodecContext *avctx, const CUVIDPARSERPARAMS *cuparseinfo, int probed_width, int probed_height, int bit_depth, int is_yuv422, int is_yuv444)
 
static av_cold int cuvid_decode_init (AVCodecContext *avctx)
 
static void cuvid_flush (AVCodecContext *avctx)
 

Variables

static const AVOption options []
 
static const AVCodecHWConfigInternal *const cuvid_hw_configs []
 

Macro Definition Documentation

◆ cudaVideoSurfaceFormat_YUV444

#define cudaVideoSurfaceFormat_YUV444   2

Definition at line 48 of file cuviddec.c.

Referenced by cuvid_handle_video_sequence(), and ff_nvdec_decode_init().

◆ cudaVideoSurfaceFormat_YUV444_16Bit

#define cudaVideoSurfaceFormat_YUV444_16Bit   3

Definition at line 49 of file cuviddec.c.

Referenced by cuvid_handle_video_sequence(), and ff_nvdec_decode_init().

◆ CHECK_CU

#define CHECK_CU ( x)
Value:
FF_CUDA_CHECK_DL(avctx, ctx->cudl, x)
#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 142 of file cuviddec.c.

Referenced by cuvid_decode_init(), cuvid_decode_packet(), cuvid_flush(), cuvid_handle_picture_decode(), cuvid_handle_video_sequence(), cuvid_output_frame(), cuvid_test_capabilities(), vulkan_device_derive(), and vulkan_free_internal().

◆ CUVID_MAX_DISPLAY_DELAY

#define CUVID_MAX_DISPLAY_DELAY   (4)

Definition at line 145 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ CUVID_DEFAULT_NUM_SURFACES

#define CUVID_DEFAULT_NUM_SURFACES   (CUVID_MAX_DISPLAY_DELAY + 1)

Definition at line 148 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ OFFSET

#define OFFSET ( x)
Value:
offsetof(CuvidContext, x)

Definition at line 1747 of file cuviddec.c.

◆ VD

Definition at line 1748 of file cuviddec.c.

◆ DEFINE_CUVID_CODEC

#define DEFINE_CUVID_CODEC ( x,
X,
bsf_name )
Value:
static const AVClass x##_cuvid_class = { \
.class_name = #x "_cuvid", \
.item_name = av_default_item_name, \
.option = options, \
.version = LIBAVUTIL_VERSION_INT, \
}; \
const FFCodec ff_##x##_cuvid_decoder = { \
.p.name = #x "_cuvid", \
CODEC_LONG_NAME("Nvidia CUVID " #X " decoder"), \
.p.type = AVMEDIA_TYPE_VIDEO, \
.p.id = AV_CODEC_ID_##X, \
.priv_data_size = sizeof(CuvidContext), \
.p.priv_class = &x##_cuvid_class, \
.init = cuvid_decode_init, \
.close = cuvid_decode_end, \
.flush = cuvid_flush, \
.bsfs = bsf_name, \
.caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \
.hw_configs = cuvid_hw_configs, \
.p.wrapper_name = "cuvid", \
};
#define FF_CODEC_RECEIVE_FRAME_CB(func)
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
#define FF_CODEC_CAP_SETS_FRAME_PROPS
Codec handles output frame properties internally instead of letting the internal logic derive them fr...
static const AVCodecHWConfigInternal *const cuvid_hw_configs[]
Definition cuviddec.c:1768
static int cuvid_output_frame(AVCodecContext *avctx, AVFrame *frame)
Definition cuviddec.c:871
static av_cold int cuvid_decode_end(AVCodecContext *avctx)
Definition cuviddec.c:1208
static av_cold int cuvid_decode_init(AVCodecContext *avctx)
Definition cuviddec.c:1374
static void cuvid_flush(AVCodecContext *avctx)
Definition cuviddec.c:1697
#define X
Definition f_ebur128.c:157
#define AV_CODEC_CAP_AVOID_PROBING
Decoder is not a preferred choice for probing.
Definition codec.h:126
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition codec.h:133
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
Describe the class of an AVClass context structure.
Definition log.h:76

Definition at line 1794 of file cuviddec.c.

Function Documentation

◆ cuvid_get_requested_hw_format()

static int cuvid_get_requested_hw_format ( AVCodecContext * avctx,
CuvidContext * ctx,
enum AVPixelFormat * fmt )
static

Definition at line 150 of file cuviddec.c.

Referenced by cuvid_decode_init(), and cuvid_handle_video_sequence().

◆ cuvid_prepare_format_list()

static void cuvid_prepare_format_list ( enum AVPixelFormat * pix_fmts,
enum AVPixelFormat hw_format,
enum AVPixelFormat sw_format )
static

Definition at line 188 of file cuviddec.c.

Referenced by cuvid_decode_init(), and cuvid_handle_video_sequence().

◆ cuvid_handle_video_sequence()

static int CUDAAPI cuvid_handle_video_sequence ( void * opaque,
CUVIDEOFORMAT * format )
static

Definition at line 248 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ cuvid_handle_picture_decode()

static int CUDAAPI cuvid_handle_picture_decode ( void * opaque,
CUVIDPICPARAMS * picparams )
static

Definition at line 708 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ cuvid_handle_picture_display()

static int CUDAAPI cuvid_handle_picture_display ( void * opaque,
CUVIDPARSERDISPINFO * dispinfo )
static

Definition at line 749 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ cuvid_is_buffer_full()

static int cuvid_is_buffer_full ( AVCodecContext * avctx)
static

Definition at line 786 of file cuviddec.c.

Referenced by cuvid_decode_packet(), and cuvid_output_frame().

◆ cuvid_decode_packet()

static int cuvid_decode_packet ( AVCodecContext * avctx,
const AVPacket * avpkt )
static

Definition at line 798 of file cuviddec.c.

Referenced by cuvid_output_frame().

◆ cuvid_output_frame()

static int cuvid_output_frame ( AVCodecContext * avctx,
AVFrame * frame )
static

Definition at line 871 of file cuviddec.c.

◆ cuvid_decode_end()

static av_cold int cuvid_decode_end ( AVCodecContext * avctx)
static

Definition at line 1208 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ cuvid_test_capabilities()

static int cuvid_test_capabilities ( AVCodecContext * avctx,
const CUVIDPARSERPARAMS * cuparseinfo,
int probed_width,
int probed_height,
int bit_depth,
int is_yuv422,
int is_yuv444 )
static

Definition at line 1274 of file cuviddec.c.

Referenced by cuvid_decode_init().

◆ cuvid_decode_init()

static av_cold int cuvid_decode_init ( AVCodecContext * avctx)
static

Definition at line 1374 of file cuviddec.c.

◆ cuvid_flush()

static void cuvid_flush ( AVCodecContext * avctx)
static

Definition at line 1697 of file cuviddec.c.

Variable Documentation

◆ options

const AVOption options[]
static
Initial value:
= {
{ "deint", "Set deinterlacing mode", OFFSET(deint_mode), AV_OPT_TYPE_INT, { .i64 = cudaVideoDeinterlaceMode_Weave }, cudaVideoDeinterlaceMode_Weave, cudaVideoDeinterlaceMode_Adaptive, VD, .unit = "deint" },
{ "weave", "Weave deinterlacing (do nothing)", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Weave }, 0, 0, VD, .unit = "deint" },
{ "bob", "Bob deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Bob }, 0, 0, VD, .unit = "deint" },
{ "adaptive", "Adaptive deinterlacing", 0, AV_OPT_TYPE_CONST, { .i64 = cudaVideoDeinterlaceMode_Adaptive }, 0, 0, VD, .unit = "deint" },
{ "gpu", "GPU to be used for decoding", OFFSET(cu_gpu), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
{ "surfaces", "Maximum surfaces to be used for decoding", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VD | AV_OPT_FLAG_DEPRECATED },
{ "drop_second_field", "Drop second field when deinterlacing", OFFSET(drop_second_field), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
{ "crop", "Crop (top)x(bottom)x(left)x(right)", OFFSET(crop_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
{ "resize", "Resize (width)x(height)", OFFSET(resize_expr), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
{ "output_format", "Hardware output format", OFFSET(output_format), AV_OPT_TYPE_INT, { .i64 = AV_PIX_FMT_CUDA }, 0, INT_MAX, VD, .unit = "output_format" },
{ "cuda", "CUDA pitch-linear output", 0, AV_OPT_TYPE_CONST, { .i64 = AV_PIX_FMT_CUDA }, 0, 0, VD, .unit = "output_format" },
{ NULL }
}
#define VD
Definition amfdec.c:787
#define NULL
Definition coverity.c:32
#define OFFSET(x)
static char * output_format
Definition ffprobe.c:145
#define AV_OPT_FLAG_DEPRECATED
Set if option is deprecated, users should refer to AVOption.help text for more information.
Definition opt.h:385
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ 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_CUDA
HW acceleration through CUDA.
Definition pixfmt.h:260

Definition at line 1749 of file cuviddec.c.

◆ cuvid_hw_configs

const AVCodecHWConfigInternal* const cuvid_hw_configs[]
static
Initial value:
= {
.public = {
.pix_fmt = AV_PIX_FMT_CUDA,
.device_type = AV_HWDEVICE_TYPE_CUDA
},
.hwaccel = NULL,
},
}
@ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
The codec supports this format via the hw_frames_ctx interface.
Definition codec.h:295
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
Definition codec.h:282
@ AV_CODEC_HW_CONFIG_METHOD_INTERNAL
The codec supports this format by some internal method.
Definition codec.h:302
@ AV_HWDEVICE_TYPE_CUDA
Definition hwcontext.h:30

Definition at line 1768 of file cuviddec.c.