module Data.ZoomCache.Common (
TimeStamp (..)
, TimeStampDiff(..)
, timeStampDiff
, timeStampFromSO
, SampleOffset(..)
, SampleOffsetDiff(..)
, sampleOffsetDiff
, SampleRateType(..)
, TrackNo
, Global(..)
, Version(..)
) where
import Data.Int
import Data.Ratio
type TrackNo = Int
data SampleOffset = SO { unSO :: !Int64 }
deriving (Eq, Ord, Show)
data SampleOffsetDiff = SODiff { unSODiff :: !Int64 }
deriving (Eq, Ord, Show)
sampleOffsetDiff :: SampleOffset -> SampleOffset -> SampleOffsetDiff
sampleOffsetDiff (SO t1) (SO t2) = SODiff (t1 t2)
data Version = Version !Int !Int
deriving (Eq, Show)
data Global = Global
{ version :: Version
, noTracks :: Int
, presentationTime :: Rational
, baseTime :: Rational
, baseUTC :: Maybe Int
}
deriving (Show)
data SampleRateType = ConstantSR | VariableSR
deriving (Eq, Show)
newtype TimeStamp = TS Double
deriving (Eq, Ord, Show)
newtype TimeStampDiff = TSDiff Double
timeStampDiff :: TimeStamp -> TimeStamp -> TimeStampDiff
timeStampDiff (TS t1) (TS t2) = TSDiff (t1 t2)
timeStampFromSO :: Rational -> SampleOffset -> TimeStamp
timeStampFromSO r (SO so)
| n == 0 = TS 0.0
| otherwise = TS (fromIntegral so * d / n)
where
n = fromIntegral $ numerator r
d = fromIntegral $ denominator r