The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: perl; coding: utf-8; tab-width: 4 -*-

use strict;
use Test::More qw(no_plan);
# use Test::More tests => 10;

BEGIN {
	use_ok('Cv', -more);
	use_ok('Cv::Flipbook');
}

use File::Basename;
use List::Util qw(min max);
my $verbose = Cv->hasGUI;

my $font = Cv->InitFont(CV_FONT_HERSHEY_PLAIN, 1.0, 1.0, 0, 2, CV_AA);
if ($verbose) {
	Cv->namedWindow('movie', 1);
}
SKIP: {
	my $flipbook = dirname($0) . "/flipbook/";
	skip("flipbook not found", 1) unless -d $flipbook;

	#my $cap1 = eval { Cv->captureFromFlipbook() };
	#is($cap1, undef);
	my $cap2 = eval { Cv->captureFromFlipbook("/path/not/to/exist") };
	is($cap2, undef);
	my $cap3 = eval { Cv->captureFromFlipbook($flipbook, undef, ".xxx") };
	is($cap3, undef);
	my $cap4 = eval { Cv->captureFromFlipbook($flipbook, undef, "*.png") };
	ok($cap4);
	ok($cap4->getProperty(CV_CAP_PROP_FRAME_COUNT));
	undef $cap4;

	my $capture = eval { Cv->captureFromFlipbook(
		$flipbook, CV_LOAD_IMAGE_GRAYSCALE, [ qq(*.png) ]
		) };
	is($capture->{flags}, CV_LOAD_IMAGE_GRAYSCALE);
	$capture->setProperty(CV_CAP_PROP_FPS, 1 / (12 * 3600));

	$capture->setProperty(
		CV_CAP_PROP_POS_FRAMES,
		max($capture->getProperty(CV_CAP_PROP_FRAME_COUNT) - 30, 0)
		);

	my $lastimg; my $quit = 0;
  movie:
	while (my $frame = $capture->queryFrame) {
		my $img = $frame->cvtColor(CV_GRAY2RGB);
		my $pos_frames = $capture->getProperty(CV_CAP_PROP_POS_FRAMES);
		$img->putText(sprintf("CAP_PROP_POS_FRAMES: %d", $pos_frames),
					  [ 30, $frame->height - 30 ], $font, [ 255, 128, 128 ]);
		my $pos_msec = $capture->getProperty(CV_CAP_PROP_POS_MSEC);
		$img->putText(sprintf("CAP_PROP_POS_MSEC: %.1fmsec", $pos_msec * 1e-3),
					  [ 30, $frame->height - 50 ], $font, [ 255, 128, 128 ]);
		$img->putText(sprintf("file: %s", basename($capture->{file})),
					  [ 30, $frame->height - 70 ], $font, [ 255, 128, 128 ]);
		if ($lastimg) {
			foreach my $alpha (1/3, 2/3, 1) {
				my $beta = 1.0 - $alpha; my $gamma = 0;
				my $added = $img->addWeighted($alpha, $lastimg, $beta, $gamma,
											  $img->new);
				if ($verbose) {
					$added->show('movie');
					my $c = Cv->waitKey(100);
					if ($c > 0 && ($c & 0xff) == 27) {
						$quit = 1;
						last movie;
					}
				}
			}
		} else {
			if ($verbose) {
				$img->show('movie');
				my $c = Cv->waitKey(300);
				if ($c > 0 && ($c & 0xff) == 27) {
					$quit = 1;
					last movie;
				}
			}
		}
		$lastimg = $img;
	}
	ok($quit || !$capture->grabFrame);
	ok($quit || !$capture->retrieveFrame);
}
Cv->waitKey(3000);