]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
update vaapi
authoralingherghescu <alin_gherghescu@yahoo.com>
Mon, 6 Feb 2023 20:01:55 +0000 (12:01 -0800)
committerFlole998 <Flole998@users.noreply.github.com>
Fri, 10 Feb 2023 00:32:57 +0000 (01:32 +0100)
- added denoise_vaapi
- added sharpness_vaapi

Makefile.ffmpeg
src/transcoding/codec.h
src/transcoding/codec/codecs/libs/vaapi.c
src/transcoding/transcode/hwaccels/hwaccels.c
src/transcoding/transcode/hwaccels/hwaccels.h
src/transcoding/transcode/hwaccels/vaapi.c
src/transcoding/transcode/hwaccels/vaapi.h
src/transcoding/transcode/video.c
src/webui/static/app/codec.js

index 561c1e288f4215880a8e82beda12afc4cc1659d3..44f91cf8eb8735b902aa846e39b75422dff312f7 100644 (file)
@@ -613,7 +613,7 @@ ifeq (yes,$(CONFIG_VAAPI))
 EXTLIBS  += vaapi
 ENCODERS += h264_vaapi hevc_vaapi vp8_vaapi vp9_vaapi
 HWACCELS += mpeg2_vaapi h264_vaapi hevc_vaapi vp9_vaapi
-FILTERS  += deinterlace_vaapi scale_vaapi
+FILTERS  += deinterlace_vaapi scale_vaapi denoise_vaapi sharpness_vaapi
 FFMPEG_DIFFS += ffmpeg.vaapi_encode.diff
 
 endif
index 3938e8b0e587e7f7bb5ed0164b4620ae7ae5c1eb..c274c40ba210fb479213c409998f0b170bba4216 100644 (file)
@@ -93,6 +93,8 @@ struct tvh_codec_profile {
     double qscale;
     int profile;
     int low_power;
+    int filter_hw_denoise;
+    int filter_hw_sharpness;
     char *device; // for hardware acceleration
     LIST_ENTRY(tvh_codec_profile) link;
 };
index e74e33d02d0151a61c3fcf23c0da51dd8d5b351f..e8330e3d997220afd9098de10ed34ebbb3705af5 100644 (file)
@@ -368,6 +368,28 @@ static const codec_profile_class_t codec_profile_vaapi_class = {
                 .off      = offsetof(tvh_codec_profile_vaapi_t, bit_rate_scale_factor),
                 .def.d    = 0,
             },
+            {
+                .type     = PT_INT,
+                .id       = "hw_denoise",     // Don't change
+                .name     = N_("Denoise"),
+                .group    = 2,
+                .desc     = N_("Denoise only available with Hardware Acceleration (from 0 to 64, 0=skip, 0 default)"),
+                .get_opts = codec_profile_class_get_opts,
+                .off      = offsetof(tvh_codec_profile_vaapi_t, filter_hw_denoise),
+                .intextra = INTEXTRA_RANGE(0, 64, 1),
+                .def.i    = 0,
+            },
+            {
+                .type     = PT_INT,
+                .id       = "hw_sharpness",     // Don't change
+                .name     = N_("Sharpness"),
+                .group    = 2,
+                .desc     = N_("Sharpness only available with Hardware Acceleration (from 0 to 64, 0=skip, 44 default)"),
+                .get_opts = codec_profile_class_get_opts,
+                .off      = offsetof(tvh_codec_profile_vaapi_t, filter_hw_sharpness),
+                .intextra = INTEXTRA_RANGE(0, 64, 1),
+                .def.i    = 44,
+            },
             {}
         }
     },
index 0130f2af6abdb639ecbdb30530b4ebc42fd97a91..892bbbc2f6b1f547446a253bac1e536cd86dc373 100644 (file)
@@ -173,6 +173,43 @@ hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len
     return -1;
 }
 
+int
+hwaccels_get_denoise_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len)
+{
+    TVHContext *ctx = avctx->opaque;
+
+    if (ctx->hw_accel_ictx) {
+        switch (avctx->pix_fmt) {
+#if ENABLE_VAAPI
+            case AV_PIX_FMT_VAAPI:
+                return vaapi_get_denoise_filter(avctx, value, filter, filter_len);
+#endif
+            default:
+                break;
+        }
+    }
+    
+    return -1;
+}
+
+int
+hwaccels_get_sharpness_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len)
+{
+    TVHContext *ctx = avctx->opaque;
+
+    if (ctx->hw_accel_ictx) {
+        switch (avctx->pix_fmt) {
+#if ENABLE_VAAPI
+            case AV_PIX_FMT_VAAPI:
+                return vaapi_get_sharpness_filter(avctx, value, filter, filter_len);
+#endif
+            default:
+                break;
+        }
+    }
+    
+    return -1;
+}
 
 /* encoding ================================================================= */
 
index a14647672ccd8dacb8c124d513fb7c6929a69826..ca129ef883cc5cc40997a907b6a4341c76ee9cc1 100644 (file)
@@ -43,6 +43,12 @@ hwaccels_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx,
 int
 hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
 
+int
+hwaccels_get_denoise_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len);
+
+int
+hwaccels_get_sharpness_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len);
+
 
 /* encoding ================================================================= */
 
index c449060dc2cce653735dd27c5c121d0dd52ab436..a5ae381064f0fb3aab70d4dffcbcd9a1a57a75a4 100644 (file)
@@ -624,6 +624,22 @@ vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len)
     return 0;
 }
 
+
+int
+vaapi_get_denoise_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len)
+{
+    snprintf(filter, filter_len, "denoise_vaapi=%d", value);
+    return 0;
+}
+
+
+int
+vaapi_get_sharpness_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len)
+{
+    snprintf(filter, filter_len, "sharpness_vaapi=%d", value);
+    return 0;
+}
+
 /* encoding ================================================================= */
 
 int
index 3ce9817b9169c5b5f8f2a2cae2be56cded6e04f8..72a2c4babe6ef0ccbeaaa9539b8ae210e617ada4 100644 (file)
@@ -41,6 +41,12 @@ vaapi_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx, char *fil
 int
 vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
 
+int
+vaapi_get_denoise_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len);
+
+int
+vaapi_get_sharpness_filter(AVCodecContext *avctx, int value, char *filter, size_t filter_len);
+
 
 /* encoding ================================================================= */
 
index 1a8f1342361ec893b04821edc8205dd31e283cd1..bf24450c29ce1dd8399b4de59316b9043b9fedec 100644 (file)
@@ -47,14 +47,24 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters
     char scale[24];
     char hw_scale[64];
     char upload[48];
+    char hw_denoise[64];
+    char hw_sharpness[64];
     int ihw = _video_filters_hw_pix_fmt(self->iavctx->pix_fmt);
     int ohw = _video_filters_hw_pix_fmt(self->oavctx->pix_fmt);
     int filter_scale = (self->iavctx->height != self->oavctx->height);
     int filter_deint = 0, filter_download = 0, filter_upload = 0;
+#if ENABLE_HWACCELS
+    int filter_denoise = 0;
+    int filter_sharpness = 0;
+#endif
 
     if (tvh_context_get_int_opt(opts, "tvh_filter_deint", &filter_deint)) {
         return -1;
     }
+#if ENABLE_VAAPI
+    filter_denoise = self->profile->filter_hw_denoise;
+    filter_sharpness = self->profile->filter_hw_sharpness;
+#endif
     //  in --> out  |  download   |   upload 
     // -------------|-------------|------------
     //  hw --> hw   |     0       |     0
@@ -114,6 +124,28 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters
     }
 #endif
 
+    memset(hw_denoise, 0, sizeof(hw_denoise));
+#if ENABLE_HWACCELS
+    if (filter_denoise) {
+        // used only when hwaccel is enabled
+        if (ihw) {
+            // hw scale
+            hwaccels_get_denoise_filter(self->iavctx, filter_denoise, hw_denoise, sizeof(hw_denoise));
+        }
+    }
+#endif
+
+    memset(hw_sharpness, 0, sizeof(hw_sharpness));
+#if ENABLE_HWACCELS
+    if (filter_sharpness) {
+        // used only when hwaccel is enabled
+        if (ihw) {
+            // hw scale
+            hwaccels_get_sharpness_filter(self->iavctx, filter_sharpness, hw_sharpness, sizeof(hw_sharpness));
+        }
+    }
+#endif
+
 #if ENABLE_HWACCELS
     // no filter required.
 #else
@@ -137,7 +169,7 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters
         return -1;
     }
 
-    if (!(*filters = str_join(",", hw_deint, hw_scale, download, deint, scale, upload, NULL))) {
+    if (!(*filters = str_join(",", hw_deint, hw_scale, hw_denoise, hw_sharpness, download, deint, scale, upload, NULL))) {
         return -1;
     }
 
index b35b528d4fb15e4ef48a5190368d111e2138d575..afdfad066d2edb79a9af0133250c1011da83109b 100644 (file)
@@ -230,6 +230,12 @@ var codec_profile_forms = {
     },
 
     'codec_profile_vaapi_h264': function(form) {
+        function updateHWFilters(form) {
+            var hwaccel_field = form.findField('hwaccel');
+            form.findField('hw_denoise').setDisabled(!hwaccel_field.getValue());
+            form.findField('hw_sharpness').setDisabled(!hwaccel_field.getValue());
+        }
+
         function updateFilters(form) {
             var platform_field = form.findField('platform');
             var rc_mode_field = form.findField('rc_mode');
@@ -334,8 +340,11 @@ var codec_profile_forms = {
         var platform_field = form.findField('platform');
         var rc_mode_field = form.findField('rc_mode');
         var low_power_field = form.findField('low_power');
+        var hwaccel_field = form.findField('hwaccel');
+        
         // first time we have to call this manually
         updateFilters(form);
+        updateHWFilters(form);
         
         // on platform change
         platform_field.on('select', function(combo, record, index) {
@@ -349,9 +358,19 @@ var codec_profile_forms = {
         low_power_field.on('check', function(checkbox, value) {
             updateFilters(form);
         });
+        // on hwaccel change
+        hwaccel_field.on('check', function(checkbox, value) {
+            updateHWFilters(form);
+        });
     },
 
     'codec_profile_vaapi_hevc': function(form) {
+        function updateHWFilters(form) {
+            var hwaccel_field = form.findField('hwaccel');
+            form.findField('hw_denoise').setDisabled(!hwaccel_field.getValue());
+            form.findField('hw_sharpness').setDisabled(!hwaccel_field.getValue());
+        }
+
         function updateFilters(form) {
             var platform_field = form.findField('platform');
             var rc_mode_field = form.findField('rc_mode');
@@ -456,8 +475,11 @@ var codec_profile_forms = {
         var platform_field = form.findField('platform');
         var rc_mode_field = form.findField('rc_mode');
         var low_power_field = form.findField('low_power');
+        var hwaccel_field = form.findField('hwaccel');
+
         // first time we have to call this manually
         updateFilters(form);
+        updateHWFilters(form);
         
         // on platform change
         platform_field.on('select', function(combo, record, index) {
@@ -471,9 +493,19 @@ var codec_profile_forms = {
         low_power_field.on('check', function(checkbox, value) {
             updateFilters(form);
         });
+        // on hwaccel change
+        hwaccel_field.on('check', function(checkbox, value) {
+            updateHWFilters(form);
+        });
     },
 
     'codec_profile_vaapi_vp8': function(form) {
+        function updateHWFilters(form) {
+            var hwaccel_field = form.findField('hwaccel');
+            form.findField('hw_denoise').setDisabled(!hwaccel_field.getValue());
+            form.findField('hw_sharpness').setDisabled(!hwaccel_field.getValue());
+        }
+
         function updateFilters(form) {
             var platform_field = form.findField('platform');
             var rc_mode_field = form.findField('rc_mode');
@@ -568,8 +600,11 @@ var codec_profile_forms = {
 
         var platform_field = form.findField('platform');
         var rc_mode_field = form.findField('rc_mode');
+        var hwaccel_field = form.findField('hwaccel');
+
         // first time we have to call this manually
         updateFilters(form);
+        updateHWFilters(form);
 
         // on platform change
         platform_field.on('select', function(combo, record, index) {
@@ -579,9 +614,19 @@ var codec_profile_forms = {
         rc_mode_field.on('select', function(combo, record, index) {
             updateFilters(form);
         });
+        // on hwaccel change
+        hwaccel_field.on('check', function(checkbox, value) {
+            updateHWFilters(form);
+        });
     },
 
     'codec_profile_vaapi_vp9': function(form) {
+        function updateHWFilters(form) {
+            var hwaccel_field = form.findField('hwaccel');
+            form.findField('hw_denoise').setDisabled(!hwaccel_field.getValue());
+            form.findField('hw_sharpness').setDisabled(!hwaccel_field.getValue());
+        }
+
         function updateFilters(form) {
             var platform_field = form.findField('platform');
             var rc_mode_field = form.findField('rc_mode');
@@ -676,8 +721,11 @@ var codec_profile_forms = {
 
         var platform_field = form.findField('platform');
         var rc_mode_field = form.findField('rc_mode');
+        var hwaccel_field = form.findField('hwaccel');
+
         // first time we have to call this manually
         updateFilters(form);
+        updateHWFilters(form);
 
         // on platform change
         platform_field.on('select', function(combo, record, index) {
@@ -687,6 +735,10 @@ var codec_profile_forms = {
         rc_mode_field.on('select', function(combo, record, index) {
             updateFilters(form);
         });
+        // on hwaccel change
+        hwaccel_field.on('check', function(checkbox, value) {
+            updateHWFilters(form);
+        });
     }
 };