#!/usr/bin/perl

# (c) G. Finch (salsaman)

# released under the GNU GPL 3 or later
# see file COPYING or www.gnu.org for details





#######################################################################
# LiVES encodedv plugin v2.1

# version 1.0 original - salsaman
# version 2.0 fix it so it works again ! - salsaman.
# version 2.1 increase quality settings, restrict audio rates.
# version 2.11 add package name libdv-bin
# version 2.12 allow png encoding; add check for "convert"
# version 2.13 verbose mode
# version 2.14 updates to plugin API

#######################################################################
my $USE_STRICT = 1;
if ($USE_STRICT) {
    use strict;
}

my $USE_WARNINGS = 1;
if ($USE_WARNINGS) {
    use warnings;
}

use POSIX;     # Needed for setlocale()
setlocale(LC_NUMERIC, "C");

my $nulfile;
my $exe;

if ($^O eq "MSWin32") {
    $nulfile = "NUL";
    $exe = ".exe";
} else {
    $nulfile = "/dev/null";
    $exe = "";
}

if (!caller) {
    our $command;
    #our $otype;
    exit 0 if (!defined($ARGV[0]));
}

if (!defined($command)) {
    $command  = $ARGV[0];
}

#######################################################################

if ($command eq "version") {
    print "encodedv encoder plugin v2.14\n";
    exit 0;
}

if ($command eq "init") {
    # perform any initialisation needed
    # On error, print error message and exit 1
    # otherwise exit 0

    if (&location("encodedv") eq "") {
	print "Encodedv was not found. Please install libdv2-apps or libdv-bin and try again.";
	exit 1;
    }

    if (&location("convert") eq "") {
	print "convert was not found. Please install imagemagick and try again.";
	exit 1;
    }
    
    # end init code
    print "initialised\n";
    exit 0;
}


if ($command eq "get_capabilities") {
    # return capabilities - this is a bitmap field
    # bit 0 - takes extra parameters (using RFX request)
    # bit 1 - unused
    # bit 2 - can encode png
    # bit 3 - not pure perl
    print "4\n";
    exit 0;
}


if ($command eq "get_formats") {
   # for each format: -
   # return format_name|display_name|audio_types|restrictions|extension|

   # audio types are: 0 - cannot encode audio, 1 - can encode using
    #  mp3, 2 - can encode using pcm, 3 - can encode using pcm and mp3
    
    print "dv_ntsc_med|dv (NTSC) medium quality|2|size=720x480,fps=30000:1001,arate=48000;44100|dv|[|\n"; # NTSC
    print "dv_pal_med|dv (PAL) medium quality|2|size=720x576,fps=25.000,arate=48000;44100|dv|[|\n"; # PAL
    print "dv_ntsc_medhi|dv (NTSC) medium/high quality|2|size=720x480,fps=30000:1001,arate=48000;44100|dv|[|\n"; # NTSC
    print "dv_pal_medhi|dv (PAL) medium/high quality|2|size=720x576,fps=25.000,arate=48000;44100|dv|[|\n"; # PAL
    print "dv_ntsc_hi|dv (NTSC) high quality|2|size=720x480,fps=30000:1001,arate=48000;44100|dv|[|\n"; # NTSC
    print "dv_pal_hi|dv (PAL) high quality|2|size=720x576,fps=25.000,arate=48000;44100|dv|[|\n"; # PAL

    exit 0;
}


if ($command eq "get_format_request") {
    # return the code for how we would like audio and video delivered
    # this is a bitmap field composed of:
    # bit 0 - unset=raw pcm audio; set=pcm audio with wav header
    # bit 1 - unset=all audio; set=clipped audio
    # bit 2 - unset=all frames; set=frames for selection only

    print 7; # clipped wav, clipped frames
    exit 0;
}


if ($command eq "encode") {
    # encode 
    $encoder_command="encodedv";

    $to_ext=".ppm";

    $passes=1;

    $usemp3=$ARGV[13];

    if ($otype eq "dv_ntsc_medhi"||$otype eq "dv_pal_medhi") {
	$passes=2;
    }
    elsif ($otype eq "dv_ntsc_hi"||$otype eq "dv_pal_hi") {
	$passes=3;
    }

    for ($i = $start; $i <= $end; $i++) {
	$name = &mkname($i);
	$name2 = &mkname($i - 1);
	`convert $name$img_ext $name2$to_ext`;
    }

    if (-f $audiofile) {
	$syscom="$encoder_command --verbose -s 0 -e ".($end-$start)." -p $passes %08d$to_ext -a wav $audiofile > \"$nfile\"";
    }
    else {
	$syscom=$encoder_command . " --verbose -s 0 -e ".($end-$start)." -p $passes %08d$to_ext > \"$nfile\"";
    }

    if (defined($DEBUG_ENCODERS)) {
	print STDERR "Debug: Encodedv command is $syscom\n";
    }

    system($syscom);
}


if ($command eq "clear") {
    # this is called after "encode"
    # note that encoding could have been stopped at any time

    $to_ext=".ppm";

    for ($i = $start; $i <= $end; $i++) {
	$name=&mkname($i-1);
	if (-f "$name$to_ext") {
	    unlink "$name$to_ext";
	}
    }
    exit 0;
}


if ($command eq "finalise") {
    # do any finalising code

    # ...

    # end finalising code
    print "finalised\n";
    exit 0;
}

##########################################################3

sub mkname {
    sprintf("%08d", shift);
}


sub location {
    # return the location of an executable
    my ($command)=shift;

    if ($^O eq "MSWin32") {
	return "$command.exe";
    }

    my ($location) = `which \"$command\" 2>$nulfile`;
    chomp($location);

    $location;
}

##### required
1;
