#!/usr/bin/perl
#nathan jahnke <njahnke@gmail.com>
use warnings;
use strict 'subs';
package sasami;
#system("export DYLD_LIBRARY_PATH=/Volumes/l/anrix");
sub sasami {
@sources = ();
open(AVS, "${basename}.avs");
for (<AVS>) {
push(@sources,"${1}.VOB") if m/^.*MPEG2source\("(.+)\.d2v".*$/;
push(@sources,$1) if m/^.*avisource\("([^"]+)".*$/;
push(@sources,$1) if m/^.*directshowsource\("([^"]+)".*$/;
$fieldorder = 1 if m/^AssumeTFF\(\)/;
$fieldorder = 0 if m/^AssumeBFF\(\)/;
$d = 1 if m/^global d1 = true/;
$d = 4 if m/^global d1 = false/;
$f = $1 if m/^changefps\(f1\/([0-9])\)/;
$vhs = 1 if m/^nate_vhs_head_change_erase/;
}
close(AVS);
die 'sasami: no sources detected in .avs!' if @sources == 0;
#get vital info about first source
$mplayeridentify = <<SABRAC;
mplayer -identify -vo null -slave ${sources[0]} 2>&1 <<ENDOFSCRIPT
quit
ENDOFSCRIPT
SABRAC
for (qx($mplayeridentify)) {
chomp;
$width = $_ if s/ID_VIDEO_WIDTH=([0-9]+)/$1/;
$height = $_ if s/ID_VIDEO_HEIGHT=([0-9]+)/$1/;
$framerate = $_ if s/ID_VIDEO_FPS=([0-9.]+)/$1/;
$maxaudiobitrate = $_ if s/ID_AUDIO_BITRATE=([0-9]+)/$1/;
}
$pal = ($height eq "576");
#build mencoder command to feed fifo
$mencoderargs = "./mencoder";
#note space at start of string
$mencoderargs .= " -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}" if $d == 1;
$mencoderargs .= " -vf-add tfields=0" if $d == 4;
$mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs;
$newframerate = ($pal ? (50/$f) : (59.94/$f));
$x264newframerate = "--fps ${newframerate}";
$mp4boxnewframerate = "-fps ${newframerate}";
$mencoderargs .= " -vf-add framestep=${f}";
$newwidth = (($d == 1) ? ($pal ? 704 : 640) : ($pal ? 352 : 320));
$newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240));
$mencoderargs .= " -vf-add scale=${newwidth}:${newheight}";
$mencoderargs .= " -vf-add format=i420 -ovc raw -of rawvideo -nosound";
$mencoderargs .= " ".join(" ",@sources);
$mencoderargs .= " -o ${avs}";
}
$basename = 'test';
$avs = "${basename}.pipe";
for(my $N = 1; $N le 2 ; $N++) {
system("rm ${avs}");
system("mkfifo ${avs}");
# this is a hack to deal with the fact that sometimes x264 takes a while to finish encoding and write out the statsfile
if ($N eq 2) {
while (!(-e "${basename}.stats")) {
print("Waiting for stats file ...\n");
sleep(1);
}
}
&sasami;# if $os eq 'unix';
print("$mencoderargs\n");
$x264command = "./x264 --pass $N --stats ${basename}.stats --bitrate 5000 --qpmin 19 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &";
print("$x264command\n");
system($x264command);
system($mencoderargs);# if $os eq 'unix';
#rm -f "$avs"
}
$mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4";
print ("$mp4boxcommand\n");
system($mp4boxcommand);
exit 0;