Dear Maintainer, I backported the work merged upstream around ffmpeg 5. Please see attached. This was sufficient to address the FTBFS both for Sid and Ubuntu Kinetic.
-Dan
Description: Backport ffmpeg 5 fixes. Author: Dan Bungert <daniel.bung...@canonical.com> Origin: https://github.com/Motion-Project/motion/pull/1351/commits/fc9ed24c467006a463684f7db2f760a61f1eebe0 Bug-Ubuntu: https://bugs.launchpad.net/bugs/1982886 Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1004629 Forwarded: not-needed Last-Update: 2022-07-26 --- a/src/ffmpeg.c +++ b/src/ffmpeg.c @@ -340,7 +340,7 @@ if (ffmpeg->tlapse == TIMELAPSE_APPEND){ ffmpeg->oc->oformat = av_guess_format ("mpeg2video", NULL, NULL); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_MPEG2VIDEO; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_MPEG2VIDEO; retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mpg",basename); if ((!ffmpeg->oc->oformat) || (retcd < 0) || (retcd >= PATH_MAX)){ @@ -362,7 +362,7 @@ if (strcmp(codec_name, "msmpeg4") == 0) { ffmpeg->oc->oformat = av_guess_format("avi", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.avi",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_MSMPEG4V2; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_MSMPEG4V2; } if (strcmp(codec_name, "swf") == 0) { @@ -373,13 +373,13 @@ if (strcmp(codec_name, "flv") == 0) { ffmpeg->oc->oformat = av_guess_format("flv", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.flv",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_FLV1; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_FLV1; } if (strcmp(codec_name, "ffv1") == 0) { ffmpeg->oc->oformat = av_guess_format("avi", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.avi",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_FFV1; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_FFV1; } if (strcmp(codec_name, "mov") == 0) { @@ -390,19 +390,19 @@ if (strcmp(codec_name, "mp4") == 0) { ffmpeg->oc->oformat = av_guess_format("mp4", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mp4",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_H264; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_H264; } if (strcmp(codec_name, "mkv") == 0) { ffmpeg->oc->oformat = av_guess_format("matroska", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mkv",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_H264; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_H264; } if (strcmp(codec_name, "hevc") == 0) { ffmpeg->oc->oformat = av_guess_format("mp4", NULL, NULL); retcd = snprintf(ffmpeg->filename,PATH_MAX,"%s.mp4",basename); - if (ffmpeg->oc->oformat) ffmpeg->oc->oformat->video_codec = MY_CODEC_ID_HEVC; + if (ffmpeg->oc->oformat) ffmpeg->oc->video_codec_id = MY_CODEC_ID_HEVC; } //Check for valid results @@ -422,7 +422,7 @@ return -1; } - if (ffmpeg->oc->oformat->video_codec == MY_CODEC_ID_NONE) { + if (ffmpeg->oc->video_codec_id == MY_CODEC_ID_NONE) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO, _("Could not get the codec")); ffmpeg_free_context(ffmpeg); free(codec_name); @@ -721,7 +721,7 @@ } else { ffmpeg->codec = avcodec_find_encoder_by_name(&ffmpeg->codec_name[codec_name_len+1]); if ((ffmpeg->oc->oformat) && (ffmpeg->codec != NULL)) { - ffmpeg->oc->oformat->video_codec = ffmpeg->codec->id; + ffmpeg->oc->video_codec_id = ffmpeg->codec->id; } else if (ffmpeg->codec == NULL) { MOTION_LOG(WRN, TYPE_ENCODER, NO_ERRNO ,_("Preferred codec %s not found") @@ -730,7 +730,7 @@ } } if (!ffmpeg->codec) - ffmpeg->codec = avcodec_find_encoder(ffmpeg->oc->oformat->video_codec); + ffmpeg->codec = avcodec_find_encoder(ffmpeg->oc->video_codec_id); if (!ffmpeg->codec) { MOTION_LOG(ERR, TYPE_ENCODER, NO_ERRNO ,_("Codec %s not found"), ffmpeg->codec_name); @@ -818,7 +818,7 @@ } } - ffmpeg->ctx_codec->codec_id = ffmpeg->oc->oformat->video_codec; + ffmpeg->ctx_codec->codec_id = ffmpeg->oc->video_codec_id; ffmpeg->ctx_codec->codec_type = AVMEDIA_TYPE_VIDEO; ffmpeg->ctx_codec->bit_rate = ffmpeg->bps; ffmpeg->ctx_codec->width = ffmpeg->width; @@ -1320,7 +1320,7 @@ #if (LIBAVFORMAT_VERSION_MAJOR >= 58) || ((LIBAVFORMAT_VERSION_MAJOR == 57) && (LIBAVFORMAT_VERSION_MINOR >= 41)) stream_in = ffmpeg->rtsp_data->transfer_format->streams[0]; - ffmpeg->oc->oformat->video_codec = stream_in->codecpar->codec_id; + ffmpeg->oc->video_codec_id = stream_in->codecpar->codec_id; ffmpeg->video_st = avformat_new_stream(ffmpeg->oc, NULL); if (!ffmpeg->video_st) { --- a/src/ffmpeg.h +++ b/src/ffmpeg.h @@ -44,11 +44,18 @@ #endif // HAVE_FFMPEG #ifdef HAVE_FFMPEG + +#if (LIBAVCODEC_VERSION_MAJOR >= 59) +typedef const AVCodec my_AVCodec; /* Version independent for AVCodec*/ +#else +typedef AVCodec my_AVCodec; /* Version independent for AVCodec*/ +#endif + struct ffmpeg { AVFormatContext *oc; AVStream *video_st; AVCodecContext *ctx_codec; - AVCodec *codec; + my_AVCodec *codec; AVPacket pkt; AVFrame *picture; /* contains default image pointers */ AVDictionary *opts;