Opened 15 months ago
#10669 new defect
crop filter with exact=0 does not work correctly on non-chroma-subsampled hardware-backed inputs
Reported by: | Russell | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avfilter |
Version: | git-master | Keywords: | crop vaapi hwaccel |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
Summary of the bug: I'm trying to crop a 444 (no chroma subsampling) video using crop
using vaapi. The crop region seems to always be rounded to a multiple of two, even though the input has no chroma subsampling, which according to the documentation means that exact
should have no effect.
Originally reported to a project I develop at https://github.com/russelltg/wl-screenrec/issues/26
The sample video has lines at x,y = 100,299. So the crop args w=200:h=200:x=100:x=100 should give a perfect box around the corner (which it does). But w=200:h=200:x=101:x=101 incorrectly gives the same result.
How to reproduce:
% ffmpeg -vaapi_device /dev/dri/renderD129 -i screenrecord.mp4 -vf 'hwupload, crop=w=200:h=200:x=101:y=101,scale_vaapi=format=nv12:w=200:h=200' -c:v h264_vaapi cropped.mp4 ffmpeg version N-112783-g5452cbdc15 built with gcc 13.2.1 (GCC) 20230801 HW: Intel i9-11900H
However, it does work if you put exact=1
It seems to me that the problematic snippet is from vf_crop.c:158
if (pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) { s->hsub = 1; s->vsub = 1; } else { s->hsub = pix_desc->log2_chroma_w; s->vsub = pix_desc->log2_chroma_h; }
from vf_crop.c, which seems to assume all hardware backed formats have 2x2 chroma subsampling (which, sure is typically the case, but not always!)
A yuv444 HEVC encoded mp4 file with line indicators at known pixel values