]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add NVIDIA Hardware accelerated decoding for transcoding
authorFlole <flole@flole.de>
Wed, 5 May 2021 14:45:37 +0000 (16:45 +0200)
committerFlole998 <Flole998@users.noreply.github.com>
Wed, 9 Jun 2021 02:24:11 +0000 (04:24 +0200)
Makefile.ffmpeg
configure
src/transcoding/transcode/stream.c
src/transcoding/transcode/video.c

index 15f95ce59f24565d3a03beaf2462721e86e707ac..d725d664460a3299fa49e88d531dee1d18102f23 100644 (file)
@@ -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 \
index 58227fbd3987f846fddc3f084cf2263c9c03d2db..4dad024c4ead4dc6fe3c98fa6ac39a9abc5d5531 100755 (executable)
--- 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
index cd6e7e5c65282bbfeec570581350ca242a706eda..0435404d6b27f8925af1253c77cd6faebe8135f9 100644 (file)
@@ -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'",
index d2840a2f31ef24cb85e262ea81537698837d5907..4482b5fbab667a0f07e7c3e9d4ca38aa22d9fb24 100644 (file)
@@ -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;
 }