diff options
author | Mikhail Burakov <mburakov@mailbox.org> | 2023-05-13 17:50:29 +0200 |
---|---|---|
committer | Mikhail Burakov <mburakov@mailbox.org> | 2023-05-13 17:50:29 +0200 |
commit | 7c3b00f82eb5c79263d96b380e587e2c2530983c (patch) | |
tree | 15998c7ef5d3e505144f11a6849b8f987739ba02 /bitstream.c | |
parent | 149e1c8814d5d64eb7f24aaaf5ad10e9244eb302 (diff) |
Add emulation prevention byte to bitstream implementation
Diffstat (limited to 'bitstream.c')
-rw-r--r-- | bitstream.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/bitstream.c b/bitstream.c index 1f3242e..43d6d2c 100644 --- a/bitstream.c +++ b/bitstream.c @@ -57,3 +57,21 @@ void BitstreamByteAlign(struct Bitstream* bitstream) { *ptr &= ~0 << vacant_bits; bitstream->size += vacant_bits; } + +void BitstreamInflate(struct Bitstream* bitstream, + const struct Bitstream* source) { + uint8_t* dst_data = (uint8_t*)bitstream->data + (bitstream->size + 7) / 8; + uint8_t* src_data = source->data; + size_t src_size = (source->size + 7) / 8; + + if (src_size > 0) *dst_data++ = *src_data++; + if (src_size > 1) *dst_data++ = *src_data++; + + for (size_t i = 2; i < src_size; i++) { + // mburakov: emulation_prevention_three_byte + if (!dst_data[-2] && !dst_data[-1] && !src_data[0]) *dst_data++ = 3; + *dst_data++ = *src_data++; + } + + bitstream->size = (size_t)(dst_data - (uint8_t*)bitstream->data) * 8; +} |