isobmff-builder-0.10.5.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, SingleAudioTrackInit(..), mkSingleTrackInit, module X)
where
import Data.ByteString.IsoBaseFileFormat.Brands.Types
import Data.ByteString.IsoBaseFileFormat.Boxes as X hiding (All)
import Data.Kind (Type, Constraint)
-- | 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 incomplete
instance IsMediaFileFormat (Dash v) where
type BoxLayout (Dash v) =
Boxes
'[ OM_ FileType
, OM Movie
'[ OM_ (MovieHeader v)
, SomeMandatoryX
(OneOf '[ TrackLayout v 'VideoTrack
, TrackLayout v 'AudioTrack
, TrackLayout v 'HintTrack
, TrackLayout v 'TimedMetaDataTrack
, TrackLayout v 'AuxilliaryVideoTrack])
]
, SO_ Skip
]
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 handlerType)
'[ SomeMandatoryX (MatchSampleEntry handlerType) ]
, OM_ TimeToSample
-- , OM_ (SampleToChunk version)
-- , OO_ (SampleSizes version)
-- , OM_ (SampleChunkOffset version)
]
]
]
])
-- Missing Boxes
-- stts
-- stsc
-- stsz
-- stco
-- esds
-- mvex
-- trex
-- For media
-- styp
-- moof
-- mfhd
-- traf
-- tfhd
-- trun
-- | A record which contains the stuff needed for a single track initialization
-- document according to the 'Dash' brand. TODO incomplete
-- TODO take this out into its own module, make a new package for specific file formats
data SingleAudioTrackInit =
SingleAudioTrackInit {mvhd :: MovieHeader 0
,tkhd :: TrackHeader 0
,mdhd :: MediaHeader 0
,hdlr :: Handler 'AudioTrack
,smhd :: SoundMediaHeader}
-- | Convert a 'SingleAudioTrackInit' record to a generic 'Boxes' collection.
mkSingleTrackInit
:: SingleAudioTrackInit -> Builder
mkSingleTrackInit doc = mediaBuilder dash $
fileTypeBox (FileType "dash" 0 ["isom","iso5","mp42"])
:| movie
( movieHeader (mvhd doc)
:| track
( trackHeader (tkhd doc)
:| media
( mediaHeader (mdhd doc)
:. handler (hdlr doc)
:| mediaInformation
( soundMediaHeader (smhd doc)
:. (dataInformation $: localMediaDataReference)
:| sampleTable
((sampleDescription $: audioSampleEntry Mpeg4Aac 1 def)
:| timeToSample [] )))))