#10531 closed defect (fixed)

vf_drawtext causing font rendering jitter after libharfbuz commit

Reported by: Mark Burton Owned by:
Priority: important Component: avfilter
Version: git-master Keywords: drawtext
Cc: Mark Burton, t.rapp Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description (last modified by Mark Burton)

Summary of the bug:

Prior to the below commit to vf_drawtext, it was possible to draw running timecode, justified to the centre or right edge and not have any horizontal jitter as the numbers ticked up. After the commit, this is no longer the case and the numbers move around horizontally as the width of the characters changes, even though a monospaced font is being used.

avfilter/vf_drawtext: improve glyph shaping and positioning
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/1eeb59a2099479eeead8cdc0d4586443fb301a8a

How to reproduce:

% ffmpeg -f lavfi -i "color=black:size=300x100:rate=24" -t 2 -vf "drawtext=fontfile=/Library/Fonts/DroidSansMono.ttf: fontcolor=white: fontsize=40: x=(w-tw)/2: y=(h-th)/2: rate=24: timecode='01\:14\:13\:19'" timecode.mov
ffmpeg version N-111793-gcb1479faca-https://www.martin-riedl.de Copyright (c) 2000-2023 the FFmpeg developers
  built with Apple clang version 14.0.0 (clang-1400.0.29.102)
  configuration: --prefix=/Volumes/ffmpeg_arm64/out --pkg-config-flags=--static --extra-version='https://www.martin-riedl.de' --enable-gray --enable-libxml2 --enable-gpl --enable-libfreetype --enable-fontconfig --enable-libharfbuzz --enable-libbluray --enable-libsnappy --enable-libvmaf --enable-libass --enable-libklvanc --enable-libzimg --enable-libzvbi --enable-libaom --enable-libopenh264 --enable-libopenjpeg --enable-librav1e --enable-libsvtav1 --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libtheora
  libavutil      58. 17.100 / 58. 17.100
  libavcodec     60. 23.100 / 60. 23.100
  libavformat    60. 10.100 / 60. 10.100
  libavdevice    60.  2.101 / 60.  2.101
  libavfilter     9. 11.100 /  9. 11.100
  libswscale      7.  3.100 /  7.  3.100
  libswresample   4. 11.100 /  4. 11.100
  libpostproc    57.  2.100 / 57.  2.100
Input #0, lavfi, from 'color=black:size=300x100:rate=24':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: wrapped_avframe, yuv420p, 300x100 [SAR 1:1 DAR 3:1], 24 fps, 24 tbr, 24 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (wrapped_avframe (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x1326070e0] using SAR=1/1
[libx264 @ 0x1326070e0] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x1326070e0] profile High, level 1.2, 4:2:0, 8-bit
[libx264 @ 0x1326070e0] 264 - core 164 - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mov, to 'timecode.mov':
  Metadata:
    encoder         : Lavf60.10.100
  Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(progressive), 300x100 [SAR 1:1 DAR 3:1], q=2-31, 24 fps, 12288 tbn
    Metadata:
      encoder         : Lavc60.23.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[out#0/mov @ 0x600003f583c0] video:11kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 12.111263%
frame=   48 fps=0.0 q=-1.0 Lsize=      12kB time=00:00:01.87 bitrate=  52.5kbits/s speed=59.3x    
[libx264 @ 0x1326070e0] frame I:1     Avg QP:12.89  size:  1394
[libx264 @ 0x1326070e0] frame P:14    Avg QP:18.93  size:   239
[libx264 @ 0x1326070e0] frame B:33    Avg QP:25.90  size:   168
[libx264 @ 0x1326070e0] consecutive B-frames:  2.1%  0.0% 56.2% 41.7%
[libx264 @ 0x1326070e0] mb I  I16..4: 68.4%  3.0% 28.6%
[libx264 @ 0x1326070e0] mb P  I16..4:  1.0%  0.3%  1.5%  P16..4:  0.6%  1.5%  1.5%  0.0%  0.0%    skip:93.6%
[libx264 @ 0x1326070e0] mb B  I16..4:  2.9%  0.3%  0.9%  B16..8: 18.4%  2.8%  0.8%  direct: 0.2%  skip:73.6%  L0:31.1% L1:68.4% BI: 0.5%
[libx264 @ 0x1326070e0] 8x8 transform intra:6.8% inter:30.9%
[libx264 @ 0x1326070e0] coded y,uvDC,uvAC intra: 17.4% 0.0% 0.0% inter: 2.4% 0.0% 0.0%
[libx264 @ 0x1326070e0] i16 v,h,dc,p: 81% 11%  8%  0%
[libx264 @ 0x1326070e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 22% 32%  0%  0%  0%  1%  0%  1%
[libx264 @ 0x1326070e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 10% 22%  6%  3%  2%  3%  7%  2%
[libx264 @ 0x1326070e0] i8c dc,h,v,p: 100%  0%  0%  0%
[libx264 @ 0x1326070e0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1326070e0] ref P L0: 66.0%  8.6% 13.1% 12.3%
[libx264 @ 0x1326070e0] ref B L0: 56.9% 41.0%  2.2%
[libx264 @ 0x1326070e0] ref B L1: 98.9%  1.1%
[libx264 @ 0x1326070e0] kb/s:41.16

Patches should be submitted to the ffmpeg-devel mailing list and not this bug tracker.

Attachments (2)

before.gif (7.2 KB ) - added by Mark Burton 15 months ago.
after.gif (8.8 KB ) - added by Mark Burton 15 months ago.

Download all attachments as: .zip

Change History (6)

by Mark Burton, 15 months ago

Attachment: before.gif added

by Mark Burton, 15 months ago

Attachment: after.gif added

comment:1 by Mark Burton, 15 months ago

Last edited 15 months ago by Mark Burton (previous) (diff)

comment:2 by Mark Burton, 15 months ago

Description: modified (diff)

comment:3 by t.rapp, 15 months ago

Cc: t.rapp added

comment:4 by Elon Musk, 15 months ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.