# 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 := 1.0~rc1

### 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

SOURCE_FORMAT := mpeg
ifeq ($(SOURCE_FORMAT),avi)
    ifndef SOURCE_DIR
        $(error You must define SOURCE_DIR)
    endif
    SOURCE_EXT := -c.avi
else
    ifeq ($(SOURCE_FORMAT),mpeg)
        # This needs to match the HTTP address of the sources in order for
        # auto-downloading to work.
        SOURCE_DIR := dc5video.debian.net/mpeg
        SOURCE_EXT := .mpeg
    else
        $(error SOURCE_FORMAT must be either "mpeg" if you are using  \
          MPEG-1 sources from dc5video.debian.net or "avi" if you are \
          using AVI sources)
    endif
endif
EXTRA_SOURCE_DIR := dc5video.debian.net/mpeg

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

# Determine video parameters
ifdef NTSC
    STANDARD := ntsc
else
    STANDARD := pal
endif
ifeq ($(STANDARD),secam)
    override STANDARD := pal
endif
WIDTH_LORES := 352
WIDTH_HIRES := 720
ifeq ($(STANDARD),pal)
    HEIGHT_LORES := 288
    HEIGHT_HIRES := 576
    STANDARD := pal
    FRAME_RATE := 25
    FRAME_RATE_RATIO := 25:1
    PIXEL_ASPECT_RATIO := 59:54
    MAX_GOP := 15
else
    ifeq ($(STANDARD),ntsc)
        HEIGHT_LORES := 240
        HEIGHT_HIRES := 480
        FRAME_RATE := 30000/1001
        FRAME_RATE_RATIO := 30000:1001
        PIXEL_ASPECT_RATIO := 10:11
        MAX_GOP := 18
    else
        $(error STANDARD must be "pal" or "secam" for PAL/SECAM output \
          or "ntsc" for NTSC output)
    endif
endif

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

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

MAIN_SOURCES := $(addprefix $(SOURCE_DIR)/,$(addsuffix $(SOURCE_EXT), \
    2005-07-09/01-Greetings-Martin_Andreas_Branden                       \
    2005-07-09/02-What_is_Debian-Jaldhar_H_Vyas                          \
    2005-07-09/03-What_is_Free_Software-Gunnar_Wolf                      \
    2005-07-09/04-Linux_Aktivaattori-Martin_Eric_Racine                  \
    2005-07-09/05-Custom_Debian_Distributions_and_Debian_Derivatives-Aigars_Mahinovs \
    2005-07-09/06-A_Travel_Through_Debian-Juan_Jose_Amor                 \
    2005-07-09/07-Debian_Release_Processes-Andreas_Barth                 \
    2005-07-09/08-Extremadura_Countys_70000_Debian_Workstations-Dario_Rapisardi_and_Pedro_Perez \
    2005-07-09/09-Getting_Involved_as_an_End_User-Alexander_Schmehl      \
    2005-07-09/10-Developing_Software_for_Debian-Martin_Eric_Racine      \
    2005-07-09/11-How_Hewlett_Packard_benefits_from_Debian-Bdale_Garbee  \
    2005-07-10/01-Welcome_to_Debconf-Debconf5_Organizers                 \
    2005-07-10/02-Debootstrap-Anthony_Towns                              \
    2005-07-10/03-Small_Teams_in_Debian-Andreas_Schuldei                 \
    2005-07-10/04-Write_the_Fine_Manual-Branden_Robinson                 \
    2005-07-10/05-Multiarch_A_Proposal_and_an_Implementation-Tollef_Fog_Heen \
    2005-07-10/06-Debtags-Enrico_Zini                                    \
    2005-07-11/01-Appealing_Presentations_with_LaTeX_Beamer-Andreas_Tille \
    2005-07-11/02-Debian_Development_in_the_Third_World_Latin_America-Gunnar_Wolf_and_Christian_Perrier \
    2005-07-11/03-Debian_Derivatives_Panel-Benjamin_Mako_Hill            \
    2005-07-11/04-Search_Engines_in_Debian-Takatsugu_Nokubi              \
    2005-07-11/05-Embedded_Debian_Demo-Wookey                            \
    2005-07-11/06-Custom_Debian_Distribution-Andreas_Tille               \
    2005-07-11/07-Debian_Release_Management-Andreas_Barth                \
    2005-07-12/01-Alternate_Approaches_to_Package_Management_and_Autobuilding-Simon_Richter \
    2005-07-12/02-Software_in_the_Public_Interest_Workshop-Benjamin_Mako_Hill \
    2005-07-12/03-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt1        \
    2005-07-12/04-Debbugs_Tips_Tricks_and_Hacks-Anthony_Towns-pt2        \
    2005-07-12/05-OpenOffice.org_in_Debian-Chris_Halls_Rene_Engelhard    \
    2005-07-12/06-Writing_Enterprise_Ready_Software-Petter_Reinholdtsen  \
    2005-07-12/07-Linda_A_Debian_Package_Checker_Written_in_Python-Steve_Kowalik \
    2005-07-12/08-Securing_the_Testing_Distribution-Joey_Hess            \
    2005-07-14/01-Shared_Library_Packaging-Junichi_Uekawa                \
    2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth                          \
    2005-07-14/03-Debian_Website_Round_Table-Frank_Lichtenheld-pt1       \
    2005-07-14/04-Debian_Website_Round_Table-Frank_Lichtenheld-pt2       \
    2005-07-14/05-Enrico_Zini-Zen_and_the_art_of_Free_Software           \
    2005-07-14/06-Autobuilding_Experimental-Andreas_Barth                \
    2005-07-14/07-Debian_Kernel_Team_Overview_and_Status-Dann_Frazier    \
    2005-07-14/08-Debian_New_Maintainer_Process-Hanna_Wallach_Dafydd_Harries_Moray_Allan \
    2005-07-15/01-Documentation_in_Debian-Takatsugu_Nokubi               \
    2005-07-15/02-Freezing_HEL_Over-Scott_James_Remnant                  \
    2005-07-15/03-Debian_Women_and_Women_in_Free_Software-Erinn_Clark_Magni_Onsoien \
    2005-07-15/04-Distributed_Revision_Control-Mark_Shuttleworth         \
    2005-07-15/05-Evaluating_Open_Source_Software_for_Enterprise_Use-Martin_Langhoff \
    2005-07-15/06-Customization_of_GNU_libc_locale_files-Denis_Barbier   \
    2005-07-15/07-Debian_Installer-Holger_Levsen_Joey_Hess_Christian_perrier_Frans_Pop \
    2005-07-15/08-Are_We_Really_Devoted_to_Our_Users-Margarita_Manterola \
    2005-07-16/01-Altivec_Optimizations_on_Debian_Powerpc-Konstantinos_Margaritis \
    2005-07-16/02-Conducting_Cooperatively_Towards_a_Better_Debian-Jeroen_van_Wolffelaar \
    2005-07-16/03-Debian_Med-Andreas_Tille                               \
    2005-07-16/04-Safer_Hex_in_Public-Holger_Levsen                      \
    2005-07-16/06-FAI_the_Fully_Automatic_Installation-Thomas_Lange      \
    2005-07-16/07-Open_Source_in_South_Asia-Jaldhar_Vyas                 \
    2005-07-16/08-Structural_Evolution-Bdale_Garbee                      \
    2005-07-16/09-Ending_Flamewars_With_Polygen-Enrico_Zini              \
    2005-07-16/10-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt1 \
    2005-07-16/11-Programs_Debconf_Man_Pages_Translations_With_Gettext-Christian_Perrier-pt2 \
    2005-07-16/12-Debian_Edu_Upgrading_a_Preconfigured_CDD-Petter_Reinholdtsen \
    2005-07-17/01-Next_Generation_Debian_Initscripts-Henrique_de_Moraes_Holschuh \
    2005-07-17/02-The_Debian_Free_Software_Guidelines-Matthew_Garret     \
    2005-07-17/03-Volatile_Archive_for_Debian-Andreas_Barth              \
    2005-07-17/04-Free_Standards-Matt_Taggart                            \
    2005-07-17/05-Cross_Compiling_Debian_from_Scratch-Timo_Savola        \
    2005-07-17/06-Package_Management_and_Revision_Control-Scott_James_Remnant \
    2005-07-17/07-Using_Debian_for_Science_Research-Helen_Faulkner       \
    2005-07-17/08-Debconf_Closing_Remarks-Alexander_Schmehl_Branden_Robinson \
    ))
EXTRA_SOURCES := $(addprefix $(EXTRA_SOURCE_DIR)/,                       \
    debcamp/1st-days.mpeg                                                \
    debcamp/dc5-2nd_video.mpeg                                           \
    debcamp/dc5-3rd-960x540.avi                                          \
    misc/dc5-band.avi)
TITLE_SOURCES_SL1 := \
    $(filter $(SOURCE_DIR)/2005-07-09/%  \
             $(SOURCE_DIR)/2005-07-10/%  \
             $(SOURCE_DIR)/2005-07-11/%  \
             $(SOURCE_DIR)/2005-07-12/%, \
      $(MAIN_SOURCES))
TITLE_SOURCES_SL2 := \
    $(filter $(SOURCE_DIR)/2005-07-14/%  \
             $(SOURCE_DIR)/2005-07-15/%  \
             $(SOURCE_DIR)/2005-07-16/%  \
             $(SOURCE_DIR)/2005-07-17/%, \
      $(MAIN_SOURCES))                   \
    $(EXTRA_SOURCES)
TITLE_SOURCES_DL := $(SESSION_SOURCES) $(EXTRA_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
$(SOURCE_DIR)/%.avi $(SOURCE_DIR)/%.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 $(SOURCE_DIR)/%$(SOURCE_EXT),%.vob,        \
          $(TITLE_SOURCES_SL1)))
$(DVD_IMAGE_BASE)-sl2-$(STANDARD).iso                         \
    : $(addprefix $(BUILD_DIR)/,                              \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_SL2)) \
        $(patsubst $(SOURCE_DIR)/%$(SOURCE_EXT),%.vob,        \
          $(patsubst $(EXTRA_SOURCE_DIR)/%.avi,%.vob,         \
            $(patsubst $(EXTRA_SOURCE_DIR)/%.mpeg,%.vob,      \
              $(TITLE_SOURCES_SL2)))))
$(DVD_IMAGE_BASE)-dl-$(STANDARD).iso                          \
    : $(addprefix $(BUILD_DIR)/,                              \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_DL))  \
        $(patsubst $(SOURCE_DIR)/%$(SOURCE_EXT),%.vob,        \
          $(patsubst $(EXTRA_SOURCE_DIR)/%.avi,%.vob,         \
            $(patsubst $(EXTRA_SOURCE_DIR)/%.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,$(RESIZE),harddup $(RESAMPLE)     \
    -af volume=$(VOLUME_ADJUST) -quiet $(CUT)

# Default values for mencoder options that need to be overridden for some
# files.
AUDIO_CODEC_TYPE := lavc
FRAME_ASPECT_RATIO := 4/3
VOLUME_ADJUST := 0
RESIZE := scale=$(WIDTH_LORES):$(HEIGHT_LORES)
ifeq ($(SOURCE_FORMAT),mpeg)
    RESAMPLE := -af resample=48000:0:2 -srate 48000
else
    RESAMPLE :=
endif
ifdef MINI
    CUT := -endpos 1:00
else
    CUT :=
endif

# 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

EXTRA_SOURCES_AVI := $(filter $(EXTRA_SOURCE_DIR)/%.avi,$(EXTRA_SOURCES))
EXTRA_SOURCES_MPEG := $(filter $(EXTRA_SOURCE_DIR)/%.mpeg,$(EXTRA_SOURCES))

$(patsubst $(SOURCE_DIR)/%$(SOURCE_EXT),$(BUILD_DIR)/%.vob,$(MAIN_SOURCES)) \
    : $(BUILD_DIR)/%.vob : $(SOURCE_DIR)/%$(SOURCE_EXT)
	$(RECODE_COMMANDS)
$(patsubst $(EXTRA_SOURCE_DIR)/%.avi,$(BUILD_DIR)/%.vob,$(EXTRA_SOURCES_AVI)) \
    : $(BUILD_DIR)/%.vob : $(EXTRA_SOURCE_DIR)/%.avi
	$(RECODE_COMMANDS)
$(patsubst $(EXTRA_SOURCE_DIR)/%.mpeg,$(BUILD_DIR)/%.vob,$(EXTRA_SOURCES_MPEG)) \
    : $(BUILD_DIR)/%.vob : $(EXTRA_SOURCE_DIR)/%.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)/debcamp/%.vob : VIDEO_BITRATE := 1000
$(BUILD_DIR)/debcamp/%.vob : VIDEO_CODEC := mpeg2video
$(BUILD_DIR)/debcamp/%.vob : RESIZE := scale=$(WIDTH_HIRES):$(HEIGHT_HIRES)
$(BUILD_DIR)/debcamp/%.vob : FRAME_ASPECT_RATIO := 16/9

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

ifeq ($(SOURCE_FORMAT),mpeg)
# These have either 48 kHz MP2 or MP3 audio and need not be resampled;
# mencoder may crash if we tell it to.
$(BUILD_DIR)/debcamp/%.vob \
$(BUILD_DIR)/2005-07-14/02-%.vob \
    : RESAMPLE :=
else
# This one has 32 kHz audio.
$(BUILD_DIR)/2005-07-12/06-%.vob \
    : RESAMPLE := -af resample=48000:0:2 -srate 48000
endif

# Volume adjustments, based on normalize-audio output (see
# calculations in audio-levels.gnumeric) then adjusted by ear.
$(BUILD_DIR)/2005-07-09/01-%.vob : VOLUME_ADJUST := -1.5281
$(BUILD_DIR)/2005-07-09/03-%.vob : VOLUME_ADJUST := -2.0572
$(BUILD_DIR)/2005-07-09/04-%.vob : VOLUME_ADJUST := 6.4298
$(BUILD_DIR)/2005-07-09/05-%.vob : VOLUME_ADJUST := -0.8492
$(BUILD_DIR)/2005-07-09/07-%.vob : VOLUME_ADJUST := 4.2783
$(BUILD_DIR)/2005-07-09/08-%.vob : VOLUME_ADJUST := 0.4792
$(BUILD_DIR)/2005-07-09/09-%.vob : VOLUME_ADJUST := -5
$(BUILD_DIR)/2005-07-09/10-%.vob : VOLUME_ADJUST := 3.4004
$(BUILD_DIR)/2005-07-09/11-%.vob : VOLUME_ADJUST := 7.1096
$(BUILD_DIR)/2005-07-10/01-%.vob : VOLUME_ADJUST := 3.2674
$(BUILD_DIR)/2005-07-10/02-%.vob : VOLUME_ADJUST := -1.5769
$(BUILD_DIR)/2005-07-10/03-%.vob : VOLUME_ADJUST := 1.392
$(BUILD_DIR)/2005-07-10/04-%.vob : VOLUME_ADJUST := -5.8213
$(BUILD_DIR)/2005-07-10/05-%.vob : VOLUME_ADJUST := 4.4037
$(BUILD_DIR)/2005-07-10/06-%.vob : VOLUME_ADJUST := -4.1598
$(BUILD_DIR)/2005-07-11/01-%.vob : VOLUME_ADJUST := -3.0432
$(BUILD_DIR)/2005-07-11/02-%.vob : VOLUME_ADJUST := -7.2244
$(BUILD_DIR)/2005-07-11/03-%.vob : VOLUME_ADJUST := 1.6769
$(BUILD_DIR)/2005-07-11/04-%.vob : VOLUME_ADJUST := -0.6644
$(BUILD_DIR)/2005-07-11/05-%.vob : VOLUME_ADJUST := 3.5055
$(BUILD_DIR)/2005-07-11/07-%.vob : VOLUME_ADJUST := -0.2384
$(BUILD_DIR)/2005-07-12/01-%.vob : VOLUME_ADJUST := 4.3132
$(BUILD_DIR)/2005-07-12/02-%.vob : VOLUME_ADJUST := -0.6546
$(BUILD_DIR)/2005-07-12/03-%.vob : VOLUME_ADJUST := 3.3491
$(BUILD_DIR)/2005-07-12/04-%.vob : VOLUME_ADJUST := 5.3547
$(BUILD_DIR)/2005-07-12/05-%.vob : VOLUME_ADJUST := -2.1695
$(BUILD_DIR)/2005-07-12/06-%.vob : VOLUME_ADJUST := 0.6344
$(BUILD_DIR)/2005-07-12/07-%.vob : VOLUME_ADJUST := -5.8066
$(BUILD_DIR)/2005-07-12/08-%.vob : VOLUME_ADJUST := -2.5415
$(BUILD_DIR)/2005-07-14/01-%.vob : VOLUME_ADJUST := 4.5807
$(BUILD_DIR)/2005-07-14/02-%.vob : VOLUME_ADJUST := -5.9671
$(BUILD_DIR)/2005-07-14/03-%.vob : VOLUME_ADJUST := -5.5512
$(BUILD_DIR)/2005-07-14/04-%.vob : VOLUME_ADJUST := -1.7103
$(BUILD_DIR)/2005-07-14/05-%.vob : VOLUME_ADJUST := 8.8851
$(BUILD_DIR)/2005-07-14/06-%.vob : VOLUME_ADJUST := -4.5348
$(BUILD_DIR)/2005-07-14/07-%.vob : VOLUME_ADJUST := -10.7033
$(BUILD_DIR)/2005-07-14/08-%.vob : VOLUME_ADJUST := -5.1758
$(BUILD_DIR)/2005-07-15/01-%.vob : VOLUME_ADJUST := -5.046
$(BUILD_DIR)/2005-07-15/02-%.vob : VOLUME_ADJUST := 2.8995
$(BUILD_DIR)/2005-07-15/03-%.vob : VOLUME_ADJUST := -0.2381
$(BUILD_DIR)/2005-07-15/04-%.vob : VOLUME_ADJUST := 7.2801
$(BUILD_DIR)/2005-07-15/05-%.vob : VOLUME_ADJUST := 5.6442
$(BUILD_DIR)/2005-07-15/07-%.vob : VOLUME_ADJUST := 3.7804
$(BUILD_DIR)/2005-07-16/01-%.vob : VOLUME_ADJUST := 3.2143
$(BUILD_DIR)/2005-07-16/02-%.vob : VOLUME_ADJUST := 1.8822
$(BUILD_DIR)/2005-07-16/03-%.vob : VOLUME_ADJUST := -2.2888
$(BUILD_DIR)/2005-07-16/04-%.vob : VOLUME_ADJUST := -0.7749
$(BUILD_DIR)/2005-07-16/06-%.vob : VOLUME_ADJUST := 2.9299
$(BUILD_DIR)/2005-07-16/08-%.vob : VOLUME_ADJUST := 4.3415
$(BUILD_DIR)/2005-07-16/09-%.vob : VOLUME_ADJUST := -2.1784
$(BUILD_DIR)/2005-07-16/10-%.vob : VOLUME_ADJUST := 3.6095
$(BUILD_DIR)/2005-07-16/11-%.vob : VOLUME_ADJUST := 3.4044
$(BUILD_DIR)/2005-07-17/02-%.vob : VOLUME_ADJUST := -1.1051
$(BUILD_DIR)/2005-07-17/03-%.vob : VOLUME_ADJUST := 3.7935
$(BUILD_DIR)/2005-07-17/04-%.vob : VOLUME_ADJUST := -0.4074
$(BUILD_DIR)/2005-07-17/05-%.vob : VOLUME_ADJUST := 3.4139
$(BUILD_DIR)/2005-07-17/06-%.vob : VOLUME_ADJUST := -4.0033
$(BUILD_DIR)/2005-07-17/07-%.vob : VOLUME_ADJUST := 4.4906
$(BUILD_DIR)/2005-07-17/08-%.vob : VOLUME_ADJUST := 7.1042
$(BUILD_DIR)/misc/dc5-band.vob : VOLUME_ADJUST := -4.8597

ifndef MINI
$(BUILD_DIR)/2005-07-09/01-%.vob : CUT := -endpos 19:58
$(BUILD_DIR)/2005-07-09/05-%.vob : CUT := -endpos 32:41
$(BUILD_DIR)/2005-07-09/06-%.vob : CUT := -endpos 22:04
$(BUILD_DIR)/2005-07-09/08-%.vob : CUT := -endpos 42:23
$(BUILD_DIR)/2005-07-09/09-%.vob : CUT := -endpos 42:03
$(BUILD_DIR)/2005-07-10/06-%.vob : CUT := -ss 0:06 -endpos 44:30
$(BUILD_DIR)/2005-07-11/01-%.vob : CUT := -ss 0:21 -endpos 39:33
$(BUILD_DIR)/2005-07-11/03-%.vob : CUT := -endpos 1:43:53
$(BUILD_DIR)/2005-07-11/04-%.vob : CUT := -ss 0:06 -endpos 51:59
$(BUILD_DIR)/2005-07-11/06-%.vob : CUT := -ss 1:03 -endpos 44:26
$(BUILD_DIR)/2005-07-11/07-%.vob : CUT := -endpos 42:35
$(BUILD_DIR)/2005-07-12/02-%.vob : CUT := -ss 0:13 -endpos 49:10
$(BUILD_DIR)/2005-07-12/03-%.vob : CUT := -endpos 53:14
$(BUILD_DIR)/2005-07-12/04-%.vob : CUT := -endpos 39:57
$(BUILD_DIR)/2005-07-12/06-%.vob : CUT := -ss 0:10 -endpos 43:01
$(BUILD_DIR)/2005-07-14/01-%.vob : CUT := -ss 0:35
$(BUILD_DIR)/2005-07-14/02-%.vob : CUT := -ss 0:14
$(BUILD_DIR)/2005-07-14/03-%.vob : CUT := -endpos 53:50
$(BUILD_DIR)/2005-07-14/04-%.vob : CUT := -ss 0:50 -endpos 40:55
$(BUILD_DIR)/2005-07-14/08-%.vob : CUT := -ss 0:26 -endpos 39:58
$(BUILD_DIR)/2005-07-15/01-%.vob : CUT := -ss 0:06 -endpos 46:45
$(BUILD_DIR)/2005-07-15/02-%.vob : CUT := -endpos 45:22
$(BUILD_DIR)/2005-07-15/04-%.vob : CUT := -ss 0:02
$(BUILD_DIR)/2005-07-15/06-%.vob : CUT := -endpos 53:56
$(BUILD_DIR)/2005-07-16/02-%.vob : CUT := -endpos 46:53
$(BUILD_DIR)/2005-07-16/04-%.vob : CUT := -endpos 35:29
$(BUILD_DIR)/2005-07-16/07-%.vob : CUT := -endpos 42:33
$(BUILD_DIR)/2005-07-16/12-%.vob : CUT := -endpos 46:16
$(BUILD_DIR)/2005-07-17/02-%.vob : CUT := -ss 0:06 -endpos 47:48
$(BUILD_DIR)/2005-07-17/04-%.vob : CUT := -endpos 48:09
$(BUILD_DIR)/2005-07-17/06-%.vob : CUT := -endpos 42:42
endif

ifeq ($(SOURCE_FORMAT),avi)
$(BUILD_DIR)/2005-07-10/03-%.vob : MENCODER_FLAGS += -forceidx
endif

ifeq ($(SOURCE_FORMAT),avi)
# Crop sources from 720 pixels wide to 704 so the scaling down to 352 is
# neater.
$(BUILD_DIR)/2005-07-09/%.vob \
$(BUILD_DIR)/2005-07-10/01-%.vob \
$(BUILD_DIR)/2005-07-10/02-%.vob \
$(BUILD_DIR)/2005-07-10/04-%.vob \
$(BUILD_DIR)/2005-07-10/05-%.vob \
$(BUILD_DIR)/2005-07-10/06-%.vob \
$(BUILD_DIR)/2005-07-11/02-%.vob \
$(BUILD_DIR)/2005-07-11/03-%.vob \
$(BUILD_DIR)/2005-07-11/04-%.vob \
$(BUILD_DIR)/2005-07-11/05-%.vob \
$(BUILD_DIR)/2005-07-11/06-%.vob \
$(BUILD_DIR)/2005-07-11/07-%.vob \
$(BUILD_DIR)/2005-07-11/08-%.vob \
$(BUILD_DIR)/2005-07-12/01-%.vob \
$(BUILD_DIR)/2005-07-12/03-%.vob \
$(BUILD_DIR)/2005-07-12/04-%.vob \
$(BUILD_DIR)/2005-07-12/06-%.vob \
$(BUILD_DIR)/2005-07-12/07-%.vob \
$(BUILD_DIR)/2005-07-12/08-%.vob \
$(BUILD_DIR)/2005-07-14/01-%.vob \
$(BUILD_DIR)/2005-07-14/02-%.vob \
$(BUILD_DIR)/2005-07-14/05-%.vob \
$(BUILD_DIR)/2005-07-14/07-%.vob \
$(BUILD_DIR)/2005-07-14/08-%.vob \
$(BUILD_DIR)/2005-07-15/02-%.vob \
$(BUILD_DIR)/2005-07-15/03-%.vob \
$(BUILD_DIR)/2005-07-15/04-%.vob \
$(BUILD_DIR)/2005-07-15/05-%.vob \
$(BUILD_DIR)/2005-07-15/07-%.vob \
$(BUILD_DIR)/2005-07-15/08-%.vob \
$(BUILD_DIR)/2005-07-16/02-%.vob \
$(BUILD_DIR)/2005-07-16/04-%.vob \
$(BUILD_DIR)/2005-07-16/08-%.vob \
$(BUILD_DIR)/2005-07-16/10-%.vob \
$(BUILD_DIR)/2005-07-16/11-%.vob \
$(BUILD_DIR)/2005-07-17/01-%.vob \
$(BUILD_DIR)/2005-07-17/03-%.vob \
$(BUILD_DIR)/2005-07-17/05-%.vob \
$(BUILD_DIR)/2005-07-17/07-%.vob \
$(BUILD_DIR)/2005-07-17/08-%.vob \
    : RESIZE := crop=704:576,scale=$(WIDTH_LORES):$(HEIGHT_LORES)
$(BUILD_DIR)/2005-07-10/03-%.vob \
$(BUILD_DIR)/2005-07-11/01-%.vob \
$(BUILD_DIR)/2005-07-12/02-%.vob \
$(BUILD_DIR)/2005-07-12/05-%.vob \
$(BUILD_DIR)/2005-07-14/03-%.vob \
$(BUILD_DIR)/2005-07-14/04-%.vob \
$(BUILD_DIR)/2005-07-14/06-%.vob \
$(BUILD_DIR)/2005-07-15/01-%.vob \
$(BUILD_DIR)/2005-07-15/06-%.vob \
$(BUILD_DIR)/2005-07-16/01-%.vob \
$(BUILD_DIR)/2005-07-16/03-%.vob \
$(BUILD_DIR)/2005-07-16/07-%.vob \
$(BUILD_DIR)/2005-07-16/09-%.vob \
$(BUILD_DIR)/2005-07-16/12-%.vob \
$(BUILD_DIR)/2005-07-17/02-%.vob \
$(BUILD_DIR)/2005-07-17/04-%.vob \
$(BUILD_DIR)/2005-07-17/06-%.vob \
    : RESIZE := crop=704:480,scale=$(WIDTH_LORES):$(HEIGHT_LORES)
# This appears to have been filmed at a ratio something like 14:9, or
# cropped afterwards.  Adding 20% letterboxes seems to make it look right.
$(BUILD_DIR)/2005-07-16/06-%.vob \
    : RESIZE := crop=704:480,expand=704,576,scale=$(WIDTH_LORES):$(HEIGHT_LORES)
else
# Crop 360-pixel wide sources to 352 so there is no need to scale
# their width.  Crop a full 8 pixels on the right so the blocks remain
# horizontally aligned.
$(BUILD_DIR)/2005-07-11/01-%.vob \
$(BUILD_DIR)/2005-07-11/04-%.vob \
$(BUILD_DIR)/2005-07-12/02-%.vob \
$(BUILD_DIR)/2005-07-14/03-%.vob \
$(BUILD_DIR)/2005-07-14/04-%.vob \
$(BUILD_DIR)/2005-07-14/06-%.vob \
$(BUILD_DIR)/2005-07-15/01-%.vob \
$(BUILD_DIR)/2005-07-15/06-%.vob \
$(BUILD_DIR)/2005-07-16/01-%.vob \
$(BUILD_DIR)/2005-07-16/03-%.vob \
$(BUILD_DIR)/2005-07-16/06-%.vob \
$(BUILD_DIR)/2005-07-16/07-%.vob \
$(BUILD_DIR)/2005-07-16/09-%.vob \
$(BUILD_DIR)/2005-07-16/12-%.vob \
$(BUILD_DIR)/2005-07-17/02-%.vob \
$(BUILD_DIR)/2005-07-17/04-%.vob \
$(BUILD_DIR)/2005-07-17/06-%.vob \
    : RESIZE := crop=352:240:0:0,scale=$(WIDTH_LORES):$(HEIGHT_LORES)
# This appears to have been filmed at a ratio something like 14:9, or
# cropped afterwards.  Adding 20% letterboxes seems to make it look right.
$(BUILD_DIR)/2005-07-16/06-%.vob \
    : RESIZE := crop=352:240,expand=352:288,scale=$(WIDTH_LORES):$(HEIGHT_LORES)
endif

# 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=$$(dc -e '$(WIDTH_LORES) 3 * p')      \
                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 0 -a 2 -o $@

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

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

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