summaryrefslogtreecommitdiff
path: root/vendor/github.com/abema/go-mp4/extract.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/extract.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/extract.go')
-rw-r--r--vendor/github.com/abema/go-mp4/extract.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/vendor/github.com/abema/go-mp4/extract.go b/vendor/github.com/abema/go-mp4/extract.go
new file mode 100644
index 000000000..7de36b06a
--- /dev/null
+++ b/vendor/github.com/abema/go-mp4/extract.go
@@ -0,0 +1,98 @@
+package mp4
+
+import (
+ "errors"
+ "io"
+)
+
+type BoxInfoWithPayload struct {
+ Info BoxInfo
+ Payload IBox
+}
+
+func ExtractBoxWithPayload(r io.ReadSeeker, parent *BoxInfo, path BoxPath) ([]*BoxInfoWithPayload, error) {
+ return ExtractBoxesWithPayload(r, parent, []BoxPath{path})
+}
+
+func ExtractBoxesWithPayload(r io.ReadSeeker, parent *BoxInfo, paths []BoxPath) ([]*BoxInfoWithPayload, error) {
+ bis, err := ExtractBoxes(r, parent, paths)
+ if err != nil {
+ return nil, err
+ }
+
+ bs := make([]*BoxInfoWithPayload, 0, len(bis))
+ for _, bi := range bis {
+ if _, err := bi.SeekToPayload(r); err != nil {
+ return nil, err
+ }
+
+ var ctx Context
+ if parent != nil {
+ ctx = parent.Context
+ }
+ box, _, err := UnmarshalAny(r, bi.Type, bi.Size-bi.HeaderSize, ctx)
+ if err != nil {
+ return nil, err
+ }
+ bs = append(bs, &BoxInfoWithPayload{
+ Info: *bi,
+ Payload: box,
+ })
+ }
+ return bs, nil
+}
+
+func ExtractBox(r io.ReadSeeker, parent *BoxInfo, path BoxPath) ([]*BoxInfo, error) {
+ return ExtractBoxes(r, parent, []BoxPath{path})
+}
+
+func ExtractBoxes(r io.ReadSeeker, parent *BoxInfo, paths []BoxPath) ([]*BoxInfo, error) {
+ if len(paths) == 0 {
+ return nil, nil
+ }
+
+ for i := range paths {
+ if len(paths[i]) == 0 {
+ return nil, errors.New("box path must not be empty")
+ }
+ }
+
+ boxes := make([]*BoxInfo, 0, 8)
+
+ handler := func(handle *ReadHandle) (interface{}, error) {
+ path := handle.Path
+ if parent != nil {
+ path = path[1:]
+ }
+ if handle.BoxInfo.Type == BoxTypeAny() {
+ return nil, nil
+ }
+ fm, m := matchPath(paths, path)
+ if m {
+ boxes = append(boxes, &handle.BoxInfo)
+ }
+
+ if fm {
+ if _, err := handle.Expand(); err != nil {
+ return nil, err
+ }
+ }
+ return nil, nil
+ }
+
+ if parent != nil {
+ _, err := ReadBoxStructureFromInternal(r, parent, handler)
+ return boxes, err
+ }
+ _, err := ReadBoxStructure(r, handler)
+ return boxes, err
+}
+
+func matchPath(paths []BoxPath, path BoxPath) (forwardMatch bool, match bool) {
+ for i := range paths {
+ fm, m := path.compareWith(paths[i])
+ forwardMatch = forwardMatch || fm
+ match = match || m
+ }
+ return
+}