From: Flole Date: Wed, 5 May 2021 14:45:37 +0000 (+0200) Subject: Add NVIDIA Hardware accelerated decoding for transcoding X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=04853f0dad2282226ec40bf7a95714b722edf66b;p=thirdparty%2Ftvheadend.git Add NVIDIA Hardware accelerated decoding for transcoding --- diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg index 15f95ce59..d725d6644 100644 --- a/Makefile.ffmpeg +++ b/Makefile.ffmpeg @@ -172,6 +172,7 @@ CONFIGURE := FFMPEG_PREFIX=$(EPREFIX) \ PKG_CONFIG=$(ROOTDIR)/support/pkg-config.ffmpeg \ ./configure --prefix=/ffmpeg --enable-static --disable-shared CONFIGURE_PI := CC="$(COMPILER) $(CFLAGS_PI)" $(CONFIGURE) +CONFIGURE_FFMPEG := $(CONFIGURE) # ############################################################################## # NASM @@ -561,8 +562,15 @@ endif ifeq (yes,$(CONFIG_NVENC)) -EXTLIBS += nvenc -ENCODERS += h264_nvenc hevc_nvenc +## YOU MUST INSTALL CUDA from NVIDIA for "libnpp" +EXTLIBS += nvenc cuvid libnpp +ENCODERS += h264_nvenc hevc_nvenc +DECODERS += h264_cuvid hevc_cuvid +HWACCELS += h264_nvdec hevc_nvdec vp8_nvdec vp9_nvdec mjpeg_nvdec mpeg1_nvdec mpeg2_nvdec mpeg4_nvdec +ECFLAGS += -I/usr/local/cuda/include + +## NVIDIA LIB for "libnpp" +CONFIGURE_FFMPEG += --extra-ldflags=-L/usr/local/cuda/lib64 $(LIB_ROOT)/$(FFNVCODEC)/.tvh_download: $(call DOWNLOAD,$(FFNVCODEC_URL),$(LIB_ROOT)/$(FFNVCODEC_TB),$(FFNVCODEC_SHA1)) @@ -678,7 +686,7 @@ $(LIB_ROOT)/$(FFMPEG)/.tvh_build: \ $(LIB_ROOT)/$(LIBOPUS)/.tvh_build \ $(LIB_ROOT)/$(FFNVCODEC)/.tvh_build \ $(LIB_ROOT)/$(FFMPEG)/.tvh_download - cd $(LIB_ROOT)/$(FFMPEG) && $(CONFIGURE) \ + cd $(LIB_ROOT)/$(FFMPEG) && $(CONFIGURE_FFMPEG) \ --disable-all \ --enable-gpl \ --enable-nonfree \ diff --git a/configure b/configure index 58227fbd3..4dad024c4 100755 --- a/configure +++ b/configure @@ -600,6 +600,7 @@ if enabled ffmpeg_static; then #check_cc_header nvEncodeAPI || \ # die "NVENC library (https://developer.nvidia.com/nvidia-video-codec-sdk) not found" enable nvenc + enable hwaccels else disable nvenc fi diff --git a/src/transcoding/transcode/stream.c b/src/transcoding/transcode/stream.c index cd6e7e5c6..0435404d6 100644 --- a/src/transcoding/transcode/stream.c +++ b/src/transcoding/transcode/stream.c @@ -74,6 +74,18 @@ tvh_stream_setup(TVHStream *self, TVHCodecProfile *profile, tvh_ssc_t *ssc) } } } +#endif +#if ENABLE_NVENC + if (idnode_is_instance(&profile->idnode, + (idclass_t *)&codec_profile_video_class)) { + if (tvh_codec_profile_video_get_hwaccel(profile) > 0) { + if (icodec_id == AV_CODEC_ID_H264) { + icodec = avcodec_find_decoder_by_name("h264_cuvid"); + } else if (icodec_id == AV_CODEC_ID_HEVC) { + icodec = avcodec_find_decoder_by_name("hevc_cuvid"); + } + } + } #endif if (!icodec && !(icodec = avcodec_find_decoder(icodec_id))) { tvh_stream_log(self, LOG_ERR, "failed to find decoder for '%s'", diff --git a/src/transcoding/transcode/video.c b/src/transcoding/transcode/video.c index d2840a2f3..4482b5fba 100644 --- a/src/transcoding/transcode/video.c +++ b/src/transcoding/transcode/video.c @@ -125,6 +125,7 @@ tvh_video_context_open_decoder(TVHContext *self, AVDictionary **opts) } mystrset(&self->hw_accel_device, self->profile->device); #endif + self->iavctx->time_base = av_make_q(1, 90000); // MPEG-TS uses a fixed timebase of 90kHz return 0; }