Skip to content

Commit

Permalink
Fixed task creation for videos with uneven dimensions. (cvat-ai#1594)
Browse files Browse the repository at this point in the history
* used yuv420p format for compressed and original chunks

* updated changelog
  • Loading branch information
azhavoro authored and Fernando Martínez González committed Aug 3, 2020
1 parent d2b1ddf commit c818ec5
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 (<https://github.com/opencv/cvat/pull/1577>)
- Synchronization with remote git repo (<https://github.com/opencv/cvat/pull/1582>)
- A problem with mask to polygons conversion when polygons are too small (<https://github.com/opencv/cvat/pull/1581>)
- Unable to upload video with uneven size (<https://github.com/opencv/cvat/pull/1594>)

### Security
-
Expand Down
21 changes: 9 additions & 12 deletions cvat/apps/engine/media_extractors.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (C) 2019 Intel Corporation
# Copyright (C) 2019-2020 Intel Corporation
#
# SPDX-License-Identifier: MIT

Expand Down Expand Up @@ -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
Expand All @@ -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",
Expand Down Expand Up @@ -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',
Expand Down

0 comments on commit c818ec5

Please sign in to comment.