diff options
Diffstat (limited to 'abs/core/test-pattern')
-rw-r--r-- | abs/core/test-pattern/PKGBUILD | 16 | ||||
-rwxr-xr-x | abs/core/test-pattern/test_pattern.bash | 326 |
2 files changed, 342 insertions, 0 deletions
diff --git a/abs/core/test-pattern/PKGBUILD b/abs/core/test-pattern/PKGBUILD new file mode 100644 index 0000000..7ac825b --- /dev/null +++ b/abs/core/test-pattern/PKGBUILD @@ -0,0 +1,16 @@ +pkgname=test-pattern +pkgver=1.0 +pkgrel=6 +arch=('i686') +pkgdesc="script to create test pattern videos" +depends=(imagemagick) +license=('GPL') +source=(test_pattern.bash) + +build() { + cd $startdir/src +# mkdir $startdir/pkg/usr/bin/ + install -m755 -D test_pattern.bash $startdir/pkg/usr/bin/test_pattern.bash +} + +md5sums=('3a427a5dee0763c6b0a5938fedbde883') diff --git a/abs/core/test-pattern/test_pattern.bash b/abs/core/test-pattern/test_pattern.bash new file mode 100755 index 0000000..d220fb0 --- /dev/null +++ b/abs/core/test-pattern/test_pattern.bash @@ -0,0 +1,326 @@ +#!/bin/bash + +# Set default options to be overriden by command line arguments. + +w=400 +h=325 +rate=50 +TEMPDIR= +unset remove_tempdir +interlaced= +aspect_ratio= +bitrate= + +while getopts ":w:h:t:r:ia:b:" opt; do + case $opt in + w) + w=$OPTARG + ;; + h) + h=$OPTARG + ;; + t) + TEMPDIR=$OPTARG + ;; + r) + rate=$OPTARG + ;; + i) + interlaced=TRUE + ;; + a) + aspect_ratio=$OPTARG + ;; + b) + bitrate=$OPTARG + ;; + \?) + echo -n "\ +Error: Invalid option -$OPTARG + +Usage: + test_pattern.bash [options] + -w width + The width in pixels. + -h height + The height in pixels. + -t tempdir + Temporary directory for intermediate files. If no directory is specified, one is created and deleted at the end of processing. + -r fieldrate + -i + Generate an interlaced test pattern + -a n:m + Aspect ratio of generated video. + -b bitrate + Bitrate used for encoding. + +Example: +test_pattern.bash -w 1440 -h 1080 -t temp -r 50 -i -a 16:9 -b 12000k +" + exit 1 + esac +done + +if [ -z "$aspect_ratio" ] ; then + aspect_ratio="${w}:${h}" +fi + +aspectx=$(echo $aspect_ratio | cut -d: -f1) +aspecty=$(echo $aspect_ratio | cut -d: -f2) + +# Calculate some dimensions based on the requested size. + +barw=$((w/32)) +barstep=$((w/90)) +barstart=$((-barw/barstep-1)) + +frames=$((w/2)) + +unity=$((h*2/27)) +unitx=$((unity*aspecty*w/(aspectx*h))) +gridlw=$((unity*3/43)) + +echo unity=$unity +echo unitx=$unitx + +nvgrid=$(((h-gridlw)/unity)) +nhgrid=$(((((w-gridlw)/unitx)-1)/2*2+1)) + +gridstartx=$((w/2-(nhgrid*unitx+gridlw)/2-1)) +gridstarty=$((h/2-(nvgrid*unity+gridlw)/2-1)) + +echo nvgrid=$nvgrid +echo nhgrid=$nhgrid +echo gridstartx=$gridstartx +echo gridstarty=$gridstarty + +echo parsed tempdir $TEMPDIR + +if [ -z "$TEMPDIR" ] ; then + TEMPDIR=$(mktemp -d --tmpdir=/tmp) + remove_tempdir=1 +else + if [ ! -d "$TEMPDIR" ] ; then + mkdir $TEMPDIR + fi +fi + +echo parsed tempdir $TEMPDIR $remove_tempdir + +unset checker +checker=( -fill "rgb(192,192,192)" ) +for ((g=-9;g<=7;g=g+2)) ; do + checker=( "${checker[@]}" + -draw + "rectangle $((w/2+g*unitx*7/10)),$((gridstarty+unity*3+gridlw)) $((w/2+(g+1)*unitx*7/10)),$((gridstarty+unity*4+gridlw))" ) +done + +checker=( "${checker[@]}" -fill black ) +for ((g=-8;g<=8;g=g+2)) ; do + checker=( "${checker[@]}" + -draw + "rectangle $((w/2+g*unitx*7/10)),$((gridstarty+unity*3+gridlw)) $((w/2+(g+1)*unitx*7/10)),$((gridstarty+unity*4+gridlw))" ) +done + +unset stripe +stripe=( -fill white ) + +for ((g=0;g<5;g++)) ; do + startx=$((w/2+(3-g*2)*unitx)) + endx=$((startx+2*unitx)) + + for ((x=startx;x<endx;x=x+2*(g+1))) ; do + stripe=( "${stripe[@]}" + -draw + "rectangle $x,$((gridstarty+unity*7+gridlw)) $((x+g)),$((gridstarty+unity*9+gridlw))" ) + done +done + +for ((g=0;g<13;g++)) ; do + stripe=( "${stripe[@]}" + -draw + "rectangle $((gridstartx+(nhgrid/2-6+g)*unitx)),$((gridstarty+unity*6+gridlw)) $((gridstartx+(nhgrid/2-6+g)*unitx+gridlw)),$((gridstarty+unity*7+gridlw-1))" ) +done + +convert -size ${w}x${h} xc:white \ + -fill "rgb(204,204,0)" \ + -draw "rectangle $((w/2-6*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2-4*unitx)),$((gridstarty+unity*6+gridlw))" \ + -draw "rectangle $((w/2-6*unitx)),$((gridstarty+unity*11+gridlw)) $((w/2+6*unitx)),$((gridstarty+unity*13+gridlw))" \ + -fill "rgb(0,204,204)" \ + -draw "rectangle $((w/2-4*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2-2*unitx)),$((gridstarty+unity*6+gridlw))" \ + -fill "rgb(0,204,0)" \ + -draw "rectangle $((w/2-2*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2-0*unitx)),$((gridstarty+unity*6+gridlw))" \ + -fill "rgb(204,0,204)" \ + -draw "rectangle $((w/2-0*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2+2*unitx)),$((gridstarty+unity*6+gridlw))" \ + -fill "rgb(204,0,0)" \ + -draw "rectangle $((w/2+2*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2+4*unitx)),$((gridstarty+unity*6+gridlw))" \ + -draw "rectangle $((w/2-unitx/2)),$((gridstarty+unity*11+gridlw)) $((w/2+unitx/2)),$((gridstarty+unity*13+gridlw))" \ + -fill "rgb(0,0,204)" \ + -draw "rectangle $((w/2+4*unitx)),$((gridstarty+unity*4+gridlw)) $((w/2+6*unitx)),$((gridstarty+unity*6+gridlw))" \ +\ + -fill black \ + -draw "rectangle $((w/2-6*unitx)),$((gridstarty+unity*6+gridlw)) $((w/2+6*unitx)),$((gridstarty+unity*9+gridlw))" \ + "${stripe[@]}" \ + -fill black \ + -draw "rectangle $((w/2-(unitx-gridlw)/2)),$((gridstarty+unity*5+gridlw)) $((w/2+(unitx-gridlw)/2-1)),$((gridstarty+unity*8+gridlw))" \ + -fill white \ + -draw "rectangle $((w/2-6*unitx)),$((h/2-gridlw/2)) $((w/2+6*unitx)),$((h/2-gridlw/2+gridlw))" \ + -draw "rectangle $((w/2-gridlw/2)),$((gridstarty+unity*5+gridlw)) $((w/2-gridlw/2+gridlw)),$((gridstarty+unity*8+gridlw))" \ +\ + -fill "rgb(0,0,0)" \ + -draw "rectangle $((w/2-6*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2-4*unitx)),$((gridstarty+unity*10+gridlw))" \ + -fill "rgb(51,51,51)" \ + -draw "rectangle $((w/2-4*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2-2*unitx)),$((gridstarty+unity*10+gridlw))" \ + -fill "rgb(102,102,102)" \ + -draw "rectangle $((w/2-2*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2-0*unitx)),$((gridstarty+unity*10+gridlw))" \ + -fill "rgb(153,153,153)" \ + -draw "rectangle $((w/2-0*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2+2*unitx)),$((gridstarty+unity*10+gridlw))" \ + -fill "rgb(204,204,204)" \ + -draw "rectangle $((w/2+2*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2+4*unitx)),$((gridstarty+unity*10+gridlw))" \ + -fill "rgb(255,255,255)" \ + -draw "rectangle $((w/2+4*unitx)),$((gridstarty+unity*9+gridlw)) $((w/2+6*unitx)),$((gridstarty+unity*10+gridlw))" \ +\ + -fill black \ + -draw "rectangle $((w/2-2*unitx)),$((gridstarty+unity*1+gridlw)) $((w/2+2*unitx)),$((gridstarty+unity*2+gridlw))" \ + -draw "rectangle $((w/2-6*unitx)),$((gridstarty+unity*2+gridlw)) $((w/2-3*unitx)),$((gridstarty+unity*3+gridlw))" \ + -draw "rectangle $((w/2+6*unitx)),$((gridstarty+unity*2+gridlw)) $((w/2+3*unitx)),$((gridstarty+unity*3+gridlw))" \ + -draw "rectangle $((gridstartx+(nhgrid/2-2)*unitx)),$((gridstarty+unity*2+gridlw)) $((gridstartx+(nhgrid/2-2)*unitx+gridlw)),$((gridstarty+unity*3+gridlw))" \ + -draw "rectangle $((w/2-3*unitx+1)),$((gridstarty+unity*10+gridlw)) $((w/2+3*unitx)),$((gridstarty+unity*11+gridlw))" \ + -fill white \ + -draw "rectangle $((gridstartx+(nhgrid/2-2)*unitx)),$((gridstarty+unity*10+gridlw)) $((gridstartx+(nhgrid/2-2)*unitx+gridlw)),$((gridstarty+unity*11+gridlw))" \ + "${checker[@]}" \ + ${TEMPDIR}/centre.png + +convert -size ${w}x${h} xc:black \ + -fill white \ + -draw "ellipse $((w/2)),$((h/2)) $((6*unitx)),$((6*unity)) 0,360" \ + ${TEMPDIR}/circle.png + +unset drawgrid +drawgrid=( -fill white ) +for ((g=0;g<=$nhgrid;g++)) ; do + drawgrid=( "${drawgrid[@]}" + -draw + "rectangle $((gridstartx+g*unitx)),0 $((gridstartx+g*unitx+gridlw)),$h" ) +done + +for ((g=0;g<=$nvgrid;g++)) ; do + drawgrid=( "${drawgrid[@]}" + -draw + "rectangle 0,$((gridstarty+g*unity)) $w,$((gridstarty+g*unity+gridlw))" ) +done + +drawgrid=( "${drawgrid[@]}" + -draw "rectangle 0,0 $gridstartx,$h" + -draw "rectangle 0,0 $w,$gridstarty" + -draw "rectangle $w,$h $((gridstartx+nhgrid*unitx)),0" + -draw "rectangle $w,$h 0,$((gridstarty+nvgrid*unity))" + -fill black +) + +for ((g=0;g<=$nhgrid;g=g+2)) ; do + drawgrid=( "${drawgrid[@]}" + -draw + "rectangle $((gridstartx+g*unitx+gridlw+1)),0 $((gridstartx+(g+1)*unitx)),$((gridstarty-1))" + -draw + "rectangle $((gridstartx+g*unitx+gridlw+1)),$((gridstarty+nvgrid*unity+gridlw+1)) $((gridstartx+(g+1)*unitx)),$h" + ) +done + +for ((g=0;g<=$nvgrid;g=g+2)) ; do + drawgrid=( "${drawgrid[@]}" + -draw + "rectangle 0,$((gridstarty+g*unity+gridlw+1)) $((gridstartx-1)),$((gridstarty+(g+1)*unity-1))" + -draw + "rectangle $((gridstartx+nhgrid*unitx+gridlw+1)),$((gridstarty+g*unity+gridlw+1)) $w,$((gridstarty+(g+1)*unity-1))" + ) +done + +diagonals=( + -fill white + -linewidth 10 + -fill white + -draw "line 0,0 $((w/2)),$((h-1))" + -draw "line 0,0 $((w-1)),$((h/2))" + -draw "line 0,$((h-1)) $((w/2)),0" + -draw "line 0,$((h-1)) $((w-1)),$((h/2))" + -draw "line $((w-1)),0 $((w/2)),$((h-1))" + -draw "line $((w-1)),0 0,$((h/2))" + -draw "line $((w-1)),$((h-1)) $((w/2)),0" + -draw "line $((w-1)),$((h-1)) 0,$((h/2))" ) + +convert -size ${w}x${h} xc:grey50 \ + "${diagonals[@]}" \ + "${drawgrid[@]}" \ + -fill "rgb(51,153,102)" \ + -draw "rectangle $((gridstartx+(nhgrid/2-7)*unitx+gridlw+1)),$((gridstarty+unity+gridlw+1)) $((gridstartx+(nhgrid/2-6)*unitx-1)),$((h/2))" \ + -fill "rgb(204,102,102)" \ + -draw "rectangle $((gridstartx+(nhgrid/2-7)*unitx+gridlw+1)),$((h/2)) $((gridstartx+(nhgrid/2-6)*unitx-1)),$((gridstarty+unity*12-1))" \ + -fill "rgb(102,102,255)" \ + -draw "rectangle $((gridstartx+(nhgrid/2-6)*unitx)),$((gridstarty+unity+gridlw+1)) $((gridstartx+(nhgrid/2-5)*unitx-1)),$((gridstarty+unity*3-1))" \ + -fill "rgb(153,102,0)" \ + -draw "rectangle $((gridstartx+(nhgrid/2-6)*unitx)),$((gridstarty+10*unity+gridlw+1)) $((gridstartx+(nhgrid/2-5)*unitx-1)),$((gridstarty+unity*12-1))" \ + -fill "rgb(128,128,0)" \ + -draw "rectangle $((gridstartx+(nhgrid/2+7)*unitx+gridlw+1)),$((gridstarty+unity+gridlw+1)) $((gridstartx+(nhgrid/2+8)*unitx-1)),$((h/2))" \ + -fill "rgb(102,102,255)" \ + -draw "rectangle $((gridstartx+(nhgrid/2+7)*unitx+gridlw+1)),$((h/2)) $((gridstartx+(nhgrid/2+8)*unitx-1)),$((gridstarty+unity*12-1))" \ + -fill "rgb(102,102,255)" \ + -draw "rectangle $((gridstartx+(nhgrid/2+6)*unitx+gridlw+1)),$((gridstarty+unity+gridlw+1)) $((gridstartx+(nhgrid/2+7)*unitx+gridlw)),$((gridstarty+unity*3-1))" \ + -fill "rgb(153,102,0)" \ + -draw "rectangle $((gridstartx+(nhgrid/2+6)*unitx+gridlw+1)),$((gridstarty+10*unity+gridlw+1)) $((gridstartx+(nhgrid/2+7)*unitx+gridlw)),$((gridstarty+unity*12-1))" \ + ${TEMPDIR}/grid.png + +convert -size ${w}x${h} ${TEMPDIR}/grid.png ${TEMPDIR}/centre.png ${TEMPDIR}/circle.png -composite ${TEMPDIR}/background.png + +if [ -n "$interlaced" ] ; then + interlaced_frame=0 + convert -size 1x${h} -tile-offset +0+1 pattern:gray50 \ + -scale ${w}x${h}\! ${TEMPDIR}/interlace.png +fi + +for ((i=0; i < $frames; i++)) ; do + + prev_image_name=$image_name + image_name=${TEMPDIR}/test$(printf "%03d" $i).png + echo creating image $image_name + + convert -size ${w}x${h} ${TEMPDIR}/background.png \ + -fill black \ + -draw "rectangle $(((barstart+i)*barstep)),0 $(((barstart+i)*barstep+barw)),${h}" \ + -font Arial-Black-Regular \ + -pointsize $unity \ + -fill white \ + -stroke black -strokewidth 5 -annotate +$((w-2*i))+$((gridstartx+11*unity)) 'Judder Test' \ + -stroke none -annotate +$((w-2*i))+$((gridstartx+11*unity)) 'Judder Test' \ + -depth 8 \ + ${image_name} + + if [ -n "$interlaced" ] ; then + interlaced_frame=$((interlaced_frame + 1)) + + if [ $interlaced_frame = 2 ] ; then + echo interlacing $((i-1)) and $i + interlaced_frame=0 + convert -size ${w}x${h} -depth 8 $prev_image_name $image_name ${TEMPDIR}/interlace.png -composite ${TEMPDIR}/interlaced$(printf "%03d" $((i/2))).png + fi + fi +done + +bitrate_flags= +if [ -n "$bitrate" ] ; then + bitrate_flags="-b $bitrate" +fi + +if [ -n "$interlaced" ] ; then + ffmpeg -r ${rate} -i ${TEMPDIR}/interlaced%03d.png -r ${rate} \ + -vcodec mpeg2video -flags +ilme+ildct -aspect $aspect_ratio \ + ${bitrate_flags} -y test.mpg +else + ffmpeg -r ${rate} -i ${TEMPDIR}/test%03d.png -r ${rate} \ + -vcodec mpeg2video -aspect $aspect_ratio \ + ${bitrate_flags} -y test.mpg +fi + +if [ -n "$remove_tempdir" ] ; then + rm -Rf $TEMPDIR +fi |