diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e683f..5059adf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ CHANGELOG --------- +* 0.4.2 (xx-xx-xx) + + * Add Rotate filter. + * 0.4.1 (11-26-2013) * Add Clip filter (@guimeira) diff --git a/src/FFMpeg/Filters/Video/RotateFilter.php b/src/FFMpeg/Filters/Video/RotateFilter.php new file mode 100644 index 0000000..95da3ad --- /dev/null +++ b/src/FFMpeg/Filters/Video/RotateFilter.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FFMpeg\Filters\Video; + +use FFMpeg\Coordinate\Dimension; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; +use FFMpeg\Media\Video; +use FFMpeg\Format\VideoInterface; + +class RotateFilter implements VideoFilterInterface +{ + const ROTATE_90 = 'transpose=1'; + const ROTATE_180 = 'hflip,vflip'; + const ROTATE_270 = 'transpose=2'; + + /** @var string */ + private $angle; + /** @var integer */ + private $priority; + + public function __construct($angle, $priority = 0) + { + $this->setAngle($angle); + $this->priority = (int) $priority; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return $this->priority; + } + + /** + * @return Dimension + */ + public function getAngle() + { + return $this->angle; + } + + /** + * {@inheritdoc} + */ + public function apply(Video $video, VideoInterface $format) + { + return array('-vf', $this->angle, '-metadata:s:v:0', 'rotate=0'); + } + + private function setAngle($angle) + { + switch ($angle) { + case self::ROTATE_90: + case self::ROTATE_180: + case self::ROTATE_270: + $this->angle = $angle; + break; + default: + throw new InvalidArgumentException('Invalid angle value.'); + } + } +} diff --git a/src/FFMpeg/Filters/Video/VideoFilters.php b/src/FFMpeg/Filters/Video/VideoFilters.php index c8a31d8..a9faacb 100644 --- a/src/FFMpeg/Filters/Video/VideoFilters.php +++ b/src/FFMpeg/Filters/Video/VideoFilters.php @@ -95,4 +95,11 @@ class VideoFilters extends AudioFilters return $this; } + + public function rotate($angle, $priority = 0) + { + $this->media->addFilter(new RotateFilter($angle, $priority)); + + return $this; + } } diff --git a/tests/FFMpeg/Tests/Filters/Video/RotateFilterTest.php b/tests/FFMpeg/Tests/Filters/Video/RotateFilterTest.php new file mode 100644 index 0000000..103b313 --- /dev/null +++ b/tests/FFMpeg/Tests/Filters/Video/RotateFilterTest.php @@ -0,0 +1,27 @@ +getVideoMock(); + $format = $this->getMock('FFMpeg\Format\VideoInterface'); + + $filter = new RotateFilter(RotateFilter::ROTATE_90); + $this->assertEquals(array('-vf', RotateFilter::ROTATE_90, '-metadata:s:v:0', 'rotate=0'), $filter->apply($video, $format)); + } + + /** + * @expectedException \FFMpeg\Exception\InvalidArgumentException + * @expectedExceptionMessage Invalid angle value. + */ + public function testApplyInvalidAngle() + { + new RotateFilter('90'); + } +}