]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.20240804085048
authorqydysky <qydysky@foxmail.com>
Sun, 4 Aug 2024 08:44:39 +0000 (16:44 +0800)
committerqydysky <qydysky@foxmail.com>
Sun, 4 Aug 2024 08:44:39 +0000 (16:44 +0800)
decoder/tool/B_I.go
decoder/tool/sue.go [new file with mode: 0644]
decoder/tool/sue_test.go [new file with mode: 0644]

index a8d1498559e8dd2e8eb79e208914a233311fe45e..c33750d7d29d0039035704a732a27e33eca663f0 100644 (file)
@@ -1,4 +1,4 @@
-package mp4
+package tool
 
 /*
 整数 字节转换区
diff --git a/decoder/tool/sue.go b/decoder/tool/sue.go
new file mode 100644 (file)
index 0000000..2abe55a
--- /dev/null
@@ -0,0 +1,30 @@
+package tool
+
+// unsigned integer Exp-Golomb-coded syntax element with the left bit first
+func ue(d int) (r, move int) {
+       for d&0b10000000 == 0b00000000 {
+               move += 1
+               d = d << 1
+       }
+       for i := move; i >= 0; i-- {
+               r |= d & 0b10000000 >> (7 - i)
+               d = d << 1
+       }
+       return r - 1, 2*move + 1
+}
+
+// signed integer Exp-Golomb-coded syntax element with the left bit first
+func se(d int) (r, move int) {
+       for d&0b10000000 == 0b00000000 {
+               move += 1
+               d = d << 1
+       }
+       for i := move; i > 0; i-- {
+               r |= d & 0b10000000 >> (8 - i)
+               d = d << 1
+       }
+       if d&0b10000000 == 0b00000000 {
+               r = -r
+       }
+       return r, 2*move + 1
+}
diff --git a/decoder/tool/sue_test.go b/decoder/tool/sue_test.go
new file mode 100644 (file)
index 0000000..139cf07
--- /dev/null
@@ -0,0 +1,20 @@
+package tool
+
+import (
+       "testing"
+)
+
+func Test_ue(t *testing.T) {
+       if r, m := ue(0b01101100); r != 2 || m != 3 {
+               t.Fatal()
+       }
+}
+
+func Test_se(t *testing.T) {
+       if r, m := se(0b00101000); r != 2 || m != 5 {
+               t.Fatal()
+       }
+       if r, m := se(0b00100000); r != -2 || m != 5 {
+               t.Fatal()
+       }
+}