Changeset 3196

Show
Ignore:
Timestamp:
2007-08-16 18:42:06 (1 year ago)
Author:
shans
Message:

Added sorting to page and rawPage streams
Removed most of the mediaStream stuff (sorted pages work better)
Modified oogg_info to use sorted page streams

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • oogg/trunk/mediaStream.ml

    r3185 r3196  
    11open Types 
    22 
    3 exception PagesAfterEOS;; 
    4 exception UnknownSerialNo;; 
    5  
    6 (* internal type *) 
    7 type _ooggMediaStream = 
    8   { _stream_serialno : serialNo ; 
    9     mutable _stream_cache : (rawPage list) option ; 
    10     _stream_type : mediaType ; 
    11     _stream_time : (granulePos -> float) option 
    12   };; 
    13  
    14 let rec oogg_find_stream serialno streams = match streams with 
    15   | h::t when h._stream_serialno = serialno -> h 
    16   | h::t -> oogg_find_stream serialno t 
    17   | [] -> raise UnknownSerialNo 
    18  
    19 (* get the beginning-of-stream pages destructively, but don't remove 
    20  * any other data  
    21  *) 
    22 let rec get_bos_pages instream = match (Stream.peek instream) with 
    23   | None                              ->  [] 
    24   | Some page when page.bos == false  ->  [] 
    25   | Some page -> 
    26       begin 
    27         Stream.junk instream; 
    28         let identity = Page.identify_bos page in 
    29         { _stream_serialno = page.serialno;  
    30           _stream_cache = (Some [page]); 
    31           _stream_type = identity;  
    32           _stream_time =  None 
    33         }::(get_bos_pages instream) 
    34       end;; 
    35  
    36 let rec get_next_page instream streamslist streamno = 
    37   let ms = List.nth streamslist streamno in 
    38   match ms._stream_cache with 
    39     | None -> None 
    40     | Some (h::t) ->  
    41       begin  
    42         if h.eos then  
    43           ms._stream_cache <- None  
    44         else  
    45           ms._stream_cache <- Some t;  
    46         Some h  
    47       end 
    48     | Some [] ->  
    49       begin 
    50         let page = Stream.next instream in 
    51         if page.serialno = ms._stream_serialno then 
    52           begin 
    53             if page.eos then ms._stream_cache <- None; 
    54             Some page 
    55           end 
    56         else 
    57           begin 
    58             let slist = oogg_find_stream page.serialno streamslist in 
    59             begin  
    60               match slist._stream_cache with 
    61                 | Some foo -> slist._stream_cache <- Some (foo @ [page]) 
    62                 | None -> raise PagesAfterEOS  
    63             end; 
    64             get_next_page instream streamslist streamno 
    65           end 
    66       end;; 
    67  
    68 let streamgen instream streamslist streamno count =  
    69     get_next_page instream streamslist streamno 
    70  
    71 (* 
    72  * we need to convert from a single lazy stream to a list of lazy streams. 
    73  * When pulling data from any of the streams, we will also be finding data that 
    74  * belongs in other streams.  Hence, we have an internal data structure that 
    75  * caches frames, a get_next_page function which returns the next frame for 
    76  * an output stream and caches frames on the other streams, and a 
    77  * streamgen generator function with which we create the output streams.  To 
    78  * start the whole thing off we grab the stream's bos pages. 
    79  *) 
    80 let to_mediaStreams instream = 
    81   let streamslist = get_bos_pages instream in 
    82   let rec _gen_streams sl c = match sl with 
    83     | []   -> [] 
    84     | h::t ->  
    85         begin 
    86           let s = h._stream_serialno in 
    87           let ty = h._stream_type in 
    88           let new_stream = Stream.from (streamgen instream streamslist c) in 
    89           { 
    90             stream_serialno=s ;  
    91             stream_pages = new_stream ;  
    92             stream_type = ty ; 
    93             stream_time = fun x -> None ; 
    94           }::(_gen_streams t (c+1)) 
    95         end in 
    96   _gen_streams streamslist 0 
    97   
    983let rec filter instream snos = 
    994  if snos = [] then [< >] else 
     
    11116                else [< filter rest snos >] 
    11217    | [< >]              -> [< >] 
    113  
    114 let streamTime mediaStream gp = mediaStream.stream_time gp;; 
  • oogg/trunk/mediaStream.mli

    r3185 r3196  
    1 val to_mediaStreams : Types.rawPageStream -> Types.mediaStream list;; 
     1(*val to_mediaStreams : Types.rawPageStream -> Types.mediaStream list;;*) 
    22 
    33val filter : Types.rawPageStream -> Types.serialNo list -> Types.rawPageStream;; 
    44 
    5 val streamTime : Types.mediaStream -> Types.granulePos -> float option;; 
     5(*val streamTime : Types.mediaStream -> Types.granulePos -> float option;;*) 
  • oogg/trunk/oogg_info.ml

    r3182 r3196  
    33let f = File.file_open Sys.argv.(1);; 
    44let s = File.to_stream f 0;; 
    5 let pages = Page.to_rawPageStream s;; 
     5let pages = Page.to_pageStream s;; 
     6let sorted_pages = Page.sort pages;; 
    67 
    7 let streams = MediaStream.to_mediaStreams pages;; 
    8  
    9 let rec print_streams l = match l with 
    10   | h::t -> begin 
    11               print_oogg32 h.stream_serialno; print_string ": "; 
    12               print_mediaType h.stream_type; print_newline (); 
    13               print_streams t 
    14             end 
     8let rec print_sorted_pages l = match l with 
     9  | (s,ps)::t -> 
     10            ( 
     11              print_oogg32 s; print_string ": "; 
     12              let p = Stream.peek ps in 
     13              (match p with 
     14                | Some p -> print_mediaType p.identity; print_newline () 
     15                | None -> print_newline ()); 
     16              print_sorted_pages t 
     17            ) 
    1518  | [] -> ();; 
    1619 
    17 print_streams streams;; 
     20print_sorted_pages sorted_pages;; 
  • oogg/trunk/page.ml

    r3185 r3196  
    259259let write_pageStream stream pstream =  
    260260  write_rawPageStream stream (pageStream_to_rawPageStream pstream);; 
     261 
     262module RawPageInput = 
     263  struct 
     264    type k = serialNo 
     265    type s = rawPage 
     266    let eq = (=) 
     267    let get_key p = p.serialno 
     268    let is_first p = p.bos 
     269    let is_last p = p.eos 
     270    let printKey s = print_oogg32 s 
     271  end;; 
     272 
     273module RawPageSort = StreamSort.StreamSort (RawPageInput);; 
     274let sort_raw = RawPageSort.sort;; 
     275 
     276module PageInput = 
     277  struct 
     278    type k = serialNo 
     279    type s = page 
     280    let eq = (=) 
     281    let get_key p = p.raw.serialno 
     282    let is_first p = p.raw.bos 
     283    let is_last p = p.raw.eos 
     284    let printKey s = print_oogg32 s 
     285  end;; 
     286 
     287module PageSort = StreamSort.StreamSort (PageInput);; 
     288let sort = PageSort.sort;; 
  • oogg/trunk/page.mli

    r3182 r3196  
    1414 
    1515val identify_bos : Types.rawPage -> Types.mediaType;; 
     16 
     17val sort_raw : Types.rawPageStream ->  
     18            (Types.serialNo * Types.rawPageStream) list;; 
     19 
     20val sort : Types.pageStream -> (Types.serialNo * Types.pageStream) list;;