summaryrefslogtreecommitdiff
path: root/core/fxcodec/codec/fx_codec_fax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcodec/codec/fx_codec_fax.cpp')
-rw-r--r--core/fxcodec/codec/fx_codec_fax.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/core/fxcodec/codec/fx_codec_fax.cpp b/core/fxcodec/codec/fx_codec_fax.cpp
index 20280a3760..9739101fec 100644
--- a/core/fxcodec/codec/fx_codec_fax.cpp
+++ b/core/fxcodec/codec/fx_codec_fax.cpp
@@ -66,9 +66,21 @@ int FindBit(const uint8_t* data_buf, int max_pos, int start_pos, bool bit) {
start_pos += 7;
}
- uint8_t skip = bit ? 0x00 : 0xff;
+ const uint8_t skip = bit ? 0x00 : 0xff;
+ const int max_byte = (max_pos + 7) / 8;
int byte_pos = start_pos / 8;
- int max_byte = (max_pos + 7) / 8;
+
+ // Try reading in bigger chunks in case there are long runs to be skipped.
+ static constexpr int kBulkReadSize = 8;
+ if (max_byte >= kBulkReadSize && byte_pos < max_byte - kBulkReadSize) {
+ uint8_t skip_block[kBulkReadSize];
+ memset(skip_block, skip, kBulkReadSize);
+ while (byte_pos < max_byte - kBulkReadSize &&
+ memcmp(data_buf + byte_pos, skip_block, kBulkReadSize) == 0) {
+ byte_pos += kBulkReadSize;
+ }
+ }
+
while (byte_pos < max_byte) {
if (data_buf[byte_pos] != skip)
break;