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 + #include ++#include + #include + #include + #include +@@ -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 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 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 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 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(&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(&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