[MPlayer-cvslog] CVS: main/TOOLS psnr-video.sh, NONE, 1.1 README, 1.9, 1.10

Guillaume Poirier CVS syncmail at mplayerhq.hu
Mon Sep 12 18:36:01 CEST 2005


CVS change done by Guillaume Poirier CVS

Update of /cvsroot/mplayer/main/TOOLS
In directory mail:/var2/tmp/cvs-serv24706

Modified Files:
	README 
Added Files:
	psnr-video.sh 
Log Message:
Adds the script psnr-video.sh to calculate the PSNR between two existing video files.
Script by Matthias Wieser < mwieser AH gmx POUM de >
Original thread:
Date: Aug 25, 2005 1:54 PM
Subject: [MEncoder-users] [Script] PSNR between two video files


--- NEW FILE ---
#!/bin/sh
# Helper script to ease comparing two video files
# Copyleft 2001 by Matthias Wieser
# This file comes under GPL, see http://www.gnu.org/copyleft/gpl.html for more
# information on it's licensing.

TEMPDIR="/tmp/psnr_video"
WORKDIR=`pwd`/
if [ $# -le 1 ]; then
   echo
   echo "Usage: `basename $0` <file1> <file2> [<frames>] [<options1>] [<options2>]"
   echo
   echo " <file1> and <file2> are the video files for which the PSNR should be calculated."
   echo " [<frames>]          is the number of frames to process, starting from frame 1."
   echo " [<options1>]        are additional MPlayer options for <file1>"
   echo " [<options2>]        are additional MPlayer options for <file2>"
   echo
   echo " Be aware that `basename $0` needs a lot of temporal space inside /temp/."
   echo
   echo "Example:"
   echo "        ./`basename $0` ./orig.avi ./test.avi 250 \"\" \"-vf pp=ac\""
   echo

   exit 1
fi

FILE1=$1
FILE2=$2

LastFrame=-1
if [ $# -ge 3 ]; then
	LastFrame=$3
	echo
	echo "Will process $LastFrame frames"
fi

if [ $# -ge 4 ]; then
	FILE1Opts=$4
	echo "Mplayer options for ${FILE1}: $FILE1Opts"
fi

if [ $# -ge 5 ]; then
	FILE2Opts=$5
	echo "Mplayer options for ${FILE2}: $FILE2Opts"
fi

mkdir -p ${TEMPDIR}/FILE1
mkdir -p ${TEMPDIR}/FILE2

###  File 1
echo
echo "############## $FILE1 #################"

cd ${TEMPDIR}/FILE1

rm *ppm 2> /dev/null
rm *del 2> /dev/null

if [ $LastFrame -ge 0 ]; then
	mplayer $FILE1Opts -frames $LastFrame -nosound -vo pnm ${WORKDIR}$FILE1 >/dev/null
else
	mplayer $FILE1Opts -nosound -vo pnm ${WORKDIR}$FILE1 >/dev/null
fi
###  File 2

echo
echo "############## $FILE2 #################"

cd ${TEMPDIR}/FILE2

rm *ppm 2> /dev/null

if [ $LastFrame -ge 0 ]; then
	mplayer $FILE2Opts -frames $LastFrame -nosound -vo pnm ${WORKDIR}$FILE2 >/dev/null
else
	mplayer $FILE2Opts -nosound -vo pnm ${WORKDIR}$FILE2 >/dev/null
fi


###  PSNR

echo
echo "############## Calculation PSNR #################"

if [[ `ls -1 ${TEMPDIR}/FILE1/*ppm|wc -l` = `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` ]]
then
	echo 
else
	echo "Files have differing numbers of frames!"
	echo "$FILE1 has `ls -1 ${TEMPDIR}/FILE1/*ppm|wc -l` frames,"
	echo "$FILE2 has `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` frames."
	echo "Processing the first `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` frames."
	echo
fi


cd ${TEMPDIR}/FILE2
#rm ../psnr.dat
echo "File;Y;Cb;Cr" >../psnr.dat
echo "0" > errorsum.del
i=0
for FILE in `ls -1 *.ppm`
        do
        echo $FILE
                echo -n "$FILE">>../psnr.dat
                echo -n ";">>../psnr.dat
        pnmpsnr ../FILE1/$FILE $FILE 2> del.del
        grep "Y" del.del | dd bs=1c count=5 skip=29 of=del2.del 2>/dev/null
                Y=`cat del2.del`
               echo -n "$Y;">>../psnr.dat
        grep "Cb" del.del | dd bs=1c count=5 skip=29 of=del2.del 2>/dev/null
                CB=`cat del2.del`
               echo -n "$CB;">>../psnr.dat
        grep "Cr" del.del | dd bs=1c count=5 skip=29 of=del2.del 2>/dev/null
                CR=`cat del2.del`
               echo -n "$CR;">>../psnr.dat
         ALL=`echo "(-10)*l((e(-$Y/10*l(10))+e(-$CB/10*l(10))/4+e(-$CR/10*l(10))/4)/1.5)/l(10)"|bc -l`
         echo "$ALL">>../psnr.dat
        ERROR=`echo "scale=30; (e(-1*$Y/10*l(10))+e(-1*$CB/10*l(10))/4+e(-1*$CR/10*l(10))/4)/1.5"|bc -l`
        ERRORSUM=`cat errorsum.del`
        echo `echo "scale=30; $ERROR + $ERRORSUM"|bc -l` > errorsum.del
    i=$(($i+1))
	if [[ $i = $LastFrame ]]
	then
		break
	fi
done
ERRORSUM=`cat errorsum.del`
PSNR=`echo "-10*l($ERRORSUM/$i)/l(10)"|bc -l`
echo "PSNR:;$PSNR">>../psnr.dat
cd ..
mv psnr.dat ${WORKDIR}

if [[ `ls -1 ${TEMPDIR}/FILE1/*ppm|wc -l` = `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` ]]
then
        echo
else
        echo "Files have differing numbers of frames!"
        echo "$FILE1 has `ls -1 ${TEMPDIR}/FILE1/*ppm|wc -l` frames,"
        echo "$FILE2 has `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` frames."
        echo "Processed the first `ls -1 ${TEMPDIR}/FILE2/*ppm|wc -l` frames."
        echo
fi

cd ..
rm -r ${TEMPDIR}

echo "Created ${WORKDIR}psnr.dat"
echo


Index: README
===================================================================
RCS file: /cvsroot/mplayer/main/TOOLS/README,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- README	24 Aug 2005 00:24:11 -0000	1.9
+++ README	12 Sep 2005 16:35:58 -0000	1.10
@@ -254,6 +254,51 @@
               assumes that the frame numbers of both files fit.
 
 
+psnr-video.sh
+
+Author:       Matthias Wieser
+
+Description:  Calculates the PSNR between two existing video files.
+              The PSNR is calculated frame by frame.
+              Prints also the overall PSNR.
+              The script can be used to:
+               * compare different softwarescalers (should I use
+                 -sws 1 or -sws 2) ?
+               * compare different resolutions (is it better to scale
+                 down to 640x360 or to 560x320)
+               * compare different deinterlacers
+               * compare different video codecs
+               * compare video filters (is it better to use -vf hqdn3d
+                 or lavcopts:nr=400)
+               * [...]
+
+Usage:        psnr-video.sh <file1> <file2> [<frames>] [<options1>] [<options2>]
+
+              <file1> and <file2> are the video files for which the PSNR
+                should be calculated.
+              [<frames>] is the number of frames to process, starting
+                from frame 1.
+              [<options1>] are additional MPlayer options for <file1>
+              [<options2>] are additional MPlayer options for <file2>
+
+              A file called psnr.dat will be created with the following
+              content:
+
+              File;Y;Cb;Cr
+              00000001.ppm;34.23;39.54;40.06;35.426
+              00000002.ppm;33.03;38.71;39.26;34.271
+              00000003.ppm;33.45;38.91;39.28;34.655
+              00000004.ppm;32.72;38.69;38.85;33.972
+              [...]
+              00000247.ppm;35.55;40.84;42.15;36.785
+              PSNR:;35.9887
+
+Note:         This script relies on the the tool "pnmpsnr" for the
+              frame-by-frame PSNR calculation.
+              Be aware that psnr-video.sh needs a lot of temporal space
+              inside /temp/.
+
+
 asfinfo
 
 Author:       Arpi




More information about the MPlayer-cvslog mailing list