From: alingherghescu Date: Mon, 6 Feb 2023 20:01:55 +0000 (-0800) Subject: update vaapi X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=470f02fb3f00d3f88e61303cd5db7ec303d0145d;p=thirdparty%2Ftvheadend.git update vaapi - added denoise_vaapi - added sharpness_vaapi --- diff --git a/Makefile.ffmpeg b/Makefile.ffmpeg index 561c1e288..44f91cf8e 100644 --- a/Makefile.ffmpeg +++ b/Makefile.ffmpeg @@ -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 diff --git a/src/transcoding/codec.h b/src/transcoding/codec.h index 3938e8b0e..c274c40ba 100644 --- a/src/transcoding/codec.h +++ b/src/transcoding/codec.h @@ -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; }; diff --git a/src/transcoding/codec/codecs/libs/vaapi.c b/src/transcoding/codec/codecs/libs/vaapi.c index e74e33d02..e8330e3d9 100644 --- a/src/transcoding/codec/codecs/libs/vaapi.c +++ b/src/transcoding/codec/codecs/libs/vaapi.c @@ -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, + }, {} } }, diff --git a/src/transcoding/transcode/hwaccels/hwaccels.c b/src/transcoding/transcode/hwaccels/hwaccels.c index 0130f2af6..892bbbc2f 100644 --- a/src/transcoding/transcode/hwaccels/hwaccels.c +++ b/src/transcoding/transcode/hwaccels/hwaccels.c @@ -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 ================================================================= */ diff --git a/src/transcoding/transcode/hwaccels/hwaccels.h b/src/transcoding/transcode/hwaccels/hwaccels.h index a14647672..ca129ef88 100644 --- a/src/transcoding/transcode/hwaccels/hwaccels.h +++ b/src/transcoding/transcode/hwaccels/hwaccels.h @@ -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 ================================================================= */ diff --git a/src/transcoding/transcode/hwaccels/vaapi.c b/src/transcoding/transcode/hwaccels/vaapi.c index c449060dc..a5ae38106 100644 --- a/src/transcoding/transcode/hwaccels/vaapi.c +++ b/src/transcoding/transcode/hwaccels/vaapi.c @@ -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 diff --git a/src/transcoding/transcode/hwaccels/vaapi.h b/src/transcoding/transcode/hwaccels/vaapi.h index 3ce9817b9..72a2c4bab 100644 --- a/src/transcoding/transcode/hwaccels/vaapi.h +++ b/src/transcoding/transcode/hwaccels/vaapi.h @@ -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 ================================================================= */ diff --git a/src/transcoding/transcode/video.c b/src/transcoding/transcode/video.c index 1a8f13423..bf24450c2 100644 --- a/src/transcoding/transcode/video.c +++ b/src/transcoding/transcode/video.c @@ -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; } diff --git a/src/webui/static/app/codec.js b/src/webui/static/app/codec.js index b35b528d4..afdfad066 100644 --- a/src/webui/static/app/codec.js +++ b/src/webui/static/app/codec.js @@ -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); + }); } };