diff options
author | Andrey Turkin <andrey.turkin@gmail.com> | 2016-05-25 16:04:28 +0300 |
---|---|---|
committer | Ubuntu <ubuntu@ip-172-31-24-241.eu-west-1.compute.internal> | 2016-05-31 11:15:19 +0000 |
commit | 7aa16d59bfc537db69ffb08b9d5ec5f868cff56a (patch) | |
tree | 396a00b334ba0a84717e0617e576d0bfb2f8c381 /libavcodec/nvenc.c | |
parent | a1953d4cec1609e010cde895cac649feb9f5fdaa (diff) | |
download | ffmpeg-7aa16d59bfc537db69ffb08b9d5ec5f868cff56a.tar.gz |
avcodec/nvenc: split H264/HEVC encoder definitions into separate files
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
Diffstat (limited to 'libavcodec/nvenc.c')
-rw-r--r-- | libavcodec/nvenc.c | 247 |
1 files changed, 15 insertions, 232 deletions
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 73d05841ae..4e42202832 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -19,43 +19,25 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #if defined(_WIN32) #include <windows.h> #else #include <dlfcn.h> #endif -#include <nvEncodeAPI.h> - -#include "libavutil/fifo.h" -#include "libavutil/internal.h" #include "libavutil/imgutils.h" #include "libavutil/avassert.h" -#include "libavutil/opt.h" #include "libavutil/mem.h" #include "libavutil/hwcontext.h" -#include "avcodec.h" #include "internal.h" #include "thread.h" +#include "nvenc.h" #if CONFIG_CUDA -#include <cuda.h> #include "libavutil/hwcontext_cuda.h" -#else - -#if defined(_WIN32) -#define CUDAAPI __stdcall -#else -#define CUDAAPI -#endif - -typedef enum cudaError_enum { - CUDA_SUCCESS = 0 -} CUresult; -typedef int CUdevice; -typedef void* CUcontext; -typedef void* CUdeviceptr; #endif #if defined(_WIN32) @@ -66,34 +48,15 @@ typedef void* CUdeviceptr; #define DL_CLOSE_FUNC(l) dlclose(l) #endif -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); - -#define MAX_REGISTERED_FRAMES 64 -typedef struct NvencSurface -{ - NV_ENC_INPUT_PTR input_surface; - AVFrame *in_ref; - NV_ENC_MAP_INPUT_RESOURCE in_map; - int reg_idx; - int width; - int height; - - int lockCount; - - NV_ENC_BUFFER_FORMAT format; - - NV_ENC_OUTPUT_PTR output_surface; - int size; -} NvencSurface; +const enum AVPixelFormat ff_nvenc_pix_fmts[] = { + AV_PIX_FMT_YUV420P, + AV_PIX_FMT_NV12, + AV_PIX_FMT_YUV444P, +#if CONFIG_CUDA + AV_PIX_FMT_CUDA, +#endif + AV_PIX_FMT_NONE +}; typedef struct NvencData { @@ -103,83 +66,12 @@ typedef struct NvencData } u; } NvencData; -typedef struct NvencDynLoadFunctions -{ - 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; - int nvenc_device_count; - CUdevice nvenc_devices[16]; - -#if !CONFIG_CUDA -#if defined(_WIN32) - HMODULE cuda_lib; -#else - void* cuda_lib; -#endif -#endif -#if defined(_WIN32) - HMODULE nvenc_lib; -#else - void* nvenc_lib; -#endif -} NvencDynLoadFunctions; - typedef struct NvencValuePair { const char *str; uint32_t num; } NvencValuePair; -typedef struct NvencContext -{ - AVClass *avclass; - - NvencDynLoadFunctions nvenc_dload_funcs; - - NV_ENC_INITIALIZE_PARAMS init_encode_params; - NV_ENC_CONFIG encode_config; - CUcontext cu_context; - CUcontext cu_context_internal; - - int max_surface_count; - NvencSurface *surfaces; - - AVFifoBuffer *output_surface_queue; - AVFifoBuffer *output_surface_ready_queue; - AVFifoBuffer *timestamp_list; - int64_t last_dts; - - struct { - CUdeviceptr ptr; - NV_ENC_REGISTERED_PTR regptr; - int mapped; - } registered_frames[MAX_REGISTERED_FRAMES]; - int nb_registered_frames; - - /* the actual data pixel format, different from - * AVCodecContext.pix_fmt when using hwaccel frames on input */ - enum AVPixelFormat data_pix_fmt; - - void *nvencoder; - - char *preset; - char *profile; - char *level; - char *tier; - int cbr; - int twopass; - int gpu; - int buffer_delay; -} NvencContext; - static const NvencValuePair nvenc_h264_level_pairs[] = { { "auto", NV_ENC_LEVEL_AUTOSELECT }, { "1" , NV_ENC_LEVEL_H264_1 }, @@ -1252,7 +1144,7 @@ static av_cold int nvenc_setup_extradata(AVCodecContext *avctx) return 0; } -static av_cold int nvenc_encode_init(AVCodecContext *avctx) +av_cold int ff_nvenc_encode_init(AVCodecContext *avctx) { NvencContext *ctx = avctx->priv_data; NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs; @@ -1315,7 +1207,7 @@ error: return res; } -static av_cold int nvenc_encode_close(AVCodecContext *avctx) +av_cold int ff_nvenc_encode_close(AVCodecContext *avctx) { NvencContext *ctx = avctx->priv_data; NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs; @@ -1697,7 +1589,7 @@ static int output_ready(NvencContext *ctx, int flush) return nb_ready > 0 && (flush || nb_ready + nb_pending >= ctx->buffer_delay); } -static int nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, +int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet) { NVENCSTATUS nv_status; @@ -1786,112 +1678,3 @@ static int nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, return 0; } - -static const enum AVPixelFormat pix_fmts_nvenc[] = { - AV_PIX_FMT_YUV420P, - AV_PIX_FMT_NV12, - AV_PIX_FMT_YUV444P, -#if CONFIG_CUDA - AV_PIX_FMT_CUDA, -#endif - AV_PIX_FMT_NONE -}; - -#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 (one of slow = hq 2pass, medium = hq, fast = hp, hq, hp, bd, ll, llhq, llhp, lossless, losslesshp, default)", OFFSET(preset), AV_OPT_TYPE_STRING, { .str = "medium" }, 0, 0, VE }, - { "profile", "Set the encoding profile (high, main, baseline or high444p)", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, - { "level", "Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1)", OFFSET(level), AV_OPT_TYPE_STRING, { .str = "auto" }, 0, 0, VE }, - { "tier", "Set the encoding tier (main or high)", OFFSET(tier), AV_OPT_TYPE_STRING, { .str = "main" }, 0, 0, VE }, - { "cbr", "Use cbr encoding mode", OFFSET(cbr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, - { "2pass", "Use 2pass encoding mode", OFFSET(twopass), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE }, - { "gpu", "Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on.", OFFSET(gpu), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, - { "delay", "Delays frame output by the given amount of frames.", OFFSET(buffer_delay), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 0, INT_MAX, VE }, - { NULL } -}; - -static const AVCodecDefault nvenc_defaults[] = { - { "b", "2M" }, - { "qmin", "-1" }, - { "qmax", "-1" }, - { "qdiff", "-1" }, - { "qblur", "-1" }, - { "qcomp", "-1" }, - { "g", "250" }, - { "bf", "0" }, - { NULL }, -}; - -#if CONFIG_NVENC_ENCODER -static const AVClass nvenc_class = { - .class_name = "nvenc", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_nvenc_encoder = { - .name = "nvenc", - .long_name = NULL_IF_CONFIG_SMALL("NVIDIA NVENC h264 encoder"), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_H264, - .priv_data_size = sizeof(NvencContext), - .init = nvenc_encode_init, - .encode2 = nvenc_encode_frame, - .close = nvenc_encode_close, - .capabilities = AV_CODEC_CAP_DELAY, - .priv_class = &nvenc_class, - .defaults = nvenc_defaults, - .pix_fmts = pix_fmts_nvenc, -}; -#endif - -/* Add an alias for nvenc_h264 */ -#if CONFIG_NVENC_H264_ENCODER -static const AVClass nvenc_h264_class = { - .class_name = "nvenc_h264", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_nvenc_h264_encoder = { - .name = "nvenc_h264", - .long_name = NULL_IF_CONFIG_SMALL("NVIDIA NVENC h264 encoder"), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_H264, - .priv_data_size = sizeof(NvencContext), - .init = nvenc_encode_init, - .encode2 = nvenc_encode_frame, - .close = nvenc_encode_close, - .capabilities = AV_CODEC_CAP_DELAY, - .priv_class = &nvenc_h264_class, - .defaults = nvenc_defaults, - .pix_fmts = pix_fmts_nvenc, -}; -#endif - -#if CONFIG_NVENC_HEVC_ENCODER -static const AVClass nvenc_hevc_class = { - .class_name = "nvenc_hevc", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_nvenc_hevc_encoder = { - .name = "nvenc_hevc", - .long_name = NULL_IF_CONFIG_SMALL("NVIDIA NVENC hevc encoder"), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_H265, - .priv_data_size = sizeof(NvencContext), - .init = nvenc_encode_init, - .encode2 = nvenc_encode_frame, - .close = nvenc_encode_close, - .capabilities = AV_CODEC_CAP_DELAY, - .priv_class = &nvenc_hevc_class, - .defaults = nvenc_defaults, - .pix_fmts = pix_fmts_nvenc, -}; -#endif |