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 
37 #include "avcodec.h"
38 
39 #define MAX_REGISTERED_FRAMES 64
40 #define RC_MODE_DEPRECATED 0x800000
41 #define RCD(rc_mode) ((rc_mode) | RC_MODE_DEPRECATED)
42 
43 #define NVENCAPI_CHECK_VERSION(major, minor) \
44  ((major) < NVENCAPI_MAJOR_VERSION || ((major) == NVENCAPI_MAJOR_VERSION && (minor) <= NVENCAPI_MINOR_VERSION))
45 
46 // SDK 8.1 compile time feature checks
47 #if NVENCAPI_CHECK_VERSION(8, 1)
48 #define NVENC_HAVE_BFRAME_REF_MODE
49 #define NVENC_HAVE_QP_MAP_MODE
50 #endif
51 
52 // SDK 9.0 compile time feature checks
53 #if NVENCAPI_CHECK_VERSION(9, 0)
54 #define NVENC_HAVE_HEVC_BFRAME_REF_MODE
55 #endif
56 
57 // SDK 9.1 compile time feature checks
58 #if NVENCAPI_CHECK_VERSION(9, 1)
59 #define NVENC_HAVE_MULTIPLE_REF_FRAMES
60 #define NVENC_HAVE_CUSTREAM_PTR
61 #define NVENC_HAVE_GETLASTERRORSTRING
62 #endif
63 
64 typedef struct NvencSurface
65 {
66  NV_ENC_INPUT_PTR input_surface;
68  int reg_idx;
69  int width;
70  int height;
71  int pitch;
72 
73  NV_ENC_OUTPUT_PTR output_surface;
74  NV_ENC_BUFFER_FORMAT format;
75  int size;
76 } NvencSurface;
77 
78 typedef struct NvencDynLoadFunctions
79 {
80  CudaFunctions *cuda_dl;
81  NvencFunctions *nvenc_dl;
82 
83  NV_ENCODE_API_FUNCTION_LIST nvenc_funcs;
86 
87 enum {
98  PRESET_LOSSLESS_DEFAULT, // lossless presets must be the last ones
100 };
101 
102 enum {
107 };
108 
109 enum {
113 };
114 
115 enum {
120 };
121 
122 enum {
125 };
126 
127 typedef struct NvencContext
128 {
130 
132 
133  NV_ENC_INITIALIZE_PARAMS init_encode_params;
134  NV_ENC_CONFIG encode_config;
135  CUcontext cu_context;
137  CUstream cu_stream;
139 
142 
147 
149 
150  struct {
151  void *ptr;
153  NV_ENC_REGISTERED_PTR regptr;
154  int mapped;
155  NV_ENC_MAP_INPUT_RESOURCE in_map;
156  } registered_frames[MAX_REGISTERED_FRAMES];
158 
159  /* the actual data pixel format, different from
160  * AVCodecContext.pix_fmt when using hwaccel frames on input */
161  enum AVPixelFormat data_pix_fmt;
162 
163  /* timestamps of the first two frames, for computing the first dts
164  * when B-frames are present */
165  int64_t initial_pts[2];
167 
169 
170  void *nvencoder;
171 
172  int preset;
173  int profile;
174  int level;
175  int tier;
176  int rc;
177  int cbr;
178  int twopass;
179  int device;
180  int flags;
183  int aq;
186  int b_adapt;
189  int nonref_p;
192  float quality;
193  int aud;
198  int cqp;
200  int coder;
202  int a53_cc;
203  int dpb_size;
204 } NvencContext;
205 
207 
209 
210 int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame);
211 
213 
215  const AVFrame *frame, int *got_packet);
216 
217 extern const enum AVPixelFormat ff_nvenc_pix_fmts[];
218 
219 #endif /* AVCODEC_NVENC_H */
int no_scenecut
Definition: nvenc.h:184
AVClass * avclass
Definition: nvenc.h:129
void * nvencoder
Definition: nvenc.h:170
int support_dyn_bitrate
Definition: nvenc.h:168
enum AVPixelFormat ff_nvenc_pix_fmts[]
Definition: nvenc.c:42
int twopass
Definition: nvenc.h:178
NV_ENC_BUFFER_FORMAT format
Definition: nvenc.h:74
int ff_nvenc_encode_init(AVCodecContext *avctx)
Definition: nvenc.c:1524
int height
Definition: nvenc.h:70
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
AVFifoBuffer * timestamp_list
Definition: nvenc.h:146
NvencFunctions * nvenc_dl
Definition: nvenc.h:81
int mapped
Definition: nvenc.h:154
AVFrame * in_ref
Definition: nvenc.h:67
An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.
int encoder_flushing
Definition: nvenc.h:148
int forced_idr
Definition: nvenc.h:185
NV_ENCODE_API_FUNCTION_LIST nvenc_funcs
Definition: nvenc.h:83
NvencDynLoadFunctions nvenc_dload_funcs
Definition: nvenc.h:131
ID3D11Device * d3d11_device
Definition: nvenc.h:138
int first_packet_output
Definition: nvenc.h:166
static AVPacket pkt
int init_qp_b
Definition: nvenc.h:196
int preset
Definition: nvenc.h:172
int pitch
Definition: nvenc.h:71
int nvenc_device_count
Definition: nvenc.h:84
NV_ENC_INPUT_PTR input_surface
Definition: nvenc.h:66
int aq
Definition: nvenc.h:183
int b_ref_mode
Definition: nvenc.h:201
CUcontext cu_context
Definition: nvenc.h:135
AVFifoBuffer * unused_surface_queue
Definition: nvenc.h:143
AVOptions.
int init_qp_p
Definition: nvenc.h:195
int ff_nvenc_encode_close(AVCodecContext *avctx)
Definition: nvenc.c:1449
int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: nvenc.c:2202
float quality
Definition: nvenc.h:192
NV_ENC_INITIALIZE_PARAMS init_encode_params
Definition: nvenc.h:133
#define MAX_REGISTERED_FRAMES
Definition: nvenc.h:39
AVFifoBuffer * output_surface_ready_queue
Definition: nvenc.h:145
CUcontext cu_context_internal
Definition: nvenc.h:136
int ptr_index
Definition: nvenc.h:152
int async_depth
Definition: nvenc.h:181
void * ptr
Definition: nvenc.h:151
int coder
Definition: nvenc.h:200
int rc
Definition: nvenc.h:176
int nb_registered_frames
Definition: nvenc.h:157
int level
Definition: nvenc.h:174
void ID3D11Device
Definition: nvenc.h:28
int bluray_compat
Definition: nvenc.h:194
int aq_strength
Definition: nvenc.h:191
int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: nvenc.c:2238
int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Definition: nvenc.c:2074
int flags
Definition: nvenc.h:180
NV_ENC_REGISTERED_PTR regptr
Definition: nvenc.h:153
int dpb_size
Definition: nvenc.h:203
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
int profile
Definition: nvenc.h:173
AVFifoBuffer * output_surface_queue
Definition: nvenc.h:144
CudaFunctions * cuda_dl
Definition: nvenc.h:80
NV_ENC_CONFIG encode_config
Definition: nvenc.h:134
Libavcodec external API header.
int strict_gop
Definition: nvenc.h:190
int temporal_aq
Definition: nvenc.h:187
main external API structure.
Definition: avcodec.h:1568
int init_qp_i
Definition: nvenc.h:197
a very simple circular buffer FIFO implementation
Describe the class of an AVClass context structure.
Definition: log.h:67
int width
Definition: nvenc.h:69
int nonref_p
Definition: nvenc.h:189
int cbr
Definition: nvenc.h:177
int reg_idx
Definition: nvenc.h:68
int b_adapt
Definition: nvenc.h:186
int weighted_pred
Definition: nvenc.h:199
int rc_lookahead
Definition: nvenc.h:182
int size
Definition: nvenc.h:75
NvencSurface * surfaces
Definition: nvenc.h:141
NV_ENC_MAP_INPUT_RESOURCE in_map
Definition: nvenc.h:155
CUstream cu_stream
Definition: nvenc.h:137
int device
Definition: nvenc.h:179
int nb_surfaces
Definition: nvenc.h:140
int aud
Definition: nvenc.h:193
int cqp
Definition: nvenc.h:198
int tier
Definition: nvenc.h:175
int a53_cc
Definition: nvenc.h:202
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: avcodec.h:1457
NV_ENC_OUTPUT_PTR output_surface
Definition: nvenc.h:73
int zerolatency
Definition: nvenc.h:188