diff options
author | Mikhail Burakov <mburakov@mailbox.org> | 2024-08-10 10:59:02 +0200 |
---|---|---|
committer | Mikhail Burakov <mburakov@mailbox.org> | 2024-08-11 13:13:38 +0200 |
commit | 8d2a9518ef406f43caeb8bfea483949c7d93a903 (patch) | |
tree | 2e2a9eef65fc334fa8865c123083e8228fc1fbb2 /bitstream.c | |
parent | 15377d5ca4a5283d53b2d5373fa15e4374735bf4 (diff) |
Major rewrite of streamer (WIP)
Diffstat (limited to 'bitstream.c')
-rw-r--r-- | bitstream.c | 77 |
1 files changed, 0 insertions, 77 deletions
diff --git a/bitstream.c b/bitstream.c deleted file mode 100644 index 43d6d2c..0000000 --- a/bitstream.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2023 Mikhail Burakov. This file is part of streamer. - * - * streamer is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * streamer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with streamer. If not, see <https://www.gnu.org/licenses/>. - */ - -#include "bitstream.h" - -void BitstreamAppend(struct Bitstream* bitstream, size_t size, uint32_t bits) { - uint8_t* ptr = (uint8_t*)bitstream->data + bitstream->size / 8; - size_t vacant_bits = 8 - bitstream->size % 8; - *ptr &= ~0 << vacant_bits; - - if (vacant_bits >= size) { - *ptr |= bits << (vacant_bits - size); - bitstream->size += size; - return; - } - - *ptr |= bits >> (size - vacant_bits); - bitstream->size += vacant_bits; - BitstreamAppend(bitstream, size - vacant_bits, bits); -} - -void BitstreamAppendUE(struct Bitstream* bitstream, uint32_t bits) { - size_t size = 0; - uint32_t dummy = ++bits; - while (dummy) { - dummy >>= 1; - size++; - } - BitstreamAppend(bitstream, size - 1, 0); - BitstreamAppend(bitstream, size, bits); -} - -void BitstreamAppendSE(struct Bitstream* bitstream, int32_t bits) { - BitstreamAppendUE( - bitstream, bits <= 0 ? (uint32_t)(-2 * bits) : (uint32_t)(2 * bits - 1)); -} - -void BitstreamByteAlign(struct Bitstream* bitstream) { - uint8_t* ptr = (uint8_t*)bitstream->data + bitstream->size / 8; - size_t vacant_bits = 8 - bitstream->size % 8; - if (vacant_bits == 8) return; - - *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; -} |