#!/bin/bash
#Use this script to trim with frame accuracy a TS (h264-AAC)
#It re-encodes the video of first and last segment, and it parses audio (keeping the AV delay)
#
#Version: 1.0
#
#Usage:
# hlsframeaccuratetrim dest_file Tin Tout src_file1, src_file2, .... ,src_fileN
#
#Example:
# hlsframeaccuratetrim dest.mp4 3.1 4.2 src1.ts, src2.ts, src3.ts,src4.ts

#Get input params
#----------------------------
outMP4=$1
inpoint=$2
outdur=$3
for ((i=4; i<=$#; i++))
do
	echo "${!i}"
	tssegments[i-4]=${!i}
done

#Apply a correction of -5ms in order to adjust the input trim point (later will find the next PTS)
#----------------------------
inpoint=$(printf "%f\n" $(bc -q <<< scale=0\;${inpoint}-0.005))

#Show input params
#----------------------------
echo "out file: ${outMP4}"
echo "Trim points: in=${inpoint}, out=${outdur}"
echo "Input files: "
for var in ${tssegments[@]}; do echo $var; done
 
#Set intermediate files 
#----------------------------
outTSvideo=${outMP4}_video.ts
outTSaudio=${outMP4}_audio.ts
outTS=${outMP4}.ts
let i=0;
for var in ${tssegments[@]}; do tssegmentsoutvideo[i]=${var}_out_video.ts; let i++; done
let i=0;
for var in ${tssegments[@]}; do tssegmentsoutaudio[i]=${var}_out_audio.ts; let i++; done

#Clean before
#----------------------------
rm -f ${tssegmentsoutvideo[@]}
rm -f ${tssegmentsoutaudio[@]}
rm -f $outTS
rm -f $outMP4

#Trim FIRST segment (re-encode video & parse audio)
#----------------------------
#The tsaccuratetrim_rv_pa does some tasks in order to keep the AV aligment (at PTS level)
audiodelay=$(./tsaccuratetrim_rv_pa ${tssegments[0]} ${tssegmentsoutvideo[0]} ${tssegmentsoutaudio[0]} IN $inpoint)

#Rewrap middle TSs (in order to clean all streams except the main video & audio)
#----------------------------
#The rewrapping set the AV PTS to 0
for ((i=1; i<=${#tssegments[*]}-2; i++))
do
	./rewrapts ${tssegments[i]} ${tssegmentsoutvideo[i]} ${tssegmentsoutaudio[i]}
done

#Trim LAST segment (re-encode video & parse audio)
#----------------------------
#The acctrimts_rv_pa does some tasks in order to keep the AV aligment (at PTS level)
./tsaccuratetrim_rv_pa ${tssegments[${#tssegments[*]}-1]} ${tssegmentsoutvideo[${#tssegmentsout[*]}-1]} ${tssegmentsoutaudio[${#tssegmentsmp4[*]}-1]} DUR $outdur

#Join all segments
#----------------------------
./catts $outTSvideo ${tssegmentsoutvideo[@]}
./catts $outTSaudio ${tssegmentsoutaudio[@]}

#Create final MP4 (wrap)
#----------------------------
./rewraptomp4 $outTSvideo $outTSaudio $audiodelay $outMP4
