{-# LANGUAGE UndecidableInstances #-}
module Data.ByteString.IsoBaseFileFormat.Boxes.Handler
(Handler()
,handler
,audioTrackHandler
,namedAudioTrackHandler
,videoTrackHandler
,namedVideoTrackHandler
,hintTrackHandler
,namedHintTrackHandler
,timedMetadataTrackHandler
,namedTimedMetadataTrackHandler
,auxilliaryVideoTrackHandler
,namedAuxilliaryVideoTrackHandler
,HandlerType(..)
,GetHandlerType
,HandlerTypeCode)
where
import Data.ByteString.IsoBaseFileFormat.Box
import Data.ByteString.IsoBaseFileFormat.Util.BoxFields
import Data.ByteString.IsoBaseFileFormat.Util.FullBox
import qualified Data.Text as T
import Data.ByteString.IsoBaseFileFormat.ReExports
newtype Handler (t :: HandlerType) where
Handler ::
Constant (U32 "pre_defined") 0 :+
Constant (U32Text "t") (HandlerTypeCode t) :+
Constant (U32Arr "reserved" 3) '[0, 0, 0] :+
Template T.Text "" -> Handler t
deriving instance (KnownSymbol (HandlerTypeCode t)) => IsBoxContent (Handler t)
deriving instance Default (Handler t)
data HandlerType
= VideoTrack
| AudioTrack
| HintTrack
| TimedMetaDataTrack
| AuxilliaryVideoTrack
type family GetHandlerType t :: HandlerType
type family HandlerTypeCode (handlertype :: HandlerType) :: Symbol where
HandlerTypeCode 'VideoTrack = "vide"
HandlerTypeCode 'AudioTrack = "soun"
HandlerTypeCode 'HintTrack = "hint"
HandlerTypeCode 'TimedMetaDataTrack = "meta"
HandlerTypeCode 'AuxilliaryVideoTrack = "auxv"
handler
:: (KnownSymbol (HandlerTypeCode t))
=> Handler t -> Box (FullBox (Handler t) 0)
handler = fullBox 0
audioTrackHandler :: Handler 'AudioTrack
audioTrackHandler = namedAudioTrackHandler "Audio Track"
namedAudioTrackHandler :: T.Text -> Handler 'AudioTrack
namedAudioTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt)
videoTrackHandler :: Handler 'VideoTrack
videoTrackHandler = namedVideoTrackHandler "Video Track"
namedVideoTrackHandler :: T.Text -> Handler 'VideoTrack
namedVideoTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt)
hintTrackHandler :: Handler 'HintTrack
hintTrackHandler = namedHintTrackHandler "Hint Track"
namedHintTrackHandler :: T.Text -> Handler 'HintTrack
namedHintTrackHandler txt = Handler (def :+ def :+ def :+ Custom txt)
timedMetadataTrackHandler :: Handler 'TimedMetaDataTrack
timedMetadataTrackHandler =
namedTimedMetadataTrackHandler "Timed Metadata Track"
namedTimedMetadataTrackHandler :: T.Text -> Handler 'TimedMetaDataTrack
namedTimedMetadataTrackHandler txt =
Handler (def :+ def :+ def :+ Custom txt)
auxilliaryVideoTrackHandler :: Handler 'AuxilliaryVideoTrack
auxilliaryVideoTrackHandler =
namedAuxilliaryVideoTrackHandler "Timed Metadata Track"
namedAuxilliaryVideoTrackHandler :: T.Text -> Handler 'AuxilliaryVideoTrack
namedAuxilliaryVideoTrackHandler txt =
Handler (def :+ def :+ def :+ (Custom txt))
instance (KnownSymbol (HandlerTypeCode t)) => IsBox (Handler t)
type instance BoxTypeSymbol (Handler t) = "hdlr"