#include "compat/cuda/dynlink_loader.h"
#include "libavutil/fifo.h"
#include "libavutil/opt.h"
+#include "hwconfig.h"
#include "avcodec.h"
#define NVENC_HAVE_HEVC_BFRAME_REF_MODE
#endif
+// SDK 9.1 compile time feature checks
+#if NVENCAPI_CHECK_VERSION(9, 1)
+#define NVENC_HAVE_MULTIPLE_REF_FRAMES
+#define NVENC_HAVE_CUSTREAM_PTR
+#define NVENC_HAVE_GETLASTERRORSTRING
+#endif
+
+// SDK 10.0 compile time feature checks
+#if NVENCAPI_CHECK_VERSION(10, 0)
+#define NVENC_HAVE_NEW_PRESETS
+#define NVENC_HAVE_MULTIPASS
+#define NVENC_HAVE_LDKFS
+#define NVENC_HAVE_H264_LVL6
+#endif
+
typedef struct NvencSurface
{
NV_ENC_INPUT_PTR input_surface;
NV_ENC_OUTPUT_PTR output_surface;
NV_ENC_BUFFER_FORMAT format;
- int size;
} NvencSurface;
typedef struct NvencDynLoadFunctions
PRESET_LOW_LATENCY_DEFAULT ,
PRESET_LOW_LATENCY_HQ ,
PRESET_LOW_LATENCY_HP,
- PRESET_LOSSLESS_DEFAULT, // lossless presets must be the last ones
+ PRESET_LOSSLESS_DEFAULT,
PRESET_LOSSLESS_HP,
+#ifdef NVENC_HAVE_NEW_PRESETS
+ PRESET_P1,
+ PRESET_P2,
+ PRESET_P3,
+ PRESET_P4,
+ PRESET_P5,
+ PRESET_P6,
+ PRESET_P7,
+#endif
};
enum {
NVENC_LOSSLESS = 2,
NVENC_ONE_PASS = 4,
NVENC_TWO_PASSES = 8,
+
+ NVENC_DEPRECATED_PRESET = 0x8000,
};
enum {
NV_ENC_CONFIG encode_config;
CUcontext cu_context;
CUcontext cu_context_internal;
+ CUstream cu_stream;
ID3D11Device *d3d11_device;
+ AVFrame *frame;
+
int nb_surfaces;
NvencSurface *surfaces;
AVFifoBuffer *output_surface_ready_queue;
AVFifoBuffer *timestamp_list;
- int encoder_flushing;
-
struct {
void *ptr;
int ptr_index;
* AVCodecContext.pix_fmt when using hwaccel frames on input */
enum AVPixelFormat data_pix_fmt;
- /* timestamps of the first two frames, for computing the first dts
- * when B-frames are present */
- int64_t initial_pts[2];
- int first_packet_output;
-
int support_dyn_bitrate;
void *nvencoder;
int coder;
int b_ref_mode;
int a53_cc;
+ int s12m_tc;
+ int dpb_size;
+ int tuning_info;
+ int multipass;
+ int ldkfs;
} NvencContext;
int ff_nvenc_encode_init(AVCodecContext *avctx);
int ff_nvenc_encode_close(AVCodecContext *avctx);
-int ff_nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame);
-
int ff_nvenc_receive_packet(AVCodecContext *avctx, AVPacket *pkt);
-int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
- const AVFrame *frame, int *got_packet);
+void ff_nvenc_encode_flush(AVCodecContext *avctx);
extern const enum AVPixelFormat ff_nvenc_pix_fmts[];
+extern const AVCodecHWConfigInternal *const ff_nvenc_hw_configs[];
#endif /* AVCODEC_NVENC_H */