Index | Thread | Search

From:
Rafael Sadowski <rafael@sizeofvoid.org>
Subject:
Re: graphics/opencv: compatibility with ffmpeg 9.0
To:
ports@openbsd.org
Date:
Tue, 11 Aug 2026 09:39:39 +0200

Download raw body.

Thread
On Mon Aug 10, 2026 at 12:37:17PM +0200, Kirill A. Korinsky wrote:
> Rafael, ports@,
> 
> I'd like to commit a fix for graphics/opencv which switches it away from
> deprecated API in ffmpeg which prevents it to build against ffmpeg 9.0
> 
> Build tested against ffmpeg-9.0 and ffmpeg-8.1.2

Is this from upstream? Please add a comment on top of the patch.
Otherwise OK rsadowski

> 
> Ok?
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/graphics/opencv/Makefile,v
> diff -u -p -r1.112 Makefile
> --- Makefile	22 Jun 2026 17:49:21 -0000	1.112
> +++ Makefile	10 Aug 2026 10:35:18 -0000
> @@ -8,7 +8,7 @@ V =			4.13.0
>  GH_ACCOUNT =		opencv
>  GH_PROJECT =		opencv
>  GH_TAGNAME =		${V}
> -REVISION-main =		0
> +REVISION-main =		1
>  REVISION-java =		0
>  
>  PKGNAME-main =		opencv-${V}
> Index: patches/patch-modules_videoio_src_cap_ffmpeg_hw_hpp
> ===================================================================
> RCS file: patches/patch-modules_videoio_src_cap_ffmpeg_hw_hpp
> diff -N patches/patch-modules_videoio_src_cap_ffmpeg_hw_hpp
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-modules_videoio_src_cap_ffmpeg_hw_hpp	10 Aug 2026 10:35:18 -0000
> @@ -0,0 +1,36 @@
> +Index: modules/videoio/src/cap_ffmpeg_hw.hpp
> +--- modules/videoio/src/cap_ffmpeg_hw.hpp.orig
> ++++ modules/videoio/src/cap_ffmpeg_hw.hpp
> +@@ -739,7 +739,9 @@ bool hw_check_codec(AVCodec* codec, AVHWDeviceType hw_
> + static
> + AVCodec *hw_find_codec(AVCodecID id, AVHWDeviceType hw_type, int (*check_category)(const AVCodec *), const char *disabled_codecs, AVPixelFormat *hw_pix_fmt) {
> +     AVCodec *c = 0;
> ++    const enum AVPixelFormat *pix_fmts;
> +     void *opaque = 0;
> ++    int ret, num_pix_fmts;
> + 
> +     while (NULL != (c = (AVCodec*)av_codec_iterate(&opaque)))
> +     {
> +@@ -757,12 +759,16 @@ AVCodec *hw_find_codec(AVCodecID id, AVHWDeviceType hw
> + #endif
> +             if (hw_type == AV_HWDEVICE_TYPE_CUDA) // CUDA encoders don't support avcodec_get_hw_config()
> +                 hw_native_fmt = AV_PIX_FMT_CUDA;
> +-            if (av_codec_is_encoder(c) && hw_native_fmt != AV_PIX_FMT_NONE && c->pix_fmts) {
> +-                for (int i = 0; c->pix_fmts[i] != AV_PIX_FMT_NONE; i++) {
> +-                    if (c->pix_fmts[i] == hw_native_fmt) {
> +-                        *hw_pix_fmt = hw_native_fmt;
> +-                        if (hw_check_codec(c, hw_type, disabled_codecs))
> +-                            return c;
> ++            if (av_codec_is_encoder(c) && hw_native_fmt != AV_PIX_FMT_NONE) {
> ++                ret = avcodec_get_supported_config(NULL, c, AV_CODEC_CONFIG_PIX_FORMAT,
> ++                                                   0, (const void **) &pix_fmts, &num_pix_fmts);
> ++                if (ret >= 0 && pix_fmts) {
> ++                    for (int i = 0; i < num_pix_fmts; i++) {
> ++                        if (pix_fmts[i] == hw_native_fmt) {
> ++                            *hw_pix_fmt = hw_native_fmt;
> ++                            if (hw_check_codec(c, hw_type, disabled_codecs))
> ++                                return c;
> ++                        }
> +                     }
> +                 }
> +             }
> Index: patches/patch-modules_videoio_src_cap_ffmpeg_impl_hpp
> ===================================================================
> RCS file: patches/patch-modules_videoio_src_cap_ffmpeg_impl_hpp
> diff -N patches/patch-modules_videoio_src_cap_ffmpeg_impl_hpp
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ patches/patch-modules_videoio_src_cap_ffmpeg_impl_hpp	10 Aug 2026 10:35:18 -0000
> @@ -0,0 +1,51 @@
> +Index: modules/videoio/src/cap_ffmpeg_impl.hpp
> +--- modules/videoio/src/cap_ffmpeg_impl.hpp.orig
> ++++ modules/videoio/src/cap_ffmpeg_impl.hpp
> +@@ -2539,10 +2539,11 @@ static AVCodecContext * icv_configure_video_stream_FFM
> + #else
> +     AVCodecContext *c = st->codec;
> + #endif
> ++    const AVRational *supported_framerates;
> ++    int frame_rate, frame_rate_base, num_supported_framerates, ret;
> ++
> +     CV_Assert(c);
> + 
> +-    int frame_rate, frame_rate_base;
> +-
> +     c->codec_id = codec ? codec->id : codec_id;
> + 
> + #ifndef CV_FFMPEG_CODECPAR
> +@@ -2583,17 +2584,28 @@ static AVCodecContext * icv_configure_video_stream_FFM
> +     c->time_base.den = frame_rate;
> +     c->time_base.num = frame_rate_base;
> +     /* adjust time base for supported framerates */
> +-    if(codec && codec->supported_framerates){
> +-        const AVRational *p= codec->supported_framerates;
> ++    if(codec){
> ++        ret = avcodec_get_supported_config(c, NULL, AV_CODEC_CONFIG_FRAME_RATE, 0,
> ++                                           (const void **) &supported_framerates,
> ++                                           &num_supported_framerates);
> ++        if (ret < 0)
> ++        {
> ++#ifdef CV_FFMPEG_CODECPAR
> ++            avcodec_free_context(&c);
> ++#endif
> ++            return NULL;
> ++        }
> ++    }
> ++    if(codec && supported_framerates){
> +         AVRational req = {frame_rate, frame_rate_base};
> +         const AVRational *best=NULL;
> +         AVRational best_error= {INT_MAX, 1};
> +-        for(; p->den!=0; p++){
> +-            AVRational error= av_sub_q(req, *p);
> ++        for(int i = 0; i < num_supported_framerates; i++){
> ++            AVRational error= av_sub_q(req, supported_framerates[i]);
> +             if(error.num <0) error.num *= -1;
> +             if(av_cmp_q(error, best_error) < 0){
> +                 best_error= error;
> +-                best= p;
> ++                best= &supported_framerates[i];
> +             }
> +         }
> +         if (best == NULL)
> 
> 
> -- 
> wbr, Kirill
>