[FFmpeg-devel] [PATCH 00/42] New API for reference counting and ThreadFrames

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Tue Sep 19 22:38:55 EEST 2023


This patchset initially grew out of my dissatisfaction with the fact
that the AVBuffer API contains implicit allocations in av_buffer_ref()
that need to be checked. Later this combined with my dissatisfaction
with the current ThreadFrame API (which contains an implicit
av_frame_ref()) which forbids decoders to set any AVFrame field
of a frame that is used for syncing after having called
ff_thread_finish_setup(). This leads to a race in the vp9-encparams
test that is fixed in this patchset.

Andreas Rheinhardt (42):
  tests/fate-run: Ensure that THREADS=random is actually random
  avcodec/refstruct: Add simple API for refcounted objects
  avcodec/get_buffer: Use RefStruct API for FramePool
  avcodec/h264_ps: Use RefStruct API for SPS/PPS
  avcodec/hevc_ps: Use RefStruct API for parameter sets
  avcodec/vp8: Use RefStruct API for seg_map
  avcodec/wavpack: Use RefStruct API for DSD context
  avcodec/dovi_rpu: Use RefStruct API for Vdr data
  avcodec/refstruct: Allow checking for exclusive ownership
  avcodec/cbs: Use RefStruct-API for unit content
  avcodec/cbs_sei: Use RefStruct API for SEI messages
  avcodec/decode: Use RefStruct API for hwaccel_picture_private
  avcodec/vulkan_decode: Use RefStruct API for shared_ref
  avcodec/hevcdec: Use RefStruct API for RefPicListTap buffer
  avcodec/pthread_frame: Use RefStruct API for ThreadFrame.progress
  avcodec/nvdec: Use RefStruct API for decoder_ref
  avcodec/refstruct: Add RefStruct pool API
  avcodec/h264dec: Use RefStruct-pool API instead of AVBufferPool API
  avcodec/hevcdec: Use RefStruct-pool API instead of AVBufferPool API
  avcodec/nvdec: Use RefStruct-pool API for decoder pool
  avcodec/refstruct: Allow to always return zeroed pool entries
  avcodec/vp9: Use RefStruct-pool API for extradata
  avcodec/vaapi_encode: Use RefStruct pool API, stop abusing AVBuffer
    API
  avcodec/refstruct: Allow to share pools
  avcodec/vp9: Join extradata buffer pools
  avcodec/refstruct: Allow to use a dynamic opaque
  avcodec/pthread_frame: Add new progress API
  avcodec/mimic: Switch to ProgressFrames
  avcodec/vp3: Switch to ProgressFrames
  avcodec/vp9: Switch to ProgressFrames
  avcodec/vp9: Fix race when attaching side-data for show-existing frame
  avcodec/vp9: Reduce wait times
  avcodec/vp9: Simplify replacing VP9Frame
  avcodec/vp9: Replace atomic_store() by atomic_init()
  avcodec/threadprogress: Add new API for frame-threaded progress
  avcodec/wavpack: Use ThreadProgress API
  avcodec/vp8: Convert to ProgressFrame API
  avcodec/codec_internal: Remove FF_CODEC_CAP_ALLOCATE_PROGRESS
  avcodec/hevcdec: Move collocated_ref to HEVCContext
  avcodec/hevcdec: Switch to ProgressFrames
  avcodec/pngdec: Switch to ProgressFrames
  avcodec/ffv1dec: Switch to ProgressFrames

 doc/multithreading.txt                |   8 +-
 libavcodec/Makefile                   |   1 +
 libavcodec/av1dec.c                   |  64 +---
 libavcodec/av1dec.h                   |  14 +-
 libavcodec/avcodec.c                  |   4 +-
 libavcodec/cbs.c                      | 103 +++----
 libavcodec/cbs.h                      |  12 +-
 libavcodec/cbs_av1.c                  |  32 +-
 libavcodec/cbs_av1.h                  |   3 +-
 libavcodec/cbs_h264.h                 |   6 +-
 libavcodec/cbs_h2645.c                | 113 +++----
 libavcodec/cbs_h265.h                 |   9 +-
 libavcodec/cbs_h266.h                 |  11 +-
 libavcodec/cbs_h266_syntax_template.c |  10 +-
 libavcodec/cbs_internal.h             |   7 +-
 libavcodec/cbs_sei.c                  |  61 ++--
 libavcodec/cbs_sei.h                  |  20 +-
 libavcodec/cbs_sei_syntax_template.c  |   5 +
 libavcodec/codec_internal.h           |   7 +-
 libavcodec/decode.c                   | 146 +++++++--
 libavcodec/decode.h                   |  10 +-
 libavcodec/dovi_rpu.c                 |  54 ++--
 libavcodec/dovi_rpu.h                 |   4 +-
 libavcodec/dxva2_vp9.c                |   4 +-
 libavcodec/ffv1.c                     |   1 -
 libavcodec/ffv1.h                     |   4 +-
 libavcodec/ffv1dec.c                  |  82 +++---
 libavcodec/get_buffer.c               |  44 +--
 libavcodec/h264_mb.c                  |   4 +-
 libavcodec/h264_parser.c              |   9 +-
 libavcodec/h264_picture.c             |  91 ++----
 libavcodec/h264_ps.c                  |  57 ++--
 libavcodec/h264_ps.h                  |  13 +-
 libavcodec/h264_refs.c                |   2 +-
 libavcodec/h264_sei.c                 |   2 +-
 libavcodec/h264_slice.c               |  88 +++---
 libavcodec/h264dec.c                  |  21 +-
 libavcodec/h264dec.h                  |  25 +-
 libavcodec/hevc_filter.c              |   8 +-
 libavcodec/hevc_mvs.c                 |   8 +-
 libavcodec/hevc_parser.c              |   8 +-
 libavcodec/hevc_ps.c                  |  80 +++--
 libavcodec/hevc_ps.h                  |  10 +-
 libavcodec/hevc_refs.c                |  64 ++--
 libavcodec/hevc_sei.c                 |   5 +-
 libavcodec/hevcdec.c                  | 113 +++----
 libavcodec/hevcdec.h                  |  22 +-
 libavcodec/hwaccel_internal.h         |   3 +-
 libavcodec/internal.h                 |   4 +-
 libavcodec/mediacodecdec.c            |  10 +-
 libavcodec/mimic.c                    |  60 ++--
 libavcodec/mpeg4videodec.c            |   3 +-
 libavcodec/mpegpicture.c              |  18 +-
 libavcodec/mpegpicture.h              |   1 -
 libavcodec/nvdec.c                    |  97 +++---
 libavcodec/nvdec.h                    |  10 +-
 libavcodec/pngdec.c                   |  67 ++---
 libavcodec/progressframe.h            | 134 +++++++++
 libavcodec/progressframe_internal.h   |  32 ++
 libavcodec/pthread_frame.c            | 127 ++++++--
 libavcodec/refstruct.c                | 407 ++++++++++++++++++++++++++
 libavcodec/refstruct.h                | 360 +++++++++++++++++++++++
 libavcodec/rv30.c                     |   1 -
 libavcodec/rv40.c                     |   1 -
 libavcodec/tests/avcodec.c            |  10 +-
 libavcodec/threadframe.h              |   4 +-
 libavcodec/threadprogress.h           |  37 +++
 libavcodec/utils.c                    |  14 +-
 libavcodec/vaapi_encode.c             |  60 ++--
 libavcodec/vaapi_encode.h             |   5 +-
 libavcodec/videotoolbox.c             |   4 +-
 libavcodec/vp3.c                      | 148 ++++------
 libavcodec/vp8.c                      | 127 +++-----
 libavcodec/vp8.h                      |  11 +-
 libavcodec/vp9.c                      | 195 +++++-------
 libavcodec/vp9_mc_template.c          |   2 +-
 libavcodec/vp9block.c                 |   5 +-
 libavcodec/vp9dec.h                   |   7 +-
 libavcodec/vp9lpf.c                   |   1 +
 libavcodec/vp9mvs.c                   |   4 +-
 libavcodec/vp9recon.c                 |  19 +-
 libavcodec/vp9shared.h                |  14 +-
 libavcodec/vulkan_av1.c               |  11 +-
 libavcodec/vulkan_decode.c            |  49 ++--
 libavcodec/vulkan_decode.h            |   2 +-
 libavcodec/vulkan_h264.c              |  15 +-
 libavcodec/vulkan_hevc.c              |  27 +-
 libavcodec/wavpack.c                  | 125 ++++----
 libavcodec/webp.c                     |   3 +-
 tests/fate-run.sh                     |   2 +-
 90 files changed, 2165 insertions(+), 1540 deletions(-)
 create mode 100644 libavcodec/progressframe.h
 create mode 100644 libavcodec/progressframe_internal.h
 create mode 100644 libavcodec/refstruct.c
 create mode 100644 libavcodec/refstruct.h
 create mode 100644 libavcodec/threadprogress.h

-- 
2.34.1



More information about the ffmpeg-devel mailing list