// 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. I‐frame 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 sub‐boxes (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 sub‐boxes // 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 []any } // BoxTypeSampleTable Sample Table Box const BoxTypeSampleTable = "stbl" func init() { BoxDefinitions = append(BoxDefinitions, BoxDefinition{ Type: BoxTypeSampleTable, ParentTypes: []string{BoxTypeMediaInformation}, Parser: ParseSampleTableBox, }) } // ParseSampleTableBox creates a new sample table box struct based on bytes func ParseSampleTableBox(parser *Parser, filePosition uint64, headerSize uint32, content []byte) (any, error) { box := &SampleTableBox{Box: &Box{filePosition, headerSize}} // parse child boxes var err error box.ChildBoxes, err = box.parseChildBoxes(parser, BoxTypeSampleTable, filePosition, content) return box, err }