Submitted By: Joe Locash Date: 2025-11-18 Initial Package Version: 1.2.13 Upstream Status: Applied Origin: Upstream commits 9bb397 and a8fffd Description: Fixes building xine-lib against ffmpeg-8. diff -Nuarp xine-lib-1.2.13.orig/src/combined/ffmpeg/ffmpeg_compat.h xine-lib-1.2.13/src/combined/ffmpeg/ffmpeg_compat.h --- xine-lib-1.2.13.orig/src/combined/ffmpeg/ffmpeg_compat.h 2025-11-18 13:24:12.824655934 -0500 +++ xine-lib-1.2.13/src/combined/ffmpeg/ffmpeg_compat.h 2025-11-18 12:59:41.956696804 -0500 @@ -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 */ diff -Nuarp xine-lib-1.2.13.orig/src/combined/ffmpeg/ff_video_decoder.c xine-lib-1.2.13/src/combined/ffmpeg/ff_video_decoder.c --- xine-lib-1.2.13.orig/src/combined/ffmpeg/ff_video_decoder.c 2025-11-18 13:24:12.825127146 -0500 +++ xine-lib-1.2.13/src/combined/ffmpeg/ff_video_decoder.c 2025-11-18 13:07:52.717841093 -0500 @@ -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 @@ static void ff_handle_mpeg12_buffer (ff_ } /* 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 void ff_postprocess (ff_video_dec 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; } @@ -2675,8 +2688,8 @@ static void ff_handle_buffer (ff_video_d 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; @@ -2885,8 +2898,8 @@ static void ff_flush_internal (ff_video_ 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)