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;

Reply via email to