Files
monibuca/plugin/mp4/pkg/box/sdtp.go
2025-02-21 09:57:41 +08:00

85 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package box
import "io"
/*
aligned(8) class SampleDependencyTypeBox
extends FullBox(sdtp, version = 0, 0) {
for (i=0; i < sample_count; i++){
unsigned int(2) is_leading;
unsigned int(2) sample_depends_on;
unsigned int(2) sample_is_depended_on;
unsigned int(2) sample_has_redundancy;
}
}
is_leading takes one of the following four values:
0: the leading nature of this sample is unknown;
1: this sample is a leading sample that has a dependency before the referenced I-picture (and is
therefore not decodable);
2: this sample is not a leading sample;
3: this sample is a leading sample that has no dependency before the referenced I-picture (and is
therefore decodable);
sample_depends_on takes one of the following four values:
0: the dependency of this sample is unknown;
1: this sample does depend on others (not an I picture);
2: this sample does not depend on others (I picture);
3: reserved
sample_is_depended_on takes one of the following four values:
0: the dependency of other samples on this sample is unknown;
1: other samples may depend on this one (not disposable);
2: no other sample depends on this one (disposable);
3: reserved
sample_has_redundancy takes one of the following four values:
0: it is unknown whether there is redundant coding in this sample;
1: there is redundant coding in this sample;
2: there is no redundant coding in this sample;
3: reserved
*/
type SampleDependencyTypeFlags struct {
IsLeading bool
DependsOn bool
IsDependedOn bool
HasRedundancy bool
}
type SampleDependencyTypeBox struct {
FullBox
SampleDependencyTypeFlags
}
func CreateSampleDependencyTypeBox(flags SampleDependencyTypeFlags) *SampleDependencyTypeBox {
return &SampleDependencyTypeBox{FullBox: FullBox{BaseBox: BaseBox{typ: TypeSDTP, size: FullBoxLen + 1}, Version: 0, Flags: [3]byte{0, 0, 0}}, SampleDependencyTypeFlags: flags}
}
func (box *SampleDependencyTypeBox) WriteTo(w io.Writer) (n int64, err error) {
var flag byte
if box.IsLeading {
flag |= 1 << 6
}
if box.DependsOn {
flag |= 2 << 4
} else {
flag |= 1 << 4
}
if box.IsDependedOn {
flag |= 1 << 2
}
if box.HasRedundancy {
flag |= 1
}
w.Write([]byte{flag})
return 1, nil
}
func (box *SampleDependencyTypeBox) Unmarshal(buf []byte) (IBox, error) {
box.IsLeading = buf[0]>>6&1 == 1
box.DependsOn = buf[0]>>4&2 == 2
box.IsDependedOn = buf[0]>>2&1 == 1
box.HasRedundancy = buf[0]&1 == 1
return box, nil
}