libavcodec/h264: Use inferred num_reorder_frames when VUI is absent

When VUI bitstream_restriction is absent, H.264 specifies that
max_num_reorder_frames should be inferred from the level's DPB limit.
FFmpeg normally starts with has_b_frames = 0 to avoid latency for
streams without B-frames, and increases the reorder buffer dynamically
when out-of-order frames are detected. However, by only increasing
has_b_frames to out_of_order, frames outside the initial reorder window
can be emitted too early and dropped.

When out-of-order frames are detected on a stream lacking VUI
bitstream_restriction, set has_b_frames to the inferred
sps->num_reorder_frames clamped to sps->ref_frame_count. Clamping to
sps->ref_frame_count prevents over-allocating DPB reorder frames (e.g.
up to 16 frames on low-resolution streams at high levels or 5 frames on
4K streams with 2 reference frames) while ensuring all B-frames are
properly ordered. Streams without B-frames continue to have zero
reorder delay.

Bug: 495269752, 559001366
Change-Id: Ifcef68115ccebd0cd35fe53a742887779885d539
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/third_party/ffmpeg/+/8418569
Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
1 file changed
tree: 92494155280ad804b8f3da29425fb0b32b6c27e4
  1. .forgejo/
  2. chromium/
  3. compat/
  4. doc/
  5. ffbuild/
  6. fftools/
  7. libavcodec/
  8. libavdevice/
  9. libavfilter/
  10. libavformat/
  11. libavutil/
  12. libswresample/
  13. libswscale/
  14. presets/
  15. tests/
  16. tools/
  17. .git-blame-ignore-revs
  18. .gitattributes
  19. .gitignore
  20. .mailmap
  21. BUILD.gn
  22. Changelog
  23. codereview.settings
  24. configure
  25. CONTRIBUTING.md
  26. COPYING.GPLv2
  27. COPYING.GPLv3
  28. COPYING.LGPLv2.1
  29. COPYING.LGPLv3
  30. CREDITS
  31. CREDITS.chromium
  32. DIR_METADATA
  33. ffmpeg_generated.gni
  34. ffmpeg_options.gni
  35. FUNDING.json
  36. INSTALL.md
  37. LICENSE.md
  38. MAINTAINERS
  39. Makefile
  40. OWNERS
  41. README.chromium
  42. README.md
  43. RELEASE
README.md

FFmpeg README

FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.

Libraries

  • libavcodec provides implementation of a wider range of codecs.
  • libavformat implements streaming protocols, container formats and basic I/O access.
  • libavutil includes hashers, decompressors and miscellaneous utility functions.
  • libavfilter provides means to alter decoded audio and video through a directed graph of connected filters.
  • libavdevice provides an abstraction to access capture and playback devices.
  • libswresample implements audio mixing and resampling routines.
  • libswscale implements color conversion and scaling routines.

Tools

  • ffmpeg is a command line toolbox to manipulate, convert and stream multimedia content.
  • ffplay is a minimalistic multimedia player.
  • ffprobe is a simple analysis tool to inspect multimedia content.
  • Additional small tools such as aviocat, ismindex and qt-faststart.

Documentation

The offline documentation is available in the doc/ directory.

The online documentation is available in the main website and in the wiki.

Examples

Coding examples are available in the doc/examples directory.

License

FFmpeg codebase is mainly LGPL-licensed with optional components licensed under GPL. Please refer to the LICENSE file for detailed information.

Contributing

Patches should be submitted to the ffmpeg-devel mailing list using git format-patch or git send-email. Github pull requests should be avoided because they are not part of our review process and will be ignored.