The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::VideoMixer::Interpolators;
$VERSION = '0.02';

package App::VideoMixer::SawToothInterpolator;
use strict;
use Time::HiRes;
use parent 'Class::Accessor';
__PACKAGE__->mk_accessors(qw( interval scale offset starttime ));

sub new {
  my ($package,$interval,$scale,$offset,$starttime) = @_;
  $starttime ||= Time::HiRes::time;
  $scale ||= 1;
  $offset ||= 0;
  my $self = {
    interval  => $interval,
    starttime => $starttime,
    scale     => $scale,
    offset    => $offset,
  };
  bless $self,$package;
  $self;
};

sub value {
  my ($self,$now) = @_;
  $now ||= Time::HiRes::time;
  my $pos = ($now - $self->starttime) / $self->interval;
  $self->offset + ($pos - int $pos) * $self->scale;
};

package App::VideoMixer::PingPongInterpolator;
use strict;
use parent 'Class::Accessor';
__PACKAGE__->mk_accessors(qw( sawtooth interval scale offset starttime ));

sub new {
  my ($class,$interval,$scale,$offset,$starttime) = @_;
  my $self = {
    sawtooth => App::VideoMixer::SawToothInterpolator->new($interval,1,0,$starttime),
    offset => ($offset || 0),
    scale  => ($scale || 1),    
  };
  bless $self,$class;
  $self;
};

sub value {
  my ($self,$now) = @_;
  
  my $pos = $self->sawtooth->value($now);
  $pos = ($pos - int $pos) * 2;
  $pos = 2 - $pos
    if ($pos > 1);
  $self->offset + $pos*$self->scale;
};

1;