Fix vaapi deinterlace for ffmpeg 8.1

This commit is contained in:
jojo61
2025-11-01 10:31:35 +01:00
parent 40c2152557
commit 618b689bc3
2 changed files with 30 additions and 8 deletions

View File

@@ -61,7 +61,7 @@ extern void ToggleLUT();
/// vdr-plugin version number. /// vdr-plugin version number.
/// Makefile extracts the version number for generating the file name /// Makefile extracts the version number for generating the file name
/// for the distribution archive. /// for the distribution archive.
static const char *const VERSION = "3.33" static const char *const VERSION = "3.34"
#ifdef GIT_REV #ifdef GIT_REV
"-GIT" GIT_REV "-GIT" GIT_REV
#endif #endif

36
video.c
View File

@@ -2703,7 +2703,9 @@ int init_filters(AVCodecContext *dec_ctx, CuvidDecoder *decoder, AVFrame *frame)
#endif #endif
#ifdef YADIF #ifdef YADIF
const char *filters_descr = "yadif_cuda=1:0:1"; // mode=send_field,parity=tff,deint=interlaced"; const char *filters_descr = "yadif_cuda=1:0:1"; // mode=send_field,parity=tff,deint=interlaced";
#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(59,40,100)
enum AVPixelFormat pix_fmts[] = {format, AV_PIX_FMT_NONE}; enum AVPixelFormat pix_fmts[] = {format, AV_PIX_FMT_NONE};
#endif
#endif #endif
char args[512]; char args[512];
@@ -2723,16 +2725,25 @@ int init_filters(AVCodecContext *dec_ctx, CuvidDecoder *decoder, AVFrame *frame)
goto end; goto end;
} }
/* buffer video source: the decoded frames from the decoder will be inserted
* here. */
snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d", dec_ctx->width,
dec_ctx->height, format, 1, 90000, dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
ret = avfilter_graph_create_filter(&decoder->buffersrc_ctx, buffersrc, "in", args, NULL, decoder->filter_graph); #if LIBAVFILTER_VERSION_INT < AV_VERSION_INT(9,16,100)
if (ret < 0) { snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
Debug(3, "Cannot create buffer source\n"); dec_ctx->width,dec_ctx->height, format, 1, 90000,
dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
#else
snprintf(args, sizeof(args), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d:colorspace=%d:range=%d",
dec_ctx->width,dec_ctx->height, dec_ctx->pix_fmt,
dec_ctx->pkt_timebase.num, dec_ctx->pkt_timebase.den,
dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den,
dec_ctx->colorspace,dec_ctx->color_range);
#endif
decoder->buffersrc_ctx = avfilter_graph_alloc_filter(decoder->filter_graph, buffersrc, "in");
if (!decoder->buffersrc_ctx) {
Debug(3,"Cannot alloc buffer source %s\n", args);
goto end; goto end;
} }
src_params = av_buffersrc_parameters_alloc(); src_params = av_buffersrc_parameters_alloc();
src_params->hw_frames_ctx = frame->hw_frames_ctx; src_params->hw_frames_ctx = frame->hw_frames_ctx;
src_params->format = format; src_params->format = format;
@@ -2747,10 +2758,19 @@ int init_filters(AVCodecContext *dec_ctx, CuvidDecoder *decoder, AVFrame *frame)
// printf("width %d height %d hw_frames_ctx // printf("width %d height %d hw_frames_ctx
// %p\n",dec_ctx->width,dec_ctx->height ,frame->hw_frames_ctx); // %p\n",dec_ctx->width,dec_ctx->height ,frame->hw_frames_ctx);
ret = av_buffersrc_parameters_set(decoder->buffersrc_ctx, src_params); ret = av_buffersrc_parameters_set(decoder->buffersrc_ctx, src_params);
av_free(src_params);
if (ret < 0) { if (ret < 0) {
Debug(3, "Cannot set hw_frames_ctx to src\n"); Debug(3, "Cannot set hw_frames_ctx to src\n");
goto end; goto end;
} }
ret = avfilter_init_str(decoder->buffersrc_ctx, args);
if (ret < 0) {
Error(_("Cannot init buffer source %s\n"), args);
goto end;
}
/* buffer video sink: to terminate the filter chain. */ /* buffer video sink: to terminate the filter chain. */
ret = avfilter_graph_create_filter(&decoder->buffersink_ctx, buffersink, "out", NULL, NULL, decoder->filter_graph); ret = avfilter_graph_create_filter(&decoder->buffersink_ctx, buffersink, "out", NULL, NULL, decoder->filter_graph);
if (ret < 0) { if (ret < 0) {
@@ -2758,11 +2778,13 @@ int init_filters(AVCodecContext *dec_ctx, CuvidDecoder *decoder, AVFrame *frame)
goto end; goto end;
} }
#ifdef YADIF #ifdef YADIF
#if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(59,40,100)
ret = av_opt_set_int_list(decoder->buffersink_ctx, "pix_fmts", pix_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN); ret = av_opt_set_int_list(decoder->buffersink_ctx, "pix_fmts", pix_fmts, AV_PIX_FMT_NONE, AV_OPT_SEARCH_CHILDREN);
if (ret < 0) { if (ret < 0) {
Debug(3, "Cannot set output pixel format\n"); Debug(3, "Cannot set output pixel format\n");
goto end; goto end;
} }
#endif
#endif #endif
/* /*
* Set the endpoints for the filter graph. The filter_graph will * Set the endpoints for the filter graph. The filter_graph will