# Makefile for Debconf5 DVDs

# Copyright 2005 Ben Hutchings <ben@decadentplace.org.uk>
# See "copyright" file for licence terms.

# The README file explains the various variables you may wish to set.

VERSION := 0.11

### General parameters #####################################################

ifdef MINI
    MINI_SUFFIX := -mini
else
    MINI_SUFFIX :=
endif

# Directory in which to generate VOBs and DVD images.
BUILD_DIR = build-$(STANDARD)$(MINI_SUFFIX)

# Temporary directory to build the DVD tree in - this will be erased
# and created as needed.
TEMP_DIR := tmp

# This is required for the use of PIPESTATUS below.
SHELL := /bin/bash

# Determine video parameters
WIDTH_LORES := 352
WIDTH_HIRES := 720
ifdef NTSC
    HEIGHT_LORES := 240
    HEIGHT_LORES_14_9 := 220
    Y_PAD_LORES_14_9 := 20
    HEIGHT_HIRES := 480
    STANDARD := ntsc
    FRAME_RATE := 30000/1001
    FRAME_RATE_RATIO := 30000:1001
    PIXEL_ASPECT_RATIO := 10:11
    MAX_GOP := 18
else
    HEIGHT_LORES := 288
    HEIGHT_LORES_14_9 := 264
    Y_PAD_LORES_14_9 := 24
    HEIGHT_HIRES := 576
    STANDARD := pal
    FRAME_RATE := 25
    FRAME_RATE_RATIO := 25:1
    PIXEL_ASPECT_RATIO := 59:54
    MAX_GOP := 15
endif

# Output video size
SIZE := $(WIDTH_LORES):$(HEIGHT_LORES)

# Output codecs and bit rates
VIDEO_CODEC := mpeg1video
VIDEO_BITRATE := 230
ifeq ($(STANDARD),pal)
    AUDIO_CODEC := mp2
else
    AUDIO_CODEC := ac3
endif
AUDIO_BITRATE := 128

### Source and target files ################################################

TITLE_SOURCES := $(addprefix dc5video.debian.net/,                            \
    debcamp/1st-days.mpeg                                                     \
    debcamp/dc5-2nd_video.mpeg                                                \
    debcamp/dc5-3rd-960x540.avi                                               \
    misc/dc5-band.avi                                                         \
    2005-07-09/01-Greetings-Martin_Andreas_Branden.mpeg                       \
    2005-07-09/02-What_is_Debian-Jaldhar_H_Vyas.mpeg                          \
    2005-07-09/03-What_is_Free_Software-Gunnar_Wolf.mpeg                      \
    2005-07-09/04-Linux_Aktivaattori-Martin_Eric_Racine.mpeg                  \
    2005-07-09/05-Custom_Debian_Distributions_and_Debian_Derivatives-Aigars_Mahinovs.mpeg \
    2005-07-09/06-A_Travel_Through_Debian-Juan_Jose_Amor.mpeg                 \
    2005-07-09/07-Debian_Release_Processes-Andreas_Barth.mpeg                 \
    2005-07-09/08-Extremadura_Countys_70000_Debian_Workstations-Dario_Rapisardi_and_Pedro_Perez.mpeg \
    2005-07-09/09-Getting_Involved_as_an_End_User-Alexander_Schmehl.mpeg      \
    2005-07-09/10-Developing_Software_for_Debian-Martin_Eric_Racine.mpeg      \
    2005-07-09/11-How_Hewlett_Packard_benefits_from_Debian-Bdale_Garbee.mpeg  \
    2005-07-10/01-Welcome_to_Debconf-Debconf5_Organizers.mpeg                 \
    2005-07-10/02-Debootstrap-Anthony_Towns.mpeg                              \
    2005-07-10/03-Small_Teams_in_Debian-Andreas_Schuldei.mpeg                 \
    2005-07-10/04-Write_the_Fine_Manual-Branden_Robinson.mpeg                 \
    2005-07-10/05-Multiarch_A_Proposal_and_an_Implementation-Tollef_Fog_Heen.mpeg \
    2005-07-10/06-Debtags-Enrico_Zini.mpeg                                    \
    2005-07-11/01-Appealing_Presentations_with_LaTeX_Beamer-Andreas_Tille.mpeg \
    2005-07-11/02-Debian_Development_in_the_Third_World_Latin_America-Gunnar_Wolf_and_Christian_Perrier.mpeg \
    2005-07-11/03-Debian_Derivatives_Panel-Benjamin_Mako_Hill.mpeg            \
    2005-07-11/04-Search_Engines_in_Debian-Takatsugu_Nokubi.mpeg              \
    2005-07-11/05-Embedded_Debian_Demo-Wookey.mpeg                            \
    2005-07-11/06-Custom_Debian_Distribution-Andreas_Tille.mpeg               \
    2005-07-11/07-Debian_Release_Management-Andreas_Barth.mpeg                \
    2005-07-12/01-Alternate_Approaches_to_Package_Management_and_Autobuilding-Simon_Richter.mpeg \
    2005-07-12/02-Software_in_the_Public_Interest_Workshop-Benjamin_Mako_Hill.mpeg \
    2005-07-12/03-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt1.mpeg        \
    2005-07-12/04-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt2.mpeg        \
    2005-07-12/05-OpenOffice.org_in_Debian-Chris_Halls_Rene_Engelhard.mpeg    \
    2005-07-12/06-Writing_Enterprise_Ready_Software-Petter_Reinholdtsen.mpeg  \
    2005-07-12/07-Linda_A_Debian_Package_Checker_Written_in_Python-Steve_Kowalik.mpeg \
    2005-07-12/08-Securing_the_Testing_Distribution-Joey_Hess.mpeg            \
    2005-07-14/01-Shared_Library_Packaging-Junichi_Uekawa.mpeg                \
    2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth.mpeg                          \
    2005-07-14/03-Debian_Website_Round_Table-Frank_Lichtenheld-pt1.mpeg       \
    2005-07-14/04-Debian_Website_Round_Table-Frank_Lichtenheld-pt2.mpeg       \
    2005-07-14/05-Enrico_Zini-Zen_and_the_art_of_Free_Software.mpeg           \
    2005-07-14/06-Autobuilding_Experimental-Andreas_Barth.mpeg                \
    2005-07-14/08-Debian_New_Maintainer_Process-Hanna_Wallach_Dafydd_Harries_Moray_Allan.mpeg \
    2005-07-15/01-Documentation_in_Debian-Takatsugu_Nokubi.mpeg               \
    2005-07-15/02-Freezing_HEL_Over-Scott_James_Remnant.mpeg                  \
    2005-07-15/03-Debian_Women_and_Women_in_Free_Software-Erinn_Clark_Magni_Onsoien.mpeg \
    2005-07-15/04-Distributed_Revision_Control-Mark_Shuttleworth.mpeg         \
    2005-07-15/05-Evaluating_Open_Source_Software_for_Enterprise_Use-Martin_Langhoff.mpeg \
    2005-07-15/06-Customization_of_GNU_libc_locale_files-Denis_Barbier.mpeg   \
    2005-07-15/07-Debian_Installer-Holger_Levsen_Joey_Hess_Christian_perrier_Frans_Pop.mpeg \
    2005-07-15/08-Are_We_Really_Devoted_to_Our_Users-Margarita_Manterola.mpeg \
    2005-07-16/01-Altivec_Optimizations_on_Debian_Powerpc-Konstantinos_Margaritis.mpeg \
    2005-07-16/02-Conducting_Cooperatively_Towards_a_Better_Debian-Jeroen_van_Wolffelaar.mpeg \
    2005-07-16/04-Safer_Hex_in_Public-Holger_Levsen.mpeg                      \
    2005-07-16/06-FAI_the_Fully_Automatic_Installation-Thomas_Lange.mpeg      \
    2005-07-16/07-Open_Source_in_South_Asia-Jaldhar_Vyas.mpeg                 \
    2005-07-16/08-Structural_Evolution-Bdale_Garbee.mpeg                      \
    2005-07-16/09-Ending_Flamewars_With_Polygen-Enrico_Zini.mpeg              \
    2005-07-16/10-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt1.mpeg \
    2005-07-16/11-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt2.mpeg \
    2005-07-16/12-Debian_Edu_Upgrading_a_Preconfigured_CDD-Petter_Reinholdtsen.mpeg \
    2005-07-17/01-Next_Generation_Debian_Initscripts-Henrique_de_Moraes_Holschuh.mpeg \
    2005-07-17/02-The_Debian_Free_Software_Guidelines-Matthew_Garret.mpeg     \
    2005-07-17/03-Volatile_Archive_for_Debian-Andreas_Barth.mpeg              \
    2005-07-17/04-Free_Standards-Matt_Taggart.mpeg                            \
    2005-07-17/05-Cross_Compiling_Debian_from_Scratch-Timo_Savola.mpeg        \
    2005-07-17/06-Package_Management_and_Revision_Control-Scott_James_Remnant.mpeg \
    2005-07-17/07-Using_Debian_for_Science_Research-Helen_Faulkner.mpeg       \
    2005-07-17/08-Debconf_Closing_Remarks-Alexander_Schmehl_Branden_Robinson.mpeg \
    )
TITLE_SOURCES_SL1 := \
    $(filter dc5video.debian.net/2005-07-09/%                                 \
             dc5video.debian.net/2005-07-10/%                                 \
             dc5video.debian.net/2005-07-11/%                                 \
             dc5video.debian.net/2005-07-12/%,                                \
      $(TITLE_SOURCES))
TITLE_SOURCES_SL2 := \
    $(filter dc5video.debian.net/2005-07-14/%                                 \
             dc5video.debian.net/2005-07-15/%                                 \
             dc5video.debian.net/2005-07-16/%                                 \
             dc5video.debian.net/2005-07-17/%                                 \
             dc5video.debian.net/debcamp/%                                    \
             dc5video.debian.net/misc/%,                                      \
      $(TITLE_SOURCES))
TITLE_SOURCES_DL := $(TITLE_SOURCES)
CREDITS_SOURCES := credits-1.dvdmenu credits-2.dvdmenu credits-3.dvdmenu      \
    credits-4.dvdmenu credits-5.dvdmenu
MENU_SOURCES_SL1 := main-sl1.dvdmenu $(CREDITS_SOURCES) debian-day-1.dvdmenu  \
    debian-day-2.dvdmenu talks-sl1.dvdmenu talks-10th.dvdmenu                 \
    talks-11th.dvdmenu talks-12th-sl1.dvdmenu
MENU_SOURCES_SL2 := main-sl2.dvdmenu $(CREDITS_SOURCES) talks-sl2.dvdmenu     \
    talks-14th.dvdmenu talks-15th-1.dvdmenu talks-15th-2.dvdmenu              \
    talks-16th-1.dvdmenu talks-16th-2.dvdmenu talks-17th.dvdmenu              \
    extras.dvdmenu debcamp.dvdmenu group-photo.dvdmenu
MENU_SOURCES_DL := main.dvdmenu $(CREDITS_SOURCES) debian-day-1.dvdmenu       \
    debian-day-2.dvdmenu talks.dvdmenu talks-10th.dvdmenu talks-11th.dvdmenu  \
    talks-12th.dvdmenu talks-14th.dvdmenu talks-15th-1.dvdmenu                \
    talks-15th-2.dvdmenu talks-16th-1.dvdmenu talks-16th-2.dvdmenu            \
    talks-17th.dvdmenu extras.dvdmenu debcamp.dvdmenu group-photo.dvdmenu

DVD_IMAGE_BASE := $(BUILD_DIR)/debconf5-dvd-$(VERSION)$(MINI_SUFFIX)

ifdef DUAL_LAYER
default : $(DVD_IMAGE_BASE)-dl-$(STANDARD).iso
else
default : $(DVD_IMAGE_BASE)-sl1-$(STANDARD).iso \
          $(DVD_IMAGE_BASE)-sl2-$(STANDARD).iso
endif

all : $(DVD_IMAGE_BASE)-dl-$(STANDARD).iso \
      $(DVD_IMAGE_BASE)-sl1-$(STANDARD).iso \
      $(DVD_IMAGE_BASE)-sl2-$(STANDARD).iso

clean :
	rm -f vobs *.pgm *.ppm $(DVD_IMAGE_BASE)*.iso
	rm -rf $(TEMP_DIR)
	@echo "WARNING: It will take several hours to regenerate the VOB files."
	@echo "Interrupt within 5 seconds if you don't really want to delete them."
	sleep 5
	rm -rf $(BUILD_DIR)

# Download missing files, if enabled.
ifdef DOWNLOAD
dc5video.debian.net/%.avi dc5video.debian.net/%.mpeg :
	mkdir -p $(dir $@)
	wget -c -O $@.partial http://$@
	mv $@.partial $@
endif

### Authoring ##############################################################

$(DVD_IMAGE_BASE)-sl1-$(STANDARD).iso                         \
    : $(addprefix $(BUILD_DIR)/,                              \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_SL1)) \
        $(patsubst %.mpeg,%.vob, $(TITLE_SOURCES_SL1)))
$(DVD_IMAGE_BASE)-sl2-$(STANDARD).iso                         \
    : $(addprefix $(BUILD_DIR)/,                              \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_SL2)) \
        $(patsubst %.avi,%.vob, $(patsubst %.mpeg,%.vob,      \
          $(TITLE_SOURCES_SL2))))
$(DVD_IMAGE_BASE)-dl-$(STANDARD).iso                          \
    : $(addprefix $(BUILD_DIR)/,                              \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_DL))  \
        $(patsubst %.avi,%.vob, $(patsubst %.mpeg,%.vob,      \
          $(TITLE_SOURCES_DL))))

$(DVD_IMAGE_BASE)-%-$(STANDARD).iso : debconf5-%.dvdauthor
	rm -rf $(TEMP_DIR)
	rm -f vobs
	ln -s $(BUILD_DIR) vobs
	dvdauthor -o $(TEMP_DIR) -x $< 2>&1              \
	    | grep -v 'WARN: unknown mpeg. aspect ratio' \
	    ; test $${PIPESTATUS[0]} -eq 0
	rm -f vobs
	python ./fix-dvdauthor-ifos $(TEMP_DIR)
	mkisofs -o $@ -dvd-video $(TEMP_DIR) || (rm -rf $@ $(TEMP_DIR) ; false)
	rm -rf $(TEMP_DIR)

### Menu generation ########################################################

# Hack to scale images and menus to NTSC dimensions if necessary.
ifeq ($(STANDARD),pal)
    SCALE_COMMAND := cat
    YSCALE := 1.0
else
    SCALE_COMMAND := pnmscale -xscale=1 -ysize=$(HEIGHT_HIRES)
    YSCALE := 0.8333333333
endif

# Rules for generating menu backgrounds by compositing photos with a banner

DARKEN_COMMAND := pnmnorm -bvalue 0 -wvalue 510
BANNER_DEPS := menu-photo-mask.pgm banner.ppm
BANNER_COMMAND := pnmcomp -alpha menu-photo-mask.pgm banner.ppm

# This is not required in a normal build, as banner.ppm.gz is already included.
# xcftopnm is included in the libgimp-perl package in Debian.  It should also
# be easy to do the conversion manually in Gimp.
banner.ppm.gz : banner.xcf.gz
	zcat $< | xcftopnm | gzip -c -9 >$@

% : %.gz
	zcat $< >$@

$(BUILD_DIR)/main-menu.ppm : photos/Arto_Teras/debconf5_group.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/main-%-menu.ppm : $(BUILD_DIR)/main-menu.ppm
	ln -sf main-menu.ppm $@

$(BUILD_DIR)/credits-1-menu.ppm : photos/Arto_Teras/img_2488-infodesk_wall_large.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/credits-2-menu.ppm : photos/Ben_Hutchings/CSD_video_equipment.jpeg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 455               \
        | pnmpad -left 20 -right 20 -top 110 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/credits-3-menu.ppm : photos/Arto_Teras/img_1999-otaniemi_night_large.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/credits-4-menu.ppm : photos/Ben_Hutchings/Smoekki_cables.jpeg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 455               \
        | pnmpad -left 20 -right 20 -top 110 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/credits-5-menu.ppm : $(BUILD_DIR)/credits-4-menu.ppm
	ln -sf credits-4-menu.ppm $@

$(BUILD_DIR)/debian-day-1-menu.ppm : photos/Arto_Teras/img_2066-debianday_audience_large.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/debian-day-2-menu.ppm : $(BUILD_DIR)/debian-day-1-menu.ppm
	ln -sf debian-day-1-menu.ppm $@

$(BUILD_DIR)/talks-menu.ppm : photos/Ben_Hutchings/CSD_lecture_hall.jpeg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmpad -left 20 -right 20 -top 110 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/talks-%-menu.ppm : $(BUILD_DIR)/talks-menu.ppm
	ln -sf talks-menu.ppm $@

$(BUILD_DIR)/extras-menu.ppm : photos/Arto_Teras/img_2333-suomenlinna_picnic_large.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $< | $(DARKEN_COMMAND)                \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

$(BUILD_DIR)/debcamp-menu.ppm : $(BUILD_DIR)/extras-menu.ppm
	ln -sf extras-menu.ppm $@

$(BUILD_DIR)/group-photo-menu.ppm : photos/Arto_Teras/debconf5_group.jpg $(BANNER_DEPS)
	mkdir -p $(dir $@)
	jpegtopnm $<                                    \
        | pnmscale -width 680 -height 453               \
        | pnmpad -left 20 -right 20 -top 112 -bottom 11 \
        | $(BANNER_COMMAND) | $(SCALE_COMMAND) >$@

# Convert PPM to MPEG2 video.  This is needed for including still true-colour
# images.
%.mpeg : %.ppm
	ppmtoy4m -v0 -n 1 -F $(FRAME_RATE_RATIO) -A $(PIXEL_ASPECT_RATIO) \
	      -I p -S 420_mpeg2 $<                                        \
	| mpeg2enc -v0 -f 8 -a 2 -o $@

# Generate menu images and multiplex with backgrounds to create MPEG2 PS.
# The colours are white, dark red (matching the Debconf logo) on very
# light gray, and bright red on very light gray.
$(BUILD_DIR)/%-menu.vob : %.dvdmenu $(BUILD_DIR)/%-menu.mpeg
	test "$$(locale -k charmap)" = 'charmap="UTF-8"'
	python ./make-menu-vob -w $(WIDTH_HIRES) -h $(HEIGHT_HIRES)  \
	    -n 255,255,255 -i 175,44,14 --highlight-b 240,240,240    \
            -s 224,0,0 --select-b 240,240,240                        \
	    -f /usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf \
	    -m $< -b $(BUILD_DIR)/$*-menu.mpeg -o $@                 \
	    --yscale $(YSCALE)

### Video and audio processing #############################################

# Generic mencoder options.
MENCODER_FLAGS = -of mpeg -ovc lavc -oac $(AUDIO_CODEC_TYPE)               \
    -mpegopts format=dvd:reorder:vframerate=$(FRAME_RATE)                  \
    -mpegopts vaspect=$(FRAME_ASPECT_RATIO)                                \
    -lavcopts vcodec=$(VIDEO_CODEC):vbitrate=$(VIDEO_BITRATE):vqcomp=0.8   \
    -lavcopts keyint=$(MAX_GOP)                                            \
    -lavcopts acodec=$(AUDIO_CODEC):abitrate=$(AUDIO_BITRATE)              \
    -ofps $(FRAME_RATE) -vf hqdn3d=2:2:4,scale=$(SIZE),harddup $(RESAMPLE) \
    -af volume=$(VOLUME_ADJUST) -quiet
ifdef MINI
    MENCODER_FLAGS += -endpos 1:00
endif

# Default values for mencoder options that need to be overridden for some files.
AUDIO_CODEC_TYPE := lavc
FRAME_ASPECT_RATIO := 4/3
RESAMPLE := -af resample=48000:0:2 -srate 48000
VOLUME_ADJUST := 0

# mpegdemux options for extracting video and audio streams
ifeq ($(AUDIO_CODEC),mp2)
    MPEGDEMUX_AUDIO_STREAM := -s 0xc0
else
    ifeq ($(AUDIO_CODEC),ac3)
        MPEGDEMUX_AUDIO_STREAM := -s 0xbd -p 0x80 -a
    else
        $(error "Don't know how to extract audio streams")
    endif
endif
MPEGDEMUX_VIDEO_STREAM := -s 0xe0

# Convert all sources to MPEG2 PS, then remultiplex to ensure A/V
# synchronisation is within DVD tolerances.

ifdef ONE_PASS

define RECODE_COMMANDS
mkdir -p $(dir $@)
mencoder $(MENCODER_FLAGS) -lavcopts vratetol=10000                    \
    -o $@.temp $< >/dev/null
mpegdemux -d $(MPEGDEMUX_VIDEO_STREAM) $@.temp $(BUILD_DIR)/$*.mpeg
cat $(VIDEO_APPEND) >>$(BUILD_DIR)/$*.mpeg
mpegdemux -d $(MPEGDEMUX_AUDIO_STREAM) $@.temp $(BUILD_DIR)/$*.$(AUDIO_CODEC)
tcmplex -d 0 -i $(BUILD_DIR)/$*.mpeg -p $(BUILD_DIR)/$*.$(AUDIO_CODEC) \
    -o $@ -m d                                                         \
    ; test -f $@
rm -f $@.temp $(BUILD_DIR)/$*.mpeg $(BUILD_DIR)/$*.$(AUDIO_CODEC)
endef

else

define RECODE_COMMANDS
mkdir -p $(dir $@)
mencoder $(MENCODER_FLAGS) -lavcopts vpass=1:vratetol=100000:turbo      \
    -passlogfile $@.log -o /dev/null $< >/dev/null
mencoder $(MENCODER_FLAGS) -lavcopts vpass=2:vratetol=10000             \
    -passlogfile $@.log -o $@.temp $< >/dev/null
mpegdemux -d $(MPEGDEMUX_VIDEO_STREAM) $@.temp $(BUILD_DIR)/$*.mpeg
cat $(VIDEO_APPEND) >>$(BUILD_DIR)/$*.mpeg
mpegdemux -d $(MPEGDEMUX_AUDIO_STREAM) $@.temp $(BUILD_DIR)/$*.$(AUDIO_CODEC)
tcmplex -d 0 -i $(BUILD_DIR)/$*.mpeg -p $(BUILD_DIR)/$*.$(AUDIO_CODEC) \
    -o $@ -m d                                                         \
    ; test -f $@
rm -f $@.log $@.temp $(BUILD_DIR)/$*.mpeg $(BUILD_DIR)/$*.$(AUDIO_CODEC)
endef

endif

# Append nothing by default
VIDEO_APPEND := /dev/null

TITLE_SOURCES_AVI := $(filter %.avi,$(TITLE_SOURCES))
TITLE_SOURCES_MPEG := $(filter %.mpeg,$(TITLE_SOURCES))

$(patsubst %.avi,$(BUILD_DIR)/%.vob,$(TITLE_SOURCES_AVI)) : $(BUILD_DIR)/%.vob : %.avi
	$(RECODE_COMMANDS)
$(patsubst %.mpeg,$(BUILD_DIR)/%.vob,$(TITLE_SOURCES_MPEG)) : $(BUILD_DIR)/%.vob : %.mpeg
	$(RECODE_COMMANDS)

# The DebCamp videos were recorded at 16:9 aspect and made available
# at higher resolutions and rates than the others.
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob \
    : VIDEO_BITRATE := 1000
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob \
    : VIDEO_CODEC := mpeg2video
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob \
    : SIZE := $(WIDTH_HIRES):$(HEIGHT_HIRES)
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob \
    : FRAME_ASPECT_RATIO := 16/9

ifeq ($(STANDARD),pal)
# These have 48 kHz MP2 audio at a reasonable volume which we need not re-encode.
$(BUILD_DIR)/dc5video.debian.net/debcamp/1st-days.vob      \
$(BUILD_DIR)/dc5video.debian.net/debcamp/dc5-2nd_video.vob \
    : AUDIO_CODEC_TYPE := copy
endif

# These have either 48 kHz MP2 or MP3 audio and need not be resampled; mencoder
# will crash if we tell it to!
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob             \
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth.vob \
    : RESAMPLE :=

# Volume adjustments, based on normalize-audio output (see
# calculations in audio-levels.gnumeric) then adjusted by ear.
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/01-Greetings-Martin_Andreas_Branden.vob : VOLUME_ADJUST := -1.5281
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/03-What_is_Free_Software-Gunnar_Wolf.vob : VOLUME_ADJUST := -2.0572
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/04-Linux_Aktivaattori-Martin_Eric_Racine.vob : VOLUME_ADJUST := 6.4298
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/05-Custom_Debian_Distributions_and_Debian_Derivatives-Aigars_Mahinovs.vob : VOLUME_ADJUST := -0.8492
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/07-Debian_Release_Processes-Andreas_Barth.vob : VOLUME_ADJUST := 4.2783
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/08-Extremadura_Countys_70000_Debian_Workstations-Dario_Rapisardi_and_Pedro_Perez.vob : VOLUME_ADJUST := 0.4792
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/09-Getting_Involved_as_an_End_User-Alexander_Schmehl.vob : VOLUME_ADJUST := -5
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/10-Developing_Software_for_Debian-Martin_Eric_Racine.vob : VOLUME_ADJUST := 3.4004
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/11-How_Hewlett_Packard_benefits_from_Debian-Bdale_Garbee.vob : VOLUME_ADJUST := 7.1096
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/01-Welcome_to_Debconf-Debconf5_Organizers.vob : VOLUME_ADJUST := 3.2674
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/02-Debootstrap-Anthony_Towns.vob : VOLUME_ADJUST := -1.5769
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/03-Small_Teams_in_Debian-Andreas_Schuldei.vob : VOLUME_ADJUST := 1.392
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/04-Write_the_Fine_Manual-Branden_Robinson.vob : VOLUME_ADJUST := -5.8213
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/05-Multiarch_A_Proposal_and_an_Implementation-Tollef_Fog_Heen.vob : VOLUME_ADJUST := 4.4037
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/06-Debtags-Enrico_Zini.vob : VOLUME_ADJUST := -4.1598
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/01-Appealing_Presentations_with_LaTeX_Beamer-Andreas_Tille.vob : VOLUME_ADJUST := -3.0432
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/02-Debian_Development_in_the_Third_World_Latin_America-Gunnar_Wolf_and_Christian_Perrier.vob : VOLUME_ADJUST := -7.2244
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/03-Debian_Derivatives_Panel-Benjamin_Mako_Hill.vob : VOLUME_ADJUST := 1.6769
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/04-Search_Engines_in_Debian-Takatsugu_Nokubi.vob : VOLUME_ADJUST := -0.6644
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/05-Embedded_Debian_Demo-Wookey.vob : VOLUME_ADJUST := 3.5055
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/07-Debian_Release_Management-Andreas_Barth.vob : VOLUME_ADJUST := -0.2384
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/01-Alternate_Approaches_to_Package_Management_and_Autobuilding-Simon_Richter.vob : VOLUME_ADJUST := 4.3132
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/02-Software_in_the_Public_Interest_Workshop-Benjamin_Mako_Hill.vob : VOLUME_ADJUST := -0.6546
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/03-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt1.vob : VOLUME_ADJUST := 3.3491
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/04-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt2.vob : VOLUME_ADJUST := 5.3547
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/05-OpenOffice.org_in_Debian-Chris_Halls_Rene_Engelhard.vob : VOLUME_ADJUST := -2.1695
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/06-Writing_Enterprise_Ready_Software-Petter_Reinholdtsen.vob : VOLUME_ADJUST := 0.6344
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/07-Linda_A_Debian_Package_Checker_Written_in_Python-Steve_Kowalik.vob : VOLUME_ADJUST := -5.8066
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/08-Securing_the_Testing_Distribution-Joey_Hess.vob : VOLUME_ADJUST := -2.5415
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/01-Shared_Library_Packaging-Junichi_Uekawa.vob : VOLUME_ADJUST := 4.5807
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth.vob : VOLUME_ADJUST := -5.9671
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/03-Debian_Website_Round_Table-Frank_Lichtenheld-pt1.vob : VOLUME_ADJUST := -5.5512
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/04-Debian_Website_Round_Table-Frank_Lichtenheld-pt2.vob : VOLUME_ADJUST := -1.7103
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/05-Enrico_Zini-Zen_and_the_art_of_Free_Software.vob : VOLUME_ADJUST := 8.8851
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/06-Autobuilding_Experimental-Andreas_Barth.vob : VOLUME_ADJUST := -4.5348
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/08-Debian_New_Maintainer_Process-Hanna_Wallach_Dafydd_Harries_Moray_Allan.vob : VOLUME_ADJUST := -5.1758
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/01-Documentation_in_Debian-Takatsugu_Nokubi.vob : VOLUME_ADJUST := -5.046
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/02-Freezing_HEL_Over-Scott_James_Remnant.vob : VOLUME_ADJUST := 2.8995
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/03-Debian_Women_and_Women_in_Free_Software-Erinn_Clark_Magni_Onsoien.vob : VOLUME_ADJUST := -0.2381
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/04-Distributed_Revision_Control-Mark_Shuttleworth.vob : VOLUME_ADJUST := 7.2801
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/05-Evaluating_Open_Source_Software_for_Enterprise_Use-Martin_Langhoff.vob : VOLUME_ADJUST := 5.6442
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/07-Debian_Installer-Holger_Levsen_Joey_Hess_Christian_perrier_Frans_Pop.vob : VOLUME_ADJUST := 3.7804
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/01-Altivec_Optimizations_on_Debian_Powerpc-Konstainos_Margaritis.vob : VOLUME_ADJUST := 3.2143
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/02-Conducting_Cooperatively_Towards_a_Better_Debian-Jeroen_van_Wolffelaar.vob : VOLUME_ADJUST := 1.8822
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/04-Safer_Hex_in_Public-Holger_Levsen.vob : VOLUME_ADJUST := -0.7749
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/06-FAI_the_Fully_Automatic_Installation-Thomas_Lange.vob : VOLUME_ADJUST := 2.9299
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/08-Structural_Evolution-Bdale_Garbee.vob : VOLUME_ADJUST := 4.3415
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/09-Ending_Flamewars_With_Polygen-Enrico_Zini.vob : VOLUME_ADJUST := -2.1784
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/10-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt1.vob : VOLUME_ADJUST := 3.6095
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/11-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt2.vob : VOLUME_ADJUST := 3.4044
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/02-The_Debian_Free_Software_Guidelines-Matthew_Garret.vob : VOLUME_ADJUST := -1.1051
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/03-Volatile_Archive_for_Debian-Andreas_Barth.vob : VOLUME_ADJUST := 3.7935
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/04-Free_Standards-Matt_Taggart.vob : VOLUME_ADJUST := -0.4074
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/05-Cross_Compiling_Debian_from_Scratch-Timo_Savola.vob : VOLUME_ADJUST := 3.4139
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/06-Package_Management_and_Revision_Control-Scott_mes_Remnant.vob : VOLUME_ADJUST := -4.0033
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/07-Using_Debian_for_Science_Research-Helen_Faulkner.vob : VOLUME_ADJUST := 4.4906
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/08-Debconf_Closing_Remarks-Alexander_Schmehl_Branden_Robinson.vob : VOLUME_ADJUST := 7.1042
$(BUILD_DIR)/dc5video.debian.net/misc/dc5-band.vob : VOLUME_ADJUST := -4.8597

ifndef MINI
# Cutting
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/01-Greetings-Martin_Andreas_Branden.vob : MENCODER_FLAGS += -endpos 19:58
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/05-Custom_Debian_Distributions_and_Debian_Derivatives-Aigars_Mahinovs.vob : MENCODER_FLAGS += -endpos 32:41
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/06-A_Travel_Through_Debian-Juan_Jose_Amor.vob : MENCODER_FLAGS += -endpos 22:04
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/08-Extremadura_Countys_70000_Debian_Workstations-Dario_Rapisardi_and_Pedro_Perez.vob : MENCODER_FLAGS += -endpos 42:23
$(BUILD_DIR)/dc5video.debian.net/2005-07-09/09-Getting_Involved_as_an_End_User-Alexander_Schmehl.vob : MENCODER_FLAGS += -endpos 42:03
$(BUILD_DIR)/dc5video.debian.net/2005-07-10/06-Debtags-Enrico_Zini.vob : MENCODER_FLAGS += -ss 0:06 -endpos 44:30
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/01-Appealing_Presentations_with_LaTeX_Beamer-Andreas_Tille.vob : MENCODER_FLAGS += -ss 0:21 -endpos 39:33
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/03-Debian_Derivatives_Panel-Benjamin_Mako_Hill.vob : MENCODER_FLAGS += -endpos 1:43:53
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/04-Search_Engines_in_Debian-Takatsugu_Nokubi.vob : MENCODER_FLAGS += -ss 0:06 -endpos 51:59
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/06-Custom_Debian_Distribution-Andreas_Tille.vob :MENCODER_FLAGS += -ss 1:03 -endpos 44:26
$(BUILD_DIR)/dc5video.debian.net/2005-07-11/07-Debian_Release_Management-Andreas_Barth.vob : MENCODER_FLAGS += -endpos 42:35
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/02-Software_in_the_Public_Interest_Workshop-Benjamin_Mako_Hill.vob : MENCODER_FLAGS += -ss 0:13 -endpos 49:10
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/03-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt1.vob : MENCODER_FLAGS += -endpos 53:14
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/04-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt2.vob : MENCODER_FLAGS += -endpos 39:57
$(BUILD_DIR)/dc5video.debian.net/2005-07-12/06-Writing_Enterprise_Ready_Software-Petter_Reinholdtsen.vob : MENCODER_FLAGS += -ss 0:10 -endpos 43:01
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/01-Shared_Library_Packaging-Junichi_Uekawa.vob : MENCODER_FLAGS += -ss 0:35
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth.vob : MENCODER_FLAGS += -ss 0:14
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/03-Debian_Website_Round_Table-Frank_Lichtenheld-pt1.vob : MENCODER_FLAGS += -endpos 53:50
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/04-Debian_Website_Round_Table-Frank_Lichtenheld-pt2.vob : MENCODER_FLAGS += -ss 0:50 -endpos 40:55
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/08-Debian_New_Maintainer_Process-Hanna_Wallach_Dafydd_Harries_Moray_Allan.vob : MENCODER_FLAGS += -ss 0:26 -endpos 39:58
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/01-Documentation_in_Debian-Takatsugu_Nokubi.vob : MENCODER_FLAGS += -ss 0:06 -endpos 46:45
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/02-Freezing_HEL_Over-Scott_James_Remnant.vob : MENCODER_FLAGS += -endpos 45:22
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/04-Distributed_Revision_Control-Mark_Shuttleworth.vob : MENCODER_FLAGS += -ss 0:02
$(BUILD_DIR)/dc5video.debian.net/2005-07-15/06-Customization_of_GNU_libc_locale_files-Denis_Barbier.vob : MENCODER_FLAGS += -endpos 53:56
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/02-Conducting_Cooperatively_towards_a_better_Debian-Jeroen_van_Wolffelaar.vob : MENCODER_FLAGS += -endpos 46:53
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/04-Safer_Hex_in_Public-Holger_Levsen.vob : MENCODER_FLAGS += -endpos 35:29
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/07-Open_Source_in_South_Asia-Jaldhar_Vyas.vob : MENCODER_FLAGS += -endpos 42:33
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/12-Debian_Edu_Upgrading_a_Preconfigured_CDD-Petter_Reinholdtsen.vob : MENCODER_FLAGS += -endpos 46:16
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/02-The_Debian_Free_Software_Guidelines-Matthew_Garret.vob : MENCODER_FLAGS += -ss 0:06 -endpos 47:48
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/04-Free_Standards-Matt_Taggart.vob : MENCODER_FLAGS += -endpos 48:09
$(BUILD_DIR)/dc5video.debian.net/2005-07-17/06-Package_Management_and_Revision_Control-Scott_James_Remnant.vob : MENCODER_FLAGS += -endpos 42:42
endif

# This seems to have been filmed at 14:9 for some reason
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/06-FAI_the_Fully_Automatic_Installation-Thomas_Lange.vob : SIZE := $(WIDTH_LORES):$(HEIGHT_LORES_14_9)
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/06-FAI_the_Fully_Automatic_Installation-Thomas_Lange.vob : MENCODER_FLAGS += -vf expand=$(WIDTH_LORES):$(HEIGHT_LORES):0:$(Y_PAD_LORES_14_9)

# Append some blackness to the end of part 1 of each 2-part session

# A black still frame
$(BUILD_DIR)/black.ppm :
	(printf 'P6\n$(WIDTH_LORES) $(HEIGHT_LORES)\n255\n'          \
	 && dd if=/dev/zero bs=$(WIDTH_LORES) count=$(HEIGHT_LORES)) \
	 > $@                                                        \
	|| (rm -f $@ ; false)

# A black frame for about 2 seconds
$(BUILD_DIR)/black.mpeg : $(BUILD_DIR)/black.ppm
	ppmtoy4m -v0 -n 50 -r -F $(FRAME_RATE_RATIO) -A $(PIXEL_ASPECT_RATIO) \
	       -S 420_jpeg $<                                                 \
	| mpeg2enc -v0 -f 8 -a 2 -o $@

$(BUILD_DIR)/dc5video.debian.net/2005-07-12/03-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt1.vob \
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/03-Debian_Website_Round_Table-Frank_Lichtenheld-pt1.vob \
$(BUILD_DIR)/dc5video.debian.net/2005-07-16/10-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt1.vob \
	: $(BUILD_DIR)/black.mpeg
%-pt1.vob : VIDEO_APPEND := $(BUILD_DIR)/black.mpeg

### Magic ##################################################################

.PHONY : all clean default
.PRECIOUS : \
    dc5video.debian.net/%.avi dc5video.debian.net/%.mpeg \
    $(BUILD_DIR)/%.vob
