module Codec.Container.Ogg.TimeScheme (
TimeScheme (..),
guessTimeScheme,
npt,
smpte24,
smpte24drop,
smpte25,
smpte25drop,
smpte30,
smpte30drop,
smpte50,
smpte60,
smpte60drop
) where
import Data.Char
import Data.Maybe
import Data.Ratio
data TimeScheme =
TimeScheme {
timeSchemeName :: String,
timeSchemeRate :: Rational
}
knownTimeSchemes :: [TimeScheme]
knownTimeSchemes = [npt, smpte24, smpte24drop, smpte25, smpte25drop,
smpte30, smpte30drop, smpte50, smpte60, smpte60drop]
guessTimeScheme :: Rational -> Maybe TimeScheme
guessTimeScheme r = listToMaybe $ filter sameRate knownTimeSchemes
where
sameRate = \x -> timeSchemeRate x == r
instance Read TimeScheme where
readsPrec _ = readsTimeScheme
readsTimeScheme :: ReadS TimeScheme
readsTimeScheme [] = []
readsTimeScheme str@(c:_)
| isDigit c = [(npt, str)]
| otherwise = [(scheme, tail rest) | scheme <- matches]
where (tok, rest) = span (\x -> isAlphaNum x || x == '-') str
matches = filter sameName knownTimeSchemes
sameName = \x -> l (timeSchemeName x) == l tok
l = map toLower
instance Show TimeScheme where
show = timeSchemeName
npt :: TimeScheme
npt = TimeScheme "npt" (1000%1)
smpte24 :: TimeScheme
smpte24 = TimeScheme "smpte-24" (24%1)
smpte24drop :: TimeScheme
smpte24drop = TimeScheme "smpte-24-drop" (24000%1001)
smpte25 :: TimeScheme
smpte25 = TimeScheme "smpte-25" (25%1)
smpte25drop :: TimeScheme
smpte25drop = TimeScheme "smpte-25-drop" (25000%1001)
smpte30 :: TimeScheme
smpte30 = TimeScheme "smpte-30" (30%1)
smpte30drop :: TimeScheme
smpte30drop = TimeScheme "smpte-30-drop" (30000%1001)
smpte50 :: TimeScheme
smpte50 = TimeScheme "smpte-50" (50%1)
smpte60 :: TimeScheme
smpte60 = TimeScheme "smpte-60" (60%1)
smpte60drop :: TimeScheme
smpte60drop = TimeScheme "smpte-60" (60000%1001)