# HG changeset patch # User Torsten Jager # Date 1757753985 -7200 # Sat Sep 13 10:59:45 2025 +0200 # Node ID 9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc # Parent 9e326869fe0faf21957642c8c7c5cac9ed4f445c FFmpeg compatibilty update. diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ff_video_decoder.c --- a/src/combined/ffmpeg/ff_video_decoder.c Sat May 31 15:55:00 2025 +0200 +++ b/src/combined/ffmpeg/ff_video_decoder.c Sat Sep 13 10:59:45 2025 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2024 the xine project + * Copyright (C) 2001-2025 the xine project * * This file is part of xine, a free video player. * @@ -60,6 +60,10 @@ #include "ffmpeg_compat.h" +#if XFF_FRAME_RATE == 2 +# include +#endif + #if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(59,0,100) # undef HAVE_POSTPROC #endif @@ -2289,8 +2293,8 @@ } /* transfer some more frame settings for deinterlacing */ - img->progressive_frame = !this->av_frame->interlaced_frame; - img->top_field_first = this->av_frame->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame); /* get back reordered pts */ img->pts = ff_untag_pts (this, this->av_frame); @@ -2370,20 +2374,29 @@ static int ff_video_step_get (ff_video_decoder_t *this) { /* use externally provided video_step or fall back to stream's time_base otherwise */ - int step = this->video_step; + int step = this->video_step, num_fields; if (step || !this->context->time_base.den) return step; +#if XFF_FRAME_RATE == 1 + num_fields = this->context->ticks_per_frame; +#else /* XFF_FRAME_RATE == 2 */ + { + const AVCodecDescriptor *desc = avcodec_descriptor_get (this->context->codec_id); + if (desc) + num_fields = (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1; + else + num_fields = 2; + } +#endif /* good: 2 * 1001 / 48000. */ - step = (int64_t)90000 * this->context->ticks_per_frame - * this->context->time_base.num / this->context->time_base.den; + step = (int64_t)90000 * num_fields * this->context->time_base.num / this->context->time_base.den; if (step >= 90) return step; /* bad: 2 * 1 / 60000. seen this once from broken h.264 video usability info (VUI). * VAAPI seems to apply a similar HACK.*/ - step = (int64_t)90000000 * this->context->ticks_per_frame - * this->context->time_base.num / this->context->time_base.den; + step = (int64_t)90000000 * num_fields * this->context->time_base.num / this->context->time_base.den; return step; } @@ -2680,8 +2693,8 @@ img->duration = video_step_to_use; /* transfer some more frame settings for deinterlacing */ - img->progressive_frame = !this->av_frame->interlaced_frame; - img->top_field_first = this->av_frame->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame); this->skipframes = img->draw(img, this->stream); this->state = STATE_FRAME_SENT; @@ -2894,8 +2907,8 @@ if (video_step_to_use <= 750) video_step_to_use = 0; img->duration = this->av_frame2->repeat_pict ? video_step_to_use * 3 / 2 : video_step_to_use; - img->progressive_frame = !this->av_frame2->interlaced_frame; - img->top_field_first = this->av_frame2->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame2); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame2); this->skipframes = img->draw (img, this->stream); if (free_img) diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ffmpeg_compat.h --- a/src/combined/ffmpeg/ffmpeg_compat.h Sat May 31 15:55:00 2025 +0200 +++ b/src/combined/ffmpeg/ffmpeg_compat.h Sat Sep 13 10:59:45 2025 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2000-2024 the xine project + * Copyright (C) 2000-2025 the xine project * * This file is part of xine, a unix video player. * @@ -319,4 +319,20 @@ # error avcodec.h must be included first ! #endif /* defined(LIBAVCODEC_VERSION_INT) */ +#if LIBAVUTIL_VERSION_INT >= XFF_INT_VERSION(58,7,0) +# define XFF_FRAME_IS_INTERLACED(_frame) ((_frame)->flags & AV_FRAME_FLAG_INTERLACED) +# define XFF_FRAME_IS_TOP_FIELD_FIRST(_frame) ((_frame)->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) +# define XFF_FRAME_IS_KEY(_frame) ((_frame)->flags & AV_FRAME_FLAG_KEY) +#else +# define XFF_FRAME_IS_INTERLACED(_frame) ((_frame)->interlaced_frame) +# define XFF_FRAME_IS_TOP_FIELD_FIRST(_frame) ((_frame)->top_field_first) +# define XFF_FRAME_IS_KEY(_frame) ((_frame)->key_frame) +#endif + +#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(60,0,0) +# define XFF_FRAME_RATE 2 /* AV_CODEC_PROP_FIELDS */ +#else +# define XFF_FRAME_RATE 1 /* AVCodecContext.ticks_per_frame */ +#endif + #endif /* XINE_AVCODEC_COMPAT_H */