=head1 NAME
Time::Timecode - Video timecode class
=head1 SYNOPSIS
use Time::Timecode;
my $tc1 = Time::Timecode->new(2, 0, 0, 12); # hh, mm, ss, ff
print $tc1->fps; # $DEFAULT_FPS
print $tc1; # 02:00:00:12
print $tc1->hours; # 2
print $tc1->hh; # shorthanded version
my $tc2 = Time::Timecode->new('00:10:30:00', { fps => 25 } );
print $tc2->total_frames; # 15750
print $tc2->fps; # 25
$tc2 = Time::Timecode->new(1800); # Total frames
print $tc1 + $tc2; # 02:01:00:12
$tc1 = Time::Timecode->new('00:01:00;04'); # Dropframe ( see the ";" )
print $tc1->is_dropframe; # 1
my $diff = $tc1 - 1800; # Subtract 1800 frames
print $tc1->is_dropframe; # Maintains LHS' opts
print $diff; # 00:00:02;00
my $opts = { delimiter => ',', frame_delimiter => '+' };
$Time::Timecode::DEFAULT_FPS = 23.976;
$tc2 = Time::Timecode->new('00,10,30+00', $opts);
print $tc2->fps # 23.976
print $tc2->minutes; # 10
print $tc2->seconds; # 30
# Conversions
my $pal = $tc->convert(25);
my $ntsc = $pal->convert(30), { dropframe => 1 });
my $ndf = $ntsc->to_non_dropframe;
=head1 DESCRIPTION
C<Time::Timecode> supports any frame rate, drop/non-drop frame counts, basic arithmetic,
and conversion between frame rates and drop/non-drop frame counts. The only
requirements are that the timecode be between 00:00:00:00 and 99:99:99:99,
inclusive, and frames per second (fps) are greater than zero. This means that
you can create nonstandard timecodes (feature or bug? :^). Dropframe rules will still
apply.
C<Time::Timecode> instances can be created from a a variety of representations,
see L</CONSTRUCTOR>.
C<Time::Timecode> instances are immutable.
=head1 CONSTRUCTOR
=over 2
=item C<new( TIMECODE [, OPTIONS ] )>
Creates an immutable instance for C<TIMECODE> with the given set of C<OPTIONS>.
If no C<OPTIONS> are given the L<"package defaults"|/DEFAULTS> are used.
=back
=head2 TIMECODE
C<TIMECODE> can be one of the following:
=over 4
=item * A list denoting hours, minutes, seconds, and/or frames:
$tc1 = Time::Timecode->new(1, 2, 3)
$tc1 = Time::Timecode->new(1, 2, 3, 0) #same as above
=item * Frame count:
$tc1 = Time::Timecode->new(1800) # 00:01:00:00 @ 30 fps
=item * Timecode string:
$tc1 = Time::Timecode->new('00:02:00:25')
B<Timecode strings with dropframe frame delimiters>
In the video encoding world timecodes with a frame delimiter of '.' or ';' are
dropframe. If either of these characters are used in the timecode string passed to C<new()>
the resulting instance will dropframe.
This can be overridden by setting the L<"dropframe argument"|/OPTIONS> to false.
=back
=head2 OPTIONS
C<OPTIONS> must be a hash reference containg any of the following:
=over 4
B<fps>: Frames per second, must be greater than 0. Decimal values
are rounded 0 places when performing calculations: 29.976 becomes 30.
Defaults to C<$Time::Timecode::DEFAULT_FPS>
B<dropframe>: A boolean value denoting wheather or not the timecode
is dropframe. Defaults to C<$Time::Timecode::DEFAULT_DROPFRAME>.
B<delimiter>: The character used to delimit the timecode's hours, minutes,
and seconds. Use the B<frame_delimiter> option for delimiting the frames.
Defaults to C<$Time::Timecode::DEFAULT_DELIMITER>.
B<frame_delimiter>: The character used to delimit the timecode's frames.
Use the B<delimiter> option for delimiting the rest of the timecode.
Defaults to C<$Time::Timecode::DEFAULT_FRAME_DELIMITER>.
=back
=head1 METHODS
All time part accessors return an integer.
=over 2
=item C<hours()>
=item C<hrs()>
=item C<hh()>
Returns the hour part of the timecode
=item C<minutes()>
=item C<mins()>
=item C<mm()>
Returns the mintue part of the timecode
=item C<seconds()>
=item C<secs()>
=item C<ss()>
Returns the second part of the timecode
=item C<frames()>
=item C<ff()>
Returns the frame part of the timecode
=item C<fps()>
Returns the frames per second
=item C<to_string()>
Returns the timecode as string in a HH:MM:SS:FF format.
The delimiter used to separate each portion of the timecode can vary.
If the C<delimiter> or C<frame_delimiter> options were provided they
will be used here. If the timecode was created from a timecode string
that representation will be reconstructed.
This method is overloaded. Using a C<Time::Timecode> instance in a scalar
context results in a call to C<to_string()>.
=item C<is_dropframe()>
Returns a boolean value denoting whether or not the timecode is dropframe.
=item C<to_non_dropframe()>
Converts the timecode to non-dropframe and returns a new C<Time::Timecode> instance.
The framerate is not changed.
If the current timecode is non-dropframe C<$self> is returned.
=item C<to_dropframe()>
Converts the timecode to dropframe and returns a new C<Time::Timecode> instance.
The framerate is not changed.
If the current timecode is dropframe C<$self> is returned.
=item C<convert( FPS [, OPTIONS ] )>
Converts the timecode to C<FPS> and returns a new instance.
C<OPTIONS> are the same as L<those allowed by the CONSTRUCTOR|/OPTIONS>. Any unspecified options
are taken from the calling instance.
The converted timecode will be non-dropframe.
=back
=head1 ARITHMATIC
=over 2
=item Addition
=item Subtraction
=item Multiplacation
=item Division
All results get their options from the left hand side (LHS) of the expression. If LHS
is a literal, options will be taken from RHS.
=back
=head1 DEFAULTS
These can be overridden L<when creating a new instance|/CONSTRUCTOR>.
C<$DEFAULT_FPS = 29.97>
C<$DEFAULT_DROPFRAME = 0>
C<$DEFAULT_DELIMITER = ':'>
C<$DEFAULT_FRAME_DELIMITER = ':'>
=head1 AUTHOR
Skye Shaw (sshaw AT lucas.cis.temple.edu)
=head1 REFERENCES
For information about dropframe timecodes see:
L<
http://dropframetimecode.org/>, L<
http://en.wikipedia.org/wiki/SMPTE_time_code#Drop_frame_timecode>
=head1 COPYRIGHT
Copyright (c) 2009-2010 Skye Shaw. All rights reserved. This program
is free software; you can redistribute it and/or modify it under the
same terms as Perl itself.