Skip to content

Catalog

A Catalog represents an independent MSF catalog snapshot — the complete description of all tracks available in a broadcast.

Parse and Validate

    catalog, err := msf.ParseCatalog(rawJSON)
    if err != nil {
        // invalid JSON or wrong catalog shape
    }
    if err := catalog.Validate(); err != nil {
        // syntactically valid, but violates MSF rules
    }

ParseCatalog decodes an independent MSF catalog from JSON. Validate checks that the catalog satisfies draft-00 constraints (required fields, unique track identities, etc.).

msf.Catalog

type Catalog struct {
    DefaultNamespace string
    Version          int
    GeneratedAt      *int64
    IsComplete       bool
    Tracks           []Track
}

func ParseCatalog(data []byte) (Catalog, error)
func ParseCatalogString(s string) (Catalog, error)
func (c Catalog) Validate() error
func (c Catalog) Clone() Catalog
func (c Catalog) ApplyDelta(delta CatalogDelta) (Catalog, error)
FieldTypeDescription
DefaultNamespacestringNamespace implied by the catalog track (not serialized in JSON)
VersionintMSF version number
GeneratedAt*int64Catalog generation timestamp (optional)
IsCompleteboolWhether the catalog is marked as complete
Tracks[]TrackComplete set of track descriptions

Track Description

Each track in the catalog is described by an msf.Track:

FieldTypeDescription
NamespacestringTrack namespace (inherited from catalog if empty)
NamestringTrack name, unique within its namespace
PackagingPackagingPackaging mode (see below)
RoleRoleContent role: video, audio, caption, etc.
CodecstringCodec string (e.g. "avc1.64001f")
MimeTypestringMIME type for the track’s data payload
Bitrate*int64Bitrate in bps (optional)
Width*int64Video width (optional)
Height*int64Video height (optional)
Framerate*int64Frame rate (optional)
SampleRate*int64Audio sample rate (optional)
ChannelConfigstringAudio channel configuration (optional)
LabelstringHuman-readable label (optional)
LanguagestringLanguage tag (optional)
Depends[]stringTrack names this track depends on (optional)
IsLive*boolWhether the track is live (optional)
TargetLatency*int64Target latency in milliseconds (optional)
RenderGroup*int64Render group for synchronized playback (optional)
AltGroup*int64Alternate group for quality switching (optional)
InitDatastringBase64-encoded initialization data (optional)
TrackDuration*int64Duration in milliseconds (optional, not for live)

Many optional fields use pointer types (*int64, *bool) to distinguish “absent” from “zero value”.

Packaging Modes

ConstantValueDescription
msf.PackagingLOC"loc"LOC-packaged media content
msf.PackagingMediaTimeline"mediatimeline"Media timeline track
msf.PackagingEventTimeline"eventtimeline"Event timeline track
msf.PackagingCMAF"cmaf"CMAF-packaged media content
msf.PackagingLegacy"legacy"Legacy timestamp+payload packaging

Roles

ConstantValueDescription
msf.RoleVideo"video"Video track
msf.RoleAudio"audio"Audio track
msf.RoleAudioDescription"audiodescription"Audio description track
msf.RoleCaption"caption"Caption track
msf.RoleSubtitle"subtitle"Subtitle track
msf.RoleSignLanguage"signlanguage"Sign language video track

Validation

Validate() returns *msf.ValidationError containing a list of problems:

    if err := catalog.Validate(); err != nil {
        var ve *msf.ValidationError
        if errors.As(err, &ve) {
            for _, problem := range ve.Problems {
                fmt.Println(problem)
            }
        }
    }