# Makefile for Debconf5 DVDs

# Copyright 2005 Ben Hutchings
# See "copyright" file for licence terms.

VERSION = 0.6

# Define the variable DOWNLOAD if you want to have videos downloaded
# automatically as needed.

# By default, this will generate single-layer disc images with video
# at PAL resolutions. Define the variable NTSC if you want to generate
# video at NTSC resolutions.  Define the variable DUAL_LAYER if you
# want to generate a dual-layer disc image.  You will also need to
# reduce VIDEO_BITRATE and/or AUDIO_BITRATE from their default values
# of 300 and 96 to fit everything onto one dual-layer disc.

# Define MINI to include just 1 minute of each video.  This is useful
# for quickly trialling changes to menus.  This will use a separate
# build directory so it won't interfere with full recoded videos.

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 := 704
ifdef NTSC
    HEIGHT_LORES := 240
    HEIGHT_HIRES := 480
    HEIGHT_HIRES_16_9 := 400
    STANDARD := ntsc
    FRAME_RATE := 30000/1001
    FRAME_RATE_RATIO := 30000:1001
    PIXEL_ASPECT_RATIO := 10:11
    MAX_GOP := 15
else
    HEIGHT_LORES := 288
    HEIGHT_HIRES := 576
    HEIGHT_HIRES_16_9 := 480
    STANDARD := pal
    FRAME_RATE := 25
    FRAME_RATE_RATIO := 25:1
    PIXEL_ASPECT_RATIO := 59:54
    MAX_GOP := 12
endif

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

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

# Source videos
TITLE_SOURCES_1 := $(addprefix dc5video.debian.net/,                          \
    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            \
    debcamp/1st-days.mpeg                                                     \
    debcamp/dc5-2nd_video.mpeg                                                \
    debcamp/dc5-3rd-960x540.avi                                               \
    misc/dc5-band.avi                                                         \
    )
TITLE_SOURCES_2 := $(addprefix dc5video.debian.net/,                          \
    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/Conducting_Cooperatively_towards_a_better_Debian-Jeroen_van_Wolffelaar.mpeg \
    2005-07-16/FAI_the_Fully_Automatic_Installation-Thomas-Lange.mpeg         \
    2005-07-16/Safer_Hex_in_Public-Holger_Levsen.mpeg                         \
    2005-07-16/Structural_Evolution-Bdale_Garbee.mpeg                         \
    2005-07-16/Tutorial_of_translation_using_gettext-Christian_Perrier-part1.mpeg \
    2005-07-16/Tutorial_of_translation_using_gettext-Christian_Perrier-part2.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/07-Using_Debian_for_Science_Research-Helen_Faulkner.mpeg       \
    2005-07-17/08-Debconf_Closing_Remarks-Alexander_Schmehl_Branden_Robinson.mpeg \
    )
TITLE_SOURCES_DL := $(TITLE_SOURCES_1) $(TITLE_SOURCES_2)
MENU_SOURCES_1 := main.dvdmenu credits-1.dvdmenu credits-2.dvdmenu  \
    credits-3.dvdmenu credits-4.dvdmenu extras.dvdmenu              \
    debcamp.dvdmenu group-with-banner.ppm debian-day-1.dvdmenu      \
    debian-day-2.dvdmenu talks-disc1.dvdmenu talks-10th.dvdmenu     \
    talks-11th.dvdmenu talks-12th-disc1.dvdmenu
MENU_SOURCES_2 := main-disc2.dvdmenu credits-1.dvdmenu              \
    credits-2.dvdmenu credits-3.dvdmenu credits-4.dvdmenu           \
    talks-disc2.dvdmenu talks-14th.dvdmenu talks-15th-1.dvdmenu     \
    talks-15th-2.dvdmenu talks-16th.dvdmenu talks-17th.dvdmenu 
MENU_SOURCES_DL := main.dvdmenu credits-1.dvdmenu credits-2.dvdmenu \
    credits-3.dvdmenu credits-4.dvdmenu extras.dvdmenu              \
    debcamp.dvdmenu group-with-banner.ppm 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.dvdmenu    \
    talks-17th.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)-1-$(STANDARD).iso \
          $(DVD_IMAGE_BASE)-2-$(STANDARD).iso
endif

all : $(DVD_IMAGE_BASE)-dl-$(STANDARD).iso \
      $(DVD_IMAGE_BASE)-1-$(STANDARD).iso  \
      $(DVD_IMAGE_BASE)-2-$(STANDARD).iso

clean :
	rm -f vobs $(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)

$(DVD_IMAGE_BASE)-dl-$(STANDARD).iso                             \
    : $(addprefix $(BUILD_DIR)/,                                 \
        $(patsubst %.dvdmenu,%-menu.vob, $(patsubst %.ppm,%.vob, \
          $(MENU_SOURCES_DL)))                                   \
        $(patsubst %.avi,%.vob, $(patsubst %.mpeg,%.vob,         \
          $(TITLE_SOURCES_DL))))
$(DVD_IMAGE_BASE)-1-$(STANDARD).iso                              \
    : $(addprefix $(BUILD_DIR)/,                                 \
        $(patsubst %.dvdmenu,%-menu.vob, $(patsubst %.ppm,%.vob, \
          $(MENU_SOURCES_1)))                                    \
        $(patsubst %.avi,%.vob, $(patsubst %.mpeg,%.vob,         \
          $(TITLE_SOURCES_1))))
$(DVD_IMAGE_BASE)-2-$(STANDARD).iso                              \
    : $(addprefix $(BUILD_DIR)/,                                 \
        $(patsubst %.dvdmenu,%-menu.vob, $(MENU_SOURCES_2))      \
        $(patsubst %.mpeg,%.vob, $(TITLE_SOURCES_2)))

$(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
	mkisofs -o $@ -dvd-video $(TEMP_DIR) || (rm -rf $@ $(TEMP_DIR) ; false)
	rm -rf $(TEMP_DIR)

ifeq ($(STANDARD),pal)
    SCALE_COMMAND = cat $<
    YSCALE := 1.0
else
    SCALE_COMMAND = pnmscale -xscale=1 -ysize=$(HEIGHT_HIRES) $<
    YSCALE := 0.8333333333
endif

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

# Convert MPEG2 video to MPEG2 PS
%.vob : %.mpeg
	mplex -v0 -f 8 -o $@ $<

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

# Generic mencoder options.
MENCODER_FLAGS = -of mpeg -ovc lavc -oac $(AUDIO_CODEC_TYPE) \
    -mpegopts format=dvd:reorder:vframerate=$(FRAME_RATE):vaspect=$(FRAME_ASPECT_RATIO) \
    -lavcopts vcodec=$(VIDEO_CODEC):vbitrate=$(VIDEO_BITRATE):vratetol=100000:vqcomp=0.8:keyint=$(MAX_GOP):acodec=$(AUDIO_CODEC):abitrate=$(AUDIO_BITRATE) \
    -ofps $(FRAME_RATE) -vf scale=$(SIZE),harddup $(RESAMPLE)
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

# Extended regex for mencoder warnings that should be ignored.
MENCODER_JUNK := "^[0-9]* duplicate frame|^$$|frameno\.avi| but disabled$$|\
font[: ]|selected video_out device is incompatible|^Limiting audio\
preload|^Increasing audio density|^Skipping frame!"

# 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.
define RECODE_COMMANDS
mkdir -p $(dir $@)
mencoder $(MENCODER_FLAGS) -o $@.temp $< 2>&1 >/dev/null \
    | egrep -v $(MENCODER_JUNK)                          \
    ; test $${PIPESTATUS[0]} -eq 0
mpegdemux -d $(MPEGDEMUX_VIDEO_STREAM) $@.temp $(BUILD_DIR)/$*.mpeg
mpegdemux -d $(MPEGDEMUX_AUDIO_STREAM) $@.temp $(BUILD_DIR)/$*.$(AUDIO_CODEC)
mplex -v0 -f 8 -o $@ $(BUILD_DIR)/$*.mpeg $(BUILD_DIR)/$*.$(AUDIO_CODEC)
rm -f $@.temp $(BUILD_DIR)/$*.mpeg $(BUILD_DIR)/$*.$(AUDIO_CODEC)
endef

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

$(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, so maintain these
# as far as possible when re-encoding.
$(BUILD_DIR)/dc5video.debian.net/debcamp/1st-days.vob        \
$(BUILD_DIR)/dc5video.debian.net/debcamp/dc5-2nd_video.vob   \
    : VIDEO_BITRATE := 1000
$(BUILD_DIR)/dc5video.debian.net/debcamp/dc5-3rd-960x540.vob \
    : VIDEO_BITRATE := 2000
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob               \
    : VIDEO_CODEC := mpeg2video
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob               \
    : AUDIO_BITRATE := 128
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob               \
    : SIZE := $(WIDTH_HIRES):$(HEIGHT_HIRES_16_9)
$(BUILD_DIR)/dc5video.debian.net/debcamp/%.vob               \
    : FRAME_ASPECT_RATIO := 16/9

ifeq ($(STANDARD),pal)
# These have 48 kHz MP2 audio 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 \
$(BUILD_DIR)/dc5video.debian.net/2005-07-14/02-Ubuntu_Talk-Mark_Shuttleworth.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 :=

# 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

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