#!/usr/bin/perl -w

######################################################################
### Voreinstellungen
######################################################################

$QUALITY = 1231;

# $MENCODER = "mencoder -ffourcc DX50 -vc mpeg12 -ovc lavc";
# besser für Ton:
# $MENCODER = "mencoder -ffourcc DX50 -vc mpeg12 -ovc lavc -aid 0 -msglevel all=4";
# Anpassung um *.vdr und *.ts verarbeiten zu können.
# "-noodml" ist nötig, da Centrix sonst nur eine Länge von 1:45 anzeigt!
$MENCODER = "mencoder -alang deu -noodml -ac -a52, -ffourcc DX50 -ovc lavc -msglevel all=4";

# Mit diesen Parametern ist auf dem Centrix kein Ton da!
$MENCODER_OPTS_FAST = "-oac copy -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$QUALITY";

$MENCODER_OPTS_HQ = "-fafmttag 0x55 -oac mp3lame -lameopts preset=standard -lavcopts vcodec=mpeg4:vbitrate=$QUALITY:mbd=1:lumi_mask=0.5:scplx_mask=0.1:cmp=256:vqmin=2:vqmax=6:mbqmin=2:mbqmax=10:autoaspect=1 -vf pp=lb";

# "-idx ist nötig, damit im AVI ein Index zu Springen drin ist!
$MENCODER_OPTS_CENTRIX = "-idx -vf scale -zoom -xy 320 -fafmttag 0x55 -oac mp3lame -lameopts preset=standard -lavcopts vcodec=mpeg4:vbitrate=600";

######################################################################
### Hauptprogramm
######################################################################

$hq = 1;
$fast = 0;
$centrix = 0;
if ($ARGV[0] eq '-fast')
{
  shift;
  $hq = 0;
  $fast = 1;
}

if ($ARGV[0] eq '-centrix')
{
  shift;
  $hq = 0;
  $centrix = 1;
}

$OUT = pop @ARGV || Hilfe();
$IN  = join(' ',@ARGV);

Hilfe() if $IN eq '';

print "'$IN' -> '$OUT'\n";

$IN_TEMP = "$OUT.$$";

$IN_ESC      = $IN;
$OUT_ESC     = $OUT;
$IN_TEMP_ESC = $IN_TEMP;
# "&" escapen
$IN_ESC      =~ s/\&/\\\&/g;
$OUT_ESC     =~ s/\&/\\\&/g;
$IN_TEMP_ESC =~ s/\&/\\\&/g;
# "'" escapen
$IN_ESC      =~ s/\'/\\\'/g;
$OUT_ESC     =~ s/\'/\\\'/g;
$IN_TEMP_ESC =~ s/\'/\\\'/g;
# "(" escapen
$IN_ESC      =~ s/\(/\\\(/g;
$OUT_ESC     =~ s/\(/\\\(/g;
$IN_TEMP_ESC =~ s/\(/\\\(/g;
# ")" escapen
$IN_ESC      =~ s/\)/\\\)/g;
$OUT_ESC     =~ s/\)/\\\)/g;
$IN_TEMP_ESC =~ s/\)/\\\)/g;
# "!" escapen
$IN_ESC      =~ s/\!/\\\!/g;
$OUT_ESC     =~ s/\!/\\\!/g;
$IN_TEMP_ESC =~ s/\!/\\\!/g;

# Files zu einem zusammenkopieren, da diese beiden Varianten nicht
# funktionieren:
# cat a b c | mencoder ... -o x
# mencoder a b c -o x
# Bei ersterem will der mencoder manchmal einen seek rückwärts durchführen, was
# natürlich nicht klappt und bei letzterem wird b und c ignoriert.
# Da mencoder das inzwischen kann, kann man auf den cat verzichten.
#system("echo DEBUG cat $IN_ESC nach $IN_TEMP_ESC");
#system("cat $IN_ESC > $IN_TEMP_ESC");

if ($fast)
{
  print "### Schnell! ###\n";
  # Das liefert auf Fernseher einwandfreie QualitÃ¤t, aber auf Notebook
  # sind Fehler sichtbar. DafÃ¼r geht es extrem schnell...
#  print "$MENCODER $MENCODER_OPTS_FAST -o $OUT_ESC $IN_TEMP_ESC\n";
#  system("$MENCODER $MENCODER_OPTS_FAST -o $OUT_ESC $IN_TEMP_ESC");
  system("touch ${OUT_ESC}.encoding_running");
  ($ret, $sig) = xsystem("$MENCODER $MENCODER_OPTS_FAST -o $OUT_ESC $IN_ESC");
  system("/bin/rm ${OUT_ESC}.encoding_running");
  print"### Return-Code: $ret\n";
  print"### Signal:      $sig\n";
  if ( ($ret > 0) || ($sig > 0) )
  {
    system("echo RET=$ret:SIG=$sig > ${OUT_ESC}.encoding_ended_with_error.txt");
  }
}

if ($centrix)
{
  print "### Für Centrix! ###\n";
#  print "$MENCODER $MENCODER_OPTS_CENTRIX -o $OUT_ESC $IN_TEMP_ESC\n";
#  system("$MENCODER $MENCODER_OPTS_CENTRIX -o $OUT_ESC $IN_TEMP_ESC");
  system("touch ${OUT_ESC}.encoding_running");
  ($ret, $sig) = xsystem("$MENCODER $MENCODER_OPTS_CENTRIX -o $OUT_ESC $IN_ESC");
  system("/bin/rm ${OUT_ESC}.encoding_running");
  print"### Return-Code: $ret\n";
  print"### Signal:      $sig\n";
  if ( ($ret > 0) || ($sig > 0) )
  {
    system("echo RET=$ret:SIG=$sig > ${OUT_ESC}.encoding_ended_with_error.txt");
  }
}

if ($hq)
{
  print "### High Quality! ###\n";
  # Diese Optionen bringen keine sichtbare Verbesserung
  # mencoder -sws 2 -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$QUALITY:trell:mv0:mbd=2:v4mv:qprd:cmp=10:subcmp=10:mbcmp=10:predia=2:dia=2 -o $OUT $IN
  # Das liefert die beste QualitÃ¤t bei akzeptabler Laufzeit:
#  print "${MENCODER}:vpass=1 -o $OUT_ESC $IN_TEMP_ESC\n";
#  system("${MENCODER}:vpass=1 -o $OUT_ESC $IN_TEMP_ESC");
#  system("${MENCODER}:vpass=2 -o $OUT_ESC $IN_TEMP_ESC");
#  unlink $PASSLOGFILE;
#  print "$MENCODER $MENCODER_OPTS_HQ -o $OUT_ESC $IN_TEMP_ESC\n";
#  system("$MENCODER $MENCODER_OPTS_HQ -o $OUT_ESC $IN_TEMP_ESC");
  system("touch ${OUT_ESC}.encoding_running");
  ($ret, $sig) = xsystem("$MENCODER $MENCODER_OPTS_HQ -o $OUT_ESC $IN_ESC");
  system("/bin/rm ${OUT_ESC}.encoding_running");
  print"### Return-Code: $ret\n";
  print"### Signal:      $sig\n";
  if ( ($ret > 0) || ($sig > 0) )
  {
    system("echo RET=$ret:SIG=$sig > ${OUT_ESC}.encoding_ended_with_error.txt");
  }
}

#print "Lösche '$IN_TEMP'\n";
#unlink $IN_TEMP;


######################################################################
### Unterprogramme
######################################################################


sub xsystem
{
  my $command = shift;
  print "$command\n";
  system($command);
  my $ret = ($? >> 8);
  my $sig = ($? & 127);
  return ($ret, $sig);
}


sub Hilfe
{
  die "Aufruf: vdr2avi [-fast] Quellfiles Zielfile\n";
}
