#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp disable
-module(gen_rtp_header).

% -mode(compile).

-define(VERSION, "0.1").

-export([main/1]).

-record(rtp_packet,
        {
          version = 2,
          padding = 0,
          marker = 0,
          payload_type = 0,
          seqno = 0,
          timestamp = 0,
          ssrc = 0,
          csrcs = [],
          extension = <<>>,
          payload = <<>>,
	  realtime
        }).


main(Args) ->
    DefaultOpts = [{format, state},
                   {ssrc, 16#11223344},
                   {pt, 98}],
    {PosArgs, Opts} = getopts_checked(Args, DefaultOpts),
    log(debug, fun (Dev) ->
            io:format(Dev, "Initial options:~n", []),
	    dump_opts(Dev, Opts),
	    io:format(Dev, "~s: ~p~n", ["Args", PosArgs])
        end, [], Opts),
    main(PosArgs, Opts).

main([First | RemArgs], Opts) ->
    try
        F = list_to_integer(First),
	Format = proplists:get_value(format, Opts, state),
	PayloadData = proplists:get_value(payload, Opts, undef),
	InFile = proplists:get_value(file, Opts, undef),

        Payload = case {PayloadData, InFile} of
	    {undef, undef} -> #rtp_packet.payload;
	    {P, undef} -> P;
	    {_, File} ->
		log(info, "Loading file '~s'~n", [File], Opts),
		{ok, InDev} = file:open(File, [read]),
		DS = [ Pl#rtp_packet.payload || {_T, Pl} <- read_packets(InDev, Opts)],
		file:close(InDev),
		log(debug, "File '~s' closed, ~w packets read.~n", [File, length(DS)], Opts),
		DS
	end,
        Dev = standard_io,
	write_packet_pre(Dev, Format),
        do_groups(Dev, Payload, F, RemArgs, Opts),
	write_packet_post(Dev, Format),
	0
    catch
        _:_ ->
            log(debug, "~p~n", [hd(erlang:get_stacktrace())], Opts),
            usage(),
            halt(1)
    end
    ;

main(_, _Opts) ->
    usage(),
    halt(1).

%%% group (count + offset) handling %%%

do_groups(_Dev, _Pl, _F, [], _Opts) ->
    ok;

do_groups(Dev, Pl, F, [L], Opts) ->
    do_groups(Dev, Pl, F, [L, 0], Opts);

do_groups(Dev, Pl, First, [L, O | Args], Opts) ->
    Ssrc = proplists:get_value(ssrc, Opts, #rtp_packet.ssrc),
    PT   = proplists:get_value(pt, Opts, #rtp_packet.payload_type),
    Len  = list_to_num(L),
    Offs = list_to_num(O),
    log(info, "Starting group: Ssrc=~.16B, PT=~B, First=~B, Len=~B, Offs=~B~n",
        [Ssrc, PT, First, Len, Offs], Opts),
    Pkg = #rtp_packet{ssrc = Ssrc, payload_type = PT},
    Pl2 = write_packets(Dev, Pl, Pkg, First, Len, Offs, Opts),
    {Args2, Opts2} = getopts_checked(Args, Opts),
    log(debug, fun (Io) ->
            io:format(Io, "Changed options:~n", []),
	    dump_opts(Io, Opts2 -- Opts)
        end, [], Opts),
    do_groups(Dev, Pl2, First+Len, Args2, Opts2).

%%% error handling helpers %%%

getopts_checked(Args, Opts) ->
    try
        getopts(Args, Opts)
    catch
        C:R ->
            log(error, "~s~n",
                [explain_error(C, R, erlang:get_stacktrace(), Opts)], Opts),
            usage(),
            halt(1)
    end.

explain_error(error, badarg, [{erlang,list_to_integer,[S,B]} | _ ], _Opts) ->
    io_lib:format("Invalid number '~s' (base ~B)", [S, B]);
explain_error(error, badarg, [{erlang,list_to_integer,[S]} | _ ], _Opts) ->
    io_lib:format("Invalid decimal number '~s'", [S]);
explain_error(C, R, [Hd | _ ], _Opts) ->
    io_lib:format("~p, ~p:~p", [Hd, C, R]);
explain_error(_, _, [], _Opts) ->
    "".

%%% usage and options %%%

myname() ->
    filename:basename(escript:script_name()).

usage(Text) ->
    io:format(standard_error, "~s: ~s~n", [myname(), Text]),
    usage().

usage() ->
    io:format(standard_error,
              "Usage: ~s [Options] Start Count1 Offs1 [[Options] Count2 Offs2 ...]~n",
              [myname()]).

show_version() ->
    io:format(standard_io,
              "~s ~s~n", [myname(), ?VERSION]).

show_help() ->
    io:format(standard_io,
              "Usage: ~s [Options] Start Count1 Offs1 [[Options] Count2 Offs2 ...]~n~n" ++
              "Options:~n" ++
	      "  -h, --help             this text~n" ++
	      "      --version          show version info~n" ++
	      "  -i, --file=FILE        reads payload from state file~n" ++
	      "  -p, --payload=HEX      set constant payload~n" ++
	      "      --verbose=N        set verbosity~n" ++
	      "  -v                     increase verbosity~n" ++
	      "      --format=state     use state format for output (default)~n" ++
	      "  -C, --format=c         use simple C lines for output~n" ++
	      "      --format=carray    use a C array for output~n" ++
	      "  -s, --ssrc=SSRC        set the SSRC~n" ++
	      "  -t, --type=N           set the payload type~n" ++
	      "  -d, --delay=FLOAT      add offset to playout timestamp~n" ++
	      "~n" ++
	      "Arguments:~n" ++
	      "  Start              initial packet (sequence) number~n" ++
	      "  Count              number of packets~n" ++
	      "  Offs               timestamp offset (in RTP units)~n" ++
	      "", [myname()]).

getopts([ "--file=" ++ File | R], Opts) ->
        getopts(R, [{file, File} | Opts]);
getopts([ "-i" ++ T | R], Opts) ->
        getopts_alias_arg("--file", T, R, Opts);
getopts([ "--version" | _], _Opts) ->
	show_version(),
        halt(0);
getopts([ "--help" | _], _Opts) ->
	show_help(),
        halt(0);
getopts([ "-h" ++ T | R], Opts) ->
        getopts_alias_no_arg("--help", T, R, Opts);
getopts([ "--verbose=" ++ V | R], Opts) ->
        Verbose = list_to_integer(V),
        getopts(R, [{verbose, Verbose} | Opts]);
getopts([ "-v" ++ T | R], Opts) ->
        Verbose = proplists:get_value(verbose, Opts, 0),
        getopts_short_no_arg(T, R, [ {verbose, Verbose+1} | Opts]);
getopts([ "--format=state" | R], Opts) ->
        getopts(R, [{format, state} | Opts]);
getopts([ "--format=c" | R], Opts) ->
        getopts(R, [{format, c} | Opts]);
getopts([ "-C" ++ T | R], Opts) ->
        getopts_alias_no_arg("--format=c", T, R, Opts);
getopts([ "--format=carray" | R], Opts) ->
        getopts(R, [{format, carray} | Opts]);
getopts([ "--payload=" ++ Hex | R], Opts) ->
        getopts(R, [{payload, hex_to_bin(Hex)} | Opts]);
getopts([ "--ssrc=" ++ Num | R], Opts) ->
        getopts(R, [{ssrc, list_to_num(Num)} | Opts]);
getopts([ "-s" ++ T | R], Opts) ->
        getopts_alias_arg("--ssrc", T, R, Opts);
getopts([ "--type=" ++ Num | R], Opts) ->
        getopts(R, [{pt, list_to_num(Num)} | Opts]);
getopts([ "-t" ++ T | R], Opts) ->
        getopts_alias_arg("--type", T, R, Opts);
getopts([ "--delay=" ++ Num | R], Opts) ->
        getopts(R, [{delay, list_to_float(Num)} | Opts]);
getopts([ "-d" ++ T | R], Opts) ->
        getopts_alias_arg("--delay", T, R, Opts);

% parsing helpers
getopts([ "--" | R], Opts) ->
        {R, normalize_opts(Opts)};
getopts([ O = "--" ++ _ | _], _Opts) ->
        usage("Invalid option: " ++ O),
        halt(1);
getopts([ [ $-, C | _] | _], _Opts) when C < $0; C > $9 ->
        usage("Invalid option: -" ++ [C]),
        halt(1);

getopts(R, Opts) ->
        {R, normalize_opts(Opts)}.

getopts_short_no_arg([], R, Opts) -> getopts(R, Opts);
getopts_short_no_arg(T, R, Opts)  -> getopts([ "-" ++ T | R], Opts).

getopts_alias_no_arg(A, [], R, Opts) -> getopts([A | R], Opts);
getopts_alias_no_arg(A, T, R, Opts)  -> getopts([A, "-" ++ T | R], Opts).

getopts_alias_arg(A, [], [T | R], Opts) -> getopts([A ++ "=" ++ T | R], Opts);
getopts_alias_arg(A, T, R, Opts)        -> getopts([A ++ "=" ++ T | R], Opts).

normalize_opts(Opts) ->
       [ proplists:lookup(E, Opts) || E <- proplists:get_keys(Opts) ].

%%% conversions %%%

bin_to_hex(Bin) -> [hd(integer_to_list(N,16)) || <<N:4>> <= Bin].
hex_to_bin(Hex) -> << <<(list_to_integer([Nib],16)):4>> || Nib <- Hex>>.

list_to_num("-" ++ Str) -> -list_to_num(Str);
list_to_num("0x" ++ Str) -> list_to_integer(Str, 16);
list_to_num("0b" ++ Str) -> list_to_integer(Str, 2);
list_to_num(Str = [ $0 | _ ])  -> list_to_integer(Str, 8);
list_to_num(Str)         -> list_to_integer(Str, 10).

%%% dumping data %%%

dump_opts(Dev, Opts) ->
        dump_opts2(Dev, Opts, proplists:get_keys(Opts)).

dump_opts2(Dev, Opts, [OptName | R]) ->
        io:format(Dev, "  ~-10s: ~p~n",
                  [OptName, proplists:get_value(OptName, Opts)]),
        dump_opts2(Dev, Opts, R);
dump_opts2(_Dev, _Opts, []) -> ok.

%%% logging %%%

log(L, Fmt, Args, Opts) when is_list(Opts) ->
    log(L, Fmt, Args, proplists:get_value(verbose, Opts, 0), Opts).

log(debug,  Fmt, Args, V, Opts) when V > 2 -> log2("DEBUG", Fmt, Args, Opts);
log(info,   Fmt, Args, V, Opts) when V > 1 -> log2("INFO", Fmt, Args, Opts);
log(notice, Fmt, Args, V, Opts) when V > 0 -> log2("NOTICE", Fmt, Args, Opts);
log(warn,   Fmt, Args, _V, Opts)           -> log2("WARNING", Fmt, Args, Opts);
log(error,  Fmt, Args, _V, Opts)           -> log2("ERROR", Fmt, Args, Opts);

log(Lvl,  Fmt, Args, V, Opts) when V >= Lvl -> log2("", Fmt, Args, Opts);

log(_, _, _, _i, _) -> ok.

log2(Type, Fmt, Args, _Opts) when is_list(Fmt) ->
    io:format(standard_error, "~s: " ++ Fmt, [Type | Args]);
log2("", Fmt, Args, _Opts) when is_list(Fmt) ->
    io:format(standard_error, Fmt, Args);
log2(_Type, Fun, _Args, _Opts) when is_function(Fun, 1) ->
    Fun(standard_error).

%%% RTP packets %%%

make_rtp_packet(P = #rtp_packet{version = 2}) ->
    << (P#rtp_packet.version):2,
       0:1, % P
       0:1, % X
       0:4, % CC
       (P#rtp_packet.marker):1,
       (P#rtp_packet.payload_type):7,
       (P#rtp_packet.seqno):16,
       (P#rtp_packet.timestamp):32,
       (P#rtp_packet.ssrc):32,
       (P#rtp_packet.payload)/bytes
    >>.

parse_rtp_packet(
    << 2:2, % Version 2
       0:1, % P (not supported yet)
       0:1, % X (not supported yet)
       0:4, % CC (not supported yet)
       M:1,
       PT:7,
       SeqNo: 16,
       TS:32,
       Ssrc:32,
       Payload/bytes >>) ->
    #rtp_packet{
        version = 0,
	marker = M,
	payload_type = PT,
	seqno = SeqNo,
	timestamp = TS,
	ssrc = Ssrc,
	payload = Payload}.

%%% payload generation %%%

next_payload(F) when is_function(F) ->
    {F(), F};
next_payload({F, D}) when is_function(F) ->
    {P, D2} = F(D),
    {P, {F, D2}};
next_payload([P | R]) ->
    {P, R};
next_payload([]) ->
    undef;
next_payload(Bin = <<_/bytes>>) ->
    {Bin, Bin}.

%%% real writing work %%%

write_packets(_Dev, DS, _P, _F, 0, _O, _Opts) ->
    DS;
write_packets(Dev, DataSource, P = #rtp_packet{}, F, L, O, Opts) ->
    Format = proplists:get_value(format, Opts, state),
    Ptime = proplists:get_value(duration, Opts, 160),
    Delay = proplists:get_value(delay, Opts, 0),
    case next_payload(DataSource) of
        {Payload, DataSource2} ->
            write_packet(Dev, 0.020 * F + Delay,
                         P#rtp_packet{seqno = F, timestamp = F*Ptime+O,
			              payload = Payload},
                         Format),
            write_packets(Dev, DataSource2, P, F+1, L-1, O, Opts);
	Other -> Other
    end.

write_packet(Dev, Time, P = #rtp_packet{}, Format) ->
    Bin = make_rtp_packet(P),

    write_packet_line(Dev, Time, P, Bin, Format).

write_packet_pre(Dev, carray) ->
    io:format(Dev,
              "struct {float t; int len; char *data;} packets[] = {~n", []);

write_packet_pre(_Dev, _) -> ok.

write_packet_post(Dev, carray) ->
    io:format(Dev, "};~n", []);

write_packet_post(_Dev, _) -> ok.

write_packet_line(Dev, Time, _P, Bin, state) ->
    io:format(Dev, "~f ~s~n", [Time, bin_to_hex(Bin)]);

write_packet_line(Dev, Time, #rtp_packet{seqno = N, timestamp = TS}, Bin, c) ->
    ByteList = [ [ $0, $x | integer_to_list(Byte, 16) ] || <<Byte:8>> <= Bin ],
    ByteStr = string:join(ByteList, ", "),
    io:format(Dev, "/* time=~f, SeqNo=~B, TS=~B */ {~s}~n", [Time, N, TS, ByteStr]);

write_packet_line(Dev, Time, #rtp_packet{seqno = N, timestamp = TS}, Bin, carray) ->
    io:format(Dev, "  /* RTP: SeqNo=~B, TS=~B */~n", [N, TS]),
    io:format(Dev, "  {~f, ~B, \"", [Time, size(Bin)]),
    [ io:format(Dev, "\\x~2.16.0B", [Byte]) || <<Byte:8>> <= Bin ],
    io:format(Dev, "\"},~n", []).

%%% real reading work %%%

read_packets(Dev, Opts) ->
    Format = proplists:get_value(in_format, Opts, state),

    read_packets(Dev, Opts, Format).

read_packets(Dev, Opts, Format) ->
    case read_packet(Dev, Format) of
        eof -> [];
        Tuple -> [Tuple | read_packets(Dev, Opts, Format)]
    end.

read_packet(Dev, Format) ->
    case read_packet_line(Dev, Format) of
        {Time, Bin} -> {Time, parse_rtp_packet(Bin)};
	eof -> eof
    end.

read_packet_line(Dev, state) ->
    case io:fread(Dev, "", "~f ~s") of
        {ok, [Time, Hex]} -> {Time, hex_to_bin(Hex)};
	eof -> eof
    end.
