Encoding from command line

From Alessandro's Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

elwood _musicali # for a in ls ./*.* ; do ffmpeg -y -i "$a" -acodec mp3 -f flv /scratch/`echo "$a"|sed -e s@' '@'_'@g`; done

Quick commands to Encode/Decode Multimedia files

http://www.ffmpeg.org/libavfilter.html

DVD

Rip DVD to DivX

  1. count dvd titles, this example is using 8 of them:
  2. audio:
mencoder dvd://1 -ovc frameno -o frameno.avi -oac mp3lame -lameopts vbr=3 -alang es -chapter 1-8
  1. video.
  2. last command output will suggest a vbitrate=xxx value:
mencoder dvd://1 -ovc lavc -lavcopts vcodec=mpeg4:vhq:v4mv:vbitrate=1000:vpass=1 -oac copy -o movie.avi -chapter 1-8
mencoder dvd://1 -ovc lavc -lavcopts vcodec=mpeg4:vhq:v4mv:vbitrate=1000:vpass=2 -oac copy -o movie.avi -chapter 1-8
  1. divx will be movie.avi.

Rip DVD generic

modo I

mencoder /dev/dvd-hdd -o CINEMA_STRANGE.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4

modo II ~15 Min.

mencoder dvd://1 -ovc frameno -o frameno.avi -oac mp3lame -lameopts vbr=3 -alang es -chapter 1-8

~100 Min.

mencoder dvd://1  -ovc lavc -lavcopts vcodec=mpeg4:vhq:v4mv:vbitrate=1130:vpass=1 -oac copy -o movie.avi -chapter 1-8 
mencoder dvd://1  -ovc lavc -lavcopts vcodec=mpeg4:vhq:v4mv:vbitrate=1130:vpass=2 -oac copy -o movie.avi -chapter 1-8 

DVD 4:3

mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=dvd -vf scale=720:576 \
-srate 48000 -af lavcresample=48000 -lavcopts vcodec=mpeg2video -ofps 25 \
-o /fileout.mpg /filein.avi

PAL Widescreen

mencoder -of mpeg -mpegopts format=dvd:vaspect=16/9:vframerate=25 -srate 48000 \
-ofps 25 -ovc lavc -oac lavc -lavcopts \
codec=mpeg2video:vrc_buf_size=1835:keyint=15:vrc_maxrate=9800:vbitrate=4900:aspect=16/9:acodec=ac3:abitrate=192 \
-o /fileout.mpeg2  /filein.mpg

PAL Fullscreen

mencoder -of mpeg -mpegopts format=dvd:vaspect=4/3:vframerate=25 -srate 48000 \
-ofps 25 -ovc lavc -oac lavc -lavcopts \
codec=mpeg2video:vrc_buf_size=1835:keyint=15:vrc_maxrate=9800:vbitrate=4900:aspect=4/3:acodec=ac3:abitrate=192 \
-o /fileout.mpeg2  /filein.mpg

Encode DVD title #2, only selected chapters:

mencoder dvd://2 -chapter 10-15 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4

Encode DVD title #2, resizing to 640x480:

mencoder dvd://2 -vf scale=640:480 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4

Encode DVD title #2, resizing to 512xHHH (keep aspect ratio):

mencoder dvd://2 -vf scale -zoom -xy 512 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4

The same, but with bitrate set to 1800kbit and optimized macroblocks:

mencoder dvd://2 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4:mbd=1:vbitrate=1800

The same, but with MJPEG compression:

mencoder dvd://2 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mjpeg:mbd=1:vbitrate=1800
ffmpeg -i  inputfile.mov  -acodec mp2 -ar 44100 -ac 2 -ab 112000 -vcodec mjpeg -qscale 2  output.mpg

Filters

  • to add filters to ffmpeg or mencoder, use the option -vf

Scale

  • with mencoder
mencoder video.mpg -oav copy -ovc copy -vf scale=120:100 -o scaled.mpg
  • with ffmpeg
ffmpeg -i <file> -vf scale=<x>:<y> <file-cropped>
  1. x and y are pixel values
  2. If value is 0, the input size is used
  3. If value is -1, maintains the aspect ratio
    this can brake the process having the proportional side size not divisible by 2 (x264 codecs)
  4. default is 0.
"not divisible by 2" (x264 issue)
  • trying to upscale a video from 854x480 [PAR 1:1 DAR 427:240] to -vf scale=-1:720 , got this message:

width or height not divisible by 2 (1281x720)

  • I'm running periodically a script encoding clips for a video server, using multiple formats for every clip and scaling them respectively to x:360 , x:480 , x:720 , the common " -vf scale:-1:360 " gives "not divisible by 2" error for some input/output sizes, the solution has been found with a formula:


 scale=ceil(a*480)+mod(ceil(a*480)\,2):480


  • in words: scale the height is proportionally to the new width plus the rest of the division by two of the proportional size. That means that, for example we take a 480 x 352 video and we scale it to 360, the new width (without my formula) would have been 491 (giving the codec an error) the formula divides it by 2 and ad adds the rest ( 1 ) to the output width.


  • these are the calculations I've made to reach the solution:
 a = 320 / 240 = 1,3333 
 scale=ceil(a*XXX):XXX

 1080 * 1,3333 = 1439,8   ceil = 1440
 720 * 1,3333  = 959,9999 ceil = 960
 480 * 1,3333  = 639,9    ceil = 640 
 360 * 1,3333  = 479,9    ceil = 480    


 a = 352 / 288 = 1,2222 
 scale=ceil(a*XXX):XXX

 1080 * 1,2222 = 1,319    ceil = 1320
 720 * 1,2222  = 879,9999 ceil = 880
 480 * 1,2222  = 586,6    ceil = 587   ERR
 360 * 1,2222  = 439,9    ceil = 440    

 a = 480 / 352 = 1,3636
 scale=ceil(a*XXX):XXX

 1080 * 1,3636 = 1472,6  ceil = 1473   ERR
 720 * 1,3636  = 981,7   ceil = 982
 480 * 1,3636  = 654,5   ceil = 655    ERR
 360 * 1,3636  = 490,8   ceil = 491    ERR

 a = 480 / 264 = 1,8181
 scale=ceil(a*XXX):XXX

 1080 * 1,8181 = 1963,5  ceil = 1964  
 720 * 1,8181  = 1309,03 ceil = 1310
 480 * 1,8181  = 872,6   ceil = 873    ERR
 360 * 1,8181  = 654,51  ceil = 655    ERR


 # final expression:
 scale=ceil(a*480)+mod(ceil(a*480)\,2):480

Crop

mplayer -vf crop=470:350:5:100 "$fileee"
  • tagliare un video dal secondo minuto (120) fino a 20 secondi dopo
mencoder  -ss 120 -endpos 20 video.avi -o video_tagliato.avi -ovc lavc

Tagliare solo i primi 30 min (1800 sec.)

mencoder -endpos 1800 rec-CUATRO-20070213-01:30.avi -o /mirror160/_video/__Temp/rec-CUATRO-20070213-01:30_tagliato.avi -ovc copy -oac copy

Television/Camera

Registrare dal DVB (Digital Video Broadcasting)

  • Satellite o digitale terrestre.
mencoder dvb://CUATRO  -ovc copy -oac copy -o Film.avi

MPEG PES...

mplayer -vo mpegpes -ao mpegpes -vop lavc=5000:25,expand=688:576:-1:-1:1,scale=688:563 \
 -cache 8192 -slave -nolirc  -subpos 80 -sub-bg-color 0 -sub-bg-alpha 255 -quiet

Guardo la webcam con mplayer

  • v4l2
mplayer -cache 128 -tv driver=v4l2:width=800:height=480:outfmt=i420:device=/dev/video0 -vo xv tv://
  • v4l
mplayer tv:// -tv driver=v4l:width=640:height=480:outfmt=rgb24:device=/dev/video0:noaudio -flip

recording webcam (old Video4Linux 1) with mencoder...

  • good quality
mencoder tv:// -tv driver=v4l:width=640:height=480:outfmt=rgb24:device=/dev/video0:noaudio -flip \
-o camed.avi -ovc lavc
  • or less
mencoder  tv:// -tv driver=v4l:width=320:height=240:fps=15:outfmt=rgb24:device=/dev/video0:alsa:forceaudio \
-flip -ofps 11.44 -ovc lavc -lavcopts vcodec=rv10 -oac pcm -noskip -o prova.avi

Images...

extract a frame in JPEG

  • 1° frame
ffmpeg -i <file sorgente> -ss 00:00:00 -t 0.04 -f mjpeg <outputfile.jpg>

Generate gif89a (-gif animation) mplayer from a video

mplayer mov03331.mpg -loop 0 -vo gif89a:fps=15.0:output=caffe1.gif

create a video from image

ffmpeg -loop_input -vframes <number_of_frames> -i <input_image> <output_video>


ffmpeg -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4

Network

Save a stream

mplayer http://mplayer.hq/example.avi -dumpstream -dumpfile dumpato.avi

Grabando ,cortando y comprimiendo un stream de tv3

mplayer "mms://directe.3alacarta.tvcatalunya.com/reflector:60738?aifp=fhgt&WMCache=0" -dumpstream -dumpfile dumpato.avi
mencoder  -ss 826.5  dumpato.avi -o dumpato_tagliato.avi -ovc copy -oac copy

mencoder  -endpos 108  dumpato_tagliato.avi -o dumpato_montato.avi
mencoder  dumpato_montato.avi -o dumpato_copresv.avi  -oac copy  -ovc lavc -of mpeg -lavcopts vcodec=mpeg2video -ofps 1

Fare il dumpo di un stream (TV da internet per esempio) in XVID

mencoder mms://sream
-ovc xvid  -xvidencopts bitrate=1150 -vf scale=640:480 -oac mp3lame -o fileout.avi

...In DV

mencoder timegousbyconloli.avi -ovc libdv -vf scale=720:576 -oac pcm -o timegousbyconlolippp.avi

Ascoltare l'audio di mplayer in un host remoto: Vedi ESOUND

  • faccio partire il server audio di rete su elwood:
[xunil@elwood ~]$ esd -tcp -port 9876 -public &
[1] 3849
- accepting connections on port 9876
  • Apro il video (uno stream in questo caso) specificando host e porta del server audio
[xunil@zombie ~]$ mplayer -ao esd:elwood:9876 mms://rntlivewm.rai.it/_rn24_live_
  • così vedo il vido su zombie e sento l'audio su elwood, cioè vedo dalla cucina e sento dalla camera da letto, non proprio comodo:
  • allora trorno in camera, da elwood, e faccio:
[xunil@elwood ~]$ ssh -X zombie mplayer -ao esd:elwood:9876 mms://rntlivewm.rai.it/_rn24_live_
  • adesso la situazione è strana, una persona normale, sana non noterebbe differenza tra "fare doppio click" sul video o

Mandare l'audio su un altro host (elwood)

mplayer -ao esd:elwood:9876  r24-24luglio.avi



Motion JPEG audio PCM

il "2> /dev/null" serve per 'buttare' lo standard error, nel caso qualcosa non funzioni, rimuoverlo dal comando.

mencoder video.avi -oac pcm -ovc lavc -lavcopts vcodec=mjpeg -o MJPEG_video.avi 2> /dev/null

Motion PNG (MPNG)

mencoder mf://*.png -mf w=800:h=600:fps=25:type=png -ovc copy -oac copy -o output.avi

Motion TGA (MTGA)

mencoder mf://*.tga -mf w=800:h=600:fps=25:type=tga -ovc copy -oac copy -o output.avi



WebM

  • /usr/share/ffmpeg/libvpx-720p.ffpreset
 vcodec=libvpx
 g=120
 rc_lookahead=16
 level=216
 profile=0
 qmax=42
 qmin=10
 vb=2M
  • ignored unless using -pass 2
 maxrate=24M
 minrate=100k


ffmpeg -i input.mp4 -s 1280x720 -vpre libvpx-720p -b 3900k -pass 1 -an -f webm -y output.webm
ffmpeg -i input.mp4 -s 1280x720 -vpre libvpx-720p -b 3900k -pass 2 -acodec libvorbis -ab 128k -f webm -y output.webm


ffmpeg -pass 1 -passlogfile pr7.webm -qmin 5 -qmax 51 -i master/879.m2t -vcodec libvpx -b:v 104800 -s 320x200 -an -f webm -y NUL
ffmpeg -pass 2 -passlogfile pr7.webm -qmin 5 -qmax 51 -i master/879.m2t -vcodec libvpx -b:v 104800 -s 320x200 -acodec libvorbis -ac 1 -b:a 64k -y  video/pr7.webm
ffmpeg  -i master/743.MTS -s 360x240  -vpre libvpx-360p -pass 1 -passlogfile  log743_7.webm -qmin 5 -qmax 51  -b:v 500k -an -f webm -y video/743_7.webm
ffmpeg  -i master/743.MTS -s 360x240  -vpre libvpx-360p -pass 1 -passlogfile  log743_7.webm -qmin 5 -qmax 51  -b:v 500k -acodec libvorbis -ac 1 -b:a 96k -f webm -y video/743_7.webm

Theora

Convert TO theora

  • Examples: (from ffmpeg2theora help)
ffmpeg2theora videoclip.avi (will write output to videoclip.ogv)
ffmpeg2theora videoclip.avi --subtitles subtitles.srt (same, with subtitles)
cat something.dv | ffmpeg2theora -f dv -o output.ogv -
  • Encode a series of images:
ffmpeg2theora frame%06d.png -o output.ogv
  • Live streaming from V4L Device:
ffmpeg2theora /dev/video0 -f video4linux --inputfps 15 -x 160 -y 128 -o - \
| oggfwd icast2server 8000 password /theora.ogv
  • Live encoding from a DV camcorder (needs a fast machine):
dvgrab - | ffmpeg2theora -f dv -x 352 -y 288 -o output.ogv -
  • Live encoding and streaming to icecast server:
 dvgrab --format raw - \
  | ffmpeg2theora -f dv -x 160 -y 128 -o /dev/stdout - \
  | oggfwd icast2server 8000 password /theora.ogv


Informazioni mandando in Play da MPLAYER

Eseguendo il comando che segue , le opzioni '-v -identify' ci posso dare delle informazioni molto utili del video che mandiamo in PLAY:

 mplayer -v -identify -aspect 4:3 /root/Desktop/Prova03.avi  

EXAMPLES OF MENCODER USAGE (from ~$ man mencoder)

  • Encode all *.jpg files in the current directory:
mencoder "mf://*.jpg" -mf fps=25 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4
  • Encode from a tuner (specify a format with -vf format):
mencoder -tv driver=v4l:width=640:height=480 tv:// -o tv.avi -ovc rawnuv

MPEG2 M2S MPEGII

http://www.mplayerhq.hu/DOCS/HTML/en/index.html http://forum.doom9.org/archive/index.php/t-110761.html

  • mencoder

OPZIONI DEMUXER/FLUSSO (STREAM)

-pvr <opzione1:opzione2:...> (solo PVR)
Questa  opzione  imposta varie proprietà di codifica per il modulo di cattura PVR.  Deve essere usata con schede di codifica MPEG via hardware supp-
portate dal driver V4L2.  Le schede Hauppauge WinTV PVR-150/250/350/500 e tutte quelle basate su IVTV sono conosciute come schede  di  cattura  PVR.
Attenzione che solamente il kernel Linux 2.6.18 o maggiore è capace di gestire il flusso MPEG attraverso lo strato V4L2.  Per la cattura hardware di
un flusso MPEG e la visione attraverso MPlayer/MEncoder, usa ’pvr://’ come URL del filmato.
fmt=<valore>
 Seleziona un formato MPEG per la codifica:
  ps:    MPEG-2 Program Stream (default)
  ts:    MPEG-2 Transport Stream
  mpeg1: MPEG-1 System Stream
  vcd:   flusso compatibile Video CD
  svcd:  flusso compatibile Super Video CD
  dvd:   flusso compatibile DVD

TS (Transport Stream)

mencoder -of lavf -lavfopts format=mpegts \
-lavcopts vcodec=mpeg2video:acodec=mp2:abitrate=224:vbitrate=3200 -o test2_mpegts_1109.m2t \
-ovc lavc -oac lavc /export/data/mediaroot/video/mid/1109.mp4

PES (Packetized Elementary Stream)

DV

From Mpeg DVD (vob)

ffmpeg -i /mnt/win/linux/dvd_da_convertire/kidd-pivot-01.MPG -target dv /media/LACIE/temp/kidd-pivot-01.dv

3pg Mobile Phones

  • Nokia XpressMusic, display:320x240

mpeg4 libamr_nb

ffmpeg -i "$video" -s 320x240 -r 14.99 -vcodec mpeg4 -ac 1 -ar 8000 -acodec libamr_nb -b 80k -ab 10.2k -y $out

mpeg4 libamr_wb (va a scatti l'audio)

ffmpeg -i "$video" -s 320x240 -r 14.99 -vcodec mpeg4 -ac 1 -ar 8000 -acodec libamr_nb -b 224k -ab 12.2k 

mpeg4 libamr_wb (va a scatti l'audio)

ffmpeg -i "$video" -s 320x240 -r 14.99 -vcodec mpeg4 -ac 1 -ar 16000 -acodec libamr_wb -b 100k -ab 18.25k -y  
ffmpeg -i "$video" -s 320x240 -r 14.99 -vcodec mpeg4 -ac 1 -ar 16000 -acodec libamr_wb -b 80k -ab 12.65k -y 

h263p mp3 (non letto da cell Nokia per via dell'audio mp3)

ffmpeg -i "$video" -s qcif    -r 20    -vcodec h263p -acodec mp3 -ar 22050 -b 128k -ab 32k -y $out

H.264 (x264)

http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-x264.html

http://en.wikipedia.org/wiki/X264

http://en.wikipedia.org/wiki/H.264

Very high quality

subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid:weight_b	6fps	0dB

High quality

subq=5:8x8dct:frameref=2:bframes=3:b_pyramid:weight_b	13fps	-0.89dB

Fast

subq=4:bframes=2:b_pyramid:weight_b	17fps	-1.48dB
mencoder -v -o video.264
level_idc=41:bframes=3:frameref=2:nopsnr:nossim:pass=1:threads=auto
mencoder $ifile -of avi -vf scale=352:288 -ovc x264 \
-x264encopts bitrate=1000:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid:weight_b:threads=auto \
-o Desktop/test2641.avi

mencoder $ifile -of avi -ovc x264 -x264encopts bitrate=3000:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid:weight_b:threads=auto \
-o Desktop/test2641.avi
mencoder $ifile -of avi -ovc x264 \
-x264encopts bitrate=500:subq=5:8x8dct:frameref=2:bframes=3:b_pyramid:weight_b:threads=auto \
-o Desktop/test2641.avi

AVID

ffmpeg -i ../hi/1906.dv -vcodec libx264 -b 4096000 -t 10 -subq 6 -acodec libfaac -ar 48000 -ab 128000 -ac 2 -f mp4  1906_ffmpeg_Afaac_Vx264.mp4
ffmpeg -i ../hi/1906.dv -vcodec libx264 -b 4096000 -t 10 -subq 6 -acodec libfaac -ac 2 -f mp4  1906_ffmpeg_Afaac_Vx264.mp4

Working with PIPEs

  • esempio da omf file di avid
mkfifo videopipe

Aprire nuova shell:

cat videopipe | ffmpeg -i - -target dv output.dv

Toranre alla vecchia shell:

mencoder <filevideo.omf> -ovc copy -oac pcm -o videopipe

Quando i due hanno terminato il play e l'encoding:

unlink videopipe 
  • reccare e encodare DV
dvgrab --autosplit --format raw -|ffmpeg -f dv -i - -target vcd f.mpg
  • Encode from a pipe:
rar p test-SVCD.rar | mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800 -ofps 24 -

Flash FLV

encode in flv (avi to flv) (mpg to flv) ffmpeg

ffmpeg -y -i dumpato2.avi -acodec mp3 -f flv dumpato2.flv
video_directory/ # for clip in ls ./*.* ; do ffmpeg -y -i "$clip" -acodec mp3 -f flv /scratch/`echo "$clip"|sed -e s@' '@'_'@g`; done

mp3

all aiff in a directory to mp3

for file in *.aiff ; do ffmpeg -i "$file" -f mp3 -ab 320000 -ar 48000 "$file.mp3" ; done
rename .aiff.mp3 .mp3 *.aiff.mp3

Problem -> Solution

Encoding

  • convertendo in x264 con RedHat 5.2 il video in uscita risulta corrotto
    • is the x264 library that updatig casuses the problem



bit rate

  • values can be specified using 1M or 1024K or 1 048 576
    • -b 1024K
    • -minrate 800K
    • -maxrate 1400K
    • -bufsize 120K

Troubleshooting

cannot open shared object file: No such file or directory

ldd `which ffmpeg`
       libavdevice.so.52 => not found
       libavfilter.so.1 => not found
       libavformat.so.52 => not found
       libavcodec.so.52 => not found
       libswscale.so.0 => not found
       libavcore.so.0 => not found
       libavutil.so.50 => not found
       libm.so.6 => /lib/libm.so.6 (0x006c3000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x007e9000)
       libc.so.6 => /lib/libc.so.6 (0x00575000)
       /lib/ld-linux.so.2 (0x00557000)
find /usr/local/lib/ | grep -E "libavdevice.so.52|libavfilter.so.1|libavcodec.so.52|libavcore.so.0"
lddconfig

FFmpeg Math expresisons

  • very powerful "under the hood" part of this software:


from ffmpeg documentation

  • item E, PI, PHI
    • the corresponding mathematical approximated values for e (euler number), pi (greek PI), phi (golden ratio)
  • in_w, in_h the input width and heigth
  • iw, ih same as @var{in_w} and @var{in_h}
  • out_w, out_h the output (cropped) width and heigth
    • ow, oh same as @var{out_w} and @var{out_h}
  • a input display aspect ratio, same as @var{iw} / @var{ih}
  • hsub, vsub horizontal and vertical chroma subsample values.
    • For example for the pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
  • If the input image format is different from the format requested by the next filter,
    • the scale filter will convert the input to the ratio of the input image.
  • default value of @var{width} and @var{height} is 0.
  • 'Some examples follow:
  • scale the input to 2x
scale=2*iw:2*ih

same as

scale=2*in_w:2*in_h
  • scale the input to half size
scale=iw/2:ih/2
  • increase the width, and set the height to the same size
scale=3/2*iw:ow
  • seek for Greek harmony
scale=iw:1/PHI*iw
scale=ih*PHI:ih

  • increase the height, and set the width to 3/2 of the height
scale=3/2*oh:3/5*ih
  • increase the size, but make the size a multiple of the chroma
scale="trunc(3/2*iw/hsub)*hsub:trunc(3/2*ih/vsub)*vsub"
  • increase the width to a maximum of 500 pixels, keep the same input aspect ratio
scale='min(500\, iw*3/2):-1'


http://ffmpeg.mplayerhq.hu/ffmpeg.html


When evaluating an arithmetic expression, FFmpeg uses an internal formula evaluator, implemented through the `libavutil/eval.h' interface.

An expression may contain unary, binary operators, constants, and functions.

Two expressions expr1 and expr2 can be combined to form another expression "expr1;expr2".

expr1 and expr2 are evaluated in turn, and the new expression evaluates to the value of expr2.

The following binary operators are available: +, -, *, /, ^.

The following unary operators are available: +, -.

The following functions are available:


`sinh(x)'
`cosh(x)'
`tanh(x)'
`sin(x)'
`cos(x)'
`tan(x)'
`atan(x)'
`asin(x)'
`acos(x)'
`exp(x)'
`log(x)'
`abs(x)'
`squish(x)'
`gauss(x)'
`isnan(x)'
    Return 1.0 if x is NAN, 0.0 otherwise. 
`mod(x, y)'
`max(x, y)'
`min(x, y)'
`eq(x, y)'
`gte(x, y)'
`gt(x, y)'
`lte(x, y)'
`lt(x, y)'
  • `st(var, expr)'
    • Allow to store the value of the expression expr in an internal variable. var specifies the number of the variable where to store the value, and it is a value ranging from 0 to 9. The function returns the value stored in the internal variable.
  • `ld(var)'
    • Allow to load the value of the internal variable with number var, which was previosly stored with st(var, expr). The function returns the loaded value.
  • `while(cond, expr)'
    • Evaluate expression expr while the expression cond is non-zero, and returns the value of the last expr evaluation, or NAN if cond was always false.
  • `ceil(expr)'
    • Round the value of expression expr upwards to the nearest integer. For example, "ceil(1.5)" is "2.0".
  • `floor(expr)'
    • Round the value of expression expr downwards to the nearest integer. For example, "floor(-1.5)" is "-2.0".
  • `trunc(expr)'
    • Round the value of expression expr towards zero to the nearest integer. For example, "trunc(-1.5)" is "-1.0".
  • `sqrt(expr)'
    • Compute the square root of expr. This is equivalent to "(expr)^.5".
  • `not(expr)'
    • Return 1.0 if expr is zero, 0.0 otherwise.
  • `pow(x, y)'
    • Compute the power of x elevated y, it is equivalent to "(x)^(y)".
* works like AND
+ works like OR
if A then B else C

is equivalent to

A*B + not(A)*C