git: c5a04cf7b88f - main - net-im/tg_owt: fix build on powerpc64*

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Wed, 09 Mar 2022 16:20:13 UTC
The branch main has been updated by pkubaj:

URL: https://cgit.FreeBSD.org/ports/commit/?id=c5a04cf7b88f3894165af184966592c70d57ef3b

commit c5a04cf7b88f3894165af184966592c70d57ef3b
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2022-03-09 16:10:32 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2022-03-09 16:10:32 +0000

    net-im/tg_owt: fix build on powerpc64*
    
    Port patches from audio/webrtc-audio-processing.
---
 .../files/patch-src_common__audio_wav__file.cc     | 126 +++++++++++++++++++++
 .../files/patch-src_common__audio_wav__header.cc   |  36 ++++++
 .../tg_owt/files/patch-src_rtc__base_system_arch.h |  16 +++
 3 files changed, 178 insertions(+)

diff --git a/net-im/tg_owt/files/patch-src_common__audio_wav__file.cc b/net-im/tg_owt/files/patch-src_common__audio_wav__file.cc
new file mode 100644
index 000000000000..bb9ba2731442
--- /dev/null
+++ b/net-im/tg_owt/files/patch-src_common__audio_wav__file.cc
@@ -0,0 +1,126 @@
+--- src/common_audio/wav_file.cc.orig	2022-02-09 19:21:53 UTC
++++ src/common_audio/wav_file.cc
+@@ -14,6 +14,7 @@
+ 
+ #include <algorithm>
+ #include <array>
++#include <sys/endian.h>
+ #include <cstdio>
+ #include <type_traits>
+ #include <utility>
+@@ -89,10 +90,6 @@ void WavReader::Reset() {
+ 
+ size_t WavReader::ReadSamples(const size_t num_samples,
+                               int16_t* const samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to big-endian when reading from WAV file"
+-#endif
+-
+   size_t num_samples_left_to_read = num_samples;
+   size_t next_chunk_start = 0;
+   while (num_samples_left_to_read > 0 && num_unread_samples_ > 0) {
+@@ -124,15 +121,16 @@ size_t WavReader::ReadSamples(const size_t num_samples
+     num_unread_samples_ -= num_samples_read;
+     num_samples_left_to_read -= num_samples_read;
+   }
++#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
++  for (size_t i = 0; i < num_samples; i++) {
++    samples[i] = bswap16(samples[i]);
++  }
++#endif
+ 
+   return num_samples - num_samples_left_to_read;
+ }
+ 
+ size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to big-endian when reading from WAV file"
+-#endif
+-
+   size_t num_samples_left_to_read = num_samples;
+   size_t next_chunk_start = 0;
+   while (num_samples_left_to_read > 0 && num_unread_samples_ > 0) {
+@@ -170,6 +168,12 @@ size_t WavReader::ReadSamples(const size_t num_samples
+     num_unread_samples_ -= num_samples_read;
+     num_samples_left_to_read -= num_samples_read;
+   }
++#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
++  // TODO: is this the right place for this?
++  for (size_t i = 0; i < num_samples; i++) {
++    samples[i] = bswap16(samples[i]);
++  }
++#endif
+ 
+   return num_samples - num_samples_left_to_read;
+ }
+@@ -213,23 +217,33 @@ WavWriter::WavWriter(FileWrapper file,
+ }
+ 
+ void WavWriter::WriteSamples(const int16_t* samples, size_t num_samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to little-endian when writing to WAV file"
+-#endif
+-
+   for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
+     const size_t num_remaining_samples = num_samples - i;
+     const size_t num_samples_to_write =
+         std::min(kMaxChunksize, num_remaining_samples);
+ 
+     if (format_ == WavFormat::kWavFormatPcm) {
++#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+       RTC_CHECK(
+           file_.Write(&samples[i], num_samples_to_write * sizeof(samples[0])));
++#else
++      std::array<int16_t, kMaxChunksize> converted_samples;
++      for (size_t j = 0; j < num_samples_to_write; ++j) {
++        converted_samples[j] = bswap16(samples[i + j]);
++      }
++      RTC_CHECK(
++          file_.Write(converted_samples.data(),
++                      num_samples_to_write * sizeof(converted_samples[0])));
++#endif
+     } else {
+       RTC_CHECK_EQ(format_, WavFormat::kWavFormatIeeeFloat);
+       std::array<float, kMaxChunksize> converted_samples;
+       for (size_t j = 0; j < num_samples_to_write; ++j) {
+-        converted_samples[j] = S16ToFloat(samples[i + j]);
++        int16_t sample = samples[i + j];
++#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
++        sample = bswap16(sample);
++#endif
++        converted_samples[j] = S16ToFloat(sample);
+       }
+       RTC_CHECK(
+           file_.Write(converted_samples.data(),
+@@ -243,10 +257,6 @@ void WavWriter::WriteSamples(const int16_t* samples, s
+ }
+ 
+ void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to little-endian when writing to WAV file"
+-#endif
+-
+   for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
+     const size_t num_remaining_samples = num_samples - i;
+     const size_t num_samples_to_write =
+@@ -255,7 +265,11 @@ void WavWriter::WriteSamples(const float* samples, siz
+     if (format_ == WavFormat::kWavFormatPcm) {
+       std::array<int16_t, kMaxChunksize> converted_samples;
+       for (size_t j = 0; j < num_samples_to_write; ++j) {
+-        converted_samples[j] = FloatS16ToS16(samples[i + j]);
++        int16_t sample = FloatS16ToS16(samples[i + j]);
++#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
++        sample = bswap16(sample);
++#endif
++        converted_samples[j] = sample;
+       }
+       RTC_CHECK(
+           file_.Write(converted_samples.data(),
+@@ -264,6 +278,7 @@ void WavWriter::WriteSamples(const float* samples, siz
+       RTC_CHECK_EQ(format_, WavFormat::kWavFormatIeeeFloat);
+       std::array<float, kMaxChunksize> converted_samples;
+       for (size_t j = 0; j < num_samples_to_write; ++j) {
++        // TODO: is swap needed for big-endian here?
+         converted_samples[j] = FloatS16ToFloat(samples[i + j]);
+       }
+       RTC_CHECK(
diff --git a/net-im/tg_owt/files/patch-src_common__audio_wav__header.cc b/net-im/tg_owt/files/patch-src_common__audio_wav__header.cc
new file mode 100644
index 000000000000..5f8f73eff0db
--- /dev/null
+++ b/net-im/tg_owt/files/patch-src_common__audio_wav__header.cc
@@ -0,0 +1,36 @@
+--- src/common_audio/wav_header.cc.orig	2022-02-09 19:21:53 UTC
++++ src/common_audio/wav_header.cc
+@@ -26,10 +26,6 @@
+ namespace webrtc {
+ namespace {
+ 
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Code not working properly for big endian platforms."
+-#endif
+-
+ #pragma pack(2)
+ struct ChunkHeader {
+   uint32_t ID;
+@@ -119,9 +115,22 @@ uint32_t PackFourCC(char a, char b, char c, char d) {
+   return packed_value;
+ }
+ 
++#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
+ std::string ReadFourCC(uint32_t x) {
+   return std::string(reinterpret_cast<char*>(&x), 4);
+ }
++#else
++static inline uint32_t ReadLE32(uint32_t x) {
++  return ((x << 24) & 0xFF000000)
++       | ((x <<  8) & 0x00FF0000)
++       | ((x >>  8) & 0x0000FF00)
++       | ((x >> 24) & 0x000000FF);
++}
++std::string ReadFourCC(uint32_t x) {
++  x = ReadLE32(x);
++  return std::string(reinterpret_cast<char*>(&x), 4);
++}
++#endif
+ 
+ uint16_t MapWavFormatToHeaderField(WavFormat format) {
+   switch (format) {
diff --git a/net-im/tg_owt/files/patch-src_rtc__base_system_arch.h b/net-im/tg_owt/files/patch-src_rtc__base_system_arch.h
new file mode 100644
index 000000000000..267fb4d0e18d
--- /dev/null
+++ b/net-im/tg_owt/files/patch-src_rtc__base_system_arch.h
@@ -0,0 +1,16 @@
+--- src/rtc_base/system/arch.h.orig	2022-02-09 19:21:53 UTC
++++ src/rtc_base/system/arch.h
+@@ -46,6 +46,13 @@
+ #endif
+ #if defined(__MIPSEL__)
+ #define WEBRTC_ARCH_LITTLE_ENDIAN
++#elif defined(__powerpc64__)
++#define WEBRTC_ARCH_64_BITS
++#if defined(__BIG_ENDIAN__)
++#define WEBRTC_ARCH_BIG_ENDIAN
++#else
++#define WEBRTC_ARCH_LITTLE_ENDIAN
++#endif
+ #else
+ #define WEBRTC_ARCH_BIG_ENDIAN
+ #endif