diff options
author | 2023-09-25 11:33:10 +0100 | |
---|---|---|
committer | 2023-09-25 11:33:10 +0100 | |
commit | 380d83f9a968da60419e0afbd8b37bd50ba953de (patch) | |
tree | 0fb6d3645c6620ad6c5381d1a680b412eee2e732 /vendor/github.com/abema/go-mp4/internal/bitio/write.go | |
parent | [bugfix] support both CollectionPage AND OrderedCollectionPage in status repl... (diff) | |
download | gotosocial-380d83f9a968da60419e0afbd8b37bd50ba953de.tar.xz |
[chore]: Bump github.com/abema/go-mp4 from 0.13.0 to 1.0.0 (#2222)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Diffstat (limited to 'vendor/github.com/abema/go-mp4/internal/bitio/write.go')
-rw-r--r-- | vendor/github.com/abema/go-mp4/internal/bitio/write.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/vendor/github.com/abema/go-mp4/internal/bitio/write.go b/vendor/github.com/abema/go-mp4/internal/bitio/write.go new file mode 100644 index 000000000..5f63dd2d2 --- /dev/null +++ b/vendor/github.com/abema/go-mp4/internal/bitio/write.go @@ -0,0 +1,61 @@ +package bitio + +import ( + "io" +) + +type Writer interface { + io.Writer + + // alignment: + // |-1-byte-block-|--------------|--------------|--------------| + // |<-offset->|<-------------------width---------------------->| + WriteBits(data []byte, width uint) error + + WriteBit(bit bool) error +} + +type writer struct { + writer io.Writer + octet byte + width uint +} + +func NewWriter(w io.Writer) Writer { + return &writer{writer: w} +} + +func (w *writer) Write(p []byte) (n int, err error) { + if w.width != 0 { + return 0, ErrInvalidAlignment + } + return w.writer.Write(p) +} + +func (w *writer) WriteBits(data []byte, width uint) error { + length := uint(len(data)) * 8 + offset := length - width + for i := offset; i < length; i++ { + oi := i / 8 + if err := w.WriteBit((data[oi]>>(7-i%8))&0x01 != 0); err != nil { + return err + } + } + return nil +} + +func (w *writer) WriteBit(bit bool) error { + if bit { + w.octet |= 0x1 << (7 - w.width) + } + w.width++ + + if w.width == 8 { + if _, err := w.writer.Write([]byte{w.octet}); err != nil { + return err + } + w.octet = 0x00 + w.width = 0 + } + return nil +} |