From 34c34fd1f4fb4cfcf01968d704ac03a56153b114 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 4 Aug 2024 16:44:39 +0800 Subject: [PATCH] 1 --- decoder/tool/B_I.go | 2 +- decoder/tool/sue.go | 30 ++++++++++++++++++++++++++++++ decoder/tool/sue_test.go | 20 ++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 decoder/tool/sue.go create mode 100644 decoder/tool/sue_test.go diff --git a/decoder/tool/B_I.go b/decoder/tool/B_I.go index a8d1498..c33750d 100644 --- a/decoder/tool/B_I.go +++ b/decoder/tool/B_I.go @@ -1,4 +1,4 @@ -package mp4 +package tool /* 整数 字节转换区 diff --git a/decoder/tool/sue.go b/decoder/tool/sue.go new file mode 100644 index 0000000..2abe55a --- /dev/null +++ b/decoder/tool/sue.go @@ -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 index 0000000..139cf07 --- /dev/null +++ b/decoder/tool/sue_test.go @@ -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() + } +} -- 2.39.2