Opened 6 years ago
Last modified 6 years ago
#9038 new defect
kmsgrab: the parsing of `format_modifier` is problematic
| Reported by: | xry111 | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | undetermined |
| Version: | unspecified | Keywords: | kmsgrab |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
The parsing of format_modifier from command line is problematic.
In the parsing of those option with AV_OPT_TYPE_INT64 type, the value is firstly parsed into a double. However in this case format_modifier is a bit mask. For example, with my Intel iGPU I need I915_FORMAT_MOD_X_TILED, which is effectively (1 << 56) | 1.
The value is $2{56} + 1$, but as all we know the precision of double is only 52 bits. So $2{56} + 1$ is truncated to $2{56}$, which is wrong.
How to reproduce:
Add one line of code to output drm_format_modifier:
av_log(avctx, AV_LOG_DEBUG, "format modifier = %ld\n", ctx->drm_format_m odifier);
Build and run ffmpeg, to grab the screen:
% ffmpeg -f kmsgrab -format_modifier 72057594037927937 -i - -vf 'hwdownload,format=bgr0' output.mp4 -loglevel 114514 2>&1 | tee log
Inspect the log:
% grep modifier log Reading option '-format_modifier' ... matched as AVOption 'format_modifier' with argument '72057594037927937'. [kmsgrab @ 0x654b40] format modifier = 72057594037927936
Inspect the video:
ffplay output.mp4
The result is a broken video, because of the incorrect format_modifier value.



Fix a paragraph, to satisify the trac format:
The value is 256 + 1, but as all we know the precision of double is only 52 bits. So 256 + 1 is truncated to 256, which is wrong.