#!/bin/bash

encode=0
to_file=0
to_rf=0
audio_index=0
video_index=0

eval set -- $(getopt -o efr --long encode,file,rf -n $0 -- "$@")

while true
do
  case "$1" in
    -e | --encode ) encode=1; shift ;;
    -f | --file ) to_file=1; shift ;;
    -r | --rf ) to_rf=1; shift ;;
    -- ) shift; break ;;
    * ) break ;;
  esac
done

echo $to_file
echo $to_rf

TS_PACKET_LENGTH=188
TS_PACKET_PAYLOAD=184
BITS_PER_BYTE=8
TICKS_PER_SECOND=90000
TS_VIDEO_BITRATE_RATIO=1.15

ts_mux_video=""
ts_mux_audio=""

# TODO: comprova que existeix null.ts


# mpeg2 sd video (anamorphic)
let video_index=$video_index+1
video_input=sintel.mp4
video_framerate=24
video_pcr_rate=38
video_width=720
video_height=576
video_aspect=16/9
video_codec=mpeg2video
video_format=m2v
video_bitrate_bits=5000000
video_vbv_size_units=112
video_ts_pid=2064

let video_vbv_size_bits=${video_vbv_size_units}*16*1024
let video_bitrate_kbits=${video_bitrate_bits}/1000

video_aspect_width=${video_aspect%/*}
video_aspect_height=${video_aspect#*/}

video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
video_ts_bitrate=${video_ts_bitrate%.*}

filename=$(basename $video_input)
video_output=${filename%.*}_${video_index}.${video_format}

if [ $encode -eq 1 ]
then

    case "$video_codec" in
	libx264)
	    echo "H.264"
	    TS_VIDEO_BITRATE_RATIO=1.05
	    video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
	    video_ts_bitrate=${video_ts_bitrate%.*}

	    ffmpeg -i $video_input -vf "pad=width=iw:height=iw*${video_aspect_height}/${video_aspect_width}:y=(oh-ih)/2, scale=w=${video_width}:h=${video_height}, setdar=dar=${video_aspect}" -f yuv4mpegpipe - | x264_pes --demuxer y4m --level $video_level --nal-hrd cbr --vbv-bufsize 2000 --bitrate $video_bitrate_kbits --keyint 12 --vbv-init 0 -o ${video_output}.pes -
	    pesvideo2ts $video_ts_pid ${video_framerate}:${video_pcr_rate} b$video_bitrate_bits $video_ts_bitrate 0 ${video_output}.pes > ${video_output}.ts
	    ;;

	mpeg2video)
	    echo "MPEG-2 video"
	    TS_VIDEO_BITRATE_RATIO=1.15
	    video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
	    video_ts_bitrate=${video_ts_bitrate%.*}

	    ffmpeg -i $video_input -vf "pad=width=iw:height=iw*${video_aspect_height}/${video_aspect_width}:y=(oh-ih)/2, scale=w=${video_width}:h=${video_height}, setdar=dar=${video_aspect}" -c:v $video_codec -b:v $video_bitrate_bits -minrate $video_bitrate_bits -bufsize $video_vbv_size_bits -maxrate $video_bitrate_bits -an -aspect ${video_aspect} ${video_output}
	    esvideompeg2pes ${video_output} 1> ${video_output}.pes 2> ${video_output}.pes.length
	    pesvideo2ts $video_ts_pid ${video_framerate}:${video_pcr_rate} $video_vbv_size_units $video_ts_bitrate 0 ${video_output}.pes > ${video_output}.ts
	    ;;
    esac

fi


# if [ $to_file -eq 1 ]
# then
#     ts_mux_video=${ts_mux_video}"c:${video_ts_bitrate} ${video_output}.ts "
# else
ts_mux_video=${ts_mux_video}"b:${video_ts_bitrate} ${video_output}.ts "
# fi



# mpeg2 audio
let audio_index=$audio_index+1
audio_input=sintel.mp4
audio_channels=2
audio_samplerate=48000
audio_codec=mp2
audio_format=mp2
audio_bitrate=128000
audio_ts_pid=2065


case "$audio_codec" in
    mp2 )
	echo "mp2"
	audio_samples_per_frame=1152
	;;
    ac3 )
	echo "ac3"
	audio_samples_per_frame=1536
	;;
    aac )
	echo "ac3"
	audio_samples_per_frame=1024
	;;
esac
audio_frame_size=`echo ${audio_bitrate}*${audio_samples_per_frame}/${BITS_PER_BYTE}/${audio_samplerate}  | bc -l`
audio_frame_size_bytes=${audio_frame_size%.*}
audio_pts_offset=`echo ${TICKS_PER_SECOND}/${video_framerate} | bc -l`
audio_pts_offset=${audio_pts_offset%.*}

let ts_packets_per_frame=(${audio_frame_size_bytes}+${TS_PACKET_PAYLOAD}-1)/${TS_PACKET_PAYLOAD}
audio_ts_bitrate=`echo ${ts_packets_per_frame}*${TS_PACKET_LENGTH}*${BITS_PER_BYTE}*${audio_samplerate}/${audio_samples_per_frame} | bc -l`
audio_ts_bitrate=${audio_ts_bitrate%.*}

filename=$(basename $audio_input)
audio_output=${filename%.*}_${audio_index}.${audio_format}

if [ $encode -eq 1 ]
then

    ffmpeg -i $audio_input -vn -ac $audio_channels -codec:a $audio_codec -b:a $audio_bitrate -ar $audio_samplerate -f $audio_format ${audio_output}
    esaudio2pes ${audio_output} $audio_samples_per_frame $audio_samplerate $audio_frame_size_bytes -1 $audio_pts_offset > ${audio_output}.pes
    pesaudio2ts $audio_ts_pid $audio_samples_per_frame $audio_samplerate $audio_frame_size_bytes 0 ${audio_output}.pes > ${audio_output}.ts
fi


ts_mux_audio=${ts_mux_audio}"b:${audio_ts_bitrate} ${audio_output}.ts "


# h.264 hd video
let video_index=$video_index+1
video_input=bbb.mov
video_framerate=24
video_pcr_rate=38
#video_width=1280
video_width=720
#video_height=720
video_height=576
video_aspect=16/9
#video_codec=libx264
video_codec=mpeg2video
video_level=4.0
#video_format=h264
video_format=m2v
video_bitrate_bits=7200000
video_vbv_size_units=112
video_ts_pid=2067

let video_vbv_size_bits=${video_vbv_size_units}*16*1024
let video_bitrate_kbits=${video_bitrate_bits}/1000

video_aspect_width=${video_aspect%/*}
video_aspect_height=${video_aspect#*/}

video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
video_ts_bitrate=${video_ts_bitrate%.*}

filename=$(basename $video_input)
video_output=${filename%.*}_${video_index}.${video_format}

if [ $encode -eq 1 ]
then

    case "$video_codec" in
	libx264)
	    echo "H.264"
	    TS_VIDEO_BITRATE_RATIO=1.05
	    video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
	    video_ts_bitrate=${video_ts_bitrate%.*}

	    ffmpeg -i $video_input -vf "pad=width=iw:height=iw*${video_aspect_height}/${video_aspect_width}:y=(oh-ih)/2, scale=w=${video_width}:h=${video_height}, setdar=dar=${video_aspect}" -f yuv4mpegpipe - | x264_pes --demuxer y4m --level $video_level --nal-hrd cbr --vbv-bufsize 2000 --bitrate $video_bitrate_kbits --keyint 12 --vbv-init 0 -o ${video_output}.pes -
	    pesvideo2ts $video_ts_pid ${video_framerate}:${video_pcr_rate} b$video_bitrate_bits $video_ts_bitrate 0 ${video_output}.pes > ${video_output}.ts
	    ;;

	mpeg2video)
	    echo "MPEG-2 video"
	    TS_VIDEO_BITRATE_RATIO=1.15
	    video_ts_bitrate=`echo ${video_bitrate_bits}*${TS_VIDEO_BITRATE_RATIO} | bc -l`
	    video_ts_bitrate=${video_ts_bitrate%.*}

	    ffmpeg -i $video_input -vf "pad=width=iw:height=iw*${video_aspect_height}/${video_aspect_width}:y=(oh-ih)/2, scale=w=${video_width}:h=${video_height}, setdar=dar=${video_aspect}" -c:v $video_codec -b:v $video_bitrate_bits -minrate $video_bitrate_bits -bufsize $video_vbv_size_bits -maxrate $video_bitrate_bits -an -aspect ${video_aspect} ${video_output}
	    esvideompeg2pes ${video_output} 1> ${video_output}.pes 2> ${video_output}.pes.length
	    pesvideo2ts $video_ts_pid ${video_framerate}:${video_pcr_rate} $video_vbv_size_units $video_ts_bitrate 0 ${video_output}.pes > ${video_output}.ts
	    ;;
    esac

fi

if [ $to_file -eq 1 ]
then
    ts_mux_video=${ts_mux_video}"c:${video_ts_bitrate} ${video_output}.ts "
else
    ts_mux_video=${ts_mux_video}"b:${video_ts_bitrate} ${video_output}.ts "
fi


# mpeg2 audio
let audio_index=$audio_index+1
audio_input=bbb.mov
audio_channels=2
audio_samplerate=48000
audio_codec=mp2
audio_format=mp2
audio_bitrate=128000
audio_ts_pid=2068

case "$audio_codec" in
    mp2 )
	echo "mp2"
	audio_samples_per_frame=1152
	;;
    ac3 )
	echo "ac3"
	audio_samples_per_frame=1536
	;;
    aac )
	echo "ac3"
	audio_samples_per_frame=1024
	;;
esac
audio_frame_size=`echo ${audio_bitrate}*${audio_samples_per_frame}/${BITS_PER_BYTE}/${audio_samplerate}  | bc -l`
audio_frame_size_bytes=${audio_frame_size%.*}
audio_pts_offset=`echo ${TICKS_PER_SECOND}/${video_framerate} | bc -l`
audio_pts_offset=${audio_pts_offset%.*}

let ts_packets_per_frame=(${audio_frame_size_bytes}+${TS_PACKET_PAYLOAD}-1)/${TS_PACKET_PAYLOAD}
audio_ts_bitrate=`echo ${ts_packets_per_frame}*${TS_PACKET_LENGTH}*${BITS_PER_BYTE}*${audio_samplerate}/${audio_samples_per_frame} | bc -l`
audio_ts_bitrate=${audio_ts_bitrate%.*}

filename=$(basename $audio_input)
audio_output=${filename%.*}_${audio_index}.${audio_format}

if [ $encode -eq 1 ]
then

    ffmpeg -i $audio_input -vn -ac $audio_channels -codec:a $audio_codec -b:a $audio_bitrate -ar $audio_samplerate -f $audio_format ${audio_output}
    esaudio2pes ${audio_output} $audio_samples_per_frame $audio_samplerate $audio_frame_size_bytes -1 $audio_pts_offset > ${audio_output}.pes
    pesaudio2ts $audio_ts_pid $audio_samples_per_frame $audio_samplerate $audio_frame_size_bytes 0 ${audio_output}.pes > ${audio_output}.ts
fi

ts_mux_audio=${ts_mux_audio}"b:${audio_ts_bitrate} ${audio_output}.ts "

# mpeg2 sd video (anamorphic)
# ffmpeg -i big_buck_bunny_1080p_h264.mov -vf 'scale=w=720:h=576' -c:v mpeg2video -b:v 6M -minrate 6M -bufsize 1835008 -maxrate 6M -an -aspect 16:9 bbb_sd.m2v
# esvideompeg2pes bbb_sd.m2v 1> bbb_sd.m2v.pes 2> bbb_sd.m2v.pes.length
# pesvideo2ts 2067 24:38 112 5270000 0 bbb_sd.m2v.pes > bbb.m2v.ts

# mpeg2 audio

# ffmpeg -i big_buck_bunny_1080p_h264.mov -vn -ac 2 -codec:a mp2 -b:a 128000 -ar 48000 -f mp2 bbb.mp2
# esaudio2pes bbb.mp2 1152 48000 384 -1 3750 > bbb.mp2.pes
# pesaudio2ts 2068 1152 48000 384 0 bbb.mp2.pes > bbb.mp2.ts

# h264 hd video
#ffmpeg -i sintel-1280-surround.mp4 -vf 'pad=width=iw:height=720:y=(oh-ih)/2' -c:v libx264 -x264opts 'nal-hrd=cbr:vbv-bufsize=2000:vbv-maxrate=7200' -b:v 7.2M -minrate 7.2M  -an sintel_hd.h264
#ffmpeg -i sintel-1280-surround.mp4 -f yuv4mpegpipe - | x264_pes --y4m-input --level 4.0 --nal-hrd cbr --vbv-bufsize 2000 --bitrate 7200 --keyint 12 --vbv-init 0 -o sintel_hd.pes
#x264_pes --level 4.0 --nal-hrd cbr --vbv-bufsize 2000 --bitrate 7200 --keyint 12 --vbv-init 0 -o sintel_hd.pes sintel-1280-surround.mp4
# ffmpeg -i sintel-1280-surround.mp4 -vf 'pad=width=iw:height=720:y=(oh-ih)/2' -f yuv4mpegpipe - | x264_pes --demuxer y4m --level 4.0 --nal-hrd cbr --vbv-bufsize 2000 --bitrate 7200 --keyint 12 --vbv-init 0 -o sintel_hd_lb.pes -
# pesvideo2ts 2066 24:38 b7200000 7600000 0 sintel_hd_lb.pes > sintel_hd_lb.ts

# aac audio
#ffmpeg -i sintel-1280-surround.mp4 -vn -ac 2 -codec:a aac -strict -2 -b:a 128000 -ar 48000 sintel.aac
#esaudio2pes sintel.aac 1024 48000 1792 -1 3750 > sintel.aac.pes
#pesaudio2ts 2069 1024 48000 1792 0 sintel.aac.pes > sintel.aac.ts


# psi/si
./psi_si.py

dvb_ts_bitrate=19906000
frequency=810000
bandwidth_khz=8000
constellation=16
feq=2/3
guard_interval=1/4
transmission_mode=8
cell_id=0
gain=0

# mux to a file
if [ $to_file -eq 1 ]
then
    #tscbrmuxer c:5250000 sintel.m2v.ts b:188000 sintel.mp2.ts b:6300000 bbb.m2v.ts b:188000 bbb.mp2.ts b:3008 pat.ts b:3008 pmt1.ts b:3008 pmt2.ts b:1500 sdt.ts b:1400 nit.ts o:$dvb_ts_bitrate null.ts > muxed_$dvb_ts_bitrate.ts
    tscbrmuxer $ts_mux_video $ts_mux_audio b:3008 pat.ts b:3008 pmt1.ts b:3008 pmt2.ts b:1500 sdt.ts b:1400 nit.ts b:2000 ait.ts o:$dvb_ts_bitrate null.ts > muxed_$dvb_ts_bitrate.ts
    tsstamp muxed_${dvb_ts_bitrate}.ts ${dvb_ts_bitrate} > muxed_${dvb_ts_bitrate}_stamp.ts
fi

# send to RF
if [ $to_rf -eq 1 ]
then
    mkfifo fifomuxed.ts
    tscbrmuxer $ts_mux_video $ts_mux_audio b:3008 pat.ts b:3008 pmt1.ts b:3008 pmt2.ts b:1500 sdt.ts b:1400 nit.ts b:2000 ait.ts o:$dvb_ts_bitrate null.ts > fifomuxed.ts &

    mkfifo fifotdt.ts
    tstdt fifomuxed.ts > fifotdt.ts &

    mkfifo fifotsstamp.ts
    tsstamp fifotdt.ts $dvb_ts_bitrate > fifotsstamp.ts &

    tsrfsend fifotsstamp.ts 1 $frequency $bandwidth_khz $constellation $feq $guard_interval $transmission_mode $cell_id $gain
fi
