Beispiel #1
0
def test_webm_lossless_filter(mocker, http_client, base_url, ffmpeg_path):
    mocker.spy(FFmpegEngine, 'run_cmd')

    response = yield http_client.fetch(
        "%s/unsafe/filters:lossless()/hotdog.webm" % (base_url))

    FFmpegEngine.run_cmd.assert_called_once_with(mocker.ANY, mocker.ANY)

    cmd = FFmpegEngine.run_cmd.mock_calls[0].args[1]

    assert '-lossless' in cmd
    assert cmd[cmd.index('-lossless') + 1] == '1'

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/webm'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': 'vp9',
        'width': 200,
        'height': 150,
        'pix_fmt': 'yuv420p',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual
def test_h265_tune_filter(mocker, http_client, base_url, ffmpeg_path):
    mocker.spy(FFmpegEngine, 'run_cmd')

    response = yield http_client.fetch(
        "%s/unsafe/filters:tune(animation):format(h265)/hotdog.mp4" % base_url)

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    FFmpegEngine.run_cmd.assert_called_once_with(mocker.ANY, mocker.ANY)

    cmd = FFmpegEngine.run_cmd.mock_calls[0][1][1]

    assert '-tune' in cmd
    assert cmd[cmd.index('-tune') + 1] == 'animation'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': 'hevc',
        'width': 200,
        'height': 150,
        'pix_fmt': 'yuv420p',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual
Beispiel #3
0
 def probe(self):
     # If self.image, we have an animated image (e.g. webp) that ffmpeg
     # cannot yet decode, but pillow can.
     if self.image:
         self.original_size = self.image.size
         duration_ms = 0
         # Load all frames, get the sum of all frames' durations
         for frame in ImageSequence.Iterator(self.image):
             frame.load()
             duration_ms += frame.info['duration']
         self.image.seek(0)
         self.duration = Decimal(duration_ms) / Decimal(1000)
     else:
         ffprobe_data = ffprobe(self.buffer, extension=self.extension)
         self.original_size = ffprobe_data['width'], ffprobe_data['height']
         self.duration = Decimal(ffprobe_data['duration'])
def test_transcode_to_h265(http_client, base_url, src_ext):
    response = yield http_client.fetch(
        "%s/unsafe/filters:format(h265)/hotdog.%s" % (base_url, src_ext))

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': 'hevc',
        'width': 200,
        'height': 150,
        'pix_fmt': 'yuv420p',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual
def test_mp4_resize_odd_dimensions(http_client, base_url, codec):
    """h264 and h265 require videos to have width and height be even integers"""
    response = yield http_client.fetch(
        "%s/unsafe/100x75/filters:format(%s)/hotdog.mp4" % (base_url, codec))

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': codec,
        'width': 100,
        'height': 74,
        'pix_fmt': 'yuv420p',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual
def test_filter_grayscale(mocker, http_client, base_url):
    mocker.spy(FFmpegEngine, 'convert_to_grayscale')
    mocker.spy(FFmpegEngine, 'run_cmd')

    response = yield http_client.fetch(
        "%s/unsafe/filters:grayscale()/hotdog.mp4" % base_url)

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    FFmpegEngine.convert_to_grayscale.assert_called_once()
    FFmpegEngine.run_cmd.assert_called_once_with(mocker.ANY, mocker.ANY)

    cmd = FFmpegEngine.run_cmd.mock_calls[0].args[1]

    assert '-vf' in cmd
    assert cmd[cmd.index('-vf') + 1] == 'hue=s=0'

    file_info = ffprobe(response.body)
    assert (file_info['width'], file_info['height']) == (200, 150)
def test_crop(mocker, http_client, base_url):
    mocker.spy(FFmpegEngine, 'crop')
    mocker.spy(FFmpegEngine, 'run_cmd')

    response = yield http_client.fetch("%s/unsafe/50x25:150x125/hotdog.mp4" %
                                       base_url)

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    FFmpegEngine.crop.assert_called_once_with(mocker.ANY, 50, 25, 150, 125)
    FFmpegEngine.run_cmd.assert_called_once_with(mocker.ANY, mocker.ANY)

    cmd = FFmpegEngine.run_cmd.mock_calls[0].args[1]

    assert '-vf' in cmd
    assert cmd[cmd.index('-vf') + 1] == 'crop=100:100:50:25'

    file_info = ffprobe(response.body)
    assert (file_info['width'], file_info['height']) == (100, 100)
Beispiel #8
0
def test_flip_vertically(mocker, http_client, base_url):
    mocker.spy(FFmpegEngine, 'flip_vertically')
    mocker.spy(FFmpegEngine, 'run_cmd')

    response = yield http_client.fetch("%s/unsafe/200x-150/hotdog.mp4" %
                                       base_url)

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/mp4'

    FFmpegEngine.flip_vertically.assert_called_once()
    FFmpegEngine.run_cmd.assert_called_once_with(mocker.ANY, mocker.ANY)

    cmd = FFmpegEngine.run_cmd.mock_calls[0][1][1]

    assert '-vf' in cmd
    assert cmd[cmd.index('-vf') + 1] == 'vflip'

    file_info = ffprobe(response.body)
    assert (file_info['width'], file_info['height']) == (200, 150)
def test_transcode_to_webm(http_client, base_url, src_ext):
    url_filter = "/filters:format(webm)" if src_ext else ""
    if src_ext is None:
        src_ext = "webm"

    response = yield http_client.fetch("%s/unsafe%s/hotdog.%s" %
                                       (base_url, url_filter, src_ext))

    assert response.code == 200
    assert response.headers.get('content-type') == 'video/webm'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': 'vp9',
        'width': 200,
        'height': 150,
        'pix_fmt': 'yuv420p',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual
def test_transcode_to_gif(config_key, config_val, http_client, base_url,
                          config, src_ext):
    setattr(config, config_key, config_val)

    url_filter = "/filters:format(gif)" if src_ext else ""
    if src_ext is None:
        src_ext = "gif"

    response = yield http_client.fetch("%s/unsafe%s/hotdog.%s" %
                                       (base_url, url_filter, src_ext))

    assert response.code == 200
    assert response.headers.get('content-type') == 'image/gif'

    file_info = ffprobe(response.body)

    expected = {
        'codec_name': 'gif',
        'width': 200,
        'height': 150,
        'pix_fmt': 'bgra',
    }
    actual = {k: file_info.get(k) for k in expected}
    assert expected == actual