feat: new sample table box

This commit is contained in:
Martin Riedl 2024-11-21 20:18:48 +01:00
parent 00105f5142
commit d643a460de
Signed by: martinr92
GPG key ID: FB68DA65516A804C
4 changed files with 58 additions and 1 deletions

2
Box.go
View file

@ -40,6 +40,8 @@ const (
BoxTypeHandlerReference = "hdlr"
// BoxTypeMediaInformation Media Information Box
BoxTypeMediaInformation = "minf"
// BoxTypeSampleTable Sample Table Box
BoxTypeSampleTable = "stbl"
// BoxTypeDataInformation Data Information Box
BoxTypeDataInformation = "dinf"
// BoxTypeDataReferenceBox Data Reference Box

View file

@ -124,6 +124,8 @@ func parseNextBox(reader io.Reader, filePosition uint64) (box interface{}, endPo
box = ParseHandlerReferenceBox(filePosition, boxHeaderSize, boxContentBytes)
case BoxTypeMediaInformation:
box, err = ParseMediaInformationBox(filePosition, boxHeaderSize, boxContentBytes)
case BoxTypeSampleTable:
box, err = ParseSampleTableBox(filePosition, boxHeaderSize, boxContentBytes)
case BoxTypeDataInformation:
box, err = ParseDataInformationBox(filePosition, boxHeaderSize, boxContentBytes)
case BoxTypeDataReferenceBox:

View file

@ -33,7 +33,7 @@ Implementation progress
| 8.4.4 Media Information Box | minf | 100% |
| 8.4.5.2 Null Media Header Box | nmhd | - |
| 8.4.6 Extended language tag | elng | - |
| 8.5.1 Sample Table Box | stbl | - |
| 8.5.1 Sample Table Box | stbl | 100% |
| 8.5.2 Sample Description Box | stsd | - |
| 8.5.3 Degradation Priority Box | stdp | - |
| 8.6.1.2 Decoding Time to Sample Box | stts | - |

53
SampleTableBox.go Normal file
View file

@ -0,0 +1,53 @@
// Copyright 2024 Martin Riedl
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package gomp4
// SampleTableBox sample table box struct
//
// 8.5.1 Sample Table Box
//
// Box Type: stbl
// Container: Media Information Box (minf)
// Mandatory: Yes
// Quantity: Exactly one
//
// The sample table contains all the time and data indexing of the media samples in a track. Using the
// tables here, it is possible to locate samples in time, determine their type (e.g. Iframe or not), and
// determine their size, container, and offset into that container.
//
// If the track that contains the Sample Table Box references no data, then the Sample Table Box does not
// need to contain any subboxes (this is not a very useful media track).
//
// If the track that the Sample Table Box is contained in does reference data, then the following subboxes
// are required: Sample Description, Sample Size, Sample To Chunk, and Chunk Offset. Further, the Sample
// Description Box shall contain at least one entry. A Sample Description Box is required because it
// contains the data reference index field which indicates which Data Reference Box to use to retrieve the
// media samples. Without the Sample Description, it is not possible to determine where the media
// samples are stored. The Sync Sample Box is optional. If the Sync Sample Box is not present, all samples
// are sync samples.
type SampleTableBox struct {
*Box
ChildBoxes []interface{}
}
// ParseSampleTableBox creates a new sample table box struct based on bytes
func ParseSampleTableBox(filePosition uint64, headerSize uint32, content []byte) (*SampleTableBox, error) {
box := &SampleTableBox{Box: &Box{filePosition, headerSize}}
// parse child boxes
var err error
box.ChildBoxes, err = box.parseChildBoxes(filePosition, content)
return box, err
}