From d643a460de33e0b6e91805ee920357236e9b3367 Mon Sep 17 00:00:00 2001 From: Martin Riedl Date: Thu, 21 Nov 2024 20:18:48 +0100 Subject: [PATCH] feat: new sample table box --- Box.go | 2 ++ Parser.go | 2 ++ README.md | 2 +- SampleTableBox.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 SampleTableBox.go diff --git a/Box.go b/Box.go index 994a957..6e33705 100644 --- a/Box.go +++ b/Box.go @@ -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 diff --git a/Parser.go b/Parser.go index 07328e3..a656ca9 100644 --- a/Parser.go +++ b/Parser.go @@ -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: diff --git a/README.md b/README.md index 080381e..f9bad8f 100644 --- a/README.md +++ b/README.md @@ -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 | - | diff --git a/SampleTableBox.go b/SampleTableBox.go new file mode 100644 index 0000000..a605d0a --- /dev/null +++ b/SampleTableBox.go @@ -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. 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 []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 +}