isobmff-builder-0.11.2.0: src/Data/ByteString/IsoBaseFileFormat/Brands/Dash.hs
{-# LANGUAGE UndecidableInstances #-}
-- | Predefined Box composition matching the @dash@ brand. TODO this is an
-- incomplete, special-purpose variant of this brand, serving my personal,
-- educational, current need.
-- This is a convenient way of building documents of that kind.
module Data.ByteString.IsoBaseFileFormat.Brands.Dash
(Dash, dash)
where
import Data.ByteString.IsoBaseFileFormat.Box
import Data.ByteString.IsoBaseFileFormat.MediaFile
import Data.ByteString.IsoBaseFileFormat.Boxes
import Data.ByteString.IsoBaseFileFormat.ReExports
-- TODO rename dash to iso5
-- | A phantom type to indicate this branding. Version can be 0 or 1 it is used
-- in some boxes to switch between 32/64 bits.
data Dash (version :: Nat)
-- | A constant to indicate the 'Dash' brand with version 0
dash :: Proxy (Dash 0)
dash = Proxy
-- | A 'BoxLayout' which contains the stuff needed for the 'dash' brand.
-- TODO add iso1 iso2 iso3 iso5 isom formats
instance IsMediaFileFormat (Dash v) where
type BoxLayout (Dash v) =
OneOf '[ MovieLayout v
, SegmentLayout]
type MovieLayout v =
Boxes
'[ OM_ FileType
, OM_ Skip
, OM Movie
'[ OM_ (MovieHeader v)
, SomeMandatoryX
(OneOf '[ TrackLayout v 'VideoTrack
, TrackLayout v 'AudioTrack
, TrackLayout v 'HintTrack
, TrackLayout v 'TimedMetaDataTrack
, TrackLayout v 'AuxilliaryVideoTrack])
, OO MovieExtends
'[ OO_ (MovieExtendsHeader v)
, OM_ TrackExtends ]
]
]
type TrackLayout version handlerType =
(ContainerBox Track
'[ OM_ (TrackHeader version)
, OM Media
'[ OM_ (MediaHeader version)
, OM_ (Handler handlerType)
, OM MediaInformation
'[ OneOf '[ OM_ (MediaHeaderFor handlerType)
, OM_ NullMediaHeader]
, OM DataInformation
'[ OM DataReference
'[ SomeMandatoryX
(OneOf '[ OM_ DataEntryUrl
, OM_ DataEntryUrn])]]
, OM SampleTable
'[ OM SampleDescription
'[ SomeMandatoryX (MatchSampleEntry handlerType) ]
, OM_ TimeToSample
, OM_ SampleToChunk
, OM_ SampleSize
, OneOf '[ OM_ ChunkOffset32
, OM_ ChunkOffset64 ]
]
]
]
])
type SegmentLayout =
Boxes '[ OM_ SegmentType
, OM MovieFragment
'[ OM_ MovieFragmentHeader
, OM TrackFragment
'[ OM_ TrackFragmentHeader
, OO_ (TrackFragBaseMediaDecodeTime 1)
, SO_ TrackRun
]
]
, SM_ MediaData
]