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
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;
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;
}
}
+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
void
hwaccels_decode_close_context(AVCodecContext *avctx);
+int
+hwaccels_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
+
/* encoding ================================================================= */
}
+int
+vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len)
+{
+ snprintf(filter, filter_len, "deinterlace_vaapi");
+ return 0;
+}
+
+
/* encoding ================================================================= */
int
void
vaapi_decode_close_context(AVCodecContext *avctx);
+int
+vaapi_get_deint_filter(AVCodecContext *avctx, char *filter, size_t filter_len);
+
/* encoding ================================================================= */
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);
}
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));
return -1;
}
- if (!(*filters = str_join(",", download, deint, scale, upload, NULL))) {
+ if (!(*filters = str_join(",", download, deint, scale, upload, hw_deint, NULL))) {
return -1;
}