1#!/usr/local/bin/bash
2#
3# QEPDVCD
4#
5# Most of this stuff comes straight from MPlayer documentation.
6# Options are limited only to a small useful subset, if you
7# want more control, RTFM and DIY.
8#
9# Version:          0.1
10#
11# Licence:          GPL
12#
13# Author:           Reynaldo H. Verdejo Pinochet <reynaldo@opendot.cl>
14#
15# Script:           MPlayer Sources. Anything supported to vcd/svcd pal/ntsc
16#
17# requires:         mencoder
18#
19# sugests:          vcdimager / cdrecord
20#
21# Thanks to:        Carlos Navarro Salas - name author ;)
22#
23#
24
25# Defaults
26
27MYNAME=`basename $0`
28TARGET="svcd"
29ENCQ="2"
30ABPS="224"
31VBPS="2000"
32NORM="NTSC"
33SPLIT="0"
34TOLERANCE="85"
35OUTNAME="mencodedvcd"
36SUBFILENAME=0
37
38EDLFILENAME="pass.edl"
39HAVESUB=0
40WORKDIR="."
41RATIOX=4
42RATIOY=3
43
44OPTIONS="INPUTFILENAME TARGET ENCQ ABPS VBPS NORM SPLIT TOLERANCE OUTNAME"
45
46usage()
47{
48echo ""
49echo "usage $MYNAME inputfile [options]"
50echo ""
51echo "Options: [Default value]"
52echo ""
53echo "-t	Target svcd|vcd [svcd]"
54echo "-q	Encoding quality 0|1|2 [2]"
55echo "-a	Audio bitrate in kbps [224]"
56echo "-v	Video bitrate in kbps [2000 For SVCD, 1150 For VCD]"
57echo "-n	Norm NTSC|PAL [NTSC]"
58echo "-d	Divide/split movie at given times time1:time2:... [no split]"
59echo "-s	Shitty TV screen tolerance %, afects subtitle positioning [85]"
60echo "-u	Subtitle file name [No subtitle]"
61echo "-o	Output basename [mencodedvcd]"
62echo ""
63echo "In case you want to use -a/-v please read:"
64echo "http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-vcd-dvd.html"
65echo ""
66}
67
68test_needed()
69{
70
71for i in mencoder; do
72	if [ -z "`which $i`" ]; then
73		echo "[ERROR] mencoder not found in $PATH!"
74		exit 1
75	fi
76done
77
78}
79
80test_sugested()
81{
82
83for i in vcdimager cdrecord; do
84	if [ -z "`which $i`" ]; then
85		echo "[WARNING] $i not found in $PATH!"
86		echo "You'll likely need it after we finish."
87		exit 1
88	fi
89done
90}
91
92test_needed
93test_sugested
94
95if [ $# -lt 1 ]; then
96	echo ""
97	echo "[ERROR] Input filename parameter is mandatory."
98	echo ""
99	usage
100	exit 1
101fi
102
103case $1 in
104	-*)
105 		usage
106		exit 1
107		;;
108	*)
109		INPUTFILENAME=$1
110		shift 1
111		;;
112esac
113
114while [ "$1"x != "x" ]; do
115	case $1 in
116		-t)
117		TARGET=$2
118		shift 1
119		;;
120		-q)
121		ENCQ=$2
122		shift 1
123		;;
124		-a)
125		ABPS=$2
126		shift 1
127		;;
128		-v)
129		VBPS=$2
130		shift 1
131		;;
132		-n)
133		NORM=$2
134		shift 1
135		;;
136		-d)
137		SPLIT=$2
138		shift 1
139		;;
140		-s)
141		TOLERANCE=$2
142		shift 1
143		;;
144		-u)
145		SUBFILENAME="$2"
146		HAVESUB=1
147		shift 1
148		;;
149		-o)
150		OUTNAME=$2
151		shift 1
152		;;
153	esac
154	shift 1
155done
156
157echo ""
158echo "[STATUS] Will re-encode using the following parameters:"
159echo ""
160for i in $OPTIONS ; do
161	echo "$i ${!i}";
162done
163
164# Parameter Sanity Check ###########################################
165# We need to check supplied params against known format constraints
166####################################################################
167
168if [ $TARGET = "svcd" ]; then
169	if [ $ABPS -gt 384 ]; then
170		echo "[ERROR] SVCD maximum abitrate is 384kbps."
171		exit 1
172	fi
173	if [ $VBPS -gt 2600 ]; then
174		echo "[ERROR] SVCD maximum vbitrate is 2600kbps."
175		exit 1
176	fi
177else [ $TARGET = "vcd" ]
178	if [ $ABPS -eq 224 ]; then
179		echo "[ERROR] VCD abitrate must be 224kbps."
180		exit 1
181	fi
182	if [ $VBPS -gt 1150 ]; then
183		echo "[ERROR] VCD maximum vbitrate is 1150kbps."
184		exit 1
185	fi
186fi
187
188# Set encoding options ##############################################
189
190if [ $TARGET = "svcd" ]; then
191	FORMAT="xsvcd"
192	VCODEC="mpeg2video"
193	VRCMINRATE=4
194	VRCMAXRATE=2500
195	VRCBUFSIZE=917
196	if [ $NORM = "NTSC" ]; then
197		SCALEX=480
198		SCALEY=480
199		KEYINT=18
200		OFPS="24000/1001"
201		TELECINE=":telecine"
202	else [ $NORM = "PAL" ]
203		SCALEX=480
204		SCALEY=576
205		KEYINT=15
206		OFPS=25
207	fi
208else [ $TARGET = "vcd" ]
209	FORMAT="xvcd"
210	VCODEC="mpeg1video"
211	VRCMINRATE=$VBPS
212	VRCMAXRATE=$VBPS
213	VRCBUFSIZE=327
214	if [ $NORM = "NTSC" ]; then
215		SCALEX=352
216		SCALEY=240
217		KEYINT=18
218		OFPS="24000/1001"
219	else [ $NORM = "PAL" ]
220		SCALEX=352
221		SCALEY=288
222		KEYINT=15
223		OFPS=25
224	fi
225fi
226
227# Start reencoding ###################################################
228
229cd $WORKDIR
230
231if [ $(($HAVESUB+1)) -eq 1 ]; then
232	SUBTITLESTRING="/dev/null"
233else
234	SUBTITLESTRING="$SUBFILENAME"
235fi
236
237if [ $SPLIT = "0" ]; then
238	CICLES=0
239	TIMESTRING=""
240else
241	if [ -e $EDLFILENAME ]; then
242		echo "[ERROR]"
243		echo "The -d option needs to generate a temporary file called"
244		echo "$EDLFILENAME. You already have one in this directory,"
245		echo "please remove/rename it and run $MYNAME again."
246		echo ""
247		exit 1
248	else
249		EDLSTRING=$(echo $SPLIT | sed -e s/:/' '/g)
250		EDLARRAY=($EDLSTRING)
251		CICLES=$(echo $EDLSTRING | wc -w)
252		TIMESTRING="-edl $EDLFILENAME -hr-edl-seek"
253	fi
254fi
255
256
257for j in $(seq 0 $CICLES); do
258
259	NEWNAME=$OUTNAME"_PART"$j".mpg"
260	echo ""
261	echo "Making $NEWNAME, wish me luck ;-)"
262	echo ""
263
264# Create EDLFILENAME #################################################
265
266	if [ $CICLES -ge 1 ]; then
267		for i in $(seq 0 $CICLES)
268		do
269			if [ $i -eq $j ]; then
270				if [ $j -ne 0 ]; then
271					echo "0 ${EDLARRAY[$(($i-1))]} 0" > $EDLFILENAME
272				fi
273				if [ $i -ne $CICLES ]; then
274					echo "${EDLARRAY[$(($i))]} 999999 0" >> $EDLFILENAME
275				fi
276			fi
277		done
278	fi
279
280# Mencoder Time ;-) ###################################################
281
282mencoder \
283-ovc lavc -oac lavc -vf expand=:::::$RATIOX/$RATIOY:1,scale=$SCALEX:$SCALEY,harddup \
284-srate 44100 -af lavcresample=44100 -lavcopts acodec=mp2:abitrate=$ABPS:vcodec=$VCODEC:\
285vbitrate=$VBPS:keyint=$KEYINT:mbd=$ENCQ:vrc_buf_size=$VRCBUFSIZE:vrc_maxrate=$VRCMAXRATE:\
286vrc_minrate=$VRCMINRATE:vi_qfactor=0.1:vi_qoffset=1.5:aspect=$RATIOX/$RATIOY -of mpeg \
287-mpegopts format=$FORMAT$TELECINE -sub $SUBTITLESTRING -subpos $TOLERANCE -subwidth \
288$TOLERANCE -ofps $OFPS $TIMESTRING -o $NEWNAME $INPUTFILENAME
289
290echo "Encoding of $NEWNAME finished."
291echo "Run vcdimager -t svcd/vcd $NEWNAME and burn with cdrecord."
292
293done
294
295echo "$(($CICLES+1)) VCD/SVCD file(s) created!!!"
296echo "Happy to be of some help ;-) have fun."
297exit 0
298