module Data.ByteString.IsoBaseFileFormat.Boxes.MovieBox where
import Data.ByteString.IsoBaseFileFormat.Boxes.Box
import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields
import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox
movieBox :: ValidBoxes (Movie version) ts
=> Boxes ts -> Box' (Movie version)
movieBox = containerBox
data Movie (version :: Nat)
instance IsBoxType' (Movie version) where
toBoxType' _ = StdType "moov"
instance BoxRules (Movie version) where
type RequiredNestedBoxes (Movie version) = '[MovieHeader version]
movieHeaderBox
:: KnownNat version
=> MovieHeader version -> Box' (MovieHeader version)
movieHeaderBox = closedFullBox Default 0
data MovieHeader (version :: Nat) where
MovieHeader ::
KnownNat version =>
Versioned MovieHeaderTimesV0
MovieHeaderTimesV1
version
:+ Template (I32 "rate") 0x00010000
:+ Template (I16 "volume") 0x0100
:+ Constant (I16 "reserved") 0
:+ Constant (I32Arr "reserved" 2) '[0,0]
:+ Constant (I32Arr "matrix" 9)
'[65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824]
:+ Template (U32Arr "pre_defined" 6) '[0,0,0,0,0,0]
:+ U32 "next_track_ID"
-> MovieHeader version
type MovieHeaderTimesV0 = MovieHeaderTimes (Scalar Word32)
type MovieHeaderTimesV1 = MovieHeaderTimes (Scalar Word64)
type MovieHeaderTimes uint =
uint "creation_time"
:+ uint "modification_time"
:+ U32 "timescale"
:+ uint "duration"
instance IsBoxContent (MovieHeader version) where
boxSize (MovieHeader c) = boxSize c
boxBuilder (MovieHeader c) = boxBuilder c
instance KnownNat version => IsBoxType' (MovieHeader version) where
toBoxType' _ = StdType "mvhd"
type BoxContent (MovieHeader version) = FullBox version (MovieHeader version)
instance BoxRules (MovieHeader version) where
type IsTopLevelBox (MovieHeader version) = 'False
type GetCardinality (MovieHeader version) any = 'ExactlyOnce
type RestrictedTo (MovieHeader version) = 'Just '[Movie version]
track :: ValidBoxes (Track version) ts
=> Boxes ts -> Box' (Track version)
track = containerBox
data Track (version :: Nat)
instance IsBoxType' (Track version) where
toBoxType' _ = StdType "trak"
instance BoxRules (Track version) where
type IsTopLevelBox (Track version) = 'False
type GetCardinality (Track version) any = 'ExactlyOnce
type RestrictedTo (Track version) = 'Just '[Movie version]
trackHeader
:: KnownNat version => TrackHeader version -> Box' (TrackHeader version)
trackHeader = closedFullBox Default 0
data TrackHeader (version :: Nat) where
TrackHeader ::
Versioned TrackHeaderTimesV0
TrackHeaderTimesV1
version
:+ Constant (I32Arr "reserved" 2) '[0, 0]
:+ Template (I16 "layer") 0
:+ Template (I16 "alternate_group") 0
:+ Template (I16 "volume") 256
:+ Constant (I16 "reserved") 0
:+ Template (I32Arr "matrix" 9)
'[65536, 0, 0, 0, 65536, 0, 0, 0, 1073741824]
:+ I32 "width"
:+ I32 "height"
-> TrackHeader version
type TrackHeaderTimesV0 = TrackHeaderTimes (Scalar Word32)
type TrackHeaderTimesV1 = TrackHeaderTimes (Scalar Word64)
type TrackHeaderTimes uint =
uint "creation_time"
:+ uint "modification_time"
:+ U32 "track_ID"
:+ Constant (U32 "reserved") 0
:+ uint "duration"
instance IsBoxContent (TrackHeader version) where
boxSize (TrackHeader c) = boxSize c
boxBuilder (TrackHeader c) = boxBuilder c
instance KnownNat version => IsBoxType' (TrackHeader version) where
type BoxContent (TrackHeader version) = FullBox version (TrackHeader version)
toBoxType' _ = StdType "tkhd"
instance BoxRules (TrackHeader version) where
type IsTopLevelBox (TrackHeader version) = 'False
type GetCardinality (TrackHeader version) any = 'ExactlyOnce
type RestrictedTo (TrackHeader version) = 'Just '[Track version]