You are here

private function TranscoderAbstractionFactoryFfmpeg::setAspectRatioOptions in Video 7.2

Set aspect ratio and size related transcoder options.

1 call to TranscoderAbstractionFactoryFfmpeg::setAspectRatioOptions()
TranscoderAbstractionFactoryFfmpeg::setOptions in transcoders/TranscoderAbstractionFactoryFfmpeg.inc
Set options is to set transcoding settings before send to the transcoder.

File

transcoders/TranscoderAbstractionFactoryFfmpeg.inc, line 685
File containing class TranscoderAbstractionFactoryFfmpeg

Class

TranscoderAbstractionFactoryFfmpeg
Class that handles FFmpeg transcoding.

Code

private function setAspectRatioOptions(array $options) {
  $targetdimensions = explode('x', $options['wxh'], 2);
  $file_info = $this
    ->getFileInfo();
  $sourcedimensions = array(
    intval($file_info['video']['dimensions']['width']),
    intval($file_info['video']['dimensions']['height']),
  );

  // If no change is necessary, just return.
  if ($targetdimensions == $sourcedimensions) {
    return;
  }
  $targetaspect = round($targetdimensions[0] / $targetdimensions[1], 4);
  $sourceaspect = round($sourcedimensions[0] / $sourcedimensions[1], 4);
  $aspectmode = !empty($options['video_aspectmode']) ? $options['video_aspectmode'] : 'preserve';
  switch ($aspectmode) {
    default:
    case 'preserve':
      if ($sourceaspect >= $targetaspect) {

        // Source video is wider than destination.
        // Decrease the height.
        $factor = $targetdimensions[0] < $sourcedimensions[0] ? $targetdimensions[0] / $sourcedimensions[0] : $sourcedimensions[0] / $targetdimensions[0];
        $width = $targetdimensions[0];
        $height = $sourcedimensions[1] * $factor;
      }
      else {
        $factor = $targetdimensions[1] < $sourcedimensions[1] ? $targetdimensions[1] / $sourcedimensions[1] : $sourcedimensions[1] / $targetdimensions[1];
        $width = $sourcedimensions[0] * $factor;
        $height = $targetdimensions[1];
      }
      $width = video_utility::roundToEvenNumber($width);
      $height = video_utility::roundToEvenNumber($height);
      if ($width != $sourcedimensions[0] || $height != $sourcedimensions[1]) {
        $this->transcoder
          ->addCommand('-vf', 'scale=' . $width . ':' . $height);
      }
      break;
    case 'crop':
      if ($sourceaspect >= $targetaspect) {

        // Source video is wider than destination.
        // Cut off left and right.
        $factor = $targetdimensions[1] < $sourcedimensions[1] ? $targetdimensions[1] / $sourcedimensions[1] : $sourcedimensions[1] / $targetdimensions[1];
        $width = round($factor * $sourcedimensions[0]);
        $height = $sourcedimensions[1];
      }
      else {
        $factor = $targetdimensions[0] < $sourcedimensions[0] ? $targetdimensions[0] / $sourcedimensions[0] : $sourcedimensions[0] / $targetdimensions[0];
        $width = $sourcedimensions[0];
        $height = round($factor * $sourcedimensions[1]);
      }
      $this->transcoder
        ->addCommand('-vf', 'crop=' . $width . ':' . $height . ',scale=' . $targetdimensions[0] . ':' . $targetdimensions[1]);
      break;
    case 'pad':
      if ($sourceaspect >= $targetaspect) {

        // Source video is wider than destination.
        // Add padding to top and bottom.
        $factor = $targetdimensions[1] > $sourcedimensions[1] ? $targetdimensions[1] / $sourcedimensions[1] : $sourcedimensions[1] / $targetdimensions[1];
        $width = $sourcedimensions[0];
        $height = round($factor * $sourcedimensions[1]);
        $x = 0;
        $y = ($height - $sourcedimensions[1]) / 2;
      }
      else {
        $factor = $targetdimensions[0] > $sourcedimensions[0] ? $targetdimensions[0] / $sourcedimensions[0] : $sourcedimensions[0] / $targetdimensions[0];
        $width = round($factor * $sourcedimensions[0]);
        $height = $sourcedimensions[1];
        $x = ($width - $sourcedimensions[0]) / 2;
        $y = 0;
      }
      $this->transcoder
        ->addCommand('-vf', 'pad=' . $width . ':' . $height . ':' . $x . ':' . $y . ',scale=' . $targetdimensions[0] . ':' . $targetdimensions[1]);
      break;
    case 'stretch':
      $result = $this->transcoder
        ->setVideoDimensions($targetdimensions[0], $targetdimensions[1]);
      break;
  }
}