FFmpeg
nvenc.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AVCODEC_NVENC_H
20 #define AVCODEC_NVENC_H
21 
22 #include "config.h"
23 
24 #if CONFIG_D3D11VA
25 #define COBJMACROS
27 #else
28 typedef void ID3D11Device;
29 #endif
30 
31 #include <ffnvcodec/nvEncodeAPI.h>
32 
34 #include "libavutil/fifo.h"
35 #include "libavutil/opt.h"
36 #include "hwconfig.h"
37 
38 #include "avcodec.h"
39 
40 #define MAX_REGISTERED_FRAMES 64
41 #define RC_MODE_DEPRECATED 0x800000
42 #define RCD(rc_mode) ((rc_mode) | RC_MODE_DEPRECATED)
43 
44 #define NVENCAPI_CHECK_VERSION(major, minor) \
45  ((major) < NVENCAPI_MAJOR_VERSION || ((major) == NVENCAPI_MAJOR_VERSION && (minor) <= NVENCAPI_MINOR_VERSION))
46 
47 // SDK 8.1 compile time feature checks
48 #if NVENCAPI_CHECK_VERSION(8, 1)
49 #define NVENC_HAVE_BFRAME_REF_MODE
50 #define NVENC_HAVE_QP_MAP_MODE
51 #endif
52 
53 // SDK 9.0 compile time feature checks
54 #if NVENCAPI_CHECK_VERSION(9, 0)
55 #define NVENC_HAVE_HEVC_BFRAME_REF_MODE
56 #endif
57 
58 // SDK 9.1 compile time feature checks
59 #if NVENCAPI_CHECK_VERSION(9, 1)
60 #define NVENC_HAVE_MULTIPLE_REF_FRAMES
61 #define NVENC_HAVE_CUSTREAM_PTR
62 #define NVENC_HAVE_GETLASTERRORSTRING
63 #endif
64 
65 typedef struct NvencSurface
66 {
67  NV_ENC_INPUT_PTR input_surface;
69  int reg_idx;
70  int width;
71  int height;
72  int pitch;
73 
74  NV_ENC_OUTPUT_PTR output_surface;
75  NV_ENC_BUFFER_FORMAT format;
76  int size;
77 } NvencSurface;
78 
79 typedef struct NvencDynLoadFunctions
80 {
81  CudaFunctions *cuda_dl;
82  NvencFunctions *nvenc_dl;
83 
84  NV_ENCODE_API_FUNCTION_LIST nvenc_funcs;
87 
88 enum {
99  PRESET_LOSSLESS_DEFAULT, // lossless presets must be the last ones
101 };
102 
103 enum {
108 };
109 
110 enum {
114 };
115 
116 enum {
121 };
122 
123 enum {
126 };
127 
128 typedef struct NvencContext
129 {
131 
133 
134  NV_ENC_INITIALIZE_PARAMS init_encode_params;
135  NV_ENC_CONFIG encode_config;
136  CUcontext cu_context;
138  CUstream cu_stream;
140 
143 
148 
150 
151  struct {
152  void *ptr;
154  NV_ENC_REGISTERED_PTR regptr;
155  int mapped;
156  NV_ENC_MAP_INPUT_RESOURCE in_map;
159 
160  /* the actual data pixel format, different from
161  * AVCodecContext.pix_fmt when using hwaccel frames on input */
163 
165 
166  void *nvencoder;
167 
168  int preset;
169  int profile;
170  int level;
171  int tier;
172  int rc;
173  int cbr;
174  int twopass;
175  int device;
176  int flags;
179  int aq;
182  int b_adapt;
185  int nonref_p;
188  float quality;
189  int aud;
194  int cqp;
196  int coder;
198  int a53_cc;
199  int dpb_size;
200 } NvencContext;
201 
203 
205 
206 int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame);
207 
209 
211  const AVFrame *frame, int *got_packet);
212 
214 
215 extern const enum AVPixelFormat ff_nvenc_pix_fmts[];
217 
218 #endif /* AVCODEC_NVENC_H */
NvencContext::twopass
int twopass
Definition: nvenc.h:174
hwconfig.h
NvencContext::b_adapt
int b_adapt
Definition: nvenc.h:182
NvencContext::zerolatency
int zerolatency
Definition: nvenc.h:184
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
NvencContext::output_surface_ready_queue
AVFifoBuffer * output_surface_ready_queue
Definition: nvenc.h:146
ff_nvenc_send_frame
int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Definition: nvenc.c:2070
opt.h
NvencContext::bluray_compat
int bluray_compat
Definition: nvenc.h:190
NvencContext::preset
int preset
Definition: nvenc.h:168
NvencContext
Definition: nvenc.h:128
NvencSurface::in_ref
AVFrame * in_ref
Definition: nvenc.h:68
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
NvencContext::nb_surfaces
int nb_surfaces
Definition: nvenc.h:141
NvencContext::ptr_index
int ptr_index
Definition: nvenc.h:153
NvencContext::encode_config
NV_ENC_CONFIG encode_config
Definition: nvenc.h:135
NvencContext::nvenc_dload_funcs
NvencDynLoadFunctions nvenc_dload_funcs
Definition: nvenc.h:132
NV_ENC_H264_PROFILE_HIGH
@ NV_ENC_H264_PROFILE_HIGH
Definition: nvenc.h:106
PRESET_LOW_LATENCY_HP
@ PRESET_LOW_LATENCY_HP
Definition: nvenc.h:98
NvencSurface
Definition: nvenc.h:65
NvencSurface::size
int size
Definition: nvenc.h:76
NvencContext::profile
int profile
Definition: nvenc.h:169
NV_ENC_HEVC_PROFILE_MAIN
@ NV_ENC_HEVC_PROFILE_MAIN
Definition: nvenc.h:111
NVENC_TWO_PASSES
@ NVENC_TWO_PASSES
Definition: nvenc.h:120
PRESET_MEDIUM
@ PRESET_MEDIUM
Definition: nvenc.h:91
NvencContext::regptr
NV_ENC_REGISTERED_PTR regptr
Definition: nvenc.h:154
AVFifoBuffer
Definition: fifo.h:31
NvencContext::no_scenecut
int no_scenecut
Definition: nvenc.h:180
NvencContext::cbr
int cbr
Definition: nvenc.h:173
NvencDynLoadFunctions::nvenc_device_count
int nvenc_device_count
Definition: nvenc.h:85
fifo.h
NvencContext::nvencoder
void * nvencoder
Definition: nvenc.h:166
PRESET_LOW_LATENCY_HQ
@ PRESET_LOW_LATENCY_HQ
Definition: nvenc.h:97
NvencContext::temporal_aq
int temporal_aq
Definition: nvenc.h:183
LIST_DEVICES
@ LIST_DEVICES
Definition: nvenc.h:124
NvencSurface::format
NV_ENC_BUFFER_FORMAT format
Definition: nvenc.h:75
NvencContext::init_encode_params
NV_ENC_INITIALIZE_PARAMS init_encode_params
Definition: nvenc.h:134
NvencContext::cu_stream
CUstream cu_stream
Definition: nvenc.h:138
PRESET_LOW_LATENCY_DEFAULT
@ PRESET_LOW_LATENCY_DEFAULT
Definition: nvenc.h:96
NvencContext::device
int device
Definition: nvenc.h:175
PRESET_HP
@ PRESET_HP
Definition: nvenc.h:93
NvencContext::surfaces
NvencSurface * surfaces
Definition: nvenc.h:142
NVENC_ONE_PASS
@ NVENC_ONE_PASS
Definition: nvenc.h:119
NV_ENC_HEVC_PROFILE_REXT
@ NV_ENC_HEVC_PROFILE_REXT
Definition: nvenc.h:113
NvencContext::b_ref_mode
int b_ref_mode
Definition: nvenc.h:197
NvencContext::cu_context
CUcontext cu_context
Definition: nvenc.h:136
NvencDynLoadFunctions
Definition: nvenc.h:79
NvencContext::registered_frames
struct NvencContext::@111 registered_frames[MAX_REGISTERED_FRAMES]
NvencContext::dpb_size
int dpb_size
Definition: nvenc.h:199
NVENC_LOWLATENCY
@ NVENC_LOWLATENCY
Definition: nvenc.h:117
NvencContext::cqp
int cqp
Definition: nvenc.h:194
NvencDynLoadFunctions::nvenc_dl
NvencFunctions * nvenc_dl
Definition: nvenc.h:82
NvencSurface::pitch
int pitch
Definition: nvenc.h:72
NvencSurface::input_surface
NV_ENC_INPUT_PTR input_surface
Definition: nvenc.h:67
PRESET_HQ
@ PRESET_HQ
Definition: nvenc.h:94
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
NvencSurface::reg_idx
int reg_idx
Definition: nvenc.h:69
PRESET_DEFAULT
@ PRESET_DEFAULT
Definition: nvenc.h:89
NvencDynLoadFunctions::cuda_dl
CudaFunctions * cuda_dl
Definition: nvenc.h:81
NvencContext::encoder_flushing
int encoder_flushing
Definition: nvenc.h:149
NvencContext::avclass
AVClass * avclass
Definition: nvenc.h:130
NvencContext::aq
int aq
Definition: nvenc.h:179
ff_nvenc_encode_init
int ff_nvenc_encode_init(AVCodecContext *avctx)
Definition: nvenc.c:1542
PRESET_FAST
@ PRESET_FAST
Definition: nvenc.h:92
NvencContext::in_map
NV_ENC_MAP_INPUT_RESOURCE in_map
Definition: nvenc.h:156
NvencContext::timestamp_list
AVFifoBuffer * timestamp_list
Definition: nvenc.h:147
PRESET_LOSSLESS_HP
@ PRESET_LOSSLESS_HP
Definition: nvenc.h:100
MAX_REGISTERED_FRAMES
#define MAX_REGISTERED_FRAMES
Definition: nvenc.h:40
NvencContext::init_qp_b
int init_qp_b
Definition: nvenc.h:192
NvencContext::data_pix_fmt
enum AVPixelFormat data_pix_fmt
Definition: nvenc.h:162
NvencContext::quality
float quality
Definition: nvenc.h:188
NvencContext::aq_strength
int aq_strength
Definition: nvenc.h:187
PRESET_BD
@ PRESET_BD
Definition: nvenc.h:95
AVCodecHWConfigInternal
Definition: hwconfig.h:29
NvencContext::flags
int flags
Definition: nvenc.h:176
NV_ENC_H264_PROFILE_BASELINE
@ NV_ENC_H264_PROFILE_BASELINE
Definition: nvenc.h:104
NvencContext::support_dyn_bitrate
int support_dyn_bitrate
Definition: nvenc.h:164
NvencContext::init_qp_i
int init_qp_i
Definition: nvenc.h:193
ff_nvenc_encode_frame
int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: nvenc.c:2226
NvencContext::a53_cc
int a53_cc
Definition: nvenc.h:198
ff_nvenc_hw_configs
const AVCodecHWConfigInternal * ff_nvenc_hw_configs[]
Definition: nvenc.c:59
ff_nvenc_encode_flush
void ff_nvenc_encode_flush(AVCodecContext *avctx)
Definition: nvenc.c:2250
NvencContext::ptr
void * ptr
Definition: nvenc.h:152
NV_ENC_HEVC_PROFILE_MAIN_10
@ NV_ENC_HEVC_PROFILE_MAIN_10
Definition: nvenc.h:112
NvencContext::init_qp_p
int init_qp_p
Definition: nvenc.h:191
NvencContext::forced_idr
int forced_idr
Definition: nvenc.h:181
NvencContext::rc
int rc
Definition: nvenc.h:172
NvencContext::rc_lookahead
int rc_lookahead
Definition: nvenc.h:178
NvencContext::nonref_p
int nonref_p
Definition: nvenc.h:185
NvencContext::unused_surface_queue
AVFifoBuffer * unused_surface_queue
Definition: nvenc.h:144
NV_ENC_H264_PROFILE_HIGH_444P
@ NV_ENC_H264_PROFILE_HIGH_444P
Definition: nvenc.h:107
NvencSurface::width
int width
Definition: nvenc.h:70
avcodec.h
ff_nvenc_receive_packet
int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: nvenc.c:2190
NvencContext::mapped
int mapped
Definition: nvenc.h:155
NvencContext::level
int level
Definition: nvenc.h:170
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
PRESET_SLOW
@ PRESET_SLOW
Definition: nvenc.h:90
NV_ENC_H264_PROFILE_MAIN
@ NV_ENC_H264_PROFILE_MAIN
Definition: nvenc.h:105
NvencContext::weighted_pred
int weighted_pred
Definition: nvenc.h:195
AVCodecContext
main external API structure.
Definition: avcodec.h:526
ff_nvenc_encode_close
int ff_nvenc_encode_close(AVCodecContext *avctx)
Definition: nvenc.c:1467
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
NvencSurface::height
int height
Definition: nvenc.h:71
NvencSurface::output_surface
NV_ENC_OUTPUT_PTR output_surface
Definition: nvenc.h:74
NvencContext::async_depth
int async_depth
Definition: nvenc.h:177
NvencDynLoadFunctions::nvenc_funcs
NV_ENCODE_API_FUNCTION_LIST nvenc_funcs
Definition: nvenc.h:84
NVENC_LOSSLESS
@ NVENC_LOSSLESS
Definition: nvenc.h:118
NvencContext::nb_registered_frames
int nb_registered_frames
Definition: nvenc.h:158
ANY_DEVICE
@ ANY_DEVICE
Definition: nvenc.h:125
NvencContext::aud
int aud
Definition: nvenc.h:189
NvencContext::coder
int coder
Definition: nvenc.h:196
AVPacket
This structure stores compressed data.
Definition: packet.h:332
NvencContext::tier
int tier
Definition: nvenc.h:171
ff_nvenc_pix_fmts
enum AVPixelFormat ff_nvenc_pix_fmts[]
Definition: nvenc.c:43
ID3D11Device
void ID3D11Device
Definition: nvenc.h:28
NvencContext::cu_context_internal
CUcontext cu_context_internal
Definition: nvenc.h:137
PRESET_LOSSLESS_DEFAULT
@ PRESET_LOSSLESS_DEFAULT
Definition: nvenc.h:99
NvencContext::strict_gop
int strict_gop
Definition: nvenc.h:186
hwcontext_d3d11va.h
NvencContext::output_surface_queue
AVFifoBuffer * output_surface_queue
Definition: nvenc.h:145
NvencContext::d3d11_device
ID3D11Device * d3d11_device
Definition: nvenc.h:139