isobmff-builder-0.10.5.0: src/Data/ByteString/IsoBaseFileFormat/Boxes/SampleEntry.hs
{-# LANGUAGE UndecidableInstances #-}
-- | Connect a sample description to a data reference via an index into the data
-- reference entry table.
module Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry where
import Data.ByteString.IsoBaseFileFormat.Boxes.Box
import Data.ByteString.IsoBaseFileFormat.Boxes.Handler
import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields
-- | Specific sample entries must provide an instance for this data family.
-- The @format@ parameter will be used as 'BoxTypeSymbol'.
data family SampleEntry (handlertype :: HandlerType) (format :: k)
-- | Create a 'SampleEntry' 'Box' from the data reference index and the
-- 'HandlerType' specific 'SampleEntry' instance.
sampleEntry
:: forall (handlertype :: HandlerType) (format :: k)
. U16 "data_reference_index"
-> SampleEntry handlertype format
-> Box (SampleEntry handlertype format)
sampleEntry i c = Box (SampleEntryFields (Constant :+ i :+ c))
-- | A common header for all specific sample entries, the 'BoxContent' of the
-- abstract 'SampleEntry' is @SampleEntryFields (SampleEntry h f)@.
newtype SampleEntryFields a where
SampleEntryFields
:: Constant (U8Arr "reserved" 6) '[0,0,0,0,0,0]
:+ U16 "data_reference_index"
:+ a
-> SampleEntryFields a
deriving instance IsBoxContent a => IsBoxContent (SampleEntryFields a)
deriving instance Default a => Default (SampleEntryFields a)
-- | Use this in 'IsMediaFileFormat's 'BoxLayout' to range over any specific
-- 'SampleEntry', disregarding the second parameter (that indicates low-level
-- format, protocol or codec characteristics).
data MatchSampleEntry (handlerType :: HandlerType)
type instance
IsRuleConform (Box (SampleEntry g' f)) (MatchSampleEntry g) =
HandlerTypeCode g' == HandlerTypeCode g
-- | The 'BoxTypeSymbol' of sample entry is exactly the @format@ type index of
-- the 'SampleEntry' family.
type instance
BoxTypeSymbol (SampleEntry handlertype format) = BoxTypeSymbol format
instance (IsBoxContent (SampleEntry handlertype format)
,KnownSymbol (BoxTypeSymbol (SampleEntry handlertype format)))
=> IsBox (SampleEntry handlertype format) where
type BoxContent (SampleEntry handlertype format) =
SampleEntryFields (SampleEntry handlertype format)