Difference between revisions of "Anri-chan/Source/sasami.pl"
From SDA Knowledge Base
(working demonstration) |
(getting closer ... mplayer's crop and expand are the very definition of hard to use) |
||
Line 10: | Line 10: | ||
sub sasami { | sub sasami { | ||
− | |||
open(AVS, "${basename}.avs"); | open(AVS, "${basename}.avs"); | ||
− | + | @avs = <AVS>; | |
+ | close(AVS); | ||
+ | @sources = (); | ||
+ | for (@avs) { | ||
+ | chomp; | ||
push(@sources,"${1}.VOB") if m/^.*MPEG2source\("(.+)\.d2v".*$/; | push(@sources,"${1}.VOB") if m/^.*MPEG2source\("(.+)\.d2v".*$/; | ||
push(@sources,$1) if m/^.*avisource\("([^"]+)".*$/; | push(@sources,$1) if m/^.*avisource\("([^"]+)".*$/; | ||
Line 22: | Line 25: | ||
$f = $1 if m/^changefps\(f1\/([0-9])\)/; | $f = $1 if m/^changefps\(f1\/([0-9])\)/; | ||
$vhs = 1 if m/^nate_vhs_head_change_erase/; | $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; | ||
+ | } | ||
} | } | ||
− | |||
die 'sasami: no sources detected in .avs!' if @sources == 0; | die 'sasami: no sources detected in .avs!' if @sources == 0; | ||
Line 43: | Line 51: | ||
#build mencoder command to feed fifo | #build mencoder command to feed fifo | ||
$mencoderargs = "./mencoder"; | $mencoderargs = "./mencoder"; | ||
+ | |||
+ | #trimming | ||
+ | # $framerate = 29.97; | ||
+ | # $framerate = 25 if $pal; | ||
+ | $mencoderargs .= " -ss ".($trimone * $framerate); | ||
+ | $mencoderargs .= " -endpos ".($trimtwo * $framerate); | ||
+ | |||
+ | #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. | ||
#note space at start of string | #note space at start of string | ||
Line 49: | Line 75: | ||
$mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs; | $mencoderargs .= " -vf-add crop=${width}:".($height-12).":0:0,expand=0:-12:0:0" if $vhs; | ||
+ | # function nate_retard_bob_2(last) { | ||
+ | # converttorgb32 | ||
+ | # field1=SelectEven.PointResize(last.width,last.height*4).crop(0,1,0,0).addborders(0,0,0,1).bilinearresize(d1,last.height) | ||
+ | # field2=SelectOdd.PointResize(last.width,last.height*4).crop(0,0,0,-1).addborders(0,1,0,0).bilinearresize(d1,last.height) | ||
+ | # interleave(field1,field2) | ||
+ | # sharpen(0.31) | ||
+ | # converttoyv12 | ||
+ | # } | ||
+ | |||
+ | # function nate_gba(last) { | ||
+ | # converttorgb | ||
+ | # lanczos4resize(320,240) | ||
+ | # crop(43,39,-44,-41) | ||
+ | # lanczos4resize(240,160) | ||
+ | # converttoyv12 | ||
+ | # } | ||
+ | # | ||
+ | # function nate_gb(last) { | ||
+ | # lanczos4resize(320,240) | ||
+ | # Crop(80,48,-80,-48) #thanks Quijo | ||
+ | # } | ||
+ | |||
$newframerate = ($pal ? (50/$f) : (59.94/$f)); | $newframerate = ($pal ? (50/$f) : (59.94/$f)); | ||
$x264newframerate = "--fps ${newframerate}"; | $x264newframerate = "--fps ${newframerate}"; | ||
Line 64: | Line 112: | ||
} | } | ||
− | $basename = ' | + | $basename = 'pso'; |
$avs = "${basename}.pipe"; | $avs = "${basename}.pipe"; | ||
for(my $N = 1; $N le 2 ; $N++) { | for(my $N = 1; $N le 2 ; $N++) { |
Revision as of 00:41, 27 September 2008
#!/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 { open(AVS, "${basename}.avs"); @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])\)/; $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; } } 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"; #trimming # $framerate = 29.97; # $framerate = 25 if $pal; $mencoderargs .= " -ss ".($trimone * $framerate); $mencoderargs .= " -endpos ".($trimtwo * $framerate); #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. #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; # function nate_retard_bob_2(last) { # converttorgb32 # field1=SelectEven.PointResize(last.width,last.height*4).crop(0,1,0,0).addborders(0,0,0,1).bilinearresize(d1,last.height) # field2=SelectOdd.PointResize(last.width,last.height*4).crop(0,0,0,-1).addborders(0,1,0,0).bilinearresize(d1,last.height) # interleave(field1,field2) # sharpen(0.31) # converttoyv12 # } # function nate_gba(last) { # converttorgb # lanczos4resize(320,240) # crop(43,39,-44,-41) # lanczos4resize(240,160) # converttoyv12 # } # # function nate_gb(last) { # lanczos4resize(320,240) # Crop(80,48,-80,-48) #thanks Quijo # } $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 = 'pso'; $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;