build the ppmy4m thingy
[maximus:mandulia.git] / mandulia.sh
1 #!/bin/bash
2 # ----------------------------------------------------------------------
3 date0=$(date --iso=s)
4 # ----------------------------------------------------------------------
5 if [[ "z${1}" != "z" ]]
6 then
7   quality="${1}"
8 else
9   quality="preview"
10 fi
11 # ----------------------------------------------------------------------
12 mv out out.$$
13 mkdir out
14 # ----------------------------------------------------------------------
15 (
16 # ----------------------------------------------------------------------
17   (
18 # ----------------------------------------------------------------------
19     case ${quality} in
20       (tiny)     o=1 ; d=16  ; f=15  ; f2=30  ;;
21       (preview)  o=1 ; d=32  ; f=30  ; f2=45  ;;
22       (medium)   o=2 ; d=64  ; f=60  ; f2=75  ;;
23       (high)     o=3 ; d=128 ; f=120 ; f2=150 ;;
24       (insane)   o=4 ; d=256 ; f=240 ; f2=300 ;;
25       (*)        echo "[mandulia] unknown quality" 1>&2 ; exit 1 ;;
26     esac
27 # ----------------------------------------------------------------------
28    f3=15
29     w=16
30     h=9
31     ms=4
32     ns=5
33     ds=5
34 # ----------------------------------------------------------------------
35     s=$(( ${o} * 64 ))
36     ppmwidth=$(( ${s} * ${w} ))
37     ppmheight=$(( ${s} * ${h} ))
38     mandulia="./mandulia ${f} ${s} ${s} ${w} ${h} ${d}"
39     #ppmtoy4m="ppmtoy4m -v 0 -S 444 -F 25:1"
40     ppmtoy4m="./ppmtoy4m_quickndirty ${ppmwidth} ${ppmheight}"
41     y4mscaler="y4mscaler -v 0 -I sar=1/1 -O preset=dvd_wide -O yscale=1/${o}"
42     y4mscaler1="y4mscaler -v 0 -I sar=1/1 -O preset=dvd_wide -O yscale=1/1"
43     mpeg2enc="mpeg2enc -v 0 -f 8 -q 8 -b 8000 -B 768 -D 10 -g 15 -G 15 -P -R 2 -o out/temp.m2v"
44     mplex="mplex -v 0 -f 8 -V -o out/temp.mpeg out/temp.m2v"
45     spumux="spumux -v 0 mandulia.xml"
46 # ----------------------------------------------------------------------
47     echo "[mandulia] tools" 1>&2
48     make 1>&2
49 # ----------------------------------------------------------------------
50     echo "[mandulia] audio" 1>&2
51     for fff in ${f} ${f2} ${f3}
52     do
53       head -c $(( ${fff} * 2 * 2 * 48000 / 25 )) < /dev/zero |
54       twolame --quiet -b 192 -r -s 48000 -N 2 - "out/${fff}.mp2"
55     done
56 # ----------------------------------------------------------------------
57     count=$(( ${ms} * ${ns} * ${ds} ))
58     echo '<!-- generated file: do not edit -->'
59     echo '<!-- generated by manulia.sh starting at '"${date0}"' -->'
60     echo '<!-- g1 = play intro ; g2 = randomize ; g3 = direction -->'
61     echo '<dvdauthor jumppad="no"><vmgm><fpc>{'
62     echo '  g1 = 1; g2 = 1; g3 = 0; jump titleset 1 menu entry root;'
63     echo '}</fpc></vmgm>'
64     echo '<titleset><!-- titleset 1 -->'
65     echo '<menus>'
66     for m in 0 1 2 3
67     do
68       x=$(( (${m} - 2) * ${f} ))
69       for n in 0 1 2 3 4
70       do
71         y=$(( (${n} - 2) * ${f} ))
72         for dir in 0 1 2 3 4
73         do
74           case ${dir} in
75             (0)  dx=0  ; dy=0  ;;
76             (1)  dx=1  ; dy=0  ;;
77             (2)  dx=0  ; dy=1  ;;
78             (3)  dx=-1 ; dy=0  ;;
79             (4)  dx=0  ; dy=-1 ;;
80           esac
81           m1=$(( ${m} + ${dx} ))
82           n1=$(( ${n} + ${dy} ))
83           menu=$(( ( ${m} * ${ns} + ${n} ) * ${ds} + ${dir} + 1))
84           echo "[mandulia] ${menu} / ${count}" 1>&2
85           if [[ ${m1} != -1 && ${m1} != ${ms} \
86              && ${n1} != -1 && ${n1} != ${ns} ]]
87           then
88 # ----------------------------------------------------------------------
89             stem="${m}_${n}_${dir}_${m1}_${n1}"
90             ${mandulia} ${x} ${y} ${dx} ${dy} |
91             ${ppmtoy4m} |
92             ${y4mscaler} |
93             ${mpeg2enc}
94             ${mplex} "out/${f}.mp2"
95             ${spumux} < "out/temp.mpeg" > "out/${stem}.mpeg"
96 # ----------------------------------------------------------------------
97             echo '<pgc pause="0"><!-- menu '"${menu}"' -->'
98             echo '<pre>{ if (g2 eq 1) { g3 = random(4); } }</pre>'
99             echo '<vob file="'"${stem}.mpeg"'" />'
100             echo '<button name="pressed">{ g2 = 1 - g2; }</button>'
101             echo '<button name="north"  >{ g3 = 2; }</button>'
102             echo '<button name="south"  >{ g3 = 4; }</button>'
103             echo '<button name="east"   >{ g3 = 1; }</button>'
104             echo '<button name="west"   >{ g3 = 3; }</button>'
105             echo '<post>{'
106             t=$(( (${m1}*${ns}+${n1})*${ds} + 1 ))
107             if [[ $(( ${m1} + 1 )) != ${ms} ]]
108             then
109               echo "  if (g3 eq 1) jump menu $(( ${t} + 1 )); else"
110             fi
111             if [[ $(( ${n1} + 1 )) != ${ns} ]]
112             then
113               echo "  if (g3 eq 2) jump menu $(( ${t} + 2 )); else"
114             fi
115             if [[ $(( ${m1} - 1 )) != -1 ]]
116             then
117               echo "  if (g3 eq 3) jump menu $(( ${t} + 3 )); else"
118             fi
119             if [[ $(( ${n1} - 1 )) != -1 ]]
120             then
121               echo "  if (g3 eq 4) jump menu $(( ${t} + 4 )); else"
122             fi
123             echo "  jump menu $(( ${t} ));"
124             echo '}</post>'
125             echo '</pgc><!-- menu '"${menu}"' -->'
126 # ----------------------------------------------------------------------
127           else
128 # ----------------------------------------------------------------------
129             echo '<pgc pause="0"><!-- menu '"${menu}"' -->'
130             echo '<pre>{ jump menu entry root; }</pre>'
131             echo '<vob file="blank.mpeg" />'
132             echo '</pgc><!-- menu '"${menu}"' -->'
133 # ----------------------------------------------------------------------
134           fi
135         done
136       done
137     done
138 # ----------------------------------------------------------------------
139     menu0=$(( (2*${ns}+2)*${ds}+0+1 ))
140     echo '<pgc pause="0" entry="root"><!-- menu root -->'
141     echo '<pre>{'
142     echo '  if (g1 eq 1) { jump title 1; } else { jump menu '"${menu0}"'; }'
143     echo '}</pre>'
144     echo '<vob file="blank.mpeg" />'
145     echo '</pgc><!-- menu root -->'
146 # ----------------------------------------------------------------------
147     echo "[mandulia] blank" 1>&2
148     i=0
149     while [[ ${i} != ${f3} ]]
150     do
151       i=$(( ${i} + 1 ))
152       echo -e "P6\n1024 576 255"
153       head -c $(( 1024 * 576 * 3 )) < /dev/zero
154     done |
155     ${ppmtoy4m} |
156     ${y4mscaler1} |
157     ${mpeg2enc}
158     ${mplex} "out/${f3}.mp2"
159     ${spumux} < "out/temp.mpeg" > "out/blank.mpeg"
160     echo '</menus><titles>'
161 # ----------------------------------------------------------------------
162     echo "[mandulia] intro" 1>&2
163     i=0
164     dd=1
165     while [[ ${i} != ${f2} ]]
166     do
167       i=$(( ${i} + 1 ))
168       ./mandulia 1 ${s} ${s} ${w} ${h} ${dd} 0 0 0 0
169       if [[ ${dd} != ${d} ]]
170       then
171         dd=$(( ${dd} + 1 ))
172       fi
173     done |
174     ${ppmtoy4m} |
175     ${y4mscaler} |
176     ${mpeg2enc}
177     ${mplex} "out/${f2}.mp2"
178     mv "out/temp.mpeg" "out/intro.mpeg"
179     echo '<pgc><!-- title 1 -->'
180     echo '<pre>{ g1 = 0; }</pre>'
181     echo '<vob file="intro.mpeg" />'
182     echo '<post>{ call menu entry root; }</post>'
183     echo '</pgc><!-- title 1 -->'
184     echo '</titles>'
185     echo '</titleset><!-- titleset 1 -->'
186     echo '</dvdauthor>'
187     echo '<!-- generated by manulia.sh finished at '"$(date --iso=s)"' -->'
188 # ----------------------------------------------------------------------
189   ) > "out/dvd.xml"
190 # ----------------------------------------------------------------------
191   cd out
192   mkdir dvd
193   dvdauthor -o dvd -x dvd.xml
194   cd dvd
195   name="Mandulia$(date +%Y%m%d)"
196   genisoimage -o "../${name}.iso" -quiet -dvd-video \
197     -publisher "http://claudiusmaximus.goto10.org" \
198     -p "${USER}@${HOSTNAME}" -V "${name}" .
199   cd ../..
200   if [[ -s "out/${name}.iso" ]]
201   then
202     echo -n "[mandulia] output file: "
203     ls -1sh "out/${name}.iso"
204   else
205     echo "[mandulia] ERROR: output iso is missing or empty"
206     echo "[mandulia] inspect log: 'out/mandulia.log'"
207   fi
208   date1=$(date --iso=s)
209 # ----------------------------------------------------------------------
210   echo '[mandulia] started  at: '"${date0}"
211   echo '[mandulia] finished at: '"${date1}"
212 # ----------------------------------------------------------------------
213 ) 2>&1 | tee out/mandulia.log | grep --color=never '^\[mandulia\]'
214 # ----------------------------------------------------------------------
215 # EOF