From 4a1db13977ff05df5e10059dda2f203f42f53dc5 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 13 Sep 2017 12:23:35 +0200 Subject: [PATCH] transcode: vaapi - add support for hw scaler, fix hw deinterlacer --- src/transcoding/transcode/hwaccels/hwaccels.c | 25 +++++++++++++- src/transcoding/transcode/hwaccels/hwaccels.h | 4 +++ src/transcoding/transcode/hwaccels/vaapi.c | 10 +++++- src/transcoding/transcode/hwaccels/vaapi.h | 3 ++ src/transcoding/transcode/video.c | 34 +++++++++++++------ 5 files changed, 63 insertions(+), 13 deletions(-) diff --git a/src/transcoding/transcode/hwaccels/hwaccels.c b/src/transcoding/transcode/hwaccels/hwaccels.c index cb063be9e..86c187bf1 100644 --- a/src/transcoding/transcode/hwaccels/hwaccels.c +++ b/src/transcoding/transcode/hwaccels/hwaccels.c @@ -108,10 +108,33 @@ hwaccels_decode_close_context(AVCodecContext *avctx) } +int +hwaccels_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx, + char *filter, size_t filter_len) +{ + TVHContext *ctx = iavctx->opaque; + + if (ctx->hw_accel_ictx) { + switch (iavctx->pix_fmt) { +#if ENABLE_VAAPI + case AV_PIX_FMT_VAAPI: + return vaapi_get_scale_filter(iavctx, oavctx, filter, filter_len); +#endif + default: + break; + } + } + + return -1; +} + + int hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len) { - if (avctx->hwaccel_context) { + TVHContext *ctx = avctx->opaque; + + if (ctx->hw_accel_ictx) { switch (avctx->pix_fmt) { #if ENABLE_VAAPI case AV_PIX_FMT_VAAPI: diff --git a/src/transcoding/transcode/hwaccels/hwaccels.h b/src/transcoding/transcode/hwaccels/hwaccels.h index 6b6f1f49b..55caad8e6 100644 --- a/src/transcoding/transcode/hwaccels/hwaccels.h +++ b/src/transcoding/transcode/hwaccels/hwaccels.h @@ -36,6 +36,10 @@ hwaccels_decode_get_format(AVCodecContext *avctx, void hwaccels_decode_close_context(AVCodecContext *avctx); +int +hwaccels_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx, + char *filter, size_t filter_len); + int hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len); diff --git a/src/transcoding/transcode/hwaccels/vaapi.c b/src/transcoding/transcode/hwaccels/vaapi.c index b316c2681..b0ee51eb3 100644 --- a/src/transcoding/transcode/hwaccels/vaapi.c +++ b/src/transcoding/transcode/hwaccels/vaapi.c @@ -558,6 +558,15 @@ vaapi_decode_close_context(AVCodecContext *avctx) } +int +vaapi_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx, + char *filter, size_t filter_len) +{ + snprintf(filter, filter_len, "scale_vaapi=w=%d:h=%d", oavctx->width, oavctx->height); + return 0; +} + + int vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len) { @@ -565,7 +574,6 @@ vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len) return 0; } - /* encoding ================================================================= */ int diff --git a/src/transcoding/transcode/hwaccels/vaapi.h b/src/transcoding/transcode/hwaccels/vaapi.h index acbd3e14f..9a61a5e24 100644 --- a/src/transcoding/transcode/hwaccels/vaapi.h +++ b/src/transcoding/transcode/hwaccels/vaapi.h @@ -35,6 +35,9 @@ vaapi_decode_setup_context(AVCodecContext *avctx); void vaapi_decode_close_context(AVCodecContext *avctx); +int +vaapi_get_scale_filter(AVCodecContext *iavctx, AVCodecContext *oavctx, char *filter, size_t filter_len); + int vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len); diff --git a/src/transcoding/transcode/video.c b/src/transcoding/transcode/video.c index c9bf0a690..035d41132 100644 --- a/src/transcoding/transcode/video.c +++ b/src/transcoding/transcode/video.c @@ -45,6 +45,7 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters char deint[8]; char hw_deint[64]; char scale[24]; + char hw_scale[64]; char upload[48]; int ihw = _video_filters_hw_pix_fmt(self->iavctx->pix_fmt); int ohw = _video_filters_hw_pix_fmt(self->oavctx->pix_fmt); @@ -57,18 +58,11 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters filter_download = (ihw && (!ohw || filter_scale || filter_deint)) ? 1 : 0; filter_upload = ((filter_download || !ihw) && ohw) ? 1 : 0; - memset(download, 0, sizeof(download)); - if (filter_download && - str_snprintf(download, sizeof(download), "hwdownload,format=pix_fmts=%s", - av_get_pix_fmt_name(self->iavctx->sw_pix_fmt))) { - return -1; - } - memset(deint, 0, sizeof(deint)); memset(hw_deint, 0, sizeof(hw_deint)); #if ENABLE_HWACCELS if (filter_deint && - !hwaccels_get_deint_filter(self->iavctx, hw_deint, sizeof(hw_deint))) { + hwaccels_get_deint_filter(self->iavctx, hw_deint, sizeof(hw_deint))) { #else if (filter_deint) { #endif @@ -78,9 +72,27 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters } memset(scale, 0, sizeof(scale)); + memset(hw_scale, 0, sizeof(hw_scale)); +#if ENABLE_HWACCELS if (filter_scale && - str_snprintf(scale, sizeof(scale), "scale=w=-2:h=%d", - self->oavctx->height)) { + hwaccels_get_scale_filter(self->iavctx, self->oavctx, hw_scale, sizeof(hw_scale))) { +#else + if (filter_scale) { +#endif + if (str_snprintf(scale, sizeof(scale), "scale=w=-2:h=%d", + self->oavctx->height)) { + return -1; + } + } + + if (deint[0] == '\0' && scale[0] == '\0') { + filter_download = filter_upload = 0; + } + + memset(download, 0, sizeof(download)); + if (filter_download && + str_snprintf(download, sizeof(download), "hwdownload,format=pix_fmts=%s", + av_get_pix_fmt_name(self->iavctx->sw_pix_fmt))) { return -1; } @@ -92,7 +104,7 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters return -1; } - if (!(*filters = str_join(",", download, deint, scale, upload, hw_deint, NULL))) { + if (!(*filters = str_join(",", hw_deint, hw_scale, download, deint, scale, upload, NULL))) { return -1; } -- 2.47.3