summaryrefslogtreecommitdiff
path: root/bitstream.c
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2023-05-13 17:50:29 +0200
committerMikhail Burakov <mburakov@mailbox.org>2023-05-13 17:50:29 +0200
commit7c3b00f82eb5c79263d96b380e587e2c2530983c (patch)
tree15998c7ef5d3e505144f11a6849b8f987739ba02 /bitstream.c
parent149e1c8814d5d64eb7f24aaaf5ad10e9244eb302 (diff)
Add emulation prevention byte to bitstream implementation
Diffstat (limited to 'bitstream.c')
-rw-r--r--bitstream.c18
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;
+}