mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
nvenc: H264 and HEVC encoders
Partially based on the work of Timo Rothenpieler <timo@rothenpieler.org> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
parent
522d971c7f
commit
b08caa87c3
@ -31,6 +31,7 @@ version <next>:
|
|||||||
- Canopus HQ/HQA decoder
|
- Canopus HQ/HQA decoder
|
||||||
- Automatically rotate videos based on metadata in avconv
|
- Automatically rotate videos based on metadata in avconv
|
||||||
- improved Quickdraw compatibility
|
- improved Quickdraw compatibility
|
||||||
|
- NVIDIA NVENC-accelerated H.264 and HEVC encoding support
|
||||||
|
|
||||||
|
|
||||||
version 11:
|
version 11:
|
||||||
|
16
configure
vendored
16
configure
vendored
@ -220,6 +220,7 @@ External library support:
|
|||||||
--enable-libxvid enable Xvid encoding via xvidcore,
|
--enable-libxvid enable Xvid encoding via xvidcore,
|
||||||
native MPEG-4/Xvid encoder exists [no]
|
native MPEG-4/Xvid encoder exists [no]
|
||||||
--enable-mmal enable decoding via MMAL [no]
|
--enable-mmal enable decoding via MMAL [no]
|
||||||
|
--enable-nvenc enable encoding via NVENC [no]
|
||||||
--enable-openssl enable openssl [no]
|
--enable-openssl enable openssl [no]
|
||||||
--enable-x11grab enable X11 grabbing (legacy) [no]
|
--enable-x11grab enable X11 grabbing (legacy) [no]
|
||||||
--enable-zlib enable zlib [autodetect]
|
--enable-zlib enable zlib [autodetect]
|
||||||
@ -1191,6 +1192,7 @@ EXTERNAL_LIBRARY_LIST="
|
|||||||
libxcb_xfixes
|
libxcb_xfixes
|
||||||
libxvid
|
libxvid
|
||||||
mmal
|
mmal
|
||||||
|
nvenc
|
||||||
openssl
|
openssl
|
||||||
x11grab
|
x11grab
|
||||||
zlib
|
zlib
|
||||||
@ -1483,6 +1485,7 @@ SYSTEM_FUNCS="
|
|||||||
inet_aton
|
inet_aton
|
||||||
isatty
|
isatty
|
||||||
jack_port_get_latency_range
|
jack_port_get_latency_range
|
||||||
|
LoadLibrary
|
||||||
localtime_r
|
localtime_r
|
||||||
mach_absolute_time
|
mach_absolute_time
|
||||||
MapViewOfFile
|
MapViewOfFile
|
||||||
@ -1780,6 +1783,8 @@ mpegaudio_select="mpegaudiodsp"
|
|||||||
mpegaudiodsp_select="dct"
|
mpegaudiodsp_select="dct"
|
||||||
mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
|
mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
|
||||||
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
|
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
|
||||||
|
nvenc_deps_any="dlopen LoadLibrary"
|
||||||
|
nvenc_extralibs='$ldl'
|
||||||
qsvdec_select="qsv"
|
qsvdec_select="qsv"
|
||||||
qsvenc_select="qsv"
|
qsvenc_select="qsv"
|
||||||
|
|
||||||
@ -1849,11 +1854,13 @@ h263i_decoder_select="h263_decoder"
|
|||||||
h263p_encoder_select="h263_encoder"
|
h263p_encoder_select="h263_encoder"
|
||||||
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
|
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
|
||||||
h264_decoder_suggest="error_resilience"
|
h264_decoder_suggest="error_resilience"
|
||||||
|
h264_nvenc_encoder_deps="nvenc"
|
||||||
h264_qsv_decoder_deps="libmfx"
|
h264_qsv_decoder_deps="libmfx"
|
||||||
h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec h264_qsv_hwaccel"
|
h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec h264_qsv_hwaccel"
|
||||||
h264_qsv_encoder_deps="libmfx"
|
h264_qsv_encoder_deps="libmfx"
|
||||||
h264_qsv_encoder_select="qsvenc"
|
h264_qsv_encoder_select="qsvenc"
|
||||||
hevc_decoder_select="bswapdsp cabac golomb videodsp"
|
hevc_decoder_select="bswapdsp cabac golomb videodsp"
|
||||||
|
hevc_nvenc_encoder_deps="nvenc"
|
||||||
huffyuv_decoder_select="bswapdsp huffyuvdsp"
|
huffyuv_decoder_select="bswapdsp huffyuvdsp"
|
||||||
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
|
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
|
||||||
iac_decoder_select="imc_decoder"
|
iac_decoder_select="imc_decoder"
|
||||||
@ -3822,6 +3829,7 @@ die_license_disabled gpl x11grab
|
|||||||
|
|
||||||
die_license_disabled nonfree libfaac
|
die_license_disabled nonfree libfaac
|
||||||
die_license_disabled nonfree libfdk_aac
|
die_license_disabled nonfree libfdk_aac
|
||||||
|
die_license_disabled nonfree nvenc
|
||||||
die_license_disabled nonfree openssl
|
die_license_disabled nonfree openssl
|
||||||
|
|
||||||
die_license_disabled version3 libopencore_amrnb
|
die_license_disabled version3 libopencore_amrnb
|
||||||
@ -4188,6 +4196,7 @@ check_func_headers windows.h CoTaskMemFree -lole32
|
|||||||
check_func_headers windows.h GetProcessAffinityMask
|
check_func_headers windows.h GetProcessAffinityMask
|
||||||
check_func_headers windows.h GetProcessTimes
|
check_func_headers windows.h GetProcessTimes
|
||||||
check_func_headers windows.h GetSystemTimeAsFileTime
|
check_func_headers windows.h GetSystemTimeAsFileTime
|
||||||
|
check_func_headers windows.h LoadLibrary
|
||||||
check_func_headers windows.h MapViewOfFile
|
check_func_headers windows.h MapViewOfFile
|
||||||
check_func_headers windows.h SetConsoleTextAttribute
|
check_func_headers windows.h SetConsoleTextAttribute
|
||||||
check_func_headers windows.h Sleep
|
check_func_headers windows.h Sleep
|
||||||
@ -4340,6 +4349,13 @@ if enabled libdc1394; then
|
|||||||
die "ERROR: No version of libdc1394 found "
|
die "ERROR: No version of libdc1394 found "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if enabled nvenc; then
|
||||||
|
check_header cuda.h || die "ERROR: cuda.h not found.";
|
||||||
|
check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found.";
|
||||||
|
check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" ||
|
||||||
|
die "ERROR: NVENC API version 4 or older is not supported";
|
||||||
|
fi
|
||||||
|
|
||||||
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
||||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||||
|
@ -82,6 +82,7 @@ OBJS-$(CONFIG_MPEGVIDEOENC) += mpegvideo_enc.o mpeg12data.o \
|
|||||||
motion_est.o ratecontrol.o \
|
motion_est.o ratecontrol.o \
|
||||||
mpegvideoencdsp.o
|
mpegvideoencdsp.o
|
||||||
OBJS-$(CONFIG_PIXBLOCKDSP) += pixblockdsp.o
|
OBJS-$(CONFIG_PIXBLOCKDSP) += pixblockdsp.o
|
||||||
|
OBJS-${CONFIG_NVENC} += nvenc.o
|
||||||
OBJS-$(CONFIG_QPELDSP) += qpeldsp.o
|
OBJS-$(CONFIG_QPELDSP) += qpeldsp.o
|
||||||
OBJS-$(CONFIG_QSV) += qsv.o
|
OBJS-$(CONFIG_QSV) += qsv.o
|
||||||
OBJS-$(CONFIG_QSVDEC) += qsvdec.o
|
OBJS-$(CONFIG_QSVDEC) += qsvdec.o
|
||||||
@ -228,11 +229,13 @@ OBJS-$(CONFIG_H264_DECODER) += h264.o h264_cabac.o h264_cavlc.o \
|
|||||||
h264_mb.o h264_picture.o h264_ps.o \
|
h264_mb.o h264_picture.o h264_ps.o \
|
||||||
h264_refs.o h264_sei.o h264_slice.o
|
h264_refs.o h264_sei.o h264_slice.o
|
||||||
OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o
|
OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o
|
||||||
|
OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc_h264.o
|
||||||
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h264.o
|
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h264.o
|
||||||
OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
|
OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
|
||||||
OBJS-$(CONFIG_HEVC_DECODER) += hevc.o hevc_mvs.o hevc_ps.o hevc_sei.o \
|
OBJS-$(CONFIG_HEVC_DECODER) += hevc.o hevc_mvs.o hevc_ps.o hevc_sei.o \
|
||||||
hevc_cabac.o hevc_refs.o hevcpred.o \
|
hevc_cabac.o hevc_refs.o hevcpred.o \
|
||||||
hevcdsp.o hevc_filter.o
|
hevcdsp.o hevc_filter.o
|
||||||
|
OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc_hevc.o
|
||||||
OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o
|
OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o
|
||||||
OBJS-$(CONFIG_HQ_HQA_DECODER) += hq_hqa.o hq_hqadata.o hq_hqadsp.o \
|
OBJS-$(CONFIG_HQ_HQA_DECODER) += hq_hqa.o hq_hqadata.o hq_hqadsp.o \
|
||||||
canopus.o
|
canopus.o
|
||||||
|
@ -478,7 +478,9 @@ void avcodec_register_all(void)
|
|||||||
/* external libraries, that shouldn't be used by default if one of the
|
/* external libraries, that shouldn't be used by default if one of the
|
||||||
* above is available */
|
* above is available */
|
||||||
REGISTER_ENCODER(LIBOPENH264, libopenh264);
|
REGISTER_ENCODER(LIBOPENH264, libopenh264);
|
||||||
|
REGISTER_ENCODER(H264_NVENC, h264_nvenc);
|
||||||
REGISTER_ENCODER(H264_QSV, h264_qsv);
|
REGISTER_ENCODER(H264_QSV, h264_qsv);
|
||||||
|
REGISTER_ENCODER(HEVC_NVENC, hevc_nvenc);
|
||||||
|
|
||||||
/* parsers */
|
/* parsers */
|
||||||
REGISTER_PARSER(AAC, aac);
|
REGISTER_PARSER(AAC, aac);
|
||||||
|
1136
libavcodec/nvenc.c
Normal file
1136
libavcodec/nvenc.c
Normal file
File diff suppressed because it is too large
Load Diff
135
libavcodec/nvenc.h
Normal file
135
libavcodec/nvenc.h
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_NVENC_H
|
||||||
|
#define AVCODEC_NVENC_H
|
||||||
|
|
||||||
|
#include <cuda.h>
|
||||||
|
#include <nvEncodeAPI.h>
|
||||||
|
|
||||||
|
#include "libavutil/fifo.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
|
#include "avcodec.h"
|
||||||
|
|
||||||
|
typedef struct NVENCInputSurface {
|
||||||
|
NV_ENC_INPUT_PTR in;
|
||||||
|
NV_ENC_BUFFER_FORMAT format;
|
||||||
|
int locked;
|
||||||
|
} NVENCInputSurface;
|
||||||
|
|
||||||
|
typedef struct NVENCOutputSurface {
|
||||||
|
NV_ENC_OUTPUT_PTR out;
|
||||||
|
NVENCInputSurface *in;
|
||||||
|
int busy;
|
||||||
|
} NVENCOutputSurface;
|
||||||
|
|
||||||
|
typedef CUresult(CUDAAPI *PCUINIT)(unsigned int Flags);
|
||||||
|
typedef CUresult(CUDAAPI *PCUDEVICEGETCOUNT)(int *count);
|
||||||
|
typedef CUresult(CUDAAPI *PCUDEVICEGET)(CUdevice *device, int ordinal);
|
||||||
|
typedef CUresult(CUDAAPI *PCUDEVICEGETNAME)(char *name, int len, CUdevice dev);
|
||||||
|
typedef CUresult(CUDAAPI *PCUDEVICECOMPUTECAPABILITY)(int *major, int *minor, CUdevice dev);
|
||||||
|
typedef CUresult(CUDAAPI *PCUCTXCREATE)(CUcontext *pctx, unsigned int flags, CUdevice dev);
|
||||||
|
typedef CUresult(CUDAAPI *PCUCTXPOPCURRENT)(CUcontext *pctx);
|
||||||
|
typedef CUresult(CUDAAPI *PCUCTXDESTROY)(CUcontext ctx);
|
||||||
|
|
||||||
|
typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTION_LIST *functionList);
|
||||||
|
|
||||||
|
typedef struct NVENCLibraryContext
|
||||||
|
{
|
||||||
|
void *cuda;
|
||||||
|
void *nvenc;
|
||||||
|
|
||||||
|
PCUINIT cu_init;
|
||||||
|
PCUDEVICEGETCOUNT cu_device_get_count;
|
||||||
|
PCUDEVICEGET cu_device_get;
|
||||||
|
PCUDEVICEGETNAME cu_device_get_name;
|
||||||
|
PCUDEVICECOMPUTECAPABILITY cu_device_compute_capability;
|
||||||
|
PCUCTXCREATE cu_ctx_create;
|
||||||
|
PCUCTXPOPCURRENT cu_ctx_pop_current;
|
||||||
|
PCUCTXDESTROY cu_ctx_destroy;
|
||||||
|
|
||||||
|
NV_ENCODE_API_FUNCTION_LIST nvenc_funcs;
|
||||||
|
} NVENCLibraryContext;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PRESET_DEFAULT,
|
||||||
|
PRESET_HP,
|
||||||
|
PRESET_HQ,
|
||||||
|
PRESET_BD ,
|
||||||
|
PRESET_LOW_LATENCY_DEFAULT ,
|
||||||
|
PRESET_LOW_LATENCY_HQ ,
|
||||||
|
PRESET_LOW_LATENCY_HP,
|
||||||
|
PRESET_LOSSLESS_DEFAULT,
|
||||||
|
PRESET_LOSSLESS_HP,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NV_ENC_H264_PROFILE_BASELINE,
|
||||||
|
NV_ENC_H264_PROFILE_MAIN,
|
||||||
|
NV_ENC_H264_PROFILE_HIGH,
|
||||||
|
NV_ENC_H264_PROFILE_HIGH_444,
|
||||||
|
NV_ENC_H264_PROFILE_CONSTRAINED_HIGH,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NVENC_LOWLATENCY = 1,
|
||||||
|
NVENC_LOSSLESS,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
LIST_DEVICES = -2,
|
||||||
|
ANY_DEVICE,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct NVENCContext {
|
||||||
|
AVClass *class;
|
||||||
|
NVENCLibraryContext nvel;
|
||||||
|
|
||||||
|
NV_ENC_INITIALIZE_PARAMS params;
|
||||||
|
NV_ENC_CONFIG config;
|
||||||
|
|
||||||
|
CUcontext cu_context;
|
||||||
|
|
||||||
|
int nb_surfaces;
|
||||||
|
NVENCInputSurface *in;
|
||||||
|
NVENCOutputSurface *out;
|
||||||
|
AVFifoBuffer *timestamps;
|
||||||
|
AVFifoBuffer *pending, *ready;
|
||||||
|
|
||||||
|
int64_t last_dts;
|
||||||
|
|
||||||
|
void *nvenc_ctx;
|
||||||
|
|
||||||
|
int preset;
|
||||||
|
int profile;
|
||||||
|
int level;
|
||||||
|
int tier;
|
||||||
|
int rc;
|
||||||
|
int device;
|
||||||
|
int flags;
|
||||||
|
} NVENCContext;
|
||||||
|
|
||||||
|
int ff_nvenc_encode_init(AVCodecContext *avctx);
|
||||||
|
|
||||||
|
int ff_nvenc_encode_close(AVCodecContext *avctx);
|
||||||
|
|
||||||
|
int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||||
|
const AVFrame *frame, int *got_packet);
|
||||||
|
|
||||||
|
#endif /* AVCODEC_NVENC_H */
|
110
libavcodec/nvenc_h264.c
Normal file
110
libavcodec/nvenc_h264.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/internal.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
|
#include "avcodec.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#include "nvenc.h"
|
||||||
|
|
||||||
|
#define OFFSET(x) offsetof(NVENCContext, x)
|
||||||
|
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
|
||||||
|
static const AVOption options[] = {
|
||||||
|
{ "preset", "Set the encoding preset", OFFSET(preset), AV_OPT_TYPE_INT, { .i64 = PRESET_HQ }, PRESET_DEFAULT, PRESET_LOSSLESS_HP, VE, "preset" },
|
||||||
|
{ "default", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_DEFAULT }, 0, 0, VE, "preset" },
|
||||||
|
{ "hp", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_HP }, 0, 0, VE, "preset" },
|
||||||
|
{ "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_HQ }, 0, 0, VE, "preset" },
|
||||||
|
{ "bd", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_BD }, 0, 0, VE, "preset" },
|
||||||
|
{ "ll", "low latency", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_DEFAULT }, 0, 0, VE, "preset" },
|
||||||
|
{ "llhq", "low latency hq", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HQ }, 0, 0, VE, "preset" },
|
||||||
|
{ "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" },
|
||||||
|
{ "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = NV_ENC_H264_PROFILE_HIGH }, NV_ENC_H264_PROFILE_BASELINE, NV_ENC_H264_PROFILE_CONSTRAINED_HIGH, VE, "profile" },
|
||||||
|
{ "baseline", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_BASELINE }, 0, 0, VE, "profile" },
|
||||||
|
{ "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_MAIN }, 0, 0, VE, "profile" },
|
||||||
|
{ "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH }, 0, 0, VE, "profile" },
|
||||||
|
{ "high_444", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_HIGH_444 }, 0, 0, VE, "profile" },
|
||||||
|
{ "constrained_high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_H264_PROFILE_CONSTRAINED_HIGH }, 0, 0, VE, "profile" },
|
||||||
|
{ "level", "Set the encoding level restriction", OFFSET(level), AV_OPT_TYPE_INT, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, NV_ENC_LEVEL_AUTOSELECT, NV_ENC_LEVEL_H264_51, VE, "level" },
|
||||||
|
{ "1.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1 }, 0, 0, VE, "level" },
|
||||||
|
{ "1.b", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_1b }, 0, 0, VE, "level" },
|
||||||
|
{ "1.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_11 }, 0, 0, VE, "level" },
|
||||||
|
{ "1.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_12 }, 0, 0, VE, "level" },
|
||||||
|
{ "1.3", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_13 }, 0, 0, VE, "level" },
|
||||||
|
{ "2.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_2 }, 0, 0, VE, "level" },
|
||||||
|
{ "2.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_21 }, 0, 0, VE, "level" },
|
||||||
|
{ "2.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_22 }, 0, 0, VE, "level" },
|
||||||
|
{ "3.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_3 }, 0, 0, VE, "level" },
|
||||||
|
{ "3.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_31 }, 0, 0, VE, "level" },
|
||||||
|
{ "3.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_32 }, 0, 0, VE, "level" },
|
||||||
|
{ "4.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_4 }, 0, 0, VE, "level" },
|
||||||
|
{ "4.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_41 }, 0, 0, VE, "level" },
|
||||||
|
{ "4.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_42 }, 0, 0, VE, "level" },
|
||||||
|
{ "5.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_5 }, 0, 0, VE, "level" },
|
||||||
|
{ "5.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_H264_51 }, 0, 0, VE, "level" },
|
||||||
|
{ "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, VE },
|
||||||
|
{ "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr_minqp", "Variable bitrate mode with MinQP", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_MINQP }, 0, 0, VE, "rc" },
|
||||||
|
{ "ll_2pass_quality", "Multi-pass optimized for image quality (only for low-latency presets)", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY }, 0, 0, VE, "rc" },
|
||||||
|
{ "ll_2pass_size", "Multi-pass optimized for constant frame size (only for low-latency presets)", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr_2pass", "Multi-pass variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "surfaces", "Number of concurrent surfaces", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, INT_MAX, VE },
|
||||||
|
{ "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" },
|
||||||
|
{ "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" },
|
||||||
|
{ "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" },
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVClass nvenc_hevc_class = {
|
||||||
|
.class_name = "nvenc_h264",
|
||||||
|
.item_name = av_default_item_name,
|
||||||
|
.option = options,
|
||||||
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVCodecDefault defaults[] = {
|
||||||
|
{ "b", "0" },
|
||||||
|
{ "qmin", "-1" },
|
||||||
|
{ "qmax", "-1" },
|
||||||
|
{ "qdiff", "-1" },
|
||||||
|
{ "qblur", "-1" },
|
||||||
|
{ "qcomp", "-1" },
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
AVCodec ff_h264_nvenc_encoder = {
|
||||||
|
.name = "nvenc_h264",
|
||||||
|
.long_name = NULL_IF_CONFIG_SMALL("NVIDIA NVENC H264 encoder"),
|
||||||
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
|
.id = AV_CODEC_ID_H264,
|
||||||
|
.init = ff_nvenc_encode_init,
|
||||||
|
.encode2 = ff_nvenc_encode_frame,
|
||||||
|
.close = ff_nvenc_encode_close,
|
||||||
|
.priv_data_size = sizeof(NVENCContext),
|
||||||
|
.priv_class = &nvenc_hevc_class,
|
||||||
|
.defaults = defaults,
|
||||||
|
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
|
||||||
|
AV_PIX_FMT_YUV420P,
|
||||||
|
AV_PIX_FMT_YUV444P,
|
||||||
|
AV_PIX_FMT_NONE },
|
||||||
|
.capabilities = CODEC_CAP_DELAY,
|
||||||
|
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||||
|
};
|
108
libavcodec/nvenc_hevc.c
Normal file
108
libavcodec/nvenc_hevc.c
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libavutil/internal.h"
|
||||||
|
#include "libavutil/opt.h"
|
||||||
|
|
||||||
|
#include "avcodec.h"
|
||||||
|
#include "internal.h"
|
||||||
|
|
||||||
|
#include "nvenc.h"
|
||||||
|
|
||||||
|
#define OFFSET(x) offsetof(NVENCContext, x)
|
||||||
|
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
|
||||||
|
static const AVOption options[] = {
|
||||||
|
{ "preset", "Set the encoding preset", OFFSET(preset), AV_OPT_TYPE_INT, { .i64 = PRESET_HQ }, PRESET_DEFAULT, PRESET_LOSSLESS_HP, VE, "preset" },
|
||||||
|
{ "default", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_DEFAULT }, 0, 0, VE, "preset" },
|
||||||
|
{ "hp", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_HP }, 0, 0, VE, "preset" },
|
||||||
|
{ "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_HQ }, 0, 0, VE, "preset" },
|
||||||
|
{ "bd", "", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_BD }, 0, 0, VE, "preset" },
|
||||||
|
{ "ll", "low latency", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_DEFAULT }, 0, 0, VE, "preset" },
|
||||||
|
{ "llhq", "low latency hq", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HQ }, 0, 0, VE, "preset" },
|
||||||
|
{ "llhp", "low latency hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOW_LATENCY_HP }, 0, 0, VE, "preset" },
|
||||||
|
{ "lossless", "lossless", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_DEFAULT }, 0, 0, VE, "preset" },
|
||||||
|
{ "losslesshp", "lossless hp", 0, AV_OPT_TYPE_CONST, { .i64 = PRESET_LOSSLESS_HP }, 0, 0, VE, "preset" },
|
||||||
|
{ "profile", "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_HEVC_MAIN }, FF_PROFILE_HEVC_MAIN, FF_PROFILE_HEVC_MAIN, VE, "profile" },
|
||||||
|
{ "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_HEVC_MAIN }, 0, 0, VE, "profile" },
|
||||||
|
{ "level", "Set the encoding level restriction", OFFSET(level), AV_OPT_TYPE_INT, { .i64 = NV_ENC_LEVEL_AUTOSELECT }, NV_ENC_LEVEL_AUTOSELECT, NV_ENC_LEVEL_HEVC_62, VE, "level" },
|
||||||
|
{ "1.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_1 }, 0, 0, VE, "level" },
|
||||||
|
{ "2.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_2 }, 0, 0, VE, "level" },
|
||||||
|
{ "2.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_21 }, 0, 0, VE, "level" },
|
||||||
|
{ "3.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_3 }, 0, 0, VE, "level" },
|
||||||
|
{ "3.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_31 }, 0, 0, VE, "level" },
|
||||||
|
{ "4.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_4 }, 0, 0, VE, "level" },
|
||||||
|
{ "4.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_41 }, 0, 0, VE, "level" },
|
||||||
|
{ "5.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_5 }, 0, 0, VE, "level" },
|
||||||
|
{ "5.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_51 }, 0, 0, VE, "level" },
|
||||||
|
{ "5.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_52 }, 0, 0, VE, "level" },
|
||||||
|
{ "6.0", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_6 }, 0, 0, VE, "level" },
|
||||||
|
{ "6.1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_61 }, 0, 0, VE, "level" },
|
||||||
|
{ "6.2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LEVEL_HEVC_62 }, 0, 0, VE, "level" },
|
||||||
|
{ "tier", "Set the encoding tier", OFFSET(tier), AV_OPT_TYPE_INT, { .i64 = NV_ENC_TIER_HEVC_MAIN }, NV_ENC_TIER_HEVC_MAIN, NV_ENC_TIER_HEVC_HIGH, VE, "tier"},
|
||||||
|
{ "main", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_MAIN }, 0, 0, VE, "tier" },
|
||||||
|
{ "high", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_TIER_HEVC_HIGH }, 0, 0, VE, "tier" },
|
||||||
|
{ "rc", "Override the preset rate-control", OFFSET(rc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, VE, "rc" },
|
||||||
|
{ "constqp", "Constant QP mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CONSTQP }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr", "Variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "cbr", "Constant bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_CBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr_minqp", "Variable bitrate mode with MinQP", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_VBR_MINQP }, 0, 0, VE, "rc" },
|
||||||
|
{ "ll_2pass_quality", "Multi-pass optimized for image quality (only for low-latency presets)", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_QUALITY }, 0, 0, VE, "rc" },
|
||||||
|
{ "ll_2pass_size", "Multi-pass optimized for constant frame size (only for low-latency presets)", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_FRAMESIZE_CAP }, 0, 0, VE, "rc" },
|
||||||
|
{ "vbr_2pass", "Multi-pass variable bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_PARAMS_RC_2_PASS_VBR }, 0, 0, VE, "rc" },
|
||||||
|
{ "surfaces", "Number of concurrent surfaces", OFFSET(nb_surfaces), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, INT_MAX, VE },
|
||||||
|
{ "device", "Select a specific NVENC device", OFFSET(device), AV_OPT_TYPE_INT, { .i64 = -1 }, -2, INT_MAX, VE, "device" },
|
||||||
|
{ "any", "Pick the first device available", 0, AV_OPT_TYPE_CONST, { .i64 = ANY_DEVICE }, 0, 0, VE, "device" },
|
||||||
|
{ "list", "List the available devices", 0, AV_OPT_TYPE_CONST, { .i64 = LIST_DEVICES }, 0, 0, VE, "device" },
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVClass nvenc_hevc_class = {
|
||||||
|
.class_name = "nvenc_hevc",
|
||||||
|
.item_name = av_default_item_name,
|
||||||
|
.option = options,
|
||||||
|
.version = LIBAVUTIL_VERSION_INT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const AVCodecDefault defaults[] = {
|
||||||
|
{ "b", "0" },
|
||||||
|
{ "qmin", "-1" },
|
||||||
|
{ "qmax", "-1" },
|
||||||
|
{ "qdiff", "-1" },
|
||||||
|
{ "qblur", "-1" },
|
||||||
|
{ "qcomp", "-1" },
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
AVCodec ff_hevc_nvenc_encoder = {
|
||||||
|
.name = "nvenc_hevc",
|
||||||
|
.long_name = NULL_IF_CONFIG_SMALL("NVIDIA NVENC HEVC encoder"),
|
||||||
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
|
.id = AV_CODEC_ID_HEVC,
|
||||||
|
.init = ff_nvenc_encode_init,
|
||||||
|
.encode2 = ff_nvenc_encode_frame,
|
||||||
|
.close = ff_nvenc_encode_close,
|
||||||
|
.priv_data_size = sizeof(NVENCContext),
|
||||||
|
.priv_class = &nvenc_hevc_class,
|
||||||
|
.defaults = defaults,
|
||||||
|
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
|
||||||
|
AV_PIX_FMT_YUV420P,
|
||||||
|
AV_PIX_FMT_YUV444P,
|
||||||
|
AV_PIX_FMT_NONE },
|
||||||
|
.capabilities = CODEC_CAP_DELAY,
|
||||||
|
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||||
|
};
|
@ -29,7 +29,7 @@
|
|||||||
#include "libavutil/version.h"
|
#include "libavutil/version.h"
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MAJOR 56
|
#define LIBAVCODEC_VERSION_MAJOR 56
|
||||||
#define LIBAVCODEC_VERSION_MINOR 25
|
#define LIBAVCODEC_VERSION_MINOR 26
|
||||||
#define LIBAVCODEC_VERSION_MICRO 0
|
#define LIBAVCODEC_VERSION_MICRO 0
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user