#!/bin/ksh
# process_dvr_output - a script processing dvr steering + data files
# $Id: process_dvr_output 261 2009-03-17 04:52:51Z raasch $

     # 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_sequence_output=false
 data_catalog=`pwd`
 file_identifier=all_streams
 groundplate=false
 topography=false

 typeset  -i  i j nstream nscenes


    # read shellscript options
 while  getopts  :d:f:s option
 do
   case  $option  in
       (d)   data_catalog=$OPTARG;;
       (f)   file_identifier=$OPTARG;;
       (s)   create_sequence_output=true;;
       (\?)  printf "\n  +++ unknown option $OPTARG \n"
             printf "\n      allowed option are -d and -f \n"
             exit;;
   esac
 done


    # 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
 sed  "s/DATA_DVR/${file_identifier}_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
 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 > ${file_identifier}_streaming.html
 rm tmp.html


    # informative messages
 printf "\n\n  *** processing local 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"


    # create output for viewing dvr data in sequence mode
 if [[ $create_sequence_output = true ]]
 then

    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 ))
    while (( j < ${frames[1]} ))
    do

       nframe=`printf "%05d" $j`

       (( i = 0 ))
       while (( i < nstream ))
       do
          (( i = i + 1 ))
          cat  ${streamname[$i]}/$nframe.dvr  >>  sequence_data/$nframe.dvr
       done

       (( 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  >  ${file_identifier}_sequence.html
    rm  tmp1.html  tmp2.html

    printf "      data for using sequence mode generated"

 fi



    # change back to directory from where script has been called
 cd - > /dev/null
