⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.pm

📁 JVT-Z203_jsvm.rar
💻 PM
📖 第 1 页 / 共 2 页
字号:
  ::PrintLog(" Create Sequences          .......... ");

  #build new original if needed
  if ($simu->{origname} ne $simu->{original})
  {

    unless(-f $simu->{origname})
    {
      my $essopt= ((defined $simu->{croptype}) and ($simu->{croptype}==2))? 2:1;
      my $temporatio = ($simu->{originalframerate}/$simu->{framerate});
      my $nbfr = $simu->{nbframes};
      if (!($temporatio == 1)) {$nbfr = int(($nbfr+($temporatio-1))/$temporatio);}
      
      External::Resize($param,
                      $simu->{logname},
                      $simu->{original},
                      $simu->{originalwidth},
                      $simu->{originalheight},
                      $simu->{originalframerate},
                      $simu->{origname},
                      $simu->{width},
                      $simu->{height},
                      $simu->{framerate},
                      $simu->{phasemode},
                      $essopt,
                      $nbfr,
                      $simu->{cropfilename},
                      $simu->{resamplemode});
    }
  }

  # build layers references
  my $reforigname= $simu->{origname};
  my $refwidth   = $simu->{width};
  my $refheight   = $simu->{height};
  my $refframerate   = $simu->{framerate};
  my $origframerate;
  if ($simu->{originalframerate}>$simu->{framerate})
  {
    $origframerate = $simu->{originalframerate};
  }
  else
  {
    $origframerate = $simu->{framerate};
  }

  my $nblayer = $#{$simu->{layers}};
  my @layers = @{$simu->{layers}};
  while($nblayer>=0)
  {
    my $layer=@layers[$nblayer];
    my $essopt= ((defined $layer->{croptype}) and ($layer->{croptype}==2))? 2:1;

    unless(-f $layer->{origname})
    {
      my $temporatio = ($origframerate/$layer->{framerate});
      my $nbfr = $simu->{nbframes};
      if (!($temporatio == 1)){$nbfr = int(($nbfr+($temporatio-1))/$temporatio);}
      
      External::Resize($param,
                        $simu->{logname},
                        $reforigname,
                        $refwidth,
                        $refheight,
                        $refframerate,
                        $layer->{origname},
                        $layer->{width},
                        $layer->{height},
                        $layer->{framerate},
                        $simu->{phasemode},
                        $essopt,
                        $nbfr,
                        $layer->{cropfilename},
                        $layer->{resamplemode});
    }
    $reforigname    = $layer->{origname};
    $refwidth       = $layer->{width};
    $refheight      = $layer->{height};
    $refframerate   = $layer->{framerate};

    $nblayer--;
  }

  # build tests references
  foreach my $test (@{$simu->{tests}})
  {
    my $essopt= ((defined $test->{croptype}) and ($test->{croptype}==2))? 2:1;

    print "$simu->{origname} $simu->{original} \n ";

    unless(-f $test->{origname})
    {
      my $refl= $test->{refl};
      my $temporatio = ($origframerate/$test->{framerate});
      my $nbfr = $simu->{nbframes};
      if (!($temporatio == 1)){$nbfr = int(($nbfr+($temporatio-1))/$temporatio);}
 
      External::Resize($param,
                      $simu->{logname},
                      $refl->{origname},
                      $refl->{width},
                      $refl->{height},
                      $refl->{framerate},
                      $test->{origname},
                      $test->{width},
                      $test->{height},
                      $test->{framerate},
                      $simu->{phasemode},
                      $essopt,
                      $nbfr,
                      $test->{cropfilename},
                      $test->{resamplemode});
    }
  }
  return 1;
}

######################################################################################
# Function         : CheckRange($;$;[$])
######################################################################################
sub CheckRange
{
  my $value = shift;
  my $ref   = shift;
  my $range = ( $#_ >= 0 ) ? shift : 0.05;
  my $up    = 1. + $range;
  my $down  = 1. - $range;

  if ($value<$down*$ref) {return 0;}
  if ($value>$up*$ref) {return 0;}
  return 1;
}

###############################################################################
# Function         : CheckResults ($$$$$$$$$$)
###############################################################################
sub CheckResults
{
  my ($simu,$test,$res_rate,$res_psnrY,$res_psnrCb,$res_psnrCr,$res_rate2,$res_psnrY2,$res_psnrCb2,$res_psnrCr2)= @_;

  my $expectedBitrate =$test->{bitrate};
  my $expextedPSNR    =$test->{psnr};
  my $result = 1;

  if (($res_rate == 0 and $res_rate ne "0") | ($res_psnrY == 0 and $res_psnrY ne "0"))
  {
    #not a number
    ::PrintLog("\t\t\t\t\tFailed (No results)\n");
    $result = 0;
  }
  else
  {
    #check bitrate
    #----------------
    ::PrintLog("\tRate\t(${res_rate})\t\t");
    ($test->{mode}==2) and (($res_rate == $res_rate2) or ::PrintLog("Failed (Rate = $res_rate and Rate2 = $res_rate2 )\n"));
    if (($expectedBitrate == 0 and $res_rate>0)
    or  ($expectedBitrate != 0 and CheckRange($res_rate,$expectedBitrate,$simu->{bitratecheckrange})))
    {
      ::PrintLog("Passed\n");
      $result = 1;
    }
    else
    {
      ::PrintLog("Failed (Result = $res_rate - Target: $expectedBitrate)\n");
      $result = 0;
    };

    #Check PSNR
    #----------------
    ::PrintLog("\tPSNR\t($res_psnrY)\t\t");
    ($test->{mode}==2) and (($res_psnrY == $res_psnrY2) or ::PrintLog("Failed (PSNRY = $res_psnrY and PSNRY2 = $res_psnrY2 )\n"));
    if (($res_psnrY>=$expextedPSNR) or  CheckRange($res_psnrY,$expextedPSNR,$simu->{psnrcheckrange}))
    {
      ::PrintLog("Passed\n");
      $result &= 1;
    }
    else
    {
      ::PrintLog("Failed (result = $res_psnrY - Target: $expextedPSNR)\n");
      $result &= 0;
    }
  }

  return $result;
}

###############################################################################
# Function         : CheckPerfectMatch ($$$$)
###############################################################################
sub CheckPerfectMatch ($$$)
{
  my ($psnrY,$psnrCb,$psnrCr)= @_;

  #check Mismatch
  #---------------
  if(($psnrY==99.99)and ($psnrCr==99.99) and ($psnrCb==99.99))
  {
    ::PrintLog("Passed\n");
    return 1;
  }
  else
  {
    ::PrintLog("Failed ($psnrY $psnrCb $psnrCr)\n");
    return 0;
  }
}

###############################################################################
# Function         : ApplyTests ($;$)
###############################################################################
sub ApplyTests ($;$)
{
  my $simu  = shift;
  my $param = shift;

  ::PrintLog(" Run Tests\t\t.......... \n\n");

  my $nbtest =$simu->{tests};
  ($nbtest) or die "No test defined for simu ".$simu->{name}."\n";

  my ($res_rate,$res_psnrY,$res_psnrCb,$res_psnrCr);
  my ($res_rate2,$res_psnrY2,$res_psnrCb2,$res_psnrCr2);

  my $result = 1;

  foreach my $test (@{$simu->{tests}})
  {
    ::PrintLog("-----------------------------------------------\n");
    ::PrintLog($test->{name}." :: (".$test->{width}."x".$test->{height}.", ".$test->{framerate}.") -> ".$test->{bitrate}." - ".$test->{psnr}."\n");
    ::PrintLog("-----------------------------------------------\n");

    if ($test->{mode}==0) #decode only
    {
      #print Dumper($test);
      ($test->{packetlossrate})  and External::LossSimulator($simu,$param,$test);
      ($res_rate, $res_psnrY, $res_psnrCb, $res_psnrCr) = External::Decode($simu,$test,$param);
    }
    elsif ($test->{mode}==1) #extract+decode
    {
      External::Extract($simu,$test,$param);
      ($test->{packetlossrate})  and External::LossSimulator($simu,$param,$test);
      ($res_rate, $res_psnrY, $res_psnrCb, $res_psnrCr) = External::Decode($simu,$test,$param);
    }
    elsif ($test->{mode}==2) #doublecheck (extract+decode)
    {
      External::Extract($simu,$test,$param);
      ($test->{packetlossrate})  and External::LossSimulator($simu,$param,$test);
      ($res_rate, $res_psnrY, $res_psnrCb, $res_psnrCr) = External::Decode($simu,$test,$param);
      External::Extract($simu,$test,$param);
      ($test->{packetlossrate})  and External::LossSimulator($simu,$param,$test);
      ($res_rate2, $res_psnrY2, $res_psnrCb2, $res_psnrCr2) = External::Decode($simu,$test,$param);
    }
    elsif ($test->{mode}==11) #decode+rewrite
    {
      External::Extract($simu,$test,$param);
      ($test->{packetlossrate})  and External::LossSimulator($simu,$param,$test);
      ($res_rate, $res_psnrY, $res_psnrCb, $res_psnrCr) = External::Rewrite($simu,$test,$param);      
    }    
    else #extract + utilisation pour le prochain test
    {
      External::Extract($simu,$test,$param);
      next;
    }

    #Check bitrate and/or PSNR
    $result &= CheckResults($simu,$test,$res_rate, $res_psnrY, $res_psnrCb, $res_psnrCr,$res_rate2, $res_psnrY2, $res_psnrCb2, $res_psnrCr2);

    #Check encoder/decoder matching
    if($test->{encdecmatch})
    {
      my($rate, $psnrY, $psnrCb, $psnrCr)=External::ComputePSNR($param->{path_bin},$simu->{logname},$test->{width},$test->{height},$test->{decodedname},$test->{reconname},$test->{extractedname},$test->{framerate},$param->{path_tmp}."psnr.dat");
    	::PrintLog("\tEncoder/Decoder match\t\t");
      $result &= CheckPerfectMatch ($psnrY, $psnrCb, $psnrCr);
    }

    #Check decoder/rewriter matching
    if ($test->{mode}==11)
    {
      my($rate, $psnrY, $psnrCb, $psnrCr)=External::ComputePSNR($param->{path_bin},$simu->{logname},$test->{width},$test->{height},$test->{decodedname},"Rewriting.yuv","Rewriting.264",$test->{framerate},$param->{path_tmp}."psnr.dat");
    	::PrintLog("\tDecoder/Rewriter match\t\t");
      $result &= CheckPerfectMatch ($psnrY, $psnrCb, $psnrCr);
    }

    if($test->{jmmatch})
    {
      External::JMDecode($simu,$test,$param);
      my($rate, $psnrY, $psnrCb, $psnrCr)=External::ComputePSNR($param->{path_bin},$simu->{logname},$test->{width},$test->{height},$test->{decodedname},$test->{jmdecodedname},$test->{extractedname},$test->{framerate},$param->{path_tmp}."psnr.dat");
      ::PrintLog("\tJM Decoder match\t\t");
      $result &= CheckPerfectMatch ($psnrY, $psnrCb, $psnrCr);
    }

  } #foreach

  return $result;
}





1;
__END__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -