Changeset 3196
- Timestamp:
- 2007-08-16 18:42:06 (1 year ago)
- Files:
-
- oogg/trunk/mediaStream.ml (modified) (2 diffs)
- oogg/trunk/mediaStream.mli (modified) (1 diff)
- oogg/trunk/oogg_info.ml (modified) (1 diff)
- oogg/trunk/page.ml (modified) (1 diff)
- oogg/trunk/page.mli (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
oogg/trunk/mediaStream.ml
r3185 r3196 1 1 open Types 2 2 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) option12 };;13 14 let rec oogg_find_stream serialno streams = match streams with15 | h::t when h._stream_serialno = serialno -> h16 | h::t -> oogg_find_stream serialno t17 | [] -> raise UnknownSerialNo18 19 (* get the beginning-of-stream pages destructively, but don't remove20 * any other data21 *)22 let rec get_bos_pages instream = match (Stream.peek instream) with23 | None -> []24 | Some page when page.bos == false -> []25 | Some page ->26 begin27 Stream.junk instream;28 let identity = Page.identify_bos page in29 { _stream_serialno = page.serialno;30 _stream_cache = (Some [page]);31 _stream_type = identity;32 _stream_time = None33 }::(get_bos_pages instream)34 end;;35 36 let rec get_next_page instream streamslist streamno =37 let ms = List.nth streamslist streamno in38 match ms._stream_cache with39 | None -> None40 | Some (h::t) ->41 begin42 if h.eos then43 ms._stream_cache <- None44 else45 ms._stream_cache <- Some t;46 Some h47 end48 | Some [] ->49 begin50 let page = Stream.next instream in51 if page.serialno = ms._stream_serialno then52 begin53 if page.eos then ms._stream_cache <- None;54 Some page55 end56 else57 begin58 let slist = oogg_find_stream page.serialno streamslist in59 begin60 match slist._stream_cache with61 | Some foo -> slist._stream_cache <- Some (foo @ [page])62 | None -> raise PagesAfterEOS63 end;64 get_next_page instream streamslist streamno65 end66 end;;67 68 let streamgen instream streamslist streamno count =69 get_next_page instream streamslist streamno70 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 that74 * belongs in other streams. Hence, we have an internal data structure that75 * caches frames, a get_next_page function which returns the next frame for76 * an output stream and caches frames on the other streams, and a77 * streamgen generator function with which we create the output streams. To78 * 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 in82 let rec _gen_streams sl c = match sl with83 | [] -> []84 | h::t ->85 begin86 let s = h._stream_serialno in87 let ty = h._stream_type in88 let new_stream = Stream.from (streamgen instream streamslist c) in89 {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 in96 _gen_streams streamslist 097 98 3 let rec filter instream snos = 99 4 if snos = [] then [< >] else … … 111 16 else [< filter rest snos >] 112 17 | [< >] -> [< >] 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;;*) 2 2 3 3 val filter : Types.rawPageStream -> Types.serialNo list -> Types.rawPageStream;; 4 4 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 3 3 let f = File.file_open Sys.argv.(1);; 4 4 let s = File.to_stream f 0;; 5 let pages = Page.to_rawPageStream s;; 5 let pages = Page.to_pageStream s;; 6 let sorted_pages = Page.sort pages;; 6 7 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 8 let 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 ) 15 18 | [] -> ();; 16 19 17 print_s treams streams;;20 print_sorted_pages sorted_pages;; oogg/trunk/page.ml
r3185 r3196 259 259 let write_pageStream stream pstream = 260 260 write_rawPageStream stream (pageStream_to_rawPageStream pstream);; 261 262 module 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 273 module RawPageSort = StreamSort.StreamSort (RawPageInput);; 274 let sort_raw = RawPageSort.sort;; 275 276 module 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 287 module PageSort = StreamSort.StreamSort (PageInput);; 288 let sort = PageSort.sort;; oogg/trunk/page.mli
r3182 r3196 14 14 15 15 val identify_bos : Types.rawPage -> Types.mediaType;; 16 17 val sort_raw : Types.rawPageStream -> 18 (Types.serialNo * Types.rawPageStream) list;; 19 20 val sort : Types.pageStream -> (Types.serialNo * Types.pageStream) list;;