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;