]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
transcode: vaapi - add support for hw scaler, fix hw deinterlacer
authorJaroslav Kysela <perex@perex.cz>
Wed, 13 Sep 2017 10:23:35 +0000 (12:23 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 13 Sep 2017 10:23:35 +0000 (12:23 +0200)
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

index cb063be9e65dc3cc6d976bbdfad02c8b304a443a..86c187bf140da96a178e848ac20a82e4639c91d5 100644 (file)
@@ -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:
index 6b6f1f49bb46996e380d79d6f6708cc2d73a4e99..55caad8e60743bdc90810cdf7912076b0fabd735 100644 (file)
@@ -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);
 
index b316c268118dbeb2d5c7c44e47371fbc59328808..b0ee51eb36be1bea242eb3fca3bb8463702ada36 100644 (file)
@@ -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
index acbd3e14fe53164bc61d71d92be5ce0f5e25b62b..9a61a5e24a4d7cae63d97474f9fa2eb6639270ba 100644 (file)
@@ -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);
 
index c9bf0a6905135e88db3c2b26828f9a3edd8b2ec8..035d41132582d7803558361b470f29c65a12e166 100644 (file)
@@ -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;
     }