diff --git a/go.mod b/go.mod index 06ee515f8..9edc119e8 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( codeberg.org/gruf/go-store/v2 v2.2.2 github.com/DmitriyVTitov/size v1.5.0 github.com/KimMachineGun/automemlimit v0.3.0 - github.com/abema/go-mp4 v1.0.0 + github.com/abema/go-mp4 v1.1.1 github.com/buckket/go-blurhash v1.1.0 github.com/coreos/go-oidc/v3 v3.6.0 github.com/disintegration/imaging v1.6.2 diff --git a/go.sum b/go.sum index 43779789f..cd84fb3e2 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/DmitriyVTitov/size v1.5.0 h1:/PzqxYrOyOUX1BXj6J9OuVRVGe+66VL4D9FlUaW5 github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= github.com/KimMachineGun/automemlimit v0.3.0 h1:khgwM5ESVN85cE6Bq2ozMAAWDfrOEwQ51D/YlmThE04= github.com/KimMachineGun/automemlimit v0.3.0/go.mod h1:pJhTW/nWJMj6SnWSU2TEKSlCaM+1N5Mej+IfS/5/Ol0= -github.com/abema/go-mp4 v1.0.0 h1:SvfJv+fi2Bpa1uInouqIYpEUFN3yyYCQMXlf4ijOHf0= -github.com/abema/go-mp4 v1.0.0/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws= +github.com/abema/go-mp4 v1.1.1 h1:OfzkdMO6SWTBR1ltNSVwlTHatrAK9I3iYLQfkdEMMuc= +github.com/abema/go-mp4 v1.1.1/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/vendor/github.com/abema/go-mp4/box_info.go b/vendor/github.com/abema/go-mp4/box_info.go index b5c587fd9..402b418ef 100644 --- a/vendor/github.com/abema/go-mp4/box_info.go +++ b/vendor/github.com/abema/go-mp4/box_info.go @@ -3,6 +3,7 @@ package mp4 import ( "bytes" "encoding/binary" + "fmt" "io" "math" ) @@ -128,7 +129,6 @@ func ReadBoxInfo(r io.ReadSeeker) (*BoxInfo, error) { if _, err := bi.SeekToPayload(r); err != nil { return nil, err } - } else if bi.Size == 1 { // read more 8 bytes buf.Reset() @@ -139,6 +139,10 @@ func ReadBoxInfo(r io.ReadSeeker) (*BoxInfo, error) { bi.Size = binary.BigEndian.Uint64(buf.Bytes()) } + if bi.Size == 0 { + return nil, fmt.Errorf("invalid size") + } + return bi, nil } diff --git a/vendor/github.com/abema/go-mp4/box_types_etsi_ts_102_366.go b/vendor/github.com/abema/go-mp4/box_types_etsi_ts_102_366.go new file mode 100644 index 000000000..7436e1833 --- /dev/null +++ b/vendor/github.com/abema/go-mp4/box_types_etsi_ts_102_366.go @@ -0,0 +1,36 @@ +package mp4 + +/*************************** ac-3 ****************************/ + +// https://www.etsi.org/deliver/etsi_ts/102300_102399/102366/01.04.01_60/ts_102366v010401p.pdf + +func BoxTypeAC3() BoxType { return StrToBoxType("ac-3") } + +func init() { + AddAnyTypeBoxDef(&AudioSampleEntry{}, BoxTypeAC3()) +} + +/*************************** dac3 ****************************/ + +// https://www.etsi.org/deliver/etsi_ts/102300_102399/102366/01.04.01_60/ts_102366v010401p.pdf + +func BoxTypeDAC3() BoxType { return StrToBoxType("dac3") } + +func init() { + AddBoxDef(&Dac3{}) +} + +type Dac3 struct { + Box + Fscod uint8 `mp4:"0,size=2"` + Bsid uint8 `mp4:"1,size=5"` + Bsmod uint8 `mp4:"2,size=3"` + Acmod uint8 `mp4:"3,size=3"` + LfeOn uint8 `mp4:"4,size=1"` + BitRateCode uint8 `mp4:"5,size=5"` + Reserved uint8 `mp4:"6,size=5,const=0"` +} + +func (Dac3) GetType() BoxType { + return BoxTypeDAC3() +} diff --git a/vendor/github.com/abema/go-mp4/box_types_iso14496_12.go b/vendor/github.com/abema/go-mp4/box_types_iso14496_12.go index f87fb467b..017fd918d 100644 --- a/vendor/github.com/abema/go-mp4/box_types_iso14496_12.go +++ b/vendor/github.com/abema/go-mp4/box_types_iso14496_12.go @@ -638,6 +638,10 @@ func (hdlr *Hdlr) OnReadName(r bitio.ReadSeeker, leftBits uint64, ctx Context) ( return 0, true, nil } + if !readerHasSize(r, size) { + return 0, false, fmt.Errorf("not enough bits") + } + buf := make([]byte, size) if _, err := io.ReadFull(r, buf); err != nil { return 0, false, err @@ -1197,6 +1201,7 @@ func (*Saiz) GetType() BoxType { /*********************** SampleEntry *************************/ +func BoxTypeMp4v() BoxType { return StrToBoxType("mp4v") } func BoxTypeAvc1() BoxType { return StrToBoxType("avc1") } func BoxTypeEncv() BoxType { return StrToBoxType("encv") } func BoxTypeHev1() BoxType { return StrToBoxType("hev1") } @@ -1207,6 +1212,7 @@ func BoxTypeAvcC() BoxType { return StrToBoxType("avcC") } func BoxTypePasp() BoxType { return StrToBoxType("pasp") } func init() { + AddAnyTypeBoxDef(&VisualSampleEntry{}, BoxTypeMp4v()) AddAnyTypeBoxDef(&VisualSampleEntry{}, BoxTypeAvc1()) AddAnyTypeBoxDef(&VisualSampleEntry{}, BoxTypeEncv()) AddAnyTypeBoxDef(&VisualSampleEntry{}, BoxTypeHev1()) diff --git a/vendor/github.com/abema/go-mp4/marshaller.go b/vendor/github.com/abema/go-mp4/marshaller.go index 18ff79a0c..ff6c64c32 100644 --- a/vendor/github.com/abema/go-mp4/marshaller.go +++ b/vendor/github.com/abema/go-mp4/marshaller.go @@ -17,6 +17,29 @@ const ( var ErrUnsupportedBoxVersion = errors.New("unsupported box version") +func readerHasSize(reader bitio.ReadSeeker, size uint64) bool { + pre, err := reader.Seek(0, io.SeekCurrent) + if err != nil { + return false + } + + end, err := reader.Seek(0, io.SeekEnd) + if err != nil { + return false + } + + if uint64(end-pre) < size { + return false + } + + _, err = reader.Seek(pre, io.SeekStart) + if err != nil { + return false + } + + return true +} + type marshaller struct { writer bitio.Writer wbits uint64 @@ -417,12 +440,13 @@ func (u *unmarshaller) unmarshalSlice(v reflect.Value, fi *fieldInstance) error } } - if length > math.MaxInt32 { - return fmt.Errorf("out of memory: requestedSize=%d", length) - } - - if fi.size != 0 && fi.size%8 == 0 && u.rbits%8 == 0 && elemType.Kind() == reflect.Uint8 && fi.size == 8 { + if u.rbits%8 == 0 && elemType.Kind() == reflect.Uint8 && fi.size == 8 { totalSize := length * uint64(fi.size) / 8 + + if !readerHasSize(u.reader, totalSize) { + return fmt.Errorf("not enough bits") + } + buf := bytes.NewBuffer(make([]byte, 0, totalSize)) if _, err := io.CopyN(buf, u.reader, int64(totalSize)); err != nil { return err @@ -431,7 +455,7 @@ func (u *unmarshaller) unmarshalSlice(v reflect.Value, fi *fieldInstance) error u.rbits += uint64(totalSize) * 8 } else { - slice = reflect.MakeSlice(v.Type(), 0, int(length)) + slice = reflect.MakeSlice(v.Type(), 0, 0) for i := 0; ; i++ { if fi.length != LengthUnlimited && uint(i) >= fi.length { break diff --git a/vendor/modules.txt b/vendor/modules.txt index aba19f24a..40ecdb295 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -77,7 +77,7 @@ github.com/DmitriyVTitov/size ## explicit; go 1.19 github.com/KimMachineGun/automemlimit github.com/KimMachineGun/automemlimit/memlimit -# github.com/abema/go-mp4 v1.0.0 +# github.com/abema/go-mp4 v1.1.1 ## explicit; go 1.14 github.com/abema/go-mp4 github.com/abema/go-mp4/internal/bitio