mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-30 16:22:24 -05:00
[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>
This commit is contained in:
parent
0f38e7c9b0
commit
2bbc64be43
39 changed files with 6276 additions and 93 deletions
98
vendor/github.com/abema/go-mp4/extract.go
generated
vendored
Normal file
98
vendor/github.com/abema/go-mp4/extract.go
generated
vendored
Normal file
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue