File: decoding.ml

package info (click to toggle)
ocaml-ffmpeg 1.2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 908 kB
  • sloc: ansic: 6,412; ml: 6,166; makefile: 3
file content (57 lines) | stat: -rw-r--r-- 1,477 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
let () = Printexc.record_backtrace true

let () =
  if Array.length Sys.argv < 2 then (
    Printf.printf "usage: %s input_file\n" Sys.argv.(0);
    exit 1);

  Avutil.Log.set_level `Debug;
  Avutil.Log.set_callback print_string;

  let src = Av.open_input Sys.argv.(1) in

  let mk_audio_decoder (pos, _, params) =
    ( pos,
      Avcodec.Audio.create_decoder ~params
        Avcodec.Audio.(find_decoder (get_params_id params)) )
  in

  let iass = Av.get_audio_streams src in

  let dass = List.map mk_audio_decoder iass in

  let mk_video_decoder (pos, _, params) =
    ( pos,
      Avcodec.Video.create_decoder ~params
        Avcodec.Video.(find_decoder (get_params_id params)) )
  in

  let ivss = Av.get_video_streams src in

  let dvss = List.map mk_video_decoder ivss in

  let rec f () =
    match
      Av.read_input
        ~audio_packet:(List.map (fun (_, s, _) -> s) iass)
        ~video_packet:(List.map (fun (_, s, _) -> s) ivss)
        src
    with
      | `Audio_packet (i, pkt) ->
          Avcodec.decode (List.assoc i dass) (fun _ -> ()) pkt;
          f ()
      | `Video_packet (i, pkt) ->
          Avcodec.decode (List.assoc i dvss) (fun _ -> ()) pkt;
          f ()
      | exception Avutil.Error `Eof -> ()
      | _ -> assert false
  in
  f ();

  List.iter (fun (_, d) -> Avcodec.flush_decoder d (fun _ -> ())) dass;
  List.iter (fun (_, d) -> Avcodec.flush_decoder d (fun _ -> ())) dvss;

  Av.close src;

  Gc.full_major ();
  Gc.full_major ()