isobmff-builder-0.10.0.0: src/Data/ByteString/IsoBaseFileFormat/Boxes/DataReference.hs
-- | A table of data references (URL/URNs). This tables is referred to by the
-- 'SampleDescription' this supports splitting a file over several files. When a
-- media file is split for transportation, this still counts as being in the
-- same file as the.
module Data.ByteString.IsoBaseFileFormat.Boxes.DataReference
(DataReference()
,DataEntryUrl()
,DataEntryUrn()
,dataReference
,localMediaDataReference
,localMediaDataEntryUrl
,dataEntryUrl
,dataEntryUrn
)
where
import Data.ByteString.IsoBaseFileFormat.Boxes.Box
import Data.ByteString.IsoBaseFileFormat.Boxes.FullBox
import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields
hiding (Default)
import qualified Data.Text as T
import Data.Singletons.Prelude.List (Length)
import Data.Default
-- | A container for 'DataEntryUrl's and 'DataEntryUrn's
newtype DataReference =
DataReference (U32 "entry_count")
deriving (Default,IsBoxContent)
-- | A container for a URL
newtype DataEntryUrl =
DataEntryUrl (Maybe T.Text)
deriving (Default,IsBoxContent)
-- | A container for a URN and optionally a URL
newtype DataEntryUrn =
DataEntryUrn (T.Text :+ T.Text)
deriving (IsBoxContent)
-- | Create a 'DataReference' box.
dataReference
:: KnownNat (Length ts)
=> Boxes ts -> Box (ContainerBox (FullBox DataReference 0) ts)
dataReference bs =
containerBox (FullBox 0 $ DataReference (typeListLength bs))
bs
-- | Create a 'DataReference' box with a single local media entry.
localMediaDataReference
:: Box (ContainerBox (FullBox DataReference 0) '[Box (FullBox DataEntryUrl 0)])
localMediaDataReference = dataReference (singletonBox localMediaDataEntryUrl)
-- | Create a 'DataEntryUrl' box for local media entry with the flag set and
-- empty content.
localMediaDataEntryUrl
:: Box (FullBox DataEntryUrl 0)
localMediaDataEntryUrl = dataEntryUrl True Nothing
-- | Create a 'DataEntryUrl' box. The flag determines if the url is local, i.e.
-- the media data is in the same file.
dataEntryUrl
:: Bool -> Maybe T.Text -> Box (FullBox DataEntryUrl 0)
dataEntryUrl isLocal Nothing = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl Nothing)
dataEntryUrl isLocal murl = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrl murl)
-- | Create a 'DataEntryUrn' box. The flag determines if the url is local, i.e.
-- the media data is in the same file.
dataEntryUrn
:: Bool -> T.Text -> T.Text -> Box (FullBox DataEntryUrn 0)
dataEntryUrn isLocal urn url = Box (FullBox (fromIntegral $ fromEnum isLocal) $ DataEntryUrn $ urn :+ url)
instance IsBox DataReference
type instance BoxTypeSymbol DataReference = "dref"
instance IsBox DataEntryUrn
type instance BoxTypeSymbol DataEntryUrn = "urn "
instance IsBox DataEntryUrl
type instance BoxTypeSymbol DataEntryUrl = "urn "