You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
5.9 KiB
265 lines
5.9 KiB
4 years ago
|
#!/usr/bin/perl -w
|
||
|
|
||
|
# dependencies: perl ImageMagick mjpegtools
|
||
|
|
||
|
my($testdir) = "transcode-test";
|
||
|
my($frames) = 5;
|
||
|
|
||
|
my(%testdata) =
|
||
|
(
|
||
|
import =>
|
||
|
{
|
||
|
},
|
||
|
|
||
|
export =>
|
||
|
{
|
||
|
ppm =>
|
||
|
{
|
||
|
"" =>
|
||
|
{
|
||
|
yuv =>
|
||
|
{
|
||
|
"output000000.ppm" => "2d366b437ced6b4b82ddab406cfc272d",
|
||
|
"output000001.ppm" => "a744069a2eaf23f3441a838c5748a746",
|
||
|
"output000002.ppm" => "4ba2a5195b2c53eb6228f702394d1166",
|
||
|
"output000003.ppm" => "f4324b1d944d4541948cd8d0221a8c89",
|
||
|
"output000004.ppm" => "f01e6f29b62abf96f0ef58ba34328fa5"
|
||
|
},
|
||
|
|
||
|
rgb =>
|
||
|
{
|
||
|
"output000000.ppm" => "415f11d450796f2a0c181b4fe2bba462",
|
||
|
"output000001.ppm" => "920db15b73c796c31b11dade8e802a1c",
|
||
|
"output000002.ppm" => "c0dbe650840584e222df6de880debe1d",
|
||
|
"output000003.ppm" => "f0fa9f76d284f3082ffdb2d4790de300",
|
||
|
"output000004.ppm" => "bfd12d139827eab1974a8b32f871d5d2"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
ffmpeg =>
|
||
|
{
|
||
|
"mpeg2" =>
|
||
|
{
|
||
|
yuv =>
|
||
|
{
|
||
|
"output.m2v" => "58a158043a2ed9dce23c5892af4fe39d"
|
||
|
},
|
||
|
|
||
|
rgb =>
|
||
|
{
|
||
|
"output.m2v" => "af88136aaa2e5c69a1cd418e15d6ef0f"
|
||
|
}
|
||
|
},
|
||
|
|
||
|
"mpeg4" =>
|
||
|
{
|
||
|
yuv =>
|
||
|
{
|
||
|
"output" => "350c502d87ed9e4a3bb8c1567f8cdc3e"
|
||
|
},
|
||
|
|
||
|
rgb =>
|
||
|
{
|
||
|
"output" => "6026db8ebfdefccbdc5f4c37f5ac3938"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
filter =>
|
||
|
{
|
||
|
}
|
||
|
);
|
||
|
|
||
|
sub checkfiles($ $ $ $)
|
||
|
{
|
||
|
my($type, $module, $codec, $mode) = @_;
|
||
|
my($file, $fsfile, $file1, $sum, $sum1, $result);
|
||
|
|
||
|
$result = 0;
|
||
|
|
||
|
for $file (sort(keys(%{$testdata{$type}{$module}{$codec}{$mode}})))
|
||
|
{
|
||
|
$fsfile = "$module-$codec-$mode-$file";
|
||
|
|
||
|
printf(" Checking file %s: ", $file);
|
||
|
|
||
|
if(! -f $fsfile)
|
||
|
{
|
||
|
printf("FAILED (file not found)\n");
|
||
|
$result = 1;
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
$sum = $testdata{$type}{$module}{$codec}{$mode}{$file};
|
||
|
|
||
|
($sum1, $file1) = split(" ", qx[md5sum $fsfile]);
|
||
|
|
||
|
if($sum ne $sum1)
|
||
|
{
|
||
|
printf("FAILED (bad checksum) [%s != %s]\n", $sum, $sum1);
|
||
|
$result= 1;
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
printf("OK\n");
|
||
|
}
|
||
|
|
||
|
return($result);
|
||
|
}
|
||
|
|
||
|
sub testmodule($ $ $ $ $ $ $)
|
||
|
{
|
||
|
my($type, $import_module, $import_file, $export_module, $export_file, $mode, $codec) = @_;
|
||
|
my($cmdline, $fsfile);
|
||
|
|
||
|
$fsfile = "$export_module-$codec-$mode-$export_file";
|
||
|
|
||
|
if($type ne "filter")
|
||
|
{
|
||
|
$cmdline = "transcode -H 0 -c 0-5 -i $import_file -x $import_module,null -o $fsfile -y $export_module,null >> log 2>&1";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return(1);
|
||
|
}
|
||
|
|
||
|
$cmdline .= " -V rgb24" if($mode eq "rgb");
|
||
|
$cmdline .= " -F $codec" if(defined($codec) && $codec ne "");
|
||
|
|
||
|
open(my($fd), ">>log");
|
||
|
printf $fd (">>> $cmdline\n");
|
||
|
close($fd);
|
||
|
|
||
|
return(1) if(system($cmdline));
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
sub main($)
|
||
|
{
|
||
|
my($frame, $name, @allnames, @report);
|
||
|
my($module, $mode, $sum, $result);
|
||
|
my($import_module, $import_file, $export_module, $export_file);
|
||
|
|
||
|
mkdir($testdir);
|
||
|
chdir($testdir);
|
||
|
|
||
|
unlink("log");
|
||
|
|
||
|
if(! -f "testimg.ppm")
|
||
|
{
|
||
|
printf("Generating base testimage\n");
|
||
|
if(system(q[convert xc:black -resize 720x576! \
|
||
|
-fill red -draw "rectangle 0,0,213,480" \
|
||
|
-fill green -draw "rectangle 214,0,426,480" \
|
||
|
-fill blue -draw "rectangle 427,0,640,480" \
|
||
|
-fill white -font "-*-helvetica-bold-r-*-*-24-*-*-*-*-*-*-1" \
|
||
|
-fill white -draw "text 100,240 'RED'" \
|
||
|
-draw "text 313,240 'GREEN'" \
|
||
|
-draw "text 526,240 'BLUE'" -quality 100 testimg.ppm >> log 2>&1]))
|
||
|
{
|
||
|
die("convert");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for($frame = 0; $frame < $frames; $frame++)
|
||
|
{
|
||
|
$name = sprintf("testframe-%3.3d.ppm", $frame);
|
||
|
|
||
|
if(! -f $name)
|
||
|
{
|
||
|
printf("Generating test frame $name\n");
|
||
|
|
||
|
if(system(q[convert xc:black -resize 720x576! \
|
||
|
-fill red -draw "rectangle 0,0,213,480" \
|
||
|
-fill green -draw "rectangle 214,0,426,480" \
|
||
|
-fill blue -draw "rectangle 427,0,640,480" \
|
||
|
-fill white -font "-*-helvetica-bold-r-*-*-24-*-*-*-*-*-*-1" \
|
||
|
-fill white -draw "text 100,240 'RED'" \
|
||
|
-draw "text 313,240 'GREEN'" \
|
||
|
-draw "text 526,240 'BLUE'" \
|
||
|
-draw "text 300,400] . qq['Frame #$frame'" ] .
|
||
|
qq[-format ppm $name >> log 2>&1]))
|
||
|
{
|
||
|
die("convert");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
push(@allnames, $name);
|
||
|
}
|
||
|
|
||
|
if(! -f "testmovie.yuv4mpeg")
|
||
|
{
|
||
|
printf("Generating test movie\n");
|
||
|
|
||
|
if(system("cat " . join(" ", @allnames) . " | ppmtoy4m -F 25:1 -A 59:54 -I t -L -S 420mpeg2 > testmovie.yuv4mpeg 2>> log"))
|
||
|
{
|
||
|
die("ppmtoy4m");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(qx[md5sum testmovie.yuv4mpeg 2>> log] !~ /^485df9fc04b510eb9d09af1d0b445307\b/)
|
||
|
{
|
||
|
die("testmovie.yuv4mpeg md5sum incorrect");
|
||
|
}
|
||
|
|
||
|
for $type (sort(keys(%testdata)))
|
||
|
{
|
||
|
for $module (sort(keys(%{$testdata{$type}})))
|
||
|
{
|
||
|
for $codec (sort(keys(%{$testdata{$type}{$module}})))
|
||
|
{
|
||
|
for $mode (sort(keys(%{$testdata{$type}{$module}{$codec}})))
|
||
|
{
|
||
|
printf("Testing %s_%s in %s mode\n", $type, $module, $mode);
|
||
|
|
||
|
if($type eq "import")
|
||
|
{
|
||
|
$import_module = $module;
|
||
|
$import_file = "testmovie.$import_module";
|
||
|
$export_module = "yuv4mpeg";
|
||
|
$export_file = "output";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if($type eq "export")
|
||
|
{
|
||
|
$import_module = "yuv4mpeg";
|
||
|
$import_file = "testmovie.yuv4mpeg";
|
||
|
$export_module = $module;
|
||
|
$export_file = "output";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# filter
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$result = testmodule($type, $import_module, $import_file, $export_module, $export_file, $mode, $codec);
|
||
|
$result = checkfiles($type, $module, $codec, $mode) if(!$result);
|
||
|
push(@report, sprintf("%-16.16s %8.8s %4.4s %6.6s", $type . "_" . $module, $codec, $mode, $result ? "FAILED" : "OK"));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf("\n");
|
||
|
printf("%-16.16s %8.8s %-4.4s %-6.6s\n", "module", "codec", "mode", "result");
|
||
|
printf("%s %s %s %s\n", "-" x 16, "-" x 8, "-" x 4, "-" x 6);
|
||
|
printf(join("\n", @report));
|
||
|
printf("\n%s\n", "-" x 37);
|
||
|
|
||
|
open(my($fd), ">>log");
|
||
|
printf $fd ("\n");
|
||
|
printf $fd ("%-16.16s %8.8s %-4.4s %-6.6s\n", "module", "codec", "mode", "result");
|
||
|
printf $fd ("%s %s %s %s\n", "-" x 16, "-" x 8, "-" x 4, "-" x 6);
|
||
|
printf $fd (join("\n", @report));
|
||
|
printf $fd ("\n%s\n", "-" x 37);
|
||
|
close($fd);
|
||
|
|
||
|
}
|
||
|
|
||
|
exit(main(%ARGV));
|