packages feed

isobmff-builder-0.10.5.0: spec/DashSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module DashSpec (spec) where -- TODO rename to mp4 audio init spec

import Test.Hspec
import Data.ByteString.IsoBaseFileFormat.Brands.Dash
import qualified Data.ByteString.Lazy as BL
import Data.Text ()

spec :: Spec
spec =
  do describe "SingleAudioTrackInit version 0" $
       do it "renders some output at all" $
            do createionTime <- mp4CurrentTime
               let ct :: Word32
                   ct = fromScalar createionTime
                   ct3 = (ct `shiftR` 24) .&. 255
                   ct2 = (ct `shiftR` 16) .&. 255
                   ct1 = (ct `shiftR` 8) .&. 255
                   ct0 = (ct `shiftR` 0) .&. 255
                   cts :: [Word8]
                   cts = fromIntegral <$> [ct3,ct2,ct1,ct0]
               let args = exampleSingleTrackInit createionTime
                   doc = mkSingleTrackInit args
                   rendered = BL.unpack $ toLazyByteString $ doc
                   expected =
                     [
                      -- ftyp box
                      0,0,0,28,102,116,121,112,100,97,115,104,0,0,0,0
                      ,105,115,111,109,105,115,111,53,109,112,52,50
                      -- moov box
                     ,0,0,1,180,109 ,111 ,111 ,118
                      -- mvhd box
                     ,0 ,0 ,0 ,108 ,109 ,118 ,104 ,100 ,0 ,0 ,0 ,0]
                      ++ cts ++ [0 ,0 ,0 ,0 ,0
                     ,1 ,95 ,144 ,0 ,1 ,95 ,144 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,0
                     ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,0 ,0 ,0 ,0 ,0 ,64 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,255 ,255 ,255 ,255
                     -- trak box
                     ,0 ,0 ,1,64
                     ,116 ,114 ,97 ,107
                     -- tkhd box
                     ,0 ,0 ,0 ,92
                     ,116 ,107 ,104 ,100
                     ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,1 ,95 ,144 ,0 ,0
                     ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0
                     ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     ,0 ,64 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
                     -- mdia box
                     ,0,0,0,220
                     ,109,100,105,97
                     ,0,0,0,32,109,100,104,100,0,0,0,0
                     ,0,0,0,0,0,0,0,0,0,1,95,144,0,0,0,0,16,181,0,0
                     -- hdlr box
                     ,0,0,0,44
                     ,104,100,108,114
                     ,0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0
                     ,72,101,108,108,111,32,119,111,114,108,100,0
                     -- minf box
                     ,0,0,0,136
                     ,109,105,110,102
                     ,0,0,0,16
                     ,115,109,104,100,0,0,0,0,0,0,0,0
                     -- dinf box
                     ,0,0,0,36
                     ,100,105,110,102
                     -- dref box
                     ,0,0,0,28
                     ,100,114,101,102
                     ,0,0,0,0,0,0,0,1
                     -- url  box
                     ,0,0,0,12
                     ,117,114,108,32
                     ,0,0,0,1
                     -- stbl
                     ,0,0,0,76,115,116,98,108
                     -- stsd
                     ,0,0,0,52,115,116,115,100
                     ,0,0,0,0,0,0,0,1
                     -- mp4a
                     ,0,0,0,36,109,112,52,97
                     ,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,16,0,0,0,0
                     ,187,128,0,0
                     -- stts
                     ,0,0,0,16,115,116,116,115,0,0,0,0,0,0,0,0]
               BL.writeFile "/tmp/isobmff-test-case-dash-spec.mp4" (BL.pack rendered)
               rendered `shouldBe`
                 expected

exampleSingleTrackInit :: U32 "creation_time" -> SingleAudioTrackInit
exampleSingleTrackInit creationTime =
  SingleAudioTrackInit
                  (MovieHeader $
                   V0 (creationTime :+ 0 :+ Template :+ durationFromSeconds Template 1) :+
                   def)
                  (TrackHeader $
                   V0 (0 :+ 0 :+ 1 :+ Constant :+ durationFromSeconds Template 1) :+
                   def)
                  (MediaHeader def)
                  (namedAudioTrackHandler "Hello world")
                  (SoundMediaHeader def)