Package: cloudcompare
Version: 2.11.3-5
Followup-For: Bug #1004801
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu kinetic ubuntu-patch
Control: tags -1 patch

Hi Gürkan,

The attached patch fixes the build failure with ffmpeg 5.0.  I have uploaded
this fix to Ubuntu.  Unfortunately there doesn't appear to be an upstream
test suite, so I'm not certain whether it works with this change.

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                   https://www.debian.org/
slanga...@ubuntu.com                                     vor...@debian.org
diff -Nru cloudcompare-2.11.3/debian/control cloudcompare-2.11.3/debian/control
--- cloudcompare-2.11.3/debian/control  2022-07-19 05:45:18.000000000 -0700
+++ cloudcompare-2.11.3/debian/control  2022-07-21 08:00:54.000000000 -0700
@@ -1,8 +1,7 @@
 Source: cloudcompare
 Section: graphics
 Priority: optional
-Maintainer: Ubuntu Developers <ubuntu-devel-disc...@lists.ubuntu.com>
-XSBC-Original-Maintainer: Gürkan Myczko <t...@debian.org>
+Maintainer: Gürkan Myczko <t...@debian.org>
 Build-Depends: debhelper-compat (= 13), cmake, libqt5opengl5-dev, libcgal-dev, 
libdxflib-dev (>= 2.5.0),
  libglew-dev, libfreenect-dev, libgdal-dev, libgomp1, libboost-all-dev, 
libavcodec-dev, libavformat-dev, libswscale-dev, libeigen3-dev,
  libjsoncpp-dev, libcurl4-gnutls-dev | libcurl4-openssl-dev, libcgal-qt5-dev, 
libqt5svg5-dev, qttools5-dev-tools, qttools5-dev
diff -Nru cloudcompare-2.11.3/debian/patches/ffmpeg-5.0.patch 
cloudcompare-2.11.3/debian/patches/ffmpeg-5.0.patch
--- cloudcompare-2.11.3/debian/patches/ffmpeg-5.0.patch 1969-12-31 
16:00:00.000000000 -0800
+++ cloudcompare-2.11.3/debian/patches/ffmpeg-5.0.patch 2022-07-21 
07:59:38.000000000 -0700
@@ -0,0 +1,144 @@
+Description: compatibility with ffmpeg 5.0.
+Author: Steve Langasek <steve.langa...@ubuntu.com>
+Bug-Debian: https://bugs.debian.org/1004801
+Last-Update: 2022-07-21
+Forwarded: no
+
+Index: 
cloudcompare-2.11.3/plugins/core/Standard/qAnimation/src/QTFFmpegWrapper/QVideoEncoder.cpp
+===================================================================
+--- 
cloudcompare-2.11.3.orig/plugins/core/Standard/qAnimation/src/QTFFmpegWrapper/QVideoEncoder.cpp
++++ 
cloudcompare-2.11.3/plugins/core/Standard/qAnimation/src/QTFFmpegWrapper/QVideoEncoder.cpp
+@@ -116,9 +116,6 @@
+               return false;
+       }
+ 
+-      //Initialize libavcodec, and register all codecs and formats
+-      av_register_all();
+-
+       // find the output format
+       avformat_alloc_output_context2(&m_ff->formatContext, NULL, NULL, 
qPrintable(m_filename));
+       if (!m_ff->formatContext)
+@@ -139,7 +136,7 @@
+       AVCodecID codec_id = m_ff->formatContext->oformat->video_codec;
+       //codec_id = AV_CODEC_ID_MPEG1VIDEO;
+       //codec_id = AV_CODEC_ID_H264;
+-      AVCodec *pCodec = avcodec_find_encoder(codec_id);
++      const AVCodec *pCodec = avcodec_find_encoder(codec_id);
+       if (!pCodec)
+       {
+               if (errorString)
+@@ -191,7 +188,9 @@
+               return false;
+       }
+       m_ff->videoStream->id = m_ff->formatContext->nb_streams-1;
+-      m_ff->videoStream->codec = m_ff->codecContext;
++      m_ff->videoStream->codecpar = avcodec_parameters_alloc();
++      avcodec_parameters_from_context(m_ff->videoStream->codecpar,
++                                      m_ff->codecContext);
+       m_ff->videoStream->time_base.num = 1;
+       m_ff->videoStream->time_base.den = m_fps;
+ 
+@@ -269,31 +268,28 @@
+               memset( &pkt, 0, sizeof( AVPacket ) );          
+               av_init_packet(&pkt);
+ 
+-              int got_packet = 0;
+-              int ret = avcodec_encode_video2(m_ff->codecContext, &pkt, 0, 
&got_packet);
+-              if (ret < 0 || !got_packet)
+-              {
+-                      break;
++              while (avcodec_receive_packet(m_ff->codecContext, &pkt) > 0) {
++                      write_frame(m_ff, &pkt);
+               }
+ 
+-              write_frame(m_ff, &pkt);
+-
+               av_packet_unref(&pkt);
+       }
+ 
+       av_write_trailer(m_ff->formatContext);
+ 
+       // close the codec
+-      avcodec_close(m_ff->videoStream->codec);
++      avcodec_free_context(&m_ff->codecContext);
+ 
+       // free the streams and other data
+       freeFrame();
+       for(unsigned i = 0; i < m_ff->formatContext->nb_streams; i++)
+       {
+-              av_freep(&m_ff->formatContext->streams[i]->codec);
++              
avcodec_parameters_free(&m_ff->formatContext->streams[i]->codecpar);
+               av_freep(&m_ff->formatContext->streams[i]);
+       }
+ 
++      avcodec_parameters_free(&m_ff->videoStream->codecpar);
++
+       // close the file
+       avio_close(m_ff->formatContext->pb);
+ 
+@@ -325,39 +321,46 @@
+       av_init_packet(&pkt);
+ 
+       // encode the image
+-      int got_packet = 0;
+-      {
+-              //compute correct timestamp based on the input frame index
+-              //int timestamp = ((m_ff->codecContext->time_base.num * 90000) 
/ m_ff->codecContext->time_base.den) * frameIndex;
+-              m_ff->frame->pts = frameIndex/*timestamp*/;
++      char errorStr[AV_ERROR_MAX_STRING_SIZE] = {0};
++      //compute correct timestamp based on the input frame index
++      //int timestamp = ((m_ff->codecContext->time_base.num * 90000) / 
m_ff->codecContext->time_base.den) * frameIndex;
++      m_ff->frame->pts = frameIndex/*timestamp*/;
++
++      int retcode = true;
++      int ret = avcodec_send_frame(m_ff->codecContext, m_ff->frame);
++      if (ret < 0) {
++              av_make_error_string(errorStr, AV_ERROR_MAX_STRING_SIZE, ret);
++              if (errorString)
++                      *errorString = QString("Error sending a frame for 
encoding: %1").arg(errorStr);
++              av_packet_unref(&pkt);
++              return false;
++      }
+ 
+-              int ret = avcodec_encode_video2(m_ff->codecContext, &pkt, 
m_ff->frame, &got_packet);
+-              if (ret < 0)
+-              {
+-                      char errorStr[AV_ERROR_MAX_STRING_SIZE] = {0};
++      while (ret >= 0) {
++              ret = avcodec_receive_packet(m_ff->codecContext, &pkt);
++              if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
++                      break;
++              else if (ret < 0) {
+                       av_make_error_string(errorStr, 
AV_ERROR_MAX_STRING_SIZE, ret);
+                       if (errorString)
+                               *errorString = QString("Error encoding video 
frame: %1").arg(errorStr);
+-                      return false;
++                      retcode = false;
++                      break;
+               }
+-      }
+-
+-      if (got_packet)
+-      {
+-              int ret = write_frame(m_ff, &pkt);
++              ret = write_frame(m_ff, &pkt);
+               if (ret < 0)
+               {
+-                      char errorStr[AV_ERROR_MAX_STRING_SIZE] = {0};
+                       av_make_error_string(errorStr, 
AV_ERROR_MAX_STRING_SIZE, ret);
+                       if (errorString)
+                               *errorString = QString("Error while writing 
video frame: %1").arg(errorStr);
+-                      return false;
++                      retcode = false;
++                      break;
+               }
+       }
+ 
+       av_packet_unref(&pkt);
+-      
+-      return true;
++
++      return retcode;
+ }
+ 
+ bool QVideoEncoder::convertImage_sws(const QImage &image, QString* 
errorString/*=0*/)
diff -Nru cloudcompare-2.11.3/debian/patches/series 
cloudcompare-2.11.3/debian/patches/series
--- cloudcompare-2.11.3/debian/patches/series   2021-11-17 03:08:34.000000000 
-0800
+++ cloudcompare-2.11.3/debian/patches/series   2022-07-21 06:18:05.000000000 
-0700
@@ -1,2 +1,3 @@
 grr
 0-stdlib.h
+ffmpeg-5.0.patch

Reply via email to