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;
}
}