Pagina 1 di 1

Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current [RISOLTO]

Inviato: dom 7 feb 2021, 18:58
da gian_d
OIIO è sicuramente la mia bestia nera perché ogni volta che devo compilarlo mi riserva sempre nuove e inaspettate sorprese. Di solito riesco a venirne a capo, ma questa volta non so che pesci pigliare. Apparentemente sembra che siano errori di sintassi del codice C++, cosa alquanto strana dal momento che in passato lo stesso codice veniva compilato correttamente.
Gli errori sono molteplici ma penso che siano dovuti ad un effetto a cascata di un presunto errore di sintassi iniziale. Escludendo errori del codice sorgente, probabilmente va passata qualche opzione al compilatore da cmake ma non so quale. Nello slackbuild del repository di Ponce non ci sono aggiornamenti recenti di OIIO e il pacchetto attualmente installato è stato ricompilato il 20 dicembre, quindi non dovrebbe trattarsi del compilatore.

Al che non riesco a capire se il problema deriva dal recente aggiornamento di glibc (mi è capitato con la ricompilazione di alcuni pacchetti ma per ora sono riuscito a risolverli quasi tutti) oppure da aggiornamenti di qualche pacchetto di sviluppo (cmake?) o di qualche libreria.

Metto qui una parte dello stream restituito dalla compilazione (gli errori si ripetono in modo ridondante anche per altri file *.cpp)

Codice: Seleziona tutto

Scanning dependencies of target OpenImageIO
[ 11%] Building CXX object src/libOpenImageIO/CMakeFiles/OpenImageIO.dir/exif.cpp.o
In file included from /tmp/SBo/oiio-Release-2.0.13/src/include/OpenImageIO/tiffutils.h:45,
                 from /tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:45:
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:558:5: error: expected identifier before numeric constant
  558 |     GPSTAG_VERSIONID         = 0,
      |     ^~~~~~~~~~~~~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:558:5: error: expected ‘}’ before numeric constant
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:557:13: note: to match this ‘{’
  557 | enum GPSTag {
      |             ^
In file included from /tmp/SBo/oiio-Release-2.0.13/src/include/OpenImageIO/tiffutils.h:45,
                 from /tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:45:
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:558:5: error: expected unqualified-id before numeric constant
  558 |     GPSTAG_VERSIONID         = 0,
      |     ^~~~~~~~~~~~~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:592:14: error: ‘TagInfo’ does not name a type
  592 | static const TagInfo gps_tag_table[] = {
      |              ^~~~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:630:7: error: ‘TagMap’ does not name a type
  630 | const TagMap&
      |       ^~~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:639:1: error: ‘cspan’ does not name a type
  639 | cspan<TagInfo>
      | ^~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:660:1: error: variable or field ‘add_exif_item_to_spec’ declared void
  660 | add_exif_item_to_spec(ImageSpec& spec, const char* name,
      | ^~~~~~~~~~~~~~~~~~~~~
/tmp/SBo/oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp:660:23: error: ‘ImageSpec’ was not declared in this scope; did you mean ‘OpenImageIO_v2_0::ImageSpec’?
  660 | add_exif_item_to_spec(ImageSpec& spec, const char* name,
      |                       ^~~~~~~~~
      |                       OpenImageIO_v2_0::ImageSpec
      
      ecc.
Qualche suggerimento?

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: dom 7 feb 2021, 19:15
da gian_d
Forse ho risolto usando lo slackbuild originale. L'avevo modificando aggiungendo -fcommon nei flag e applicando una patch per risolvere un errore che mi dava nelle precedenti compilazioni.
Adesso la compilazione sta procedendo e ha superato senza errori la fase in cui si arrestava (l'11%), speriamo che non incappi nell'errore che mi dava nelle precedenti compilazioni.

In ogni caso noto che può bastare anche un apparente banale aggiornamento delle configurazioni di sistema per far saltare fuori apparenti incasinamenti nelle compilazioni. Mah... :-D

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: dom 7 feb 2021, 19:17
da gian_d
Come non detto, è incappato di nuovo nell'errore nella stessa fase, solo che adesso me la dà al 19% della compilazione invece dell'11% :-\

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 10:14
da ponce
visto che l'errore sembra provenire da un header di libtiff probabilmente potrebbe essere legato all'aggiornamento di libtiff che c'e' stato in current a gennaio.

siccome openimageio e' una dipendenza di Blender e il maintainer e' lo stesso e usa anche current potresti provare a sentire se ha qualche soluzione...

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 14:03
da gian_d
lo farò nei prossimi giorni, prima voglio provare ancora un paio di cartucce, ma ho un po' di impegni fino a mercoledì che non mi lasciano molto tempo

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 17:31
da gian_d
Ponce, avevi visto giusto, il problema è causato proprio dall'aggiornamento di libtiff. Quello di gennaio era una ricompilazione, ma ho visto che è stato aggiornato dalla versione 4.1.0 a 4.2.0 proprio il 20 dicembre. Evidentemente quando avevo fatto la compilazione di OIIO il 20 dicembre non avevo ancora aggiornato i pacchetti della current.

Detto questo, ho ricompilato libtiff dai sorgenti della version 4.1.0 e fatto il downgrade sul sistema a questa versione. La compilazione di OIIO procede senza errori con lo slackbuild che avevo.

Ho già notato che nell'header tiff.h di libtiff sono state introdotte nella 4.2.0 delle definizioni che sono chiamate in causa nel codice di OIIO. Forse si tratta di un conflitto derivante da una ridondanza, voglio studiarmi i codici, magari riesco a risolvere confrontandoli con quelli dell'ultima versione di OIIO: ho visto che la compilazione di quest'ultima versione non genera questo errore ma ne incontra altri di diverso tipo.

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 18:55
da gian_d
Risolto, ho applicato una patch estrapolata per approssimazioni successive dal codice della versione 2.2.11 di OIIO e ora funziona. La patch non è inserita nello slackbuild originale ma in uno slackbuild ritoccato perché applico un'altra patch

Di seguito scrivo le modifiche che ho fatto

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 19:15
da gian_d
Slackbuild

nei flag ($SLKCFLAGS) ho aggiunto -fcommon

come patch ho aggiunto le seguenti righe

Codice: Seleziona tutto

 patch -p1 < $CWD/rawinput.diff
 patch -p1 < $CWD/oiio-libopenimageio-exif-cpp.diff
i codici delle patch li incollo in due post successivi

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 19:18
da gian_d
Patch rawinput.diff
Non mi ricordo il contesto, ma l'avevo applicata per risolvere degli errori in una precedente compilazione

Codice: Seleziona tutto

--- oiio-Release-2.0.13/src/raw.imageio/rawinput.cpp	2019-12-03 23:28:14.000000000 +0100
+++ oiio-Release-2.0.13-fix/src/raw.imageio/rawinput.cpp	2020-12-20 23:29:30.556780764 +0100
@@ -643,7 +643,7 @@
 #if LIBRAW_VERSION >= LIBRAW_MAKE_VERSION(0, 17, 0)
     if (other.parsed_gps.gpsparsed) {
         add("GPS", "Latitude", other.parsed_gps.latitude, false, 0.0f);
-        add("GPS", "Longitude", other.parsed_gps.longtitude, false,
+        add("GPS", "Longitude", other.parsed_gps.longitude, false,
             0.0f);  // N.B. wrong spelling!
         add("GPS", "TimeStamp", other.parsed_gps.gpstimestamp, false, 0.0f);
         add("GPS", "Altitude", other.parsed_gps.altitude, false, 0.0f);
@@ -667,12 +667,12 @@
     // float AmbientTemperature;
     // float BatteryTemperature;
     // float exifAmbientTemperature;
-    add("Exif", "Humidity", other.exifHumidity, false, 0.0f);
-    add("Exif", "Pressure", other.exifPressure, false, 0.0f);
-    add("Exif", "WaterDepth", other.exifWaterDepth, false, 0.0f);
-    add("Exif", "Acceleration", other.exifAcceleration, false, 0.0f);
-    add("Exif", "CameraElevactionAngle", other.exifCameraElevationAngle, false,
-        0.0f);
+    //add("Exif", "Humidity", other.exifHumidity, false, 0.0f);
+    //add("Exif", "Pressure", other.exifPressure, false, 0.0f);
+    //add("Exif", "WaterDepth", other.exifWaterDepth, false, 0.0f);
+    //add("Exif", "Acceleration", other.exifAcceleration, false, 0.0f);
+    //add("Exif", "CameraElevactionAngle", other.exifCameraElevationAngle, false,
+    //    0.0f);
     // float real_ISO;
 #endif
 
@@ -861,9 +861,9 @@
 {
 #if LIBRAW_VERSION >= LIBRAW_MAKE_VERSION(0, 18, 0)
     auto const& mn(m_processor->imgdata.makernotes.olympus);
-    MAKERF(OlympusCropID);
-    MAKERF(OlympusFrame); /* upper left XY, lower right XY */
-    MAKERF(OlympusSensorCalibration);
+    //MAKERF(OlympusCropID);
+    //MAKERF(OlympusFrame); /* upper left XY, lower right XY */
+    //MAKERF(OlympusSensorCalibration);
     MAKERF(FocusMode);
     MAKERF(AutoFocus);
     MAKERF(AFPoint);
@@ -938,12 +938,12 @@
 {
 #if LIBRAW_VERSION >= LIBRAW_MAKE_VERSION(0, 18, 0)
     auto const& mn(m_processor->imgdata.makernotes.fuji);
-    add(m_make, "ExpoMidPointShift", mn.FujiExpoMidPointShift);
-    add(m_make, "DynamicRange", mn.FujiDynamicRange);
-    add(m_make, "FilmMode", mn.FujiFilmMode);
-    add(m_make, "DynamicRangeSetting", mn.FujiDynamicRangeSetting);
-    add(m_make, "DevelopmentDynamicRange", mn.FujiDevelopmentDynamicRange);
-    add(m_make, "AutoDynamicRange", mn.FujiAutoDynamicRange);
+    add(m_make, "ExpoMidPointShift", mn.ExpoMidPointShift);
+    add(m_make, "DynamicRange", mn.DynamicRange);
+    add(m_make, "FilmMode", mn.FilmMode);
+    add(m_make, "DynamicRangeSetting", mn.DynamicRangeSetting);
+    add(m_make, "DevelopmentDynamicRange", mn.DevelopmentDynamicRange);
+    add(m_make, "AutoDynamicRange", mn.AutoDynamicRange);
     MAKERF(FocusMode);
     MAKERF(AFMode);
     MAKERF(FocusPixel);
@@ -967,7 +967,7 @@
 {
 #if LIBRAW_VERSION >= LIBRAW_MAKE_VERSION(0, 18, 0)
     auto const& mn(m_processor->imgdata.makernotes.sony);
-    MAKERF(SonyCameraType);
+    MAKERF(CameraType);
 #endif
 #if LIBRAW_VERSION >= LIBRAW_MAKE_VERSION(0, 19, 0)
     // uchar Sony0x9400_version; /* 0 if not found/deciphered, 0xa, 0xb, 0xc following exiftool convention */
@@ -976,12 +976,12 @@
     // uchar Sony0x9400_SequenceLength1;
     // unsigned Sony0x9400_SequenceFileNumber;
     // uchar Sony0x9400_SequenceLength2;
-    if (mn.raw_crop.cwidth || mn.raw_crop.cheight) {
-        add(m_make, "cropleft", mn.raw_crop.cleft, true);
-        add(m_make, "croptop", mn.raw_crop.ctop, true);
-        add(m_make, "cropwidth", mn.raw_crop.cwidth, true);
-        add(m_make, "cropheight", mn.raw_crop.cheight, true);
-    }
+    //if (mn.raw_crop.cwidth || mn.raw_crop.cheight) {
+    //    add(m_make, "cropleft", mn.raw_crop.cleft, true);
+    //    add(m_make, "croptop", mn.raw_crop.ctop, true);
+    //    add(m_make, "cropwidth", mn.raw_crop.cwidth, true);
+    //    add(m_make, "cropheight", mn.raw_crop.cheight, true);
+    //}
     MAKERF(AFMicroAdjValue);
     MAKERF(AFMicroAdjOn);
     MAKER(AFMicroAdjRegisteredLenses, 0);
@@ -1054,17 +1054,17 @@
         MAKER(Adapter, 0);
         MAKER(AttachmentID, 0ULL);
         MAKER(Attachment, 0);
-        MAKER(CanonFocalUnits, 0);
+        MAKER(FocalUnits, 0);
         MAKER(FocalLengthIn35mmFormat, 0.0f);
     }
 
     if (Strutil::iequals(m_make, "Nikon")) {
         auto const& mn(m_processor->imgdata.lens.nikon);
-        add(m_make, "EffectiveMaxAp", mn.NikonEffectiveMaxAp);
-        add(m_make, "LensIDNumber", mn.NikonLensIDNumber);
-        add(m_make, "LensFStops", mn.NikonLensFStops);
-        add(m_make, "MCUVersion", mn.NikonMCUVersion);
-        add(m_make, "LensType", mn.NikonLensType);
+        add(m_make, "EffectiveMaxAp", mn.EffectiveMaxAp);
+        add(m_make, "LensIDNumber", mn.LensIDNumber);
+        add(m_make, "LensFStops", mn.LensFStops);
+        add(m_make, "MCUVersion", mn.MCUVersion);
+        add(m_make, "LensType", mn.LensType);
     }
     if (Strutil::iequals(m_make, "DNG")) {
         auto const& mn(m_processor->imgdata.lens.dng);

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 19:23
da gian_d
Patch oiio-libopenimageio-exif-cpp.diff
Questa risolve il problema dell'aggiornamento di libtiff. Peraltro in un blocco del codice aggiornato c'è anche un commento che fa riferimento proprio alle versioni di libtiff precedenti a 4.2.0

Codice: Seleziona tutto

--- oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp	2019-12-03 23:28:14.000000000 +0100
+++ oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp	2021-02-02 02:54:55.000000000 +0100
@@ -554,40 +528,44 @@
 
 
 
+// libtiff > 4.1.0 defines these in tiff.h. For older libtiff, let's define
+// them ourselves.
+#ifndef GPSTAG_VERSIONID
 enum GPSTag {
-    GPSTAG_VERSIONID         = 0,
-    GPSTAG_LATITUDEREF       = 1,
-    GPSTAG_LATITUDE          = 2,
-    GPSTAG_LONGITUDEREF      = 3,
-    GPSTAG_LONGITUDE         = 4,
-    GPSTAG_ALTITUDEREF       = 5,
-    GPSTAG_ALTITUDE          = 6,
-    GPSTAG_TIMESTAMP         = 7,
-    GPSTAG_SATELLITES        = 8,
-    GPSTAG_STATUS            = 9,
-    GPSTAG_MEASUREMODE       = 10,
-    GPSTAG_DOP               = 11,
-    GPSTAG_SPEEDREF          = 12,
-    GPSTAG_SPEED             = 13,
-    GPSTAG_TRACKREF          = 14,
-    GPSTAG_TRACK             = 15,
-    GPSTAG_IMGDIRECTIONREF   = 16,
-    GPSTAG_IMGDIRECTION      = 17,
-    GPSTAG_MAPDATUM          = 18,
-    GPSTAG_DESTLATITUDEREF   = 19,
-    GPSTAG_DESTLATITUDE      = 20,
-    GPSTAG_DESTLONGITUDEREF  = 21,
-    GPSTAG_DESTLONGITUDE     = 22,
-    GPSTAG_DESTBEARINGREF    = 23,
-    GPSTAG_DESTBEARING       = 24,
-    GPSTAG_DESTDISTANCEREF   = 25,
-    GPSTAG_DESTDISTANCE      = 26,
-    GPSTAG_PROCESSINGMETHOD  = 27,
-    GPSTAG_AREAINFORMATION   = 28,
-    GPSTAG_DATESTAMP         = 29,
-    GPSTAG_DIFFERENTIAL      = 30,
-    GPSTAG_HPOSITIONINGERROR = 31
+    GPSTAG_VERSIONID            = 0,
+    GPSTAG_LATITUDEREF          = 1,
+    GPSTAG_LATITUDE             = 2,
+    GPSTAG_LONGITUDEREF         = 3,
+    GPSTAG_LONGITUDE            = 4,
+    GPSTAG_ALTITUDEREF          = 5,
+    GPSTAG_ALTITUDE             = 6,
+    GPSTAG_TIMESTAMP            = 7,
+    GPSTAG_SATELLITES           = 8,
+    GPSTAG_STATUS               = 9,
+    GPSTAG_MEASUREMODE          = 10,
+    GPSTAG_DOP                  = 11,
+    GPSTAG_SPEEDREF             = 12,
+    GPSTAG_SPEED                = 13,
+    GPSTAG_TRACKREF             = 14,
+    GPSTAG_TRACK                = 15,
+    GPSTAG_IMGDIRECTIONREF      = 16,
+    GPSTAG_IMGDIRECTION         = 17,
+    GPSTAG_MAPDATUM             = 18,
+    GPSTAG_DESTLATITUDEREF      = 19,
+    GPSTAG_DESTLATITUDE         = 20,
+    GPSTAG_DESTLONGITUDEREF     = 21,
+    GPSTAG_DESTLONGITUDE        = 22,
+    GPSTAG_DESTBEARINGREF       = 23,
+    GPSTAG_DESTBEARING          = 24,
+    GPSTAG_DESTDISTANCEREF      = 25,
+    GPSTAG_DESTDISTANCE         = 26,
+    GPSTAG_PROCESSINGMETHOD     = 27,
+    GPSTAG_AREAINFORMATION      = 28,
+    GPSTAG_DATESTAMP            = 29,
+    GPSTAG_DIFFERENTIAL         = 30,
+    GPSTAG_GPSHPOSITIONINGERROR = 31
 };
+#endif
 
 static const TagInfo gps_tag_table[] = {
     // clang-format off
@@ -622,7 +600,7 @@
     { GPSTAG_AREAINFORMATION,	"GPS:AreaInformation",	TIFF_UNDEFINED, 1 },
     { GPSTAG_DATESTAMP,		"GPS:DateStamp",	TIFF_ASCII, 0 },
     { GPSTAG_DIFFERENTIAL,	"GPS:Differential",	TIFF_SHORT, 1 },
-    { GPSTAG_HPOSITIONINGERROR,	"GPS:HPositioningError",TIFF_RATIONAL, 1 }
+    { GPSTAG_GPSHPOSITIONINGERROR,	"GPS:HPositioningError",TIFF_RATIONAL, 1 }
     // clang-format on
 };
 
@@ -685,7 +663,7 @@
     }
     if (dirp->tdir_type == TIFF_RATIONAL) {
         int n    = dirp->tdir_count;  // How many
-        float* f = (float*)alloca(n * sizeof(float));
+        float* f = OIIO_ALLOCA(float, n);
         for (int i = 0; i < n; ++i) {
             unsigned int num, den;
             num = ((const unsigned int*)dataptr)[2 * i + 0];
@@ -704,7 +682,7 @@
     }
     if (dirp->tdir_type == TIFF_SRATIONAL) {
         int n    = dirp->tdir_count;  // How many
-        float* f = (float*)alloca(n * sizeof(float));
+        float* f = OIIO_ALLOCA(float, n);
         for (int i = 0; i < n; ++i) {
             int num, den;
             num = ((const int*)dataptr)[2 * i + 0];
@@ -799,7 +777,7 @@
 
 #if DEBUG_EXIF_READ
     std::cerr << "Read " << tagmap.mapname() << " ";
-    print_dir_entry(tagmap, dir, buf, offset_adjustment);
+    print_dir_entry(std::cerr, tagmap, dir, buf, offset_adjustment);
 #endif
 
     if (dir.tdir_tag == TIFFTAG_EXIFIFD || dir.tdir_tag == TIFFTAG_GPSIFD) {
@@ -808,7 +786,7 @@
         unsigned int offset = dirp->tdir_offset;  // int stored in offset itself
         if (swab)
             swap_endian(&offset);
-        if (offset >= buf.size()) {
+        if (offset >= size_t(buf.size())) {
 #if DEBUG_EXIF_READ
             unsigned int off2 = offset;
             swap_endian(&off2);
@@ -863,6 +841,16 @@
         unsigned int offset = dirp->tdir_offset;  // int stored in offset itself
         if (swab)
             swap_endian(&offset);
+        if (offset >= size_t(buf.size())) {
+#if DEBUG_EXIF_READ
+            unsigned int off2 = offset;
+            swap_endian(&off2);
+            std::cerr << "Bad Exif block? ExifIFD has offset " << offset
+                      << " inexplicably greater than exif buffer length "
+                      << buf.size() << " (byte swapped = " << off2 << ")\n";
+#endif
+            return;
+        }
         // Don't recurse if we've already visited this IFD
         if (ifd_offsets_seen.find(offset) != ifd_offsets_seen.end())
             return;
 
@@ -964,49 +946,46 @@
             const char* s = *(const char**)p.data();
             int len       = strlen(s) + 1;
             append_tiff_dir_entry(dirs, data, tag, type, len, s,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_RATIONAL:
         if (element == TypeDesc::FLOAT) {
-            unsigned int* rat = (unsigned int*)alloca(2 * count
-                                                      * sizeof(unsigned int));
+            unsigned int* rat = OIIO_ALLOCA(unsigned int, 2 * count);
             const float* f    = (const float*)p.data();
             for (size_t i = 0; i < count; ++i)
                 float_to_rational(f[i], rat[2 * i], rat[2 * i + 1]);
             append_tiff_dir_entry(dirs, data, tag, type, count, rat,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_SRATIONAL:
         if (element == TypeDesc::FLOAT) {
-            int* rat       = (int*)alloca(2 * count * sizeof(int));
+            int* rat       = OIIO_ALLOCA(int, 2 * count);
             const float* f = (const float*)p.data();
             for (size_t i = 0; i < count; ++i)
                 float_to_rational(f[i], rat[2 * i], rat[2 * i + 1]);
             append_tiff_dir_entry(dirs, data, tag, type, count, rat,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_SHORT:
-        if (append_tiff_dir_entry_integer<unsigned short>(p, dirs, data, tag,
-                                                          type,
-                                                          offset_correction))
+        if (append_tiff_dir_entry_integer<unsigned short>(
+                p, dirs, data, tag, type, offset_correction, endianreq))
             return;
         break;
     case TIFF_LONG:
         if (append_tiff_dir_entry_integer<unsigned int>(p, dirs, data, tag,
-                                                        type,
-                                                        offset_correction))
+                                                        type, offset_correction,
+                                                        endianreq))
             return;
         break;
     case TIFF_BYTE:
-        if (append_tiff_dir_entry_integer<unsigned char>(p, dirs, data, tag,
-                                                         type,
-                                                         offset_correction))
+        if (append_tiff_dir_entry_integer<unsigned char>(
+                p, dirs, data, tag, type, offset_correction, endianreq))
             return;
         break;
     default: break;
@@ -1091,14 +1097,24 @@
 bool
 decode_exif(cspan<uint8_t> exif, ImageSpec& spec)
 {
+    // Sometimes an exif blob starts with "Exif". Skip it.
+    if (exif.size() >= 6 && exif[0] == 'E' && exif[1] == 'x' && exif[2] == 'i'
+        && exif[3] == 'f' && exif[4] == 0 && exif[5] == 0) {
+        exif = exif.subspan(6);
+    }
+
 #if DEBUG_EXIF_READ
     std::cerr << "Exif dump:\n";
-    for (size_t i = 0; i < exif.size(); ++i) {
+    for (size_t i = 0; i < std::min(200L, exif.size()); ++i) {
+        if ((i % 16) == 0)
+            std::cerr << "[" << i << "] ";
         if (exif[i] >= ' ')
             std::cerr << (char)exif[i] << ' ';
         std::cerr << "(" << (int)exif[i] << ") ";
+        if ((i % 16) == 15)
+            std::cerr << "\n";
     }
-    std::cerr << "\n";
+    std::cerr << std::endl;
 #endif
 
     // The first item should be a standard TIFF header.  Note that HERE,
@@ -1176,8 +1192,10 @@
 
 template<class T>
 inline void
-append(std::vector<char>& blob, const T& v)
+append(std::vector<char>& blob, T v, endian endianreq = endian::native)
 {
+    if (endianreq != endian::native)
+        swap_endian(&v);
     blob.insert(blob.end(), (const char*)&v, (const char*)&v + sizeof(T));
 }
 
@@ -1191,10 +1209,20 @@
 
 
 
+// DEPRECATED(2.1)
+void
+encode_exif(const ImageSpec& spec, std::vector<char>& blob)
+{
+    encode_exif(spec, blob, endian::native);
+}
+
+
+
 // Construct an Exif data block from the ImageSpec, appending the Exif
 // data as a big blob to the char vector.
 void
-encode_exif(const ImageSpec& spec, std::vector<char>& blob)
+encode_exif(const ImageSpec& spec, std::vector<char>& blob,
+            OIIO::endian endianreq)
 {
     const TagMap& exif_tagmap(exif_tagmap_ref());
     const TagMap& gps_tagmap(gps_tagmap_ref());
@@ -1243,9 +1271,9 @@
     // Put a TIFF header
     size_t tiffstart = blob.size();  // store initial size
     TIFFHeader head;
-    head.tiff_magic   = littleendian() ? 0x4949 : 0x4d4d;
+    head.tiff_magic   = (endianreq == endian::little) ? 0x4949 : 0x4d4d;
     head.tiff_version = 42;
-    // head.tiff_diroff -- fix below, once we know the sizes
+    // N.B. need to swap_endian head.tiff_diroff  below, once we know the sizes
     append(blob, head);
 
     // Accumulate separate tag directories for TIFF, Exif, GPS, and Interop.
@@ -1259,7 +1287,8 @@
         if (Strutil::starts_with(p.name(), "GPS:")) {
             int tag = gps_tagmap.tag(p.name());
             if (tag >= 0)
-                encode_exif_entry(p, tag, gpsdirs, blob, gps_tagmap, tiffstart);
+                encode_exif_entry(p, tag, gpsdirs, blob, gps_tagmap, tiffstart,
+                                  endianreq);
         } else {
             // Not GPS
             int tag = exif_tagmap.tag(p.name());
@@ -1267,10 +1296,10 @@
                 // This range of Exif tags go in the main TIFF directories,
                 // not the Exif IFD. Whatever.
                 encode_exif_entry(p, tag, tiffdirs, blob, exif_tagmap,
-                                  tiffstart);
+                                  tiffstart, endianreq);
             } else {
                 encode_exif_entry(p, tag, exifdirs, blob, exif_tagmap,
-                                  tiffstart);
+                                  tiffstart, endianreq);
             }
         }
     }
@@ -1293,12 +1322,14 @@
     if (exifdirs.size() || makerdirs.size()) {
         // Add some required Exif tags that wouldn't be in the spec
         append_tiff_dir_entry(exifdirs, blob, EXIF_EXIFVERSION, TIFF_UNDEFINED,
-                              4, "0230", tiffstart);
+                              4, "0230", tiffstart, 0, endianreq);
         append_tiff_dir_entry(exifdirs, blob, EXIF_FLASHPIXVERSION,
-                              TIFF_UNDEFINED, 4, "0100", tiffstart);
+                              TIFF_UNDEFINED, 4, "0100", tiffstart, 0,
+                              endianreq);
         static char componentsconfig[] = { 1, 2, 3, 0 };
         append_tiff_dir_entry(exifdirs, blob, EXIF_COMPONENTSCONFIGURATION,
-                              TIFF_UNDEFINED, 4, componentsconfig, tiffstart);
+                              TIFF_UNDEFINED, 4, componentsconfig, tiffstart, 0,
+                              endianreq);
     }
 
     // If any GPS info was found, add a version tag to the GPS fields.
@@ -1306,7 +1337,7 @@
         // Add some required Exif tags that wouldn't be in the spec
         static char ver[] = { 2, 2, 0, 0 };
         append_tiff_dir_entry(gpsdirs, blob, GPSTAG_VERSIONID, TIFF_BYTE, 4,
-                              &ver, tiffstart);
+                              &ver, tiffstart, 0, endianreq);
     }
 
     // Compute offsets:

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current

Inviato: lun 8 feb 2021, 19:44
da ponce
gian_d ha scritto:
lun 8 feb 2021, 19:23
Patch oiio-libopenimageio-exif-cpp.diff
Questa risolve il problema dell'aggiornamento di libtiff. Peraltro in un blocco del codice aggiornato c'è anche un commento che fa riferimento proprio alle versioni di libtiff precedenti a 4.2.0

Codice: Seleziona tutto

--- oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp	2019-12-03 23:28:14.000000000 +0100
+++ oiio-Release-2.0.13/src/libOpenImageIO/exif.cpp	2021-02-02 02:54:55.000000000 +0100
@@ -554,40 +528,44 @@
 
 
 
+// libtiff > 4.1.0 defines these in tiff.h. For older libtiff, let's define
+// them ourselves.
+#ifndef GPSTAG_VERSIONID
 enum GPSTag {
-    GPSTAG_VERSIONID         = 0,
-    GPSTAG_LATITUDEREF       = 1,
-    GPSTAG_LATITUDE          = 2,
-    GPSTAG_LONGITUDEREF      = 3,
-    GPSTAG_LONGITUDE         = 4,
-    GPSTAG_ALTITUDEREF       = 5,
-    GPSTAG_ALTITUDE          = 6,
-    GPSTAG_TIMESTAMP         = 7,
-    GPSTAG_SATELLITES        = 8,
-    GPSTAG_STATUS            = 9,
-    GPSTAG_MEASUREMODE       = 10,
-    GPSTAG_DOP               = 11,
-    GPSTAG_SPEEDREF          = 12,
-    GPSTAG_SPEED             = 13,
-    GPSTAG_TRACKREF          = 14,
-    GPSTAG_TRACK             = 15,
-    GPSTAG_IMGDIRECTIONREF   = 16,
-    GPSTAG_IMGDIRECTION      = 17,
-    GPSTAG_MAPDATUM          = 18,
-    GPSTAG_DESTLATITUDEREF   = 19,
-    GPSTAG_DESTLATITUDE      = 20,
-    GPSTAG_DESTLONGITUDEREF  = 21,
-    GPSTAG_DESTLONGITUDE     = 22,
-    GPSTAG_DESTBEARINGREF    = 23,
-    GPSTAG_DESTBEARING       = 24,
-    GPSTAG_DESTDISTANCEREF   = 25,
-    GPSTAG_DESTDISTANCE      = 26,
-    GPSTAG_PROCESSINGMETHOD  = 27,
-    GPSTAG_AREAINFORMATION   = 28,
-    GPSTAG_DATESTAMP         = 29,
-    GPSTAG_DIFFERENTIAL      = 30,
-    GPSTAG_HPOSITIONINGERROR = 31
+    GPSTAG_VERSIONID            = 0,
+    GPSTAG_LATITUDEREF          = 1,
+    GPSTAG_LATITUDE             = 2,
+    GPSTAG_LONGITUDEREF         = 3,
+    GPSTAG_LONGITUDE            = 4,
+    GPSTAG_ALTITUDEREF          = 5,
+    GPSTAG_ALTITUDE             = 6,
+    GPSTAG_TIMESTAMP            = 7,
+    GPSTAG_SATELLITES           = 8,
+    GPSTAG_STATUS               = 9,
+    GPSTAG_MEASUREMODE          = 10,
+    GPSTAG_DOP                  = 11,
+    GPSTAG_SPEEDREF             = 12,
+    GPSTAG_SPEED                = 13,
+    GPSTAG_TRACKREF             = 14,
+    GPSTAG_TRACK                = 15,
+    GPSTAG_IMGDIRECTIONREF      = 16,
+    GPSTAG_IMGDIRECTION         = 17,
+    GPSTAG_MAPDATUM             = 18,
+    GPSTAG_DESTLATITUDEREF      = 19,
+    GPSTAG_DESTLATITUDE         = 20,
+    GPSTAG_DESTLONGITUDEREF     = 21,
+    GPSTAG_DESTLONGITUDE        = 22,
+    GPSTAG_DESTBEARINGREF       = 23,
+    GPSTAG_DESTBEARING          = 24,
+    GPSTAG_DESTDISTANCEREF      = 25,
+    GPSTAG_DESTDISTANCE         = 26,
+    GPSTAG_PROCESSINGMETHOD     = 27,
+    GPSTAG_AREAINFORMATION      = 28,
+    GPSTAG_DATESTAMP            = 29,
+    GPSTAG_DIFFERENTIAL         = 30,
+    GPSTAG_GPSHPOSITIONINGERROR = 31
 };
+#endif
 
 static const TagInfo gps_tag_table[] = {
     // clang-format off
@@ -622,7 +600,7 @@
     { GPSTAG_AREAINFORMATION,	"GPS:AreaInformation",	TIFF_UNDEFINED, 1 },
     { GPSTAG_DATESTAMP,		"GPS:DateStamp",	TIFF_ASCII, 0 },
     { GPSTAG_DIFFERENTIAL,	"GPS:Differential",	TIFF_SHORT, 1 },
-    { GPSTAG_HPOSITIONINGERROR,	"GPS:HPositioningError",TIFF_RATIONAL, 1 }
+    { GPSTAG_GPSHPOSITIONINGERROR,	"GPS:HPositioningError",TIFF_RATIONAL, 1 }
     // clang-format on
 };
 
@@ -685,7 +663,7 @@
     }
     if (dirp->tdir_type == TIFF_RATIONAL) {
         int n    = dirp->tdir_count;  // How many
-        float* f = (float*)alloca(n * sizeof(float));
+        float* f = OIIO_ALLOCA(float, n);
         for (int i = 0; i < n; ++i) {
             unsigned int num, den;
             num = ((const unsigned int*)dataptr)[2 * i + 0];
@@ -704,7 +682,7 @@
     }
     if (dirp->tdir_type == TIFF_SRATIONAL) {
         int n    = dirp->tdir_count;  // How many
-        float* f = (float*)alloca(n * sizeof(float));
+        float* f = OIIO_ALLOCA(float, n);
         for (int i = 0; i < n; ++i) {
             int num, den;
             num = ((const int*)dataptr)[2 * i + 0];
@@ -799,7 +777,7 @@
 
 #if DEBUG_EXIF_READ
     std::cerr << "Read " << tagmap.mapname() << " ";
-    print_dir_entry(tagmap, dir, buf, offset_adjustment);
+    print_dir_entry(std::cerr, tagmap, dir, buf, offset_adjustment);
 #endif
 
     if (dir.tdir_tag == TIFFTAG_EXIFIFD || dir.tdir_tag == TIFFTAG_GPSIFD) {
@@ -808,7 +786,7 @@
         unsigned int offset = dirp->tdir_offset;  // int stored in offset itself
         if (swab)
             swap_endian(&offset);
-        if (offset >= buf.size()) {
+        if (offset >= size_t(buf.size())) {
 #if DEBUG_EXIF_READ
             unsigned int off2 = offset;
             swap_endian(&off2);
@@ -863,6 +841,16 @@
         unsigned int offset = dirp->tdir_offset;  // int stored in offset itself
         if (swab)
             swap_endian(&offset);
+        if (offset >= size_t(buf.size())) {
+#if DEBUG_EXIF_READ
+            unsigned int off2 = offset;
+            swap_endian(&off2);
+            std::cerr << "Bad Exif block? ExifIFD has offset " << offset
+                      << " inexplicably greater than exif buffer length "
+                      << buf.size() << " (byte swapped = " << off2 << ")\n";
+#endif
+            return;
+        }
         // Don't recurse if we've already visited this IFD
         if (ifd_offsets_seen.find(offset) != ifd_offsets_seen.end())
             return;
 
@@ -964,49 +946,46 @@
             const char* s = *(const char**)p.data();
             int len       = strlen(s) + 1;
             append_tiff_dir_entry(dirs, data, tag, type, len, s,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_RATIONAL:
         if (element == TypeDesc::FLOAT) {
-            unsigned int* rat = (unsigned int*)alloca(2 * count
-                                                      * sizeof(unsigned int));
+            unsigned int* rat = OIIO_ALLOCA(unsigned int, 2 * count);
             const float* f    = (const float*)p.data();
             for (size_t i = 0; i < count; ++i)
                 float_to_rational(f[i], rat[2 * i], rat[2 * i + 1]);
             append_tiff_dir_entry(dirs, data, tag, type, count, rat,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_SRATIONAL:
         if (element == TypeDesc::FLOAT) {
-            int* rat       = (int*)alloca(2 * count * sizeof(int));
+            int* rat       = OIIO_ALLOCA(int, 2 * count);
             const float* f = (const float*)p.data();
             for (size_t i = 0; i < count; ++i)
                 float_to_rational(f[i], rat[2 * i], rat[2 * i + 1]);
             append_tiff_dir_entry(dirs, data, tag, type, count, rat,
-                                  offset_correction);
+                                  offset_correction, 0, endianreq);
             return;
         }
         break;
     case TIFF_SHORT:
-        if (append_tiff_dir_entry_integer<unsigned short>(p, dirs, data, tag,
-                                                          type,
-                                                          offset_correction))
+        if (append_tiff_dir_entry_integer<unsigned short>(
+                p, dirs, data, tag, type, offset_correction, endianreq))
             return;
         break;
     case TIFF_LONG:
         if (append_tiff_dir_entry_integer<unsigned int>(p, dirs, data, tag,
-                                                        type,
-                                                        offset_correction))
+                                                        type, offset_correction,
+                                                        endianreq))
             return;
         break;
     case TIFF_BYTE:
-        if (append_tiff_dir_entry_integer<unsigned char>(p, dirs, data, tag,
-                                                         type,
-                                                         offset_correction))
+        if (append_tiff_dir_entry_integer<unsigned char>(
+                p, dirs, data, tag, type, offset_correction, endianreq))
             return;
         break;
     default: break;
@@ -1091,14 +1097,24 @@
 bool
 decode_exif(cspan<uint8_t> exif, ImageSpec& spec)
 {
+    // Sometimes an exif blob starts with "Exif". Skip it.
+    if (exif.size() >= 6 && exif[0] == 'E' && exif[1] == 'x' && exif[2] == 'i'
+        && exif[3] == 'f' && exif[4] == 0 && exif[5] == 0) {
+        exif = exif.subspan(6);
+    }
+
 #if DEBUG_EXIF_READ
     std::cerr << "Exif dump:\n";
-    for (size_t i = 0; i < exif.size(); ++i) {
+    for (size_t i = 0; i < std::min(200L, exif.size()); ++i) {
+        if ((i % 16) == 0)
+            std::cerr << "[" << i << "] ";
         if (exif[i] >= ' ')
             std::cerr << (char)exif[i] << ' ';
         std::cerr << "(" << (int)exif[i] << ") ";
+        if ((i % 16) == 15)
+            std::cerr << "\n";
     }
-    std::cerr << "\n";
+    std::cerr << std::endl;
 #endif
 
     // The first item should be a standard TIFF header.  Note that HERE,
@@ -1176,8 +1192,10 @@
 
 template<class T>
 inline void
-append(std::vector<char>& blob, const T& v)
+append(std::vector<char>& blob, T v, endian endianreq = endian::native)
 {
+    if (endianreq != endian::native)
+        swap_endian(&v);
     blob.insert(blob.end(), (const char*)&v, (const char*)&v + sizeof(T));
 }
 
@@ -1191,10 +1209,20 @@
 
 
 
+// DEPRECATED(2.1)
+void
+encode_exif(const ImageSpec& spec, std::vector<char>& blob)
+{
+    encode_exif(spec, blob, endian::native);
+}
+
+
+
 // Construct an Exif data block from the ImageSpec, appending the Exif
 // data as a big blob to the char vector.
 void
-encode_exif(const ImageSpec& spec, std::vector<char>& blob)
+encode_exif(const ImageSpec& spec, std::vector<char>& blob,
+            OIIO::endian endianreq)
 {
     const TagMap& exif_tagmap(exif_tagmap_ref());
     const TagMap& gps_tagmap(gps_tagmap_ref());
@@ -1243,9 +1271,9 @@
     // Put a TIFF header
     size_t tiffstart = blob.size();  // store initial size
     TIFFHeader head;
-    head.tiff_magic   = littleendian() ? 0x4949 : 0x4d4d;
+    head.tiff_magic   = (endianreq == endian::little) ? 0x4949 : 0x4d4d;
     head.tiff_version = 42;
-    // head.tiff_diroff -- fix below, once we know the sizes
+    // N.B. need to swap_endian head.tiff_diroff  below, once we know the sizes
     append(blob, head);
 
     // Accumulate separate tag directories for TIFF, Exif, GPS, and Interop.
@@ -1259,7 +1287,8 @@
         if (Strutil::starts_with(p.name(), "GPS:")) {
             int tag = gps_tagmap.tag(p.name());
             if (tag >= 0)
-                encode_exif_entry(p, tag, gpsdirs, blob, gps_tagmap, tiffstart);
+                encode_exif_entry(p, tag, gpsdirs, blob, gps_tagmap, tiffstart,
+                                  endianreq);
         } else {
             // Not GPS
             int tag = exif_tagmap.tag(p.name());
@@ -1267,10 +1296,10 @@
                 // This range of Exif tags go in the main TIFF directories,
                 // not the Exif IFD. Whatever.
                 encode_exif_entry(p, tag, tiffdirs, blob, exif_tagmap,
-                                  tiffstart);
+                                  tiffstart, endianreq);
             } else {
                 encode_exif_entry(p, tag, exifdirs, blob, exif_tagmap,
-                                  tiffstart);
+                                  tiffstart, endianreq);
             }
         }
     }
@@ -1293,12 +1322,14 @@
     if (exifdirs.size() || makerdirs.size()) {
         // Add some required Exif tags that wouldn't be in the spec
         append_tiff_dir_entry(exifdirs, blob, EXIF_EXIFVERSION, TIFF_UNDEFINED,
-                              4, "0230", tiffstart);
+                              4, "0230", tiffstart, 0, endianreq);
         append_tiff_dir_entry(exifdirs, blob, EXIF_FLASHPIXVERSION,
-                              TIFF_UNDEFINED, 4, "0100", tiffstart);
+                              TIFF_UNDEFINED, 4, "0100", tiffstart, 0,
+                              endianreq);
         static char componentsconfig[] = { 1, 2, 3, 0 };
         append_tiff_dir_entry(exifdirs, blob, EXIF_COMPONENTSCONFIGURATION,
-                              TIFF_UNDEFINED, 4, componentsconfig, tiffstart);
+                              TIFF_UNDEFINED, 4, componentsconfig, tiffstart, 0,
+                              endianreq);
     }
 
     // If any GPS info was found, add a version tag to the GPS fields.
@@ -1306,7 +1337,7 @@
         // Add some required Exif tags that wouldn't be in the spec
         static char ver[] = { 2, 2, 0, 0 };
         append_tiff_dir_entry(gpsdirs, blob, GPSTAG_VERSIONID, TIFF_BYTE, 4,
-                              &ver, tiffstart);
+                              &ver, tiffstart, 0, endianreq);
     }
 
     // Compute offsets:
potresti per favore mandarla al maintainer di openimageio, spiegandogli quello che hai fatto, in modo che ci dia un'occhiata anche lui?

Re: Errori di compilazione di OpenImageIO dopo recenti aggiornamenti di current [RISOLTO]

Inviato: lun 8 feb 2021, 19:47
da gian_d
Senza dubbio, avevo già intenzione di farlo :-)

Fatto