]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
transcode: vaapi - use vaapi deinterlace instead yadif
authorJaroslav Kysela <perex@perex.cz>
Sat, 2 Sep 2017 10:42:08 +0000 (12:42 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 2 Sep 2017 10:42:08 +0000 (12:42 +0200)
Makefile.ffmpeg
src/transcoding/codec/profile_video_class.c
src/transcoding/memutils.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

index 96a57414676b30b5e724718e638ddf1ee8e56a34..d94ce6e6b62e99f1deda2d63974a74d6122b1d0a 100644 (file)
@@ -556,7 +556,7 @@ ifeq (yes,$(CONFIG_VAAPI))
 EXTLIBS  += vaapi
 ENCODERS += h264_vaapi hevc_vaapi
 HWACCELS += mpeg2_vaapi h264_vaapi hevc_vaapi
-FILTERS  += scale_vaapi
+FILTERS  += deinterlace_vaapi scale_vaapi
 FFMPEG_DIFFS += ffmpeg.vaapi_encode.diff
 
 endif
index ceb7443289bf900124c07494a8b615cc63c4e6f8..7768db731934d79f405722aaa32d86975f5eb0c6 100644 (file)
@@ -111,7 +111,7 @@ codec_profile_video_class_deinterlace_set(void *obj, const void *val)
 
     if (self &&
         (avcodec = tvh_codec_profile_get_avcodec((TVHCodecProfile *)self))) {
-        self->deinterlace = (avcodec->id == AV_CODEC_ID_HEVC) ? 1 : *(int *)val;
+        self->deinterlace = *(int *)val;
         return 1;
     }
     return 0;
index f44efce5296e633f61e7da198b49a18a311815c1..3313fd815c8a913d5cf7b6aee7f5c687aff4714b 100644 (file)
@@ -30,8 +30,10 @@ str_add(const char *sep, const char *str)
     char *result = NULL;
 
     if ((result = calloc(1, sep_len + str_len + 1))) {
-        strncpy(result, sep, sep_len);
-        strncat(result, str, str_len);
+        if (str_len > 0) {
+            strncpy(result, sep, sep_len);
+            strncat(result, str, str_len);
+        }
     }
     return result;
 }
index 75195dde9d178dc0544ca13ece935159cfe16746..44f1db106fb29e66fb19e812ffed03b79e297df1 100644 (file)
@@ -105,6 +105,24 @@ hwaccels_decode_close_context(AVCodecContext *avctx)
 }
 
 
+int
+hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len)
+{
+    if (avctx->hwaccel_context) {
+        switch (avctx->pix_fmt) {
+#if ENABLE_VAAPI
+            case AV_PIX_FMT_VAAPI:
+                return vaapi_get_deint_filter(avctx, filter, filter_len);
+#endif
+            default:
+                break;
+        }
+    }
+    
+    return -1;
+}
+
+
 /* encoding ================================================================= */
 
 int
index aaa3733a6a972e5e6f10211600c9ebc386d82933..6b6f1f49bb46996e380d79d6f6708cc2d73a4e99 100644 (file)
@@ -36,6 +36,9 @@ hwaccels_decode_get_format(AVCodecContext *avctx,
 void
 hwaccels_decode_close_context(AVCodecContext *avctx);
 
+int
+hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
+
 
 /* encoding ================================================================= */
 
index 11652fce142401242bc142ddf8a0429be0c953e3..4ac20006abab0dcc14ace1151e3cf3eba1cbfbf3 100644 (file)
@@ -530,6 +530,14 @@ vaapi_decode_close_context(AVCodecContext *avctx)
 }
 
 
+int
+vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len)
+{
+    snprintf(filter, filter_len, "deinterlace_vaapi");
+    return 0;
+}
+
+
 /* encoding ================================================================= */
 
 int
index af394488758ceaf515faffd15ba1e52c210b6ea5..acbd3e14fe53164bc61d71d92be5ce0f5e25b62b 100644 (file)
@@ -35,6 +35,9 @@ vaapi_decode_setup_context(AVCodecContext *avctx);
 void
 vaapi_decode_close_context(AVCodecContext *avctx);
 
+int
+vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
+
 
 /* encoding ================================================================= */
 
index ce73b2d5c052a4a4ac62ea6c0eeeb113bfc32a3e..8679ec1c41cdf0bfb7644210f433aba9d011b3ea 100644 (file)
@@ -41,10 +41,11 @@ _video_filters_hw_pix_fmt(enum AVPixelFormat pix_fmt)
 static int
 _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters)
 {
-    static char download[48];
-    static char deint[8];
-    static char scale[24];
-    static char upload[48];
+    char download[48];
+    char deint[8];
+    char hw_deint[64];
+    char scale[24];
+    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);
     int filter_scale = (self->iavctx->height != self->oavctx->height);
@@ -64,8 +65,11 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters
     }
 
     memset(deint, 0, sizeof(deint));
-    if (filter_deint && str_snprintf(deint, sizeof(deint), "yadif")) {
-        return -1;
+    memset(hw_deint, 0, sizeof(hw_deint));
+    if (filter_deint && hwaccels_get_deint_filter(self->iavctx, hw_deint, sizeof(hw_deint))) {
+        if (str_snprintf(deint, sizeof(deint), "yadif")) {
+            return -1;
+        }
     }
 
     memset(scale, 0, sizeof(scale));
@@ -83,7 +87,7 @@ _video_filters_get_filters(TVHContext *self, AVDictionary **opts, char **filters
         return -1;
     }
 
-    if (!(*filters = str_join(",", download, deint, scale, upload, NULL))) {
+    if (!(*filters = str_join(",", download, deint, scale, upload, hw_deint, NULL))) {
         return -1;
     }