summaryrefslogtreecommitdiff
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
parent149e1c8814d5d64eb7f24aaaf5ad10e9244eb302 (diff)
Add emulation prevention byte to bitstream implementation
-rw-r--r--bitstream.c18
-rw-r--r--bitstream.h3
2 files changed, 21 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;
+}
diff --git a/bitstream.h b/bitstream.h
index 87edec3..1520c57 100644
--- a/bitstream.h
+++ b/bitstream.h
@@ -31,4 +31,7 @@ void BitstreamAppendUE(struct Bitstream* bitstream, uint32_t bits);
void BitstreamAppendSE(struct Bitstream* bitstream, int32_t bits);
void BitstreamByteAlign(struct Bitstream* bitstream);
+void BitstreamInflate(struct Bitstream* bitstream,
+ const struct Bitstream* source);
+
#endif // STREAMER_BITSTREAM_H_