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;
157  } registered_frames[MAX_REGISTERED_FRAMES];
159 
160  /* the actual data pixel format, different from
161  * AVCodecContext.pix_fmt when using hwaccel frames on input */
162  enum AVPixelFormat data_pix_fmt;
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 */
int no_scenecut
Definition: nvenc.h:180
AVClass * avclass
Definition: nvenc.h:130
void * nvencoder
Definition: nvenc.h:166
int support_dyn_bitrate
Definition: nvenc.h:164
enum AVPixelFormat ff_nvenc_pix_fmts[]
Definition: nvenc.c:42
int twopass
Definition: nvenc.h:174
NV_ENC_BUFFER_FORMAT format
Definition: nvenc.h:75
int ff_nvenc_encode_init(AVCodecContext *avctx)
Definition: nvenc.c:1536
int height
Definition: nvenc.h:71
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
AVFifoBuffer * timestamp_list
Definition: nvenc.h:147
NvencFunctions * nvenc_dl
Definition: nvenc.h:82
int mapped
Definition: nvenc.h:155
AVFrame * in_ref
Definition: nvenc.h:68
An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.
int encoder_flushing
Definition: nvenc.h:149
int forced_idr
Definition: nvenc.h:181
NV_ENCODE_API_FUNCTION_LIST nvenc_funcs
Definition: nvenc.h:84
NvencDynLoadFunctions nvenc_dload_funcs
Definition: nvenc.h:132
ID3D11Device * d3d11_device
Definition: nvenc.h:139
static AVPacket pkt
int init_qp_b
Definition: nvenc.h:192
int preset
Definition: nvenc.h:168
int pitch
Definition: nvenc.h:72
int nvenc_device_count
Definition: nvenc.h:85
NV_ENC_INPUT_PTR input_surface
Definition: nvenc.h:67
void ff_nvenc_encode_flush(AVCodecContext *avctx)
Definition: nvenc.c:2244
int aq
Definition: nvenc.h:179
int b_ref_mode
Definition: nvenc.h:197
CUcontext cu_context
Definition: nvenc.h:136
AVFifoBuffer * unused_surface_queue
Definition: nvenc.h:144
AVOptions.
int init_qp_p
Definition: nvenc.h:191
int ff_nvenc_encode_close(AVCodecContext *avctx)
Definition: nvenc.c:1461
int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: nvenc.c:2184
float quality
Definition: nvenc.h:188
NV_ENC_INITIALIZE_PARAMS init_encode_params
Definition: nvenc.h:134
#define MAX_REGISTERED_FRAMES
Definition: nvenc.h:40
AVFifoBuffer * output_surface_ready_queue
Definition: nvenc.h:146
CUcontext cu_context_internal
Definition: nvenc.h:137
int ptr_index
Definition: nvenc.h:153
int async_depth
Definition: nvenc.h:177
void * ptr
Definition: nvenc.h:152
int coder
Definition: nvenc.h:196
int rc
Definition: nvenc.h:172
const AVCodecHWConfigInternal * ff_nvenc_hw_configs[]
Definition: nvenc.c:58
int nb_registered_frames
Definition: nvenc.h:158
int level
Definition: nvenc.h:170
void ID3D11Device
Definition: nvenc.h:28
int bluray_compat
Definition: nvenc.h:190
int aq_strength
Definition: nvenc.h:187
int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: nvenc.c:2220
int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Definition: nvenc.c:2064
int flags
Definition: nvenc.h:176
NV_ENC_REGISTERED_PTR regptr
Definition: nvenc.h:154
int dpb_size
Definition: nvenc.h:199
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:169
AVFifoBuffer * output_surface_queue
Definition: nvenc.h:145
CudaFunctions * cuda_dl
Definition: nvenc.h:81
NV_ENC_CONFIG encode_config
Definition: nvenc.h:135
Libavcodec external API header.
int strict_gop
Definition: nvenc.h:186
int temporal_aq
Definition: nvenc.h:183
main external API structure.
Definition: avcodec.h:526
int init_qp_i
Definition: nvenc.h:193
a very simple circular buffer FIFO implementation
Describe the class of an AVClass context structure.
Definition: log.h:67
int width
Definition: nvenc.h:70
int nonref_p
Definition: nvenc.h:185
int cbr
Definition: nvenc.h:173
int reg_idx
Definition: nvenc.h:69
int b_adapt
Definition: nvenc.h:182
int weighted_pred
Definition: nvenc.h:195
int rc_lookahead
Definition: nvenc.h:178
int size
Definition: nvenc.h:76
NvencSurface * surfaces
Definition: nvenc.h:142
NV_ENC_MAP_INPUT_RESOURCE in_map
Definition: nvenc.h:156
CUstream cu_stream
Definition: nvenc.h:138
int device
Definition: nvenc.h:175
int nb_surfaces
Definition: nvenc.h:141
int aud
Definition: nvenc.h:189
int cqp
Definition: nvenc.h:194
int tier
Definition: nvenc.h:171
int a53_cc
Definition: nvenc.h:198
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: packet.h:332
NV_ENC_OUTPUT_PTR output_surface
Definition: nvenc.h:74
int zerolatency
Definition: nvenc.h:184