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

#!/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));