#!/bin/ksh
#--------------------------------------------------------------------------------#
# This file is part of the PALM model system.
#
# PALM is free software: you can redistribute it and/or modify it under the terms
# of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
#
# PALM is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# PALM. If not, see .
#
# Copyright 1997-2021 Leibniz Universitaet Hannover
#--------------------------------------------------------------------------------#
#
# Current revisions:
# -----------------
#
#
# Former revisions:
# -----------------
# $Id: process_dvr_output 4843 2021-01-15 15:22:11Z raasch $
# Corrected "Former revisions" section
#
# 2696 2017-12-14 17:12:51Z kanani
# Change in file header (GPL part)
#
# 1310 2014-03-14 08:01:56Z raasch
# update GPL copyright
#
# 1046 2012-11-09 14:38:45Z maronga
# code put under GPL (PALM 3.9)
#
# process_dvr_output - a script processing dvr steering + data files
# This script determines the number of streams opened by the dvr software
# and creates one single dvrs- and html-file which allow the dvr-plugin
# to display all streams in one sequence.
# Last changes:
# 16/03/09 - Siggi - Generating the first version
# Variable declarations + default values
camera=false
create_config_file=false
create_sequence_output=false
data_catalog=`pwd`
dvrp_output=rtsp
file_identifier=all_streams
groundplate=false
palm_run_identifier="unknown_run"
topography=false
typeset -i a acceleration=1 k i j nstream nscenes
# Read shellscript options
while getopts :a:cd:f:ls option
do
case $option in
(a) acceleration=$OPTARG;;
(c) create_config_file=true;;
(d) data_catalog=$OPTARG;;
(f) file_identifier=$OPTARG;;
(l) dvrp_output=local;;
(s) create_sequence_output=true;;
(\?) printf "\n +++ unknown option $OPTARG \n"
printf "\n allowed option are -d, -f, -l, -s \n"
exit;;
esac
done
# Create the config file for the streaming server; do nothing else
if [[ $create_config_file = true ]]
then
cp ${PALM_BIN}/.dvrserver.config .
# Entering the BASEDIR, UID and GID into this file
user_id=`id -u`
group_id=`id -g`
# data directory is always the current working directory
sed "s//./g" .dvrserver.config > .dvrserver.1
sed "s//$user_id/g" .dvrserver.1 > .dvrserver.2
sed "s//$group_id/g" .dvrserver.2 > .dvrserver.3
mv .dvrserver.3 .dvrserver.config
rm .dvrserver.1 .dvrserver.2
exit
fi
# Find out the PALM run identifier
if [[ -f CPU_MEASURES ]]
then
palm_run_identifier=`head -1 CPU_MEASURES`
fi
# Process the streaming server output
if [[ $dvrp_output = rtsp ]]
then
# Change to the given directory
cd $data_catalog
# Find out the number of streams
(( i = 0 ))
while true
do
(( i = i + 1 ))
if (( i < 10 ))
then
cstream=0$i
else
cstream=$i
fi
if [[ $(ls -1 *.* | grep -c $cstream) = 0 ]]
then
(( i = i - 1 ))
break
fi
# find out the stream name
streamname[$i]=`ls -1 ${cstream}_*-ge.dvrs | cut -f1 -d"-"`
# get addres
adr[$i]=`grep ADR= ${streamname[$i]}.dvrs | grep '*' | cut -f2 -d"="`
# get maxbytes
maxbytes[$i]=`head -1 ${streamname[$i]}.max`
# get number of frames
frames[$i]=`tail -1 ${streamname[$i]}.max`
done
nstream=$i
nscenes=$nstream
# Check, if there are files containing the camera data, the ground plate
# and topography data.
# Check the first stream only, because all streams have the same files.
if [[ -f ${streamname[1]}_camera.max ]]
then
camera=true
adr_camera=`grep ADR= ${streamname[1]}.dvrs | grep 'camera' | cut -f2 -d"="`
maxbytes_camera=`head -1 ${streamname[1]}_camera.max`
(( nscenes = nscenes + 1 ))
fi
if [[ -f ${streamname[1]}_groundplate.max ]]
then
groundplate=true
adr_groundplate=`echo $adr_camera | sed "s/camera/groundplate/g"`
maxbytes_groundplate=`head -1 ${streamname[1]}_groundplate.max`
(( nscenes = nscenes + 1 ))
fi
if [[ -f ${streamname[1]}_topography.max ]]
then
topography=true
adr_topography=`echo $adr_camera | sed "s/camera/topography/g"`
maxbytes_topography=`head -1 ${streamname[1]}_topography.max`
(( nscenes = nscenes + 1 ))
fi
# Start with writing the dvrs file for the combined streams
dvr_file=${file_identifier}_streaming.dvrs
echo "SCENES=$nscenes" > $dvr_file
# First, add the static scenes
if [[ $camera = true ]]
then
echo "MED=TCP" >> $dvr_file
echo "ADR=$adr_camera" >> $dvr_file
echo "MAXBYTES=$maxbytes_camera" >> $dvr_file
echo "FRAMES=1" >> $dvr_file
echo "FRAMES_P_SEC=0" >> $dvr_file
echo "SCENEEND" >> $dvr_file
fi
if [[ $groundplate = true ]]
then
echo "MED=TCP" >> $dvr_file
echo "ADR=$adr_groundplate" >> $dvr_file
echo "MAXBYTES=$maxbytes_groundplate" >> $dvr_file
echo "FRAMES=1" >> $dvr_file
echo "FRAMES_P_SEC=0" >> $dvr_file
echo "SCENEEND" >> $dvr_file
fi
if [[ $topography = true ]]
then
echo "MED=TCP" >> $dvr_file
echo "ADR=$adr_topography" >> $dvr_file
echo "MAXBYTES=$maxbytes_topography" >> $dvr_file
echo "FRAMES=1" >> $dvr_file
echo "FRAMES_P_SEC=0" >> $dvr_file
echo "SCENEEND" >> $dvr_file
fi
# Now add the streams
(( i = 0 ))
while (( i < nstream ))
do
(( i = i + 1 ))
echo "MED=TCP" >> $dvr_file
echo "ADR=${adr[$i]}" >> $dvr_file
echo "MAXBYTES=${maxbytes[$i]}" >> $dvr_file
echo "FRAMES=${frames[$i]}" >> $dvr_file
echo "FRAMES_P_SEC=25" >> $dvr_file
echo "SCENEEND" >> $dvr_file
done
# Change path to the current file identifier
# Remove path because BASEDIR of streaming server is set to "."
# sed "s/DATA_DVR/${file_identifier}_dvr/g" $dvr_file > tmp_file
sed "s/DATA_DVR\///g" $dvr_file > tmp_file
mv tmp_file $dvr_file
# If there is a dvr configuration file, set the BASEDIR to the parent
# directory of the above given path (i.e. ".")
if [[ -f .dvrserver.config ]]
then
old_path=`grep BASEDIR .dvrserver.config`
sed "s&${old_path}&BASEDIR=.&g" .dvrserver.config > .dvrserver.config.new
mv .dvrserver.config.new .dvrserver.config
fi
# Create the html file for the combined streames
cp 01_*-ge.html tmp.html
replace=$(echo `grep src= tmp.html`)
sed "s&${replace}&src=\"${file_identifier}_streaming.dvrs\"&g" tmp.html > tmp1.html
if [[ "$palm_run_identifier" = "" ]]
then
cp tmp1.html ${file_identifier}_streaming.html
else
sed "s&DATA_DVR/${streamname[1]}/\*\*\*\*\*.dvr (DVR 3D Streaming)&DVR 3D streaming generated by $palm_run_identifier&g" tmp1.html > ${file_identifier}_streaming.html
fi
rm tmp.html tmp1.html
# Informative messages
printf "\n\n *** processing dvr stream output:"
printf "\n number of detected streams = $nstream"
printf "\n stream names:"
(( i = 0 ))
while (( i < nstream ))
do
(( i = i + 1 ))
printf " ${streamname[$i]}"
done
printf "\n"
else
# This is the branch for local output (dvrp_output=local).
# Find out the number of streams.
(( i = 0 ))
while true
do
(( i = i + 1 ))
if (( i < 10 ))
then
cstream=0$i
else
cstream=$i
fi
if [[ $(ls -1 *.* | grep -c ${cstream}_) = 0 ]]
then
(( i = i - 1 ))
break
fi
# find out the stream name
streamname[$i]=`ls -1 ${cstream}_*.camera.dvr | cut -f1 -d"."`
done
# Exit, if there are no streams.
[[ $i = 0 ]] && exit
nstream=$i
mkdir -p ${data_catalog}/sequence_data
# First, merge static scenes into one file
if [[ -f ${streamname[1]}.camera.dvr ]]
then
cat ${streamname[1]}.camera.dvr >> ${data_catalog}/sequence_data/static_scenes.dvr
fi
if [[ -f ${streamname[1]}.groundplate.dvr ]]
then
cat ${streamname[1]}.groundplate.dvr >> ${data_catalog}/sequence_data/static_scenes.dvr
fi
if [[ -f ${streamname[1]}.topography.dvr ]]
then
cat ${streamname[1]}.topography.dvr >> ${data_catalog}/sequence_data/static_scenes.dvr
fi
# Find out the number of frames
frames[1]=`grep sequence ${streamname[1]}_00000.html | cut -f2 -d";" | cut -f1 -d'"' | cut -f2 -d"-"`
# Now, merge the data, frame by frame
(( j = 0 ))
while (( j < ${frames[1]} ))
do
nframe=`printf "%05d" $j`
(( i = 0 ))
while (( i < nstream ))
do
(( i = i + 1 ))
cat ${streamname[$i]}_$nframe.dvr >> ${data_catalog}/sequence_data/$nframe.dvr
done
(( j = j + 1 ))
done
# Create the html file to be used for the sequence mode
cp ${streamname[1]}_00000.html tmp1.html
sed "s&${streamname[1]}_camera.dvr&sequence_data/static_scenes.dvr&g" tmp1.html > tmp2.html
sed "s&${streamname[1]}_&sequence_data/&g" tmp2.html > tmp3.html
if [[ "$palm_run_identifier" = "" ]]
then
cp tmp3.html ${file_identifier}_sequence.html
else
sed "s&sequence_data/%05d.dvr (DVR 3D Sequence)&DVR 3D sequence generated by $palm_run_identifier&g" tmp3.html > ${file_identifier}_sequence.html
fi
rm tmp1.html tmp2.html tmp3.html
mv ${file_identifier}_sequence.html ${data_catalog}
# Informative messages
printf "\n\n *** processing dvr local output (using dvrp_output=local):"
printf "\n number of detected streams = $nstream"
printf "\n stream names:"
(( i = 0 ))
while (( i < nstream ))
do
(( i = i + 1 ))
printf " ${streamname[$i]}"
done
printf "\n"
fi
# Create output for viewing dvr data in sequence mode
if [[ $create_sequence_output = true ]]
then
rm -rf sequence_data
mkdir sequence_data
# First, merge static scenes into one file
if [[ $camera = true ]]
then
cat ${streamname[1]}/camera.dvr >> sequence_data/static_scenes.dvr
fi
if [[ $groundplate = true ]]
then
cat ${streamname[1]}/groundplate.dvr >> sequence_data/static_scenes.dvr
fi
if [[ $topography = true ]]
then
cat ${streamname[1]}/topography.dvr >> sequence_data/static_scenes.dvr
fi
# Now, merge the data, frame by frame
(( j = 0 ))
(( k = 0 ))
(( a = 0 ))
while (( j < ${frames[1]} ))
do
rframe=`printf "%05d" $j`
if (( a == 0 ))
then
wframe=`printf "%05d" $k`
(( k = k + 1 ))
(( i = 0 ))
while (( i < nstream ))
do
(( i = i + 1 ))
cat ${streamname[$i]}/$rframe.dvr >> sequence_data/$wframe.dvr
done
fi
(( a = a + 1 ))
if (( a == acceleration ))
then
(( a = 0 ))
fi
(( j = j + 1 ))
done
# Create the html file to be used for the sequence mode
cp ${streamname[1]}.html tmp1.html
sed "s/camera.dvr/static_scenes.dvr/g" tmp1.html > tmp2.html
sed "s&${streamname[1]}&sequence_data&g" tmp2.html > tmp3.html
sed "s/;0-0/;0-$wframe/g" tmp3.html > tmp4.html
if [[ "$palm_run_identifier" = "" ]]
then
cp tmp4.html ${file_identifier}_sequence.html
else
sed "s&DATA_DVR/sequence_data/\*\*\*\*\*.dvr (DVR 3D Sequence)&DVR 3D sequence generated by $palm_run_identifier&g" tmp4.html > ${file_identifier}_sequence.html
fi
rm tmp1.html tmp2.html tmp3.html tmp4.html
printf " data for using sequence mode generated"
fi
# Change back to directory from where script has been called
cd - > /dev/null 2>&1