| #!/bin/bash | 
 | # | 
 | # Usage: | 
 | #   lanczos_downcompup_sr.sh [<Options>] | 
 | #                            <input_y4m> | 
 | #                            <num_frames> | 
 | #                            <horz_resampling_config> | 
 | #                            <vert_resampling_config> | 
 | #                            <cq_level>[:<cpu_used>] | 
 | #                            <downcompup_y4m> | 
 | #                            <downcompupsr_y4m> | 
 | #                            [[<down_y4m>]:[<downcomp_bit>]:[<downcomp_y4m]] | 
 | # | 
 | #   Notes: | 
 | #       <Options> are optional switches similar to what is used by | 
 | #           lanczos_resample_y4m utility | 
 | #       <y4m_input> is input y4m video | 
 | #       <num_frames> is number of frames to process | 
 | #       <horz_resampling_config> and <vert_resampling_config> are in format: | 
 | #               <p>:<q>:<Lanczos_a_str>[:<x0>] | 
 | #           similar to what is used by lanczos_resample_y4m utility, with the | 
 | #           enhancement that for <Lanczos_a_str> optionally | 
 | #           two '^'-separated strings for 'a' could be provided instead | 
 | #           of one for down and up-sampling operations respectively if different. | 
 | #           Note each string separated by '^' could have two values for luma | 
 | #           and chroma separated by ','. | 
 | #           So <Lanczos_a_str> could be of the form: | 
 | #               <a_luma_down>,<a_chroma_down>^<a_luma_up>,<a_chroma_up> | 
 | #             if down and up operations use different parameters, or | 
 | #               <a_luma_down>,<a_chroma_down> | 
 | #             if down and up operations use the same parameters. | 
 | #       <cq_level>[:<cpu_used>] provides the cq_level parameter of | 
 | #           compression along with an optional cpu_used parameter. | 
 | #       <downcompup_y4m> is the output y4m video after upscaling. | 
 | #       <downcompupsr_y4m> is the output y4m video after super-resolution. | 
 | #       The last param [[<down_y4m>]:[<downcomp_bit>]:[<downcomp_y4m]] | 
 | #           provides names of intermediate files where: | 
 | #               <down_y4m> is the resampled source | 
 | #               <downcomp_bit> is the compressed resampled bitstream | 
 | #               <downcomp_y4m> is the reconstructed bitstream. | 
 | #           This parameter string is entirely optional. | 
 | #           Besides if provided, each of <down_y4m>, <downcomp_bit> and | 
 | #           <downcomp_y4m> are optional by themselves where each can be | 
 | #           either provided or empty. If empty the corresponding | 
 | #           intermediate file is deleted. | 
 | # | 
 |  | 
 | set -e | 
 |  | 
 | tmpdir="/tmp" | 
 | AOMENC="${tmpdir}/aomenc_$$" | 
 | AOMDEC="${tmpdir}/aomdec_$$" | 
 | RESAMPLE="${tmpdir}/lanczos_resample_y4m_$$" | 
 | SUPERRES="${tmpdir}/cnn_restore_y4m_$$" | 
 | cp ./aomenc $AOMENC | 
 | cp ./aomdec $AOMDEC | 
 | cp ./lanczos_resample_y4m $RESAMPLE | 
 | cp ./cnn_restore_y4m $SUPERRES | 
 |  | 
 | trap 'echo "Exiting..."; rm -f ${AOMENC} ${AOMDEC} ${RESAMPLE} ${SUPERRES}' EXIT | 
 |  | 
 | extra="" | 
 |  | 
 | opts=0 | 
 | options="" | 
 | while [[ "${@:$((opts+1)):1}" == -* ]]; do | 
 |   options="$options ${@:$((opts+1)):1}" | 
 |   ((opts=opts+1)) | 
 | done | 
 | if [[ $# -lt "((opts+7))" ]]; then | 
 |   echo "Too few parameters $(($#-opts))" | 
 |   exit 1; | 
 | fi | 
 |  | 
 | input_y4m=${@:$((opts+1)):1} | 
 | nframes=${@:$((opts+2)):1} | 
 | hdconfig=${@:$((opts+3)):1} | 
 | vdconfig=${@:$((opts+4)):1} | 
 | codecparams=${@:$((opts+5)):1} | 
 | downcompup_y4m=${@:$((opts+6)):1} | 
 | downcompupsr_y4m=${@:$((opts+7)):1} | 
 | intfiles=${@:$((opts+8)):1} | 
 |  | 
 | #Get codec params cq_level and cpu_used | 
 | OIFS="$IFS"; IFS=':' codecparams_arr=($codecparams); IFS="$OIFS" | 
 | cq_level=${codecparams_arr[0]} | 
 | cpu_used=${codecparams_arr[1]} | 
 | if [[ -z ${cpu_used} ]]; then | 
 |   cpu_used="0" | 
 | fi | 
 | echo "cq_level: ${cq_level}" | 
 | echo "cpu_used: ${cpu_used}" | 
 |  | 
 | #Get width and height | 
 | hdr=$(head -1 $input_y4m) | 
 | twidth=$(awk -F ' ' '{ print $2 }' <<< "${hdr}") | 
 | theight=$(awk -F ' ' '{ print $3 }' <<< "${hdr}") | 
 | width=${twidth:1} | 
 | height=${theight:1} | 
 |  | 
 | #Parse the intermediate files parameter | 
 | OIFS="$IFS"; IFS=':' intfiles_arr=($intfiles); IFS="$OIFS" | 
 | down_y4m=${intfiles_arr[0]} | 
 | downcomp_bit=${intfiles_arr[1]} | 
 | downcomp_y4m=${intfiles_arr[2]} | 
 | if [[ -z ${down_y4m} ]]; then | 
 |   down_y4m=${tmpdir}/down_$$.y4m | 
 | fi | 
 | if [[ -z ${downcomp_bit} ]]; then | 
 |   downcomp_bit=${tmpdir}/downcomp_$$.bit | 
 | fi | 
 | if [[ -z ${downcomp_y4m} ]]; then | 
 |   downcomp_y4m=${tmpdir}/downcomp_$$.y4m | 
 | fi | 
 |  | 
 | #Obtain the horizontal and vertical upsampling configs | 
 | hdconfig_arr=(${hdconfig//:/ }) | 
 | haparams=${hdconfig_arr[2]} | 
 | OIFS="$IFS"; IFS='^' haparams_arr=($haparams); IFS="$OIFS" | 
 | hdconfig="${hdconfig_arr[0]}:${hdconfig_arr[1]}:${haparams_arr[0]}" | 
 | srhconfig="${hdconfig_arr[1]}:${hdconfig_arr[0]}" | 
 | if [[ -z ${haparams_arr[1]} ]]; then | 
 |   huconfig="${hdconfig_arr[1]}:${hdconfig_arr[0]}:${haparams_arr[0]}" | 
 | else | 
 |   huconfig="${hdconfig_arr[1]}:${hdconfig_arr[0]}:${haparams_arr[1]}" | 
 | fi | 
 | if [[ -n ${hdconfig_arr[3]} ]]; then | 
 |   hdconfig="${hdconfig}:${hdconfig_arr[3]}" | 
 |   huconfig="${huconfig}:i${hdconfig_arr[3]//,/,i}" | 
 | fi | 
 | if [[ -n ${hdconfig_arr[4]} ]]; then | 
 |   hdconfig="${hdconfig}:${hdconfig_arr[4]}" | 
 |   huconfig="${huconfig}:${hdconfig_arr[4]}" | 
 | fi | 
 |  | 
 | vdconfig_arr=(${vdconfig//:/ }) | 
 | vaparams=${vdconfig_arr[2]} | 
 | OIFS="$IFS"; IFS='^' vaparams_arr=($vaparams); IFS="$OIFS" | 
 | vdconfig="${vdconfig_arr[0]}:${vdconfig_arr[1]}:${vaparams_arr[0]}" | 
 | srvconfig="${vdconfig_arr[1]}:${vdconfig_arr[0]}" | 
 | if [[ -z ${vaparams_arr[1]} ]]; then | 
 |   vuconfig="${vdconfig_arr[1]}:${vdconfig_arr[0]}:${vaparams_arr[0]}" | 
 | else | 
 |   vuconfig="${vdconfig_arr[1]}:${vdconfig_arr[0]}:${vaparams_arr[1]}" | 
 | fi | 
 | if [[ -n ${vdconfig_arr[3]} ]]; then | 
 |   vdconfig="${vdconfig}:${vdconfig_arr[3]}" | 
 |   vuconfig="${vuconfig}:i${vdconfig_arr[3]//,/,i}" | 
 | fi | 
 | if [[ -n ${vdconfig_arr[4]} ]]; then | 
 |   vdconfig="${vdconfig}:${vdconfig_arr[4]}" | 
 |   vuconfig="${vuconfig}:${vdconfig_arr[4]}" | 
 | fi | 
 |  | 
 | #Downsample | 
 | $RESAMPLE $options $input_y4m $nframes $hdconfig $vdconfig $down_y4m | 
 |  | 
 | #Compress | 
 | $AOMENC -o $downcomp_bit $down_y4m \ | 
 |         --codec=av1 --good --threads=0 --passes=1 --lag-in-frames=19 \ | 
 |         --kf-max-dist=65 --kf-min-dist=0 --test-decode=warn -v --psnr \ | 
 |         --end-usage=q \ | 
 |         --cq-level=${cq_level} \ | 
 |         --cpu-used=${cpu_used} \ | 
 |         --limit=${nframes} \ | 
 |         ${extra} | 
 | $AOMDEC --progress -S --codec=av1 -o $downcomp_y4m $downcomp_bit | 
 |  | 
 | #Upsample | 
 | $RESAMPLE $options $downcomp_y4m $nframes $huconfig $vuconfig $downcompup_y4m \ | 
 |           ${width}x${height} | 
 |  | 
 | #Super-resolution | 
 | $SUPERRES $downcompup_y4m $nframes $srhconfig $downcompupsr_y4m | 
 |  | 
 | #Compute metrics | 
 | #tiny_ssim_highbd $input_y4m $downcompup_y4m | 
 | #tiny_ssim_highbd $input_y4m $downcompupsr_y4m | 
 |  | 
 | if [[ -z ${intfiles_arr[0]} ]]; then | 
 |   rm $down_y4m | 
 | fi | 
 | if [[ -z ${intfiles_arr[1]} ]]; then | 
 |   rm $downcomp_bit | 
 | fi | 
 | if [[ -z ${intfiles_arr[2]} ]]; then | 
 |   rm $downcomp_y4m | 
 | fi |