summaryrefslogtreecommitdiff
path: root/vendor/github.com/abema/go-mp4/bitio/write.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-12-17 05:38:56 +0100
committerLibravatar GitHub <noreply@github.com>2022-12-17 04:38:56 +0000
commit2bbc64be4317166d3abb7aa177d4913f166a53e8 (patch)
tree88c3d613eb986b18894f311afa4291987a0e26c4 /vendor/github.com/abema/go-mp4/bitio/write.go
parent[chore] fix some little config whoopsies (#1272) (diff)
downloadgotosocial-2bbc64be4317166d3abb7aa177d4913f166a53e8.tar.xz
[feature] Enable basic video support (mp4 only) (#1274)
* [feature] basic video support * fix missing semicolon * replace text shadow with stacked icons Co-authored-by: f0x <f0x@cthu.lu>
Diffstat (limited to 'vendor/github.com/abema/go-mp4/bitio/write.go')
-rw-r--r--vendor/github.com/abema/go-mp4/bitio/write.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/vendor/github.com/abema/go-mp4/bitio/write.go b/vendor/github.com/abema/go-mp4/bitio/write.go
new file mode 100644
index 000000000..5f63dd2d2
--- /dev/null
+++ b/vendor/github.com/abema/go-mp4/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
+}