#
# Macht das Video-Encoding für Chaosseminar-Videos vom CCC Erfa-Kreis Ulm.
#
# Geschrieben von Nico nach Hinweisen von Michael. Danke! :-)
#
# Version: 0.1.4, 2008-01-29
#
#
# Nur getestet mit GNU Make 3.81.
#
#
#
#
#  VORAUSSETZUNGEN
# ═════════════════
#
#
# Im Folgenden gilt:
# Bytes haben 8 Bits, also ist ein Byte genau ein Oktett lang.
# Ein Word sei definiert als zwei Bytes.
#
#
#  Benutzer
# ──────────
#
# Solltest du eine der folgenden Fragen mit „Weiß ich nicht.“ (oder falsch ;-) )
# beantworten, bist du leider nicht geeignet, um dieses System zu benutzen. In
# dem Fall, geh bitte zur Wikipedia (du möchtest mit
# <URL:http://de.wikipedia.org/wiki/Digital_Video> anfangen), mach dort deine
# Hausaufgaben und komm anschließend wieder. Das erspart uns allen viel Stress.
# Danke.
#
# Kurzer Test für Benutzer dieses Skripts (natürlich stehen die Antworten
# *nicht* hier drin, das wäre ja langweilig):
#
#    1. Ist DV komprimiert?
#    2. Wieso ist FAT32 ungeeignet, um Videos darauf zu schneiden oder zu
#       transkodieren?
#    3. Welches Format, das dieses Makefile verarbeitet, hat eine Nutzdatenrate
#       von 1.536 kbit/s? Worin besteht der Unterschied zwischen dieser Zahl und
#       1,46484375 MiB/s? (Nein, „MiB/s“ sind keine Men in Black pro Sekunde.)
#    4. Wie konvertiert man (unter Benutzung von Open-Source-Software, versteht
#       sich) ein MPG-Video mit QuickTime-3.2-Overlay (Interactive Scan,
#       48.000 Scanlines pro Sekunde, MJPEG-Bildrekompressionsalgorithmus, Data
#       Flow Rate 4,71 Megabyte pro Sekunde, einfacher statt doppelter
#       Containertranscoder für „.mpg“), MP3-Audio mit 328,7 Kilobyte pro
#       Sekunde und Untertiteln im DVD-Format (AAC-Untertitel, Kompression mit
#       zlib, aber ohne Dolby) in ein normales AVI-Video?
#    5. Wie konvertiert man (unter Benutzung von Open-Source-Software, versteht
#       sich) üblicherweise einen YUV-Videostrom (ohne Container) nach H.264
#       (mit MP4-Container)?
#    6. Was ist der Unterschied zwischen Videoströmen im AVI-Format und
#       Videocontainern im Theora-Format, wenn man mal die Bitrate der
#       MP4-Kompression außer Acht lässt (denn die ist ja immer verschieden)?
#    7. Wie findest du heraus, wie der Header von WAV-Dateien aufgebaut ist?
#    8. Muss man 16-Bit-Audio von 48 kHz nach 44,1 kHz transkodieren, bevor man
#       es in ein DV-Video kopiert? Wieso (nicht)? Wie lautet der Befehl für
#       diese Transkodierung, wenn man das Paket „sox“ verwendet?
#    9. Wieso sollte man nach H.264 transkodiertes Videomaterial nicht mehr
#       schneiden?
#   10. Du möchtest Videomaterial nach Theora transkodieren. Wird die Größe des
#       sich ergebenden Theora-Videostroms kleiner, wenn du vor dem Kodieren
#       einen temporalen Denoiser über das Videomaterial laufen lässt?
#   11. Wie groß ist der Speicherplatzbedarf für 24,855 Stunden (also etwas mehr
#       als einen Tag) unkomprimierte Stereo-Audioaufnahme mit Word-Samples und
#       einer Samplerate von 48 k bei Speicherung in einem WAV-Audiocontainer?
#       Worin besteht das Problem, falls man mehr aufnehmen und in einer
#       WAV-Datei speichern möchte?
#
# Na, hat’s dir Spaß gemacht? Uns auch. :-)
#
# Falls du denkst, dass du geeignet seist, dir langweilig ist, du nicht schon im
# Chaosseminar-Video-TEAM des CCC Erfa-Kreises Ulm bist und du in Ulm, DE oder
# Umgebung (eine schnelle Internetanbindung zählt als Umgebung) wohnst:
# <URL:mailto:MacGyver@ulm.ccc.de?subject=Chaosseminar-Makefile%200.1.4>.
#
#
#  Eingabe-Video
# ───────────────
#
# Dieses Makefile erfordert natürlich ein fertig geschnittenes Video im
# DV-Format (raw DV!). Du möchtest *keine* seltsamen Dinge mit AVI- oder
# QuickTime-Containern ausprobieren.
#
# Als Format möchtest du:
#   Raw DV, PAL, 720x576, 50i, 4:2:0, 48000/16LE/2.
# Ja, diese Angaben sind teilweise redundant.
#
# Solltest du versehentlich 12-Bit-Audio aufgenommen haben: oje, viel Spaß …
#
#
#  Dateisystem
# ─────────────
#
# Die Dateisysteme FAT12, FAT16 bzw. FAT32 sind für diese Schnitt-Sachen *NICHT*
# geeignet (es sei denn, du heißt Michael oder Nico und *weißt genau*, was du
# tust! Ja, zugegebenermaßen, es gibt *Hacks*, mit denen das dennoch geht. Aber
# die *willst* du *gar nicht* ausprobieren!).
#
# Stand 2008-01-29 wird XFS als Dateisystem empfohlen.
#
#
#  Speicherplatzbedarf
# ─────────────────────
#
# 1 Frame DV hat exakt 144.000 Bytes. Also haben 25 Frames (entsprechend
# 1 Sekunde) 3.600.000 Bytes = 3,6 MB. 2 Stunden, 16 Minuten und 32 Sekunden
# (typische Länge eines Chaosseminar-Videos) haben also *exakt* 28.125 MiB, also
# rund 27,466 GiB.
#
# I sei die Größe der Eingabe-Video-Datei im oben beschriebenen Raw-DV-Format in
# Bytes.
#
# Berechne folgende Werte:
#     A = I / 144000 / 25 * 48000 * 2 * 2 / 1024 / 1024 = I / 19660800
#     A ist die Größe des Audio-Anteils in MiB.
#     V = I / 1024 / 1024 - A
#     V ist die Größe des Video-Anteils in MiB.
#
#
# An freiem Speicherplatz (wenn Eingabe-Video mit Größe I schon gespeichert ist)
# werden benötigt:
#     AUDIO: A + 44 Bytes für WAV mit Audio


#
# Erzeugte Dateien mit _VIDEO oder _AUDIO im Namen sind temporäre Dateien, die
# später wieder entfernt werden können.
# Erzeugte Dateien mit _video oder _audio im Namen sind die endgültigen Dateien,
# die man haben will. :-)
#


#
# Interner Video-Archiv-Schlüssel (i. d. R. vom Video-Team vergeben).
# Man übergibt den normalerweise auf der Kommandozeile.
#
KEY=

#
# Eingabedatei, aus der das rohe, fertig geschnittene Video gelesen werden soll.
# Darf ruhig viele, viele GiB haben (üblich sind so etwa 30 GiB pro
# Chaosseminar-Video), das geht schon …
#
INPUTFILE=$(KEY).dv

#
# Welches normalisierte Audio verwendet werden soll:
#   * „QMW“  = Normalisierung basierend auf quadratischem Mittelwert,
#   * „PEAK“ = Normalisierung basierend auf lautestem Peak
#   * „NONE“ = keine Normalisierung, Original-Audio verwenden.
#AUDIO_NORMALIZE=NONE
AUDIO_NORMALIZE=QMW

#
# Wer diese Option ändert und nicht Nico ist und das Make-Handbuch nicht gelesen
# hat, ist doomed.
#
PARALLEL=-j 1 -l 0
#PARALLEL=-j 3 -l 7.5  # Viel Spaß, Nico!

#
# Man stelle das für Single-Prozessor-Kisten mal lieber nicht höher als 2. Am
# besten auf 1.
#
X264_THREADS=1
#X264_THREADS=3

#
# Falls es mal jemandem zu langsam geht UND nur getestet wird … cat.
# WARNUNG: Wirkt sich natürlich schlimmst auf die Testergebnisse aus!!!
#
DENOISER=yuvdenoise -g 2,3,3

GST_LAUNCH=gst-launch-0.10

SAR="4:3"

IPOD_RES="328x240"
DEFAULT_RES="656x480"
IPOD_CROP=-cropleft 4 -cropright 4
CROP=-cropleft 8 -cropright 8
AUDIN="raw"

#
# Für Leute, die ‚make all‘ oder ‚make‘ eingeben
#
all:
	@false


#
# Dann wollen wir mal …
#
World:
	@test "$(KEY)z" != z
	$(MAKE) $(PARALLEL) $@-recursive

OUTPUTFILES=$(KEY)_audio.ogg $(KEY)_audio.mp3 $(KEY)_video.ogg $(KEY)_video.mp4 $(KEY)_video.m4v  # $(KEY)_video.3gp
World-recursive: $(OUTPUTFILES)

hd:
	$(MAKE) $(PARALLEL) INPUTFILE=$(KEY).ts SAR="16:9" AUDIN="mp2" IPOD_RES="320x176" DEFAULT_RES="640x480" CROP="" IPOD_CROP="" OUTPUTFILES="$(OUTPUTFILES) $(KEY)_video_high.mp4" World
nico:
	$(MAKE) X264_THREADS=3 PARALLEL='-j 3 -l 8' World
.PHONY: nico

I_AM_SURE=

#
# Audio extrahieren (und gleich mal nach Mono mit 44.1 kHz verwandeln)
# Ausgabe ist pcm_s16le/44100/1 in WAV-Container
#
# XXX: Dieser Code gilt für Little-Endian-Maschinen! Für Big-Endian-Kisten muss
# entweder der ffmpeg-Aufruf angepasst werden oder sox braucht noch ‚-x‘ als
# zusätzlichen Parameter!
#
AUDIOINPUT=$(KEY)_AUDIO_INPUT.wav
$(AUDIOINPUT): $(INPUTFILE)
	ffmpeg -i "$<" -f s16le -acodec copy -vn - | \
	        sox -t $(AUDIN) -s -w -r 48000 -c 2 - \
		    -t wav -s -w -r 44100 -c 1 "$@"

#	        sox -t raw -s -w -r 48000 -c 2 - \
#	        sox -t mp2 -s -w -r 48000 -c 2 - \

#
# Audio normalizen (Lautstärke adjusten, falls außerhalb eines gewissen
# Bereichs);
# Anpassung erfolgt basierend auf quadratischen Mittelwert
#
$(KEY)_AUDIO_NORMALIZED-QMW.wav: $(AUDIOINPUT)
	cp -v "$<" "$@"
# Default-Settings von normalize-0.7.7 werden hier explizit wiederholt, falls
# sie sich in einer zukünftigen Version mal ändern sollten. Die Videos sollen
# natürlich immer die gleichen Einstellungen haben.
	normalize --amplitude=-12dBFS --limiter=0.5 --adjust-threshold=0.125 \
	          -vv --fractions \
	          "$@"
# In normalize-0.7.7 gibt es (im Quellcode, src/common.h) VERBOSE_QUIET (0),
# VERBOSE_PROGRESS (1), VERBOSE_INFO (2) und VERBOSE_DEBUG (3). src/normalize.c
# setzt den Verbositäts-Level auf VERBOSE_PROGRESS. Zwei ‘-v’ ergeben also
# VERBOSE_DEBUG, mehr bringt nix.

#
# Audio normalizen (Lautstärke adjusten, falls außerhalb eines gewissen
# Bereichs);
# Anpassung erfolgt basierend auf lautestem Peak
#
$(KEY)_AUDIO_NORMALIZED-PEAK.wav: $(AUDIOINPUT)
	cp -v "$<" "$@"
# Default-Settings von normalize-0.7.7 werden hier explizit wiederholt, falls
# sie sich in einer zukünftigen Version mal ändern sollten. Die Videos sollen
# natürlich immer die gleichen Einstellungen haben.
	normalize --amplitude=-12dBFS --limiter=0.5 --adjust-threshold=0.125 \
	          -vv --fractions \
	          --peak \
	          "$@"
# In normalize-0.7.7 gibt es (im Quellcode, src/common.h) VERBOSE_QUIET (0),
# VERBOSE_PROGRESS (1), VERBOSE_INFO (2) und VERBOSE_DEBUG (3). src/normalize.c
# setzt den Verbositäts-Level auf VERBOSE_PROGRESS. Zwei ‘-v’ ergeben also
# VERBOSE_DEBUG, mehr bringt nix.

#
# Audio nicht normalizen (sondern nur Link zur Original-Version bereitstellen)
#
$(KEY)_AUDIO_NORMALIZED-NONE.wav: $(AUDIOINPUT)
	ln -sf "$<" "$@"








################################################################################


##
## Audio nach MPEG II, Layer 3 encoden
## XXX: Hardcore-Variante, die alle möglichen Optimierungen nutzt. Vermutlich
## nicht für tragbare Player geeignet!!! TODO:TESTME!!!
##
#AUDIO_$(HARDCORE).mp3:
#	lame -m m -q 0 --freeformat --clipdetect --preset 80
## TODO:CHECKME: Prüfen, ob ‚-t‘ für lame ganz toll ist oder nicht,
## vorausgesetzt, man verwendet keine VBR.
#
# Bei Verwendung von VBR: --vbr-new -V 2 verwenden, schätze ich … TODO:testen!


################################################################################








#
# Video extrahieren und nachbearbeiten (mittels mjpegtools-Pipeline)
#
# (Hinweis: Nachbearbeitetes Video wird im Y4M-Format gespeichert und von dort
# aus weiter verarbeitet.)
#
#Y4MFILE=$(KEY)_VIDEO.y4m
#$(Y4MFILE): $(INPUTFILE)
#	ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | y4munsharp | yuvdenoise -G 2,3,3 > "$@"
#	ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | $(DENOISER) > "$@"

# Für H.264-Encoding für iPod verwendet:
#SMALL_Y4MFILE=$(KEY)_VIDEO_SMALL.y4m
#$(SMALL_Y4MFILE): $(Y4MFILE)
#$(SMALL_Y4MFILE): $(INPUTFILE)

# XXX: Hier wird das bestehende Video einfach nochmal runterskaliert, und zwar
# auf genau ein Viertel der Größe (also Breite und Höhe je durch zwei geteilt).
# Evtl. bekommt man bessere Ergebnisse, wenn man ffmpeg nochmal laufen lässt und
# das Video gleich von ffmpeg verkleinern lässt und anschließend den Denoiser
# drüber laufen lässt … aber das glaube ich eigentlich weniger. TODO: testen.
#	y4mscaler -O size=320x240 < $< > $@
# Resultat sieht für mich genauso gut aus, Skalierung ist aber schneller:
#	y4mscaler -O size=320x240 -S option=box < $< > $@


# Zumindest in x264-svn-20070924 nicht mehr nötig. :-)
##
## Header umbasteln für H.264-Encoder.
## Ineffizienter Mist, vermutlich optimierbar …
##
#YUVFILE=$(KEY)_VIDEO.yuv
#$(YUVFILE): $(Y4MFILE)
#	y4mtoyuv < $< > $@

#
# Nach Theora encoden
# (dieses Target behandelt in der Tat *nur* Video!)
#
#$(KEY)_VIDEO.ogg: $(Y4MFILE)
$(KEY)_VIDEO.ogg: $(INPUTFILE)
#	ffmpeg2theora -p preview -o $@ -f yuv4mpegpipe $<
#	ffmpeg2theora -o $@ -f yuv4mpegpipe $<
#	ffmpeg2theora --optimize -v 6 -S 1 -o $@ -f yuv4mpegpipe $<
#TODO: ggf. noch weiter optimieren:
#	ffmpeg -i "$<" -deinterlace -s 656x480 -cropleft 8 -cropright 8 -f yuv4mpegpipe - | $(DENOISER) | ffmpeg2theora --optimize -v 5 -S 1 -o $@ -f yuv4mpegpipe -
	ffmpeg -i "$<" -deinterlace -s $(DEFAULT_RES) $(CROP) -f yuv4mpegpipe - | $(DENOISER) | ffmpeg2theora --optimize -v 5 -S 1 -o $@ -f yuv4mpegpipe -

#
# Nach H.264 encoden
#
#BITRATE=662  # an Test-Video-Stück ermittelt zum Größenausgleich zu Theora-Version (XXX: war wohl falsch berechnet)
#BITRATE=680  # neuer Test
BITRATE=700  # ursprüngliche Version; wir lassen das mal. Ist gut so. Theora-Dingens war fehlerhaft eingestellt. Repariert.
#$(KEY)_VIDEO_default.264: $(Y4MFILE)
VPIPE1=videopipe1.y4m
VPIPE2=videopipe2.y4m
VPIPE3=videopipe3.y4m

$(KEY)_VIDEO_default.264: $(INPUTFILE)

# Komplizierteste Kombination, die ich ausmachen konnte ;-) :
	if ! [ -p $(VPIPE1) ]; then mkfifo $(VPIPE1); fi
	ffmpeg -i "$<" -deinterlace -s $(DEFAULT_RES) $(CROP) -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE1) &
	x264 --crf 24 --level 30 --subme 7 --analyse none --filter -1,-1 --trellis 2 \
	     --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --me esa --merange 32 --thread-input \
	     --8x8dct --direct auto --mixed-refs --progress --output $@ $(VPIPE1)
#	     --filter -1,-1 --bframes 1 --trellis 2 \
##	x264 --bitrate 700 --level 3 --nf  --no-cabac --subme 6 --analyse none \
##	     --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \
##	     --progress --no-psnr --output $@ $(VPIPE1)
#	x264 --crf 24 --level 30 --subme 7 --me esa \
#	     --filter -1,-1 --bframes 1 --trellis 2 \
#	     --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \
#	     --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \
#	     --thread-input --threads $(X264_THREADS) \
#	     --sar $(SAR) \
#	     -o $@ $(VPIPE1)
	rm $(VPIPE1)

#IPOD_VIDEO_BITRATE=175  # =700/4
IPOD_VIDEO_BITRATE=138  # =552/4
#$(KEY)_VIDEO_ipod.264: $(SMALL_Y4MFILE)
$(KEY)_VIDEO_ipod.264: $(INPUTFILE)

# Aus Michaels Notizen entnommene Spaßmatrix (nur die Zeilen ohne CABAC):
#
# Michaels genereller Rat: --crf=24
# HINWEIS: --crf ist inkompatibel mit Multipass-Encoding!
#
# Für 640x480:
#     --no-cabac --level=30 --subme=7 --me=umh               --ref=5 --partitions=all       --direct=auto --mixed-refs --crf=23
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2                        --direct=auto --mixed-refs          --no-fast-pskip --no-dct-decimate --qcomp=0.8 --qpmin=15 --vbv-maxrate=1500                                                                        --pass=2
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552                                                                                                                  --qpmin=15                                                                                           --pass=1
#     --no-cabac --level=30 --subme=7 --me=umh                                                                         --crf=23                                               --qpmin=15
#
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552                                                                                                                  --qpmin=15                                                                                           --pass=1
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552                                                                                                                  --qpmin=15                                                                                           --pass=2
#
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2                        --direct=auto --mixed-refs          --no-fast-pskip --no-dct-decimate --qcomp=0.7 --qpmin=15 --vbv-maxrate=1500 --merange=32 --nr=100                                                  --pass=2
#     --no-cabac --level=30 --subme=7 --me=umh                                                                         --crf=23
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552 --ref=2                        --direct=auto --mixed-refs          --no-fast-pskip --no-dct-decimate --qcomp=0.8 --qpmin=15 --vbv-maxrate=1500                                                                        --pass=2
#     --no-cabac --level 30 --subme 7 --me umh --bitrate 700 --ref 2 --partitions p8x8,b8x8               --mixed-refs                                                        --qpmin 16 --vbv-maxrate 1500 --merange 12          --filter=-1,-1 --no-psnr --thread-input          --pass=1
#     --no-cabac --level=30 --subme=7 --me=umh                                                                         --crf=24
#
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552                                                                                                                                                                                                                       --pass=1
#     --no-cabac --level=30 --subme=7 --me=umh --bitrate=552                                                                                                                                                                                                                       --pass=2
#
# Für 320x240:
#     --no-cabac --level=13 --subme=7 --me=umh --bitrate=552 --ref=5 --partitions=all       --direct=auto --mixed-refs          --no-fast-pskip --no-dct-decimate --qcomp=0.7 --qpmin=20                                                                                                    320x240
#     --no-cabac --level=13 --subme=6 --me=umh --bitrate 110 --ref=5                                                                                                                                                                                                      --fps=25 --pass=1 320x240
#     --no-cabac --level=13 --subme=6 --me=umh --bitrate 190 --ref=5                                                                                                                                                                                                      --fps=25 --pass=1 320x240
#
#
#
#
# Laut <URL:http://www.apple.com/ipodclassic/specs.html> kann der iPod classic:
#   H.264 video,  up to 1.5 Mbps, 640 by 480 pixels, 30 frames per second, Low-Complexity version of the H.264 Baseline Profile with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats
#   H.264 video,  up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Baseline Profile up to Level 3.0                     with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats
#   MPEG-4 video, up to 2.5 Mbps, 640 by 480 pixels, 30 frames per second, Simple Profile                                       with AAC-LC audio up to 160 Kbps, 48kHz, stereo audio in .m4v, .mp4, and .mov file formats
# Das Display ist allerdings nur 320x240 groß, also bringt uns mehr nix …
#
#
#
#
# Komplizierte und hoffentlich noch sinnvolle Kombination:
#	x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa \
#	     --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \
#	     --qcomp 0.8 --qpmin 18 --vbv-maxrate=1500 --merange 32 --nr 100 \
#	     --thread-input --threads $(X264_THREADS) \
#	     -o $@ $<
	if ! [ -p $(VPIPE2) ]; then mkfifo $(VPIPE2); fi
	ffmpeg -i "$<" -deinterlace -s $(IPOD_RES) $(IPOD_CROP) -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE2) &
	x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa --vbv-maxrate 1500 --vbv-bufsize 1000\
	     --ref 2 --partitions all --direct auto --mixed-refs \
	     --qcomp 0.8 --qpmin 18 --merange 32 --nr 100 \
	     --thread-input --threads $(X264_THREADS) \
	     --output $@ $(VPIPE2)
#	x264 --crf 24 --level 30 --nf  --no-cabac --subme 7 --analyse none \
#	     --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --vbv-maxrate 1000 --me esa --merange 32 --thread-input \
#	     --sar $(SAR) --8x8dct --direct auto --mixed-refs --progress --no-psnr --output $@ $(VPIPE2)
##	x264 --bitrate 700 --level 3 --nf  --no-cabac --subme 6 --analyse none \
##	     --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \
##	     --progress --no-psnr --output $@ $(VPIPE2)
#	x264 --crf 24 --no-cabac --level 30 --subme 7 --me esa \
#	     --filter -1,-1 --bframes 1 --trellis 2 \
#	     --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \
#	     --qcomp 0.8 --qpmin 18 --vbv-maxrate=1500 --merange 32 --nr 100 \
#	     --thread-input --threads $(X264_THREADS) \
#	     --sar $(SAR) \
#	     -o $@ $(VPIPE2)
	rm $(VPIPE2)
#	     --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \

$(KEY)_VIDEO_high.264: $(INPUTFILE)
	if ! [ -p $(VPIPE3) ]; then mkfifo $(VPIPE3); fi
	ffmpeg -i "$<" -deinterlace -s 1440x1080 -croptop 4 -cropbottom 4 -f yuv4mpegpipe - | $(DENOISER) > $(VPIPE3) &
#	x264 --crf 24 --level 30 --subme 7 --me esa \
#	     --filter -1,-1 --bframes 1 --trellis 2 \
#	     --ref 5 --partitions all --8x8dct --direct auto --mixed-refs \
#	     --qcomp 0.8 --qpmin 16 --merange 32 --nr 100 \
#	     --thread-input --threads $(X264_THREADS) \
#	     --sar $(SAR) \
#	     -o $@ $(VPIPE3)
##	x264 --bitrate 700 --level 3 --nf  --no-cabac --subme 6 --analyse none \
##	     --qpmin 16 --vbv-maxrate 1000 --me umh --merange 12 --thread-input \
##	     --progress --no-psnr --output $@ $(VPIPE3)
	x264 --crf 24 --level 30 --nf  --subme 7 --analyse none \
	     --filter -1,-1 --trellis 2 \
	     --ref 5 --partitions all --qcomp 0.8 --qpmin 16 --me esa --merange 32 --thread-input \
	     --8x8dct --direct auto --mixed-refs --progress --nr 100 --output $@ $(VPIPE3)
	rm $(VPIPE3)

#
# Ausgabeformate:
#
AUDIOFINAL=$(KEY)_AUDIO_NORMALIZED-$(AUDIO_NORMALIZE).wav
$(KEY)_audio.ogg: $(AUDIOFINAL)
	oggenc -b 56 -C 1 -o $@ $<
	@chmod u-w $@

$(KEY)_audio.mp3: $(AUDIOFINAL)
	lame -b 80 -h $< $@
	@chmod u-w $@

$(KEY)_AUDIO.aac: $(AUDIOFINAL)
# TODO: besser komprimieren/encoden! Das hier ist noch großer Mist und in der Testphase!!!
#	faac -q 500 -o $@ $<
#	faac -b 80 -o $@ $<
#	faac -b 60 -o $@ $<
#	faac -b 56 -o $@ $<
	faac -b 64 -P -X -R 44100 -B 16 -C 1 --mpeg-vers 4 -o $@ $<

$(KEY)_video.mp4: $(KEY)_VIDEO_default.264 $(KEY)_AUDIO.aac
#	MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@
	MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@
	@chmod u-w $@

$(KEY)_video_high.mp4: $(KEY)_VIDEO_high.264 $(KEY)_AUDIO.aac
#	MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@
	MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@
	@chmod u-w $@

$(KEY)_video.ogg: $(KEY)_VIDEO.ogg $(KEY)_audio.ogg
# Theora+Vorbis aus je einem Container in einzelnen OGG-Container muxen.
#
# Wow, GStreamer ist ja sooo coool (nach ca. 28 h Nachforschungen,
# Verwünschungen und großer Verwunderung)! :-D
# vlc kann es anscheinend gar nicht,
# ffmpeg macht es falsch (das Resultat ist broken),
# mit GStreamer klappt es wunderbar! :-)
#
	$(GST_LAUNCH) \
	    filesrc location="$(KEY)_audio.ogg" '!' oggdemux '!' vorbisparse '!' \
	    queue ! oggmux name=m '!' filesink location="$@" \
	    filesrc location="$(KEY)_VIDEO.ogg" '!' oggdemux '!' theoraparse '!' \
	    queue ! m.
	@chmod u-w $@

$(KEY)_video.m4v: $(KEY)_VIDEO_ipod.264 $(KEY)_AUDIO.aac
# XXX: Auch Audio-Spur neu (kleiner) encoden?
#	MP4Box -add $< -add $(KEY)_AUDIO.aac -mpeg4 $@
	MP4Box -add $< -add $(KEY)_AUDIO.aac -new $@
	@chmod u-w $@

#$(KEY)_video.3gp:
# machen wir nicht mehr (Stand: 2007-09-10)
#	@chmod u-w $@

clean:
	@test "$(KEY)z" != z
	rm -f $(KEY)_VIDEO_default_264_2pass.log $(KEY)_VIDEO_ipod_264_2pass.log \
	      $(KEY)_AUDIO* $(KEY)_VIDEO*

veryclean: clean
	@test "$(I_AM_SURE)z" = "yesz"
	rm -f $(KEY)_audio* $(KEY)_video*

.PHONY: all World World-recursive clean veryclean
