module Codec.Container.Ogg.Sort (
merge,
sort,
) where
import Codec.Container.Ogg.ContentType
import Codec.Container.Ogg.List
import Codec.Container.Ogg.Headers
import Codec.Container.Ogg.Page
import Codec.Container.Ogg.Serial
import Codec.Container.Ogg.Track
merge :: [[OggPage]] -> [OggPage]
merge = sortHeaders . mergeSkeleton . listMerge
sort :: [OggPage] -> [OggPage]
sort = sortHeaders . listMerge . demux
sortHeaders :: [OggPage] -> [OggPage]
sortHeaders = processHeaders (sortHeaders' [] [] [] [] [])
sortHeaders' :: [OggPage]
-> [OggPage]
-> [OggPage]
-> [OggPage]
-> [OggPage]
-> [OggPage]
-> [OggPage]
sortHeaders' sb tb ob oh se [] = sb ++ tb ++ ob ++ oh ++ se
sortHeaders' sb tb ob oh se (g:gs)
| contentTypeIs skeleton g = case (pageBOS g, pageEOS g) of
(True, False) -> sortHeaders' (sb++[g]) tb ob oh se gs
(False, True) -> sortHeaders' sb tb ob oh (se++[g]) gs
_ -> sortHeaders' sb tb ob (oh++[g]) se gs
| contentTypeIs theora g = case (pageBOS g) of
True -> sortHeaders' sb (tb++[g]) ob oh se gs
False -> sortHeaders' sb tb ob (oh++[g]) se gs
| otherwise = case (pageBOS g) of
True -> sortHeaders' sb tb (ob++[g]) oh se gs
False -> sortHeaders' sb tb ob (oh++[g]) se gs
mergeSkeleton :: [OggPage] -> [OggPage]
mergeSkeleton [] = []
mergeSkeleton (g:gs)
| contentTypeIs skeleton g = g : mergeSkeleton' (pageTrack g) gs
| otherwise = g : mergeSkeleton gs
mergeSkeleton' :: OggTrack -> [OggPage] -> [OggPage]
mergeSkeleton' _ [] = []
mergeSkeleton' t' (g:gs)
| contentTypeIs skeleton g = case (t == t', pageBOS g, pageEOS g) of
(True, _, _) -> g:gs'
(False, True, _) -> gs'
(False, _, True) -> gs'
(False, _, _) -> g':gs'
| otherwise = g : gs'
where
t = pageTrack g
g' = g{pageTrack = t'}
gs' = mergeSkeleton' t' gs