avcodec/h274: add film grain synthesis routine
authorNiklas Haas <git@haasn.dev>
Tue, 17 Aug 2021 19:25:32 +0000 (21:25 +0200)
committerJames Almer <jamrial@gmail.com>
Tue, 24 Aug 2021 12:58:52 +0000 (09:58 -0300)
commit6bc29a6b571c83058d04dc7b8b0f827dfee31b2c
tree1ef02885ae312ecb9097a30da956b6f5d996a228
parentcf37c3fb6c84d8eb61079520b4c57e3c969bc25d
avcodec/h274: add film grain synthesis routine

This could arguably also be a vf, but I decided to put it here since
decoders are technically required to apply film grain during the output
step, and I would rather want to avoid requiring users insert the
correct film grain synthesis filter on their own.

The code, while in C, is written in a way that unrolls/vectorizes fairly
well under -O3, and is reasonably cache friendly. On my CPU, a single
thread pushes about 400 FPS at 1080p.

Apart from hand-written assembly, one possible avenue of improvement
would be to change the access order to compute the grain row-by-row
rather than in 8x8 blocks. This requires some redundant PRNG calls, but
would make the algorithm more cache-oblivious.

The implementation has been written to the wording of SMPTE RDD 5-2006
as faithfully as I can manage. However, apart from passing a visual
inspection, no guarantee of correctness can be made due to the lack of
any publicly available reference implementation against which to
compare it.

Signed-off-by: Niklas Haas <git@haasn.dev>
Signed-off-by: James Almer <jamrial@gmail.com>
libavcodec/Makefile
libavcodec/h274.c [new file with mode: 0644]
libavcodec/h274.h [new file with mode: 0644]