commit:     3f8de491a11fd52f6350c604247ebc0f630cab98
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sat Jul 27 21:57:44 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sat Jul 27 21:57:44 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=3f8de491

media-video/mjpegtools: various correctness fixes

* Fix build with GCC 15
* Fix LTO safety
* Fix C99 issue in configure

Closes: https://bugs.gentoo.org/899868
Closes: https://bugs.gentoo.org/927103
Closes: https://bugs.gentoo.org/936562
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../files/mjpegtools-2.2.1-gcc15-template.patch    | 349 +++++++++++++++++++++
 .../mjpegtools/files/mjpegtools-2.2.1-lto.patch    |  24 ++
 .../mjpegtools-2.2.1-puts-c99-configure.patch      |  13 +
 ...-2.2.1-r1.ebuild => mjpegtools-2.2.1-r2.ebuild} |   3 +
 4 files changed, 389 insertions(+)

diff --git a/media-video/mjpegtools/files/mjpegtools-2.2.1-gcc15-template.patch 
b/media-video/mjpegtools/files/mjpegtools-2.2.1-gcc15-template.patch
new file mode 100644
index 000000000000..66d017233233
--- /dev/null
+++ b/media-video/mjpegtools/files/mjpegtools-2.2.1-gcc15-template.patch
@@ -0,0 +1,349 @@
+https://bugs.gentoo.org/936562
+https://sourceforge.net/p/mjpeg/patches/63/
+--- a/y4mdenoise/Region2D.hh
++++ b/y4mdenoise/Region2D.hh
+@@ -97,35 +97,11 @@
+               // Add the given horizontal extent to the region.  Note that
+               // a_tnXEnd is technically one past the end of the extent.
+ 
+-      template <class REGION, class REGION_TEMP>
+-      void UnionDebug (Status_t &a_reStatus, INDEX a_tnY,
+-                      INDEX a_tnXStart, INDEX a_tnXEnd, REGION_TEMP &a_rTemp);
+-              // Add the given horizontal extent to the region.  Note that
+-              // a_tnXEnd is technically one past the end of the extent.
+-              // Exhaustively (i.e. slowly) verifies the results, using a
+-              // much simpler algorithm.
+-              // Requires the use of a temporary region, usually of the
+-              // final subclass' type, in order to work.  (Since that can't
+-              // be known at this level, a template parameter is included for
+-              // it.)
+-
+       template <class REGION>
+       void Union (Status_t &a_reStatus, const REGION &a_rOther);
+               // Make the current region represent the union between itself
+               // and the other given region.
+ 
+-      template <class REGION, class REGION_O, class REGION_TEMP>
+-      void UnionDebug (Status_t &a_reStatus,
+-                      REGION_O &a_rOther, REGION_TEMP &a_rTemp);
+-              // Make the current region represent the union between itself
+-              // and the other given region.
+-              // Exhaustively (i.e. slowly) verifies the results, using a
+-              // much simpler algorithm.
+-              // Requires the use of a temporary region, usually of the
+-              // final subclass' type, in order to work.  (Since that can't
+-              // be known at this level, a template parameter is included for
+-              // it.)
+-
+       //void Merge (Status_t &a_reStatus, INDEX a_tnY, INDEX a_tnXStart,
+       //              INDEX a_tnXEnd);
+               // Merge this extent into the current region.
+@@ -166,36 +142,11 @@
+               // Subtract the given horizontal extent from the region.  Note
+               // that a_tnXEnd is technically one past the end of the extent.
+ 
+-      template <class REGION_TEMP>
+-      void SubtractDebug (Status_t &a_reStatus, INDEX a_tnY,
+-                      INDEX a_tnXStart, INDEX a_tnXEnd, REGION_TEMP &a_rTemp);
+-              // Subtract the given horizontal extent from the region.  Note
+-              // that a_tnXEnd is technically one past the end of the extent.
+-              // Exhaustively (i.e. slowly) verifies the results, using a
+-              // much simpler algorithm.
+-              // Requires the use of a temporary region, usually of the
+-              // final subclass' type, in order to work.  (Since that can't
+-              // be known at this level, a template parameter is included for
+-              // it.)
+-
+       template <class REGION>
+       void Subtract (Status_t &a_reStatus, const REGION &a_rOther);
+               // Subtract the other region from the current region, i.e.
+               // remove from the current region any extents that exist in the
+               // other region.
+-      
+-      template <class REGION, class REGION_O, class REGION_TEMP>
+-      void SubtractDebug (Status_t &a_reStatus, REGION_O &a_rOther,
+-                      REGION_TEMP &a_rTemp);
+-              // Subtract the other region from the current region, i.e.
+-              // remove from the current region any extents that exist in the
+-              // other region.
+-              // Exhaustively (i.e. slowly) verifies the results, using a
+-              // much simpler algorithm.
+-              // Requires the use of a temporary region, usually of the
+-              // final subclass' type, in order to work.  (Since that can't
+-              // be known at this level, a template parameter is included for
+-              // it.)
+ 
+       //typedef ... ConstIterator;
+       //ConstIterator Begin (void) const { return m_setExtents.Begin(); }
+@@ -404,85 +355,6 @@
+ 
+ 
+ 
+-// Add the given horizontal extent to the region.
+-template <class INDEX, class SIZE>
+-template <class REGION, class REGION_TEMP>
+-void
+-Region2D<INDEX,SIZE>::UnionDebug (Status_t &a_reStatus, INDEX a_tnY,
+-      INDEX a_tnXStart, INDEX a_tnXEnd, REGION_TEMP &a_rTemp)
+-{
+-      typename REGION::ConstIterator itHere;
+-      typename REGION_TEMP::ConstIterator itHereO;
+-      INDEX tnX;
+-              // Used to loop through points.
+-
+-      // Make sure they didn't start us off with an error.
+-      assert (a_reStatus == g_kNoError);
+-
+-      // Calculate the union.
+-      a_rTemp.Assign (a_reStatus, *this);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      a_rTemp.Union (a_reStatus, a_tnY, a_tnXStart, a_tnXEnd);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      
+-      // Loop through every point in the result, make sure it's in
+-      // one of the two input regions.
+-      for (itHereO = a_rTemp.Begin(); itHereO != a_rTemp.End(); ++itHereO)
+-      {
+-              const Extent &rHere = *itHereO;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!((rHere.m_tnY == a_tnY
+-                              && (tnX >= a_tnXStart && tnX < a_tnXEnd))
+-                      || this->DoesContainPoint (rHere.m_tnY, tnX)))
+-                              goto error;
+-              }
+-      }
+-
+-      // Loop through every point in the original region, make sure
+-      // it's in the result.
+-      for (itHere = this->Begin(); itHere != this->End(); ++itHere)
+-      {
+-              const Extent &rHere = *itHere;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!a_rTemp.DoesContainPoint (rHere.m_tnY, tnX))
+-                              goto error;
+-              }
+-      }
+-
+-      // Loop through every point in the added extent, make sure it's in
+-      // the result.
+-      for (tnX = a_tnXStart; tnX < a_tnXEnd; ++tnX)
+-      {
+-              if (!a_rTemp.DoesContainPoint (a_tnY, tnX))
+-                      goto error;
+-      }
+-
+-      // The operation succeeded.  Commit it.
+-      Assign (a_reStatus, a_rTemp);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-
+-      // All done.
+-      return;
+-
+-error:
+-      // Handle deviations.
+-      fprintf (stderr, "Region2D::Union() failed\n");
+-      fprintf (stderr, "Input region:\n");
+-      PrintRegion (*this);
+-      fprintf (stderr, "Input extent: [%d,%d-%d]\n",
+-              int (a_tnY), int (a_tnXStart), int (a_tnXEnd));
+-      fprintf (stderr, "Result:\n");
+-      PrintRegion (a_rTemp);
+-      assert (false);
+-}
+-
+-
+-
+ // Make the current region represent the union between itself
+ // and the other given region.
+ template <class INDEX, class SIZE>
+@@ -511,184 +383,6 @@
+       }
+ }
+ 
+-
+-
+-// Make the current region represent the union between itself
+-// and the other given region.
+-template <class INDEX, class SIZE>
+-template <class REGION, class REGION_O, class REGION_TEMP>
+-void
+-Region2D<INDEX,SIZE>::UnionDebug (Status_t &a_reStatus,
+-      REGION_O &a_rOther, REGION_TEMP &a_rTemp)
+-{
+-      typename REGION::ConstIterator itHere;
+-      typename REGION_O::ConstIterator itHereO;
+-      typename REGION_TEMP::ConstIterator itHereT;
+-      INDEX tnX;
+-              // Used to loop through points.
+-
+-      // Make sure they didn't start us off with an error.
+-      assert (a_reStatus == g_kNoError);
+-
+-      // Calculate the union.
+-      a_rTemp.Assign (a_reStatus, *this);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      a_rTemp.Union (a_reStatus, a_rOther);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      
+-      // Loop through every point in the result, make sure it's in
+-      // one of the two input regions.
+-      for (itHereT = a_rTemp.Begin(); itHereT != a_rTemp.End(); ++itHereT)
+-      {
+-              const Extent &rHere = *itHereT;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!a_rOther.DoesContainPoint (rHere.m_tnY, tnX)
+-                      && !this->DoesContainPoint (rHere.m_tnY, tnX))
+-                              goto error;
+-              }
+-      }
+-
+-      // Loop through every point in the first input region, make sure
+-      // it's in the result.
+-      for (itHere = this->Begin(); itHere != this->End(); ++itHere)
+-      {
+-              const Extent &rHere = *itHere;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!a_rTemp.DoesContainPoint (rHere.m_tnY, tnX))
+-                              goto error;
+-              }
+-      }
+-
+-      // Loop through every point in the second input region, make sure
+-      // it's in the result.
+-      for (itHereO = a_rOther.Begin();
+-               itHereO != a_rOther.End();
+-               ++itHereO)
+-      {
+-              const Extent &rHere = *itHereO;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!a_rTemp.DoesContainPoint (rHere.m_tnY, tnX))
+-                              goto error;
+-              }
+-      }
+-
+-      // The operation succeeded.  Commit it.
+-      Assign (a_reStatus, a_rTemp);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-
+-      // All done.
+-      return;
+-
+-error:
+-      // Handle deviations.
+-      fprintf (stderr, "Region2D::Union() failed\n");
+-      fprintf (stderr, "First input region:\n");
+-      PrintRegion (*this);
+-      fprintf (stderr, "Second input region:\n");
+-      PrintRegion (a_rOther);
+-      fprintf (stderr, "Result:\n");
+-      PrintRegion (a_rTemp);
+-      assert (false);
+-}
+-
+-
+-
+-// Subtract the other region from the current region, i.e.
+-// remove from the current region any areas that exist in the
+-// other region.
+-template <class INDEX, class SIZE>
+-template <class REGION, class REGION_O, class REGION_TEMP>
+-void
+-Region2D<INDEX,SIZE>::SubtractDebug (Status_t &a_reStatus,
+-      REGION_O &a_rOther, REGION_TEMP &a_rTemp)
+-{
+-      typename REGION::ConstIterator itHere;
+-      typename REGION_O::ConstIterator itHereO;
+-      typename REGION_TEMP::ConstIterator itHereT;
+-      INDEX tnX;
+-              // Used to loop through points.
+-
+-      // Make sure they didn't start us off with an error.
+-      assert (a_reStatus == g_kNoError);
+-
+-      // Calculate the difference.
+-      a_rTemp.Assign (a_reStatus, *this);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      a_rTemp.Subtract (a_reStatus, a_rOther);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-      
+-      // Loop through every point in the result, make sure it's in
+-      // the first input region but not the second.
+-      for (itHereT = a_rTemp.Begin(); itHereT != a_rTemp.End(); ++itHereT)
+-      {
+-              const Extent &rHere = *itHereT;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!(this->DoesContainPoint (rHere.m_tnY, tnX)
+-                      && !a_rOther.DoesContainPoint (rHere.m_tnY, tnX)))
+-                              goto error;
+-              }
+-      }
+-
+-      // Loop through every point in the first input region, and if it's
+-      // not in the second input region, make sure it's in the result.
+-      for (itHere = this->Begin(); itHere != this->End(); ++itHere)
+-      {
+-              const Extent &rHere = *itHere;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (!a_rOther.DoesContainPoint (rHere.m_tnY, tnX))
+-                      {
+-                              if (!a_rTemp.DoesContainPoint (rHere.m_tnY, 
tnX))
+-                                      goto error;
+-                      }
+-              }
+-      }
+-
+-      // Loop through every point in the second input region, make sure
+-      // it's not in the result.
+-      for (itHereO = a_rOther.Begin();
+-               itHereO != a_rOther.End();
+-               ++itHereO)
+-      {
+-              const Extent &rHere = *itHere;
+-              for (tnX = rHere.m_tnXStart; tnX < rHere.m_tnXEnd; ++tnX)
+-              {
+-                      if (a_rTemp.DoesContainPoint (rHere.m_tnY, tnX))
+-                              goto error;
+-              }
+-      }
+-
+-      // The operation succeeded.  Commit it.
+-      Assign (a_reStatus, a_rTemp);
+-      if (a_reStatus != g_kNoError)
+-              return;
+-
+-      // All done.
+-      return;
+-
+-error:
+-      // Handle deviations.
+-      fprintf (stderr, "Region2D::Subtract() failed\n");
+-      fprintf (stderr, "First input region:\n");
+-      PrintRegion (*this);
+-      fprintf (stderr, "Second input region:\n");
+-      PrintRegion (a_rOther);
+-      fprintf (stderr, "Result:\n");
+-      PrintRegion (a_rTemp);
+-      assert (false);
+-}
+-
+-
+-
+ // Flood-fill the current region.
+ template <class INDEX, class SIZE>
+ template <class CONTROL>
+

diff --git a/media-video/mjpegtools/files/mjpegtools-2.2.1-lto.patch 
b/media-video/mjpegtools/files/mjpegtools-2.2.1-lto.patch
new file mode 100644
index 000000000000..b4cf1e14275f
--- /dev/null
+++ b/media-video/mjpegtools/files/mjpegtools-2.2.1-lto.patch
@@ -0,0 +1,24 @@
+https://sourceforge.net/p/mjpeg/bugs/143/
+https://bugs.gentoo.org/927103
+--- a/mpeg2enc/quantize_x86.c
++++ b/mpeg2enc/quantize_x86.c
+@@ -41,7 +41,7 @@
+ #include "quantize_precomp.h"
+ #include "quantize_ref.h"
+                                       
+-int quant_weight_coeff_sum_mmx (int16_t *blk, uint16_t *i_quant_mat );
++int32_t quant_weight_coeff_sum_mmx(int16_t *src, int16_t *i_quant_mat);
+ 
+ void iquantize_non_intra_m1_mmx(int16_t *src, int16_t *dst, uint16_t *qmat);
+ void iquantize_non_intra_m2_mmx(int16_t *src, int16_t *dst, uint16_t *qmat);
+--- a/lavtools/lav_io.c
++++ b/lavtools/lav_io.c
+@@ -34,7 +34,7 @@
+ #include <libdv/dv.h>
+ #endif
+
+-extern int AVI_errno;
++extern long int AVI_errno;
+
+ static char video_format=' ';
+ static int  internal_error=0;

diff --git 
a/media-video/mjpegtools/files/mjpegtools-2.2.1-puts-c99-configure.patch 
b/media-video/mjpegtools/files/mjpegtools-2.2.1-puts-c99-configure.patch
new file mode 100644
index 000000000000..6cbc92ee28ff
--- /dev/null
+++ b/media-video/mjpegtools/files/mjpegtools-2.2.1-puts-c99-configure.patch
@@ -0,0 +1,13 @@
+https://sourceforge.net/p/mjpeg/bugs/144/
+https://bugs.gentoo.org/899868
+--- a/configure.ac
++++ b/configure.ac
+@@ -236,7 +236,7 @@ dnl Check to see if __progname is provided by the system
+ dnl ********************************************************************
+ AC_CACHE_CHECK([for __progname],
+                [mjt_cv_extern___progname],
+-               [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
++               [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
+                                                 [[extern char *__progname;
+                                                   puts(__progname);]])],
+                                [mjt_cv_extern___progname=yes],

diff --git a/media-video/mjpegtools/mjpegtools-2.2.1-r1.ebuild 
b/media-video/mjpegtools/mjpegtools-2.2.1-r2.ebuild
similarity index 95%
rename from media-video/mjpegtools/mjpegtools-2.2.1-r1.ebuild
rename to media-video/mjpegtools/mjpegtools-2.2.1-r2.ebuild
index 501d8c0b77b0..71a254556311 100644
--- a/media-video/mjpegtools/mjpegtools-2.2.1-r1.ebuild
+++ b/media-video/mjpegtools/mjpegtools-2.2.1-r2.ebuild
@@ -42,6 +42,9 @@ src_prepare() {
 
        eapply "${FILESDIR}/${P}-c++17-register-fix.patch"
        eapply "${FILESDIR}/${P}-c++17-no-auto_ptr-fix.patch"
+       eapply "${FILESDIR}/${P}-gcc15-template.patch"
+       eapply "${FILESDIR}/${P}-lto.patch"
+       eapply "${FILESDIR}/${P}-puts-c99-configure.patch"
 
        eautoreconf
        sed -i -e '/ARCHFLAGS=/s:=.*:=:' configure

Reply via email to