Difference between revisions of "Anri-chan/Source/sasami.pl"
From SDA Knowledge Base
(gba/gb in; who knew retard bob was built into mencoder? grenola!) |
(beginning of statid) |
||
Line 46: | Line 46: | ||
$gb = 1 if m/^nate_gb$/; | $gb = 1 if m/^nate_gb$/; | ||
$resize = 1 if m/^lanczos4resize\(d1,last\.height\)/; | $resize = 1 if m/^lanczos4resize\(d1,last\.height\)/; | ||
+ | $statidlines[0] = $1 if m/^statid1="""(.*)"""$/; | ||
+ | $statidlines[1] = $1 if m/^statid2="""(.*)"""$/; | ||
+ | $statidlines[2] = $1 if m/^statid3="""(.*)"""$/; | ||
} | } | ||
Line 125: | Line 128: | ||
$mencoderargs .= " ".join(" ",@sources); | $mencoderargs .= " ".join(" ",@sources); | ||
$mencoderargs .= " -o ${avs}"; | $mencoderargs .= " -o ${avs}"; | ||
+ | |||
+ | if ($statidlines[0]) { | ||
+ | use Imager; | ||
+ | $img = Imager->new; | ||
+ | $img->read(file=>"ntsc_d1.tga") or die "Cannot load statid image: ", $img->errstr; | ||
+ | $font = Imager::Font->new(file=>"/Library/Fonts/Verdana.ttf"); | ||
+ | &statid_lines_write($statidlines[0], $img->getheight/2, 36, 'white' ) if $statidlines[0]; | ||
+ | &statid_lines_write($statidlines[1], 360, 36, 'white' ) if $statidlines[1]; | ||
+ | &statid_lines_write($statidlines[2], 400, 36, 'white' ) if $statidlines[2]; | ||
+ | &statid_lines_write("Audio commentary on track 2", 460, 28, '#E1CE8B') if $audio_commentary; | ||
+ | $img->write(file=>'statid.tga') | ||
+ | or die 'Cannot save statid.tga: ', $img->errstr; | ||
+ | } | ||
} | } | ||
$basename = 'pokemon'; | $basename = 'pokemon'; | ||
$avs = "${basename}.pipe"; | $avs = "${basename}.pipe"; | ||
− | for(my $N = 1; $N le 2 ; $N++) { | + | #for(my $N = 1; $N le 2 ; $N++) { |
system("rm ${avs}"); | system("rm ${avs}"); | ||
system("mkfifo ${avs}"); | system("mkfifo ${avs}"); | ||
Line 141: | Line 157: | ||
&sasami;# if $os eq 'unix'; | &sasami;# if $os eq 'unix'; | ||
print("$mencoderargs\n"); | print("$mencoderargs\n"); | ||
− | + | # $x264command = "./x264 --pass $N --stats ${basename}.stats --bitrate 5000 --qpmin 19 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &"; | |
+ | $x264command = "./x264 --bitrate 5000 --qpmin 0 ${x264newframerate} -o ${basename}.264 ${avs} ${newwidth}x${newheight} &"; | ||
print("$x264command\n"); | print("$x264command\n"); | ||
system($x264command); | system($x264command); | ||
system($mencoderargs);# if $os eq 'unix'; | system($mencoderargs);# if $os eq 'unix'; | ||
#rm -f "$avs" | #rm -f "$avs" | ||
− | } | + | #} |
$mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4"; | $mp4boxcommand = "./mp4box ${mp4boxnewframerate} -new -add ${basename}.264 ${basename}.mp4"; | ||
print ("$mp4boxcommand\n"); | print ("$mp4boxcommand\n"); | ||
Line 152: | Line 169: | ||
exit 0; | exit 0; | ||
+ | |||
+ | |||
+ | #statid line text, y-offset, text size, color | ||
+ | sub statid_lines_write { | ||
+ | $font->align(string => $_[0], | ||
+ | aa => 1, | ||
+ | size => $_[2], | ||
+ | color => $_[3], | ||
+ | x => $img->getwidth/2, | ||
+ | y => $_[1], | ||
+ | halign => 'center', | ||
+ | valign => 'center', | ||
+ | image => $img); | ||
+ | } | ||
</nowiki></pre> | </nowiki></pre> |
Revision as of 23:49, 14 October 2008
#!/usr/bin/perl #nathan jahnke <njahnke@gmail.com> use warnings; use strict 'subs'; package sasami; #system("export DYLD_LIBRARY_PATH=/Volumes/l/anrix"); #to move to anri config file later $gba_crop_left = 43; $gba_crop_top = 39; $gba_crop_right = 44; $gba_crop_bottom = 41; $gb_crop_left = 80; $gb_crop_top = 48; $gb_crop_right = 80; $gb_crop_bottom = 48; sub sasami { open(AVS, "${basename}.avs"); #must be unix text when running sasami under unix ... @avs = <AVS>; close(AVS); @sources = (); for (@avs) { chomp; 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])\)/; $deflicker = 1 if m/^nate_retard_bob_2/; $vhs = 1 if m/^nate_vhs_head_change_erase/; $onepixel = 1 if m/^nate_1_pixel_bob_fix/; $nes = 1 if m/^nate_nes$/; if (m/trim\(([0-9]+),([0-9]+)\)/) { $trimone=$1; $trimtwo=$2; } $gba = 1 if m/^nate_gba$/; $gb = 1 if m/^nate_gb$/; $resize = 1 if m/^lanczos4resize\(d1,last\.height\)/; $statidlines[0] = $1 if m/^statid1="""(.*)"""$/; $statidlines[1] = $1 if m/^statid2="""(.*)"""$/; $statidlines[2] = $1 if m/^statid3="""(.*)"""$/; } 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/; } # print "$width\n"; # print "$height\n"; # print "$framerate\n"; # print "$maxaudiobitrate\n"; $pal = ($height eq "576"); #build mencoder command to feed fifo $mencoderargs = "./mencoder"; #trimming # $framerate = 29.97; # $framerate = 25 if $pal; $mencoderargs .= " -ss ".($trimone * $framerate) if $trimone; $mencoderargs .= " -endpos ".($trimtwo * $framerate) if $trimtwo; #one pixel bob if ($onepixel) { $mencoderargs .= " -vf-add crop=${width}:".($height-1).":0:0,expand=${width}:${height}:0:1"; $fieldorder = 0 if $fieldorder == 1; $fieldorder = 1 if $fieldorder == 0; } #nes $mencoderargs .= " -vf-add crop=".($width-8).":${height}:8:0,expand=${width}:${height}:8:0" if $nes; #-af channels=6:4:0:0:0:1:0:2:0:3 media.avi #Would change the number of channels to 6 and set up 4 routes that copy channel 0 to channels 0 to 3. Channel 4 and 5 will contain silence. $mencoderargs .= " -vf-add yadif=3 -vf-add mcdeint=1:${fieldorder}" if $d == 1; $tfields = 0; $tfields = 4 if $deflicker; $mencoderargs .= " -vf-add tfields=${tfields}" if $d == 4; #i just eyeballed this - someone will need to sync the avisynth and mencoder sharpen filters $mencoderargs .= " -vf-add unsharp=l3x3:0.6:c3x3:0.6" if $deflicker; $mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs; if ($gba) { $mencoderargs .= " -vf-add scale=320:240"; $mencoderargs .= " -vf-add crop=".(320-$gba_crop_right-$gba_crop_left).":".(240-$gba_crop_bottom-$gba_crop_top).":${gba_crop_left}:${gba_crop_top}"; $mencoderargs .= " -vf-add scale=240:160"; $newwidth = 240; $newheight = 160; } elsif ($gb) { $mencoderargs .= " -vf-add scale=320:240"; $mencoderargs .= " -vf-add crop=".(320-$gb_crop_right-$gb_crop_left).":".(240-$gb_crop_bottom-$gb_crop_top).":${gb_crop_left}:${gb_crop_top}"; $newwidth = (320-$gb_crop_right-$gb_crop_left); $newheight = (240-$gb_crop_bottom-$gb_crop_top); } $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)) unless $newwidth; $newheight = (($d == 1) ? ($pal ? 576 : 480) : ($pal ? 288 : 240)) unless $newheight; $mencoderargs .= " -vf-add scale=${newwidth}:${newheight}" if $resize; $mencoderargs .= " -vf-add format=i420 -ovc raw -of rawvideo -nosound"; $mencoderargs .= " ".join(" ",@sources); $mencoderargs .= " -o ${avs}"; if ($statidlines[0]) { use Imager; $img = Imager->new; $img->read(file=>"ntsc_d1.tga") or die "Cannot load statid image: ", $img->errstr; $font = Imager::Font->new(file=>"/Library/Fonts/Verdana.ttf"); &statid_lines_write($statidlines[0], $img->getheight/2, 36, 'white' ) if $statidlines[0]; &statid_lines_write($statidlines[1], 360, 36, 'white' ) if $statidlines[1]; &statid_lines_write($statidlines[2], 400, 36, 'white' ) if $statidlines[2]; &statid_lines_write("Audio commentary on track 2", 460, 28, '#E1CE8B') if $audio_commentary; $img->write(file=>'statid.tga') or die 'Cannot save statid.tga: ', $img->errstr; } } $basename = 'pokemon'; $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} &"; $x264command = "./x264 --bitrate 5000 --qpmin 0 ${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; #statid line text, y-offset, text size, color sub statid_lines_write { $font->align(string => $_[0], aa => 1, size => $_[2], color => $_[3], x => $img->getwidth/2, y => $_[1], halign => 'center', valign => 'center', image => $img); }