From c818ec54cbe03c852c92395b08d6151174083a86 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov <41117609+azhavoro@users.noreply.github.com> Date: Tue, 26 May 2020 21:11:30 +0300 Subject: [PATCH] Fixed task creation for videos with uneven dimensions. (#1594) * used yuv420p format for compressed and original chunks * updated changelog --- CHANGELOG.md | 1 + cvat/apps/engine/media_extractors.py | 21 +++++++++------------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9816c8def9ad..f48c142ba7ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed an error when exporting a task with cuboids to any format except CVAT () - Synchronization with remote git repo () - A problem with mask to polygons conversion when polygons are too small () +- Unable to upload video with uneven size () ### Security - diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 18d28f208d80..3070dca70d07 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -1,4 +1,4 @@ -# Copyright (C) 2019 Intel Corporation +# Copyright (C) 2019-2020 Intel Corporation # # SPDX-License-Identifier: MIT @@ -304,10 +304,16 @@ def __init__(self, _): self._output_fps = 25 @staticmethod - def _create_av_container(path, w, h, rate, pix_format, options): + def _create_av_container(path, w, h, rate, options): + # x264 requires width and height must be divisible by 2 for yuv420p + if h % 2: + h += 1 + if w % 2: + w += 1 + container = av.open(path, 'w') video_stream = container.add_stream('libx264', rate=rate) - video_stream.pix_fmt = pix_format + video_stream.pix_fmt = "yuv420p" video_stream.width = w video_stream.height = h video_stream.options = options @@ -320,14 +326,12 @@ def save_as_chunk(self, images, chunk_path): input_w = images[0][0].width input_h = images[0][0].height - pix_format = images[0][0].format.name output_container, output_v_stream = self._create_av_container( path=chunk_path, w=input_w, h=input_h, rate=self._output_fps, - pix_format=pix_format, options={ "crf": str(self._image_quality), "preset": "ultrafast", @@ -373,18 +377,11 @@ def save_as_chunk(self, images, chunk_path): output_h = input_h // downscale_factor output_w = input_w // downscale_factor - # width and height must be divisible by 2 - if output_h % 2: - output_h += 1 - if output_w % 2: - output_w +=1 - output_container, output_v_stream = self._create_av_container( path=chunk_path, w=output_w, h=output_h, rate=self._output_fps, - pix_format='yuv420p', options={ 'profile': 'baseline', 'coder': '0',