How AV1 Signals Film Grain Synthesis Metadata

This article provides an overview of how the AV1 video codec implements film grain synthesis (FGS) by transmitting parametric data instead of encoding raw grain directly into the pixel stream. By stripping high-frequency noise during encoding and signaling its mathematical characteristics via designated syntax elements within Open Bitstream Units (OBUs), AV1 achieves substantial bitrate savings while preserving cinematic texture. The following sections detail the signaling workflow, the structure of the parameter payload, and how the decoder applies this metadata to reconstruct the original grain profile.

The Film Grain Synthesis Architecture

Traditional video compression treats film grain as high-frequency detail, which requires a disproportionately high bitrate to encode without producing artifacts. AV1 solves this by modeling grain as a separate, parameterized layer.

During the encoding stage, an integrated grain analyzer estimates the statistical properties of the film grain, denoises the source images, and compresses the smooth video. The derived grain properties are then transmitted alongside the compressed video data. Upon decoding, the reconstructed video is rendered, and an autoregressive (AR) synthesis engine regenerates and blends the pseudo-random grain over the final output after all in-loop filtering operations (deblocking, CDEF, and loop restoration) are complete.

Signaling Hierarchy Within AV1 OBUs

AV1 packages all bitstream data into Open Bitstream Units (OBUs). The transmission of film grain characteristics operates through a specific hierarchical structure:

  1. Sequence Header OBU (OBU_SEQUENCE_HEADER):
    At the highest level, the bitstream indicates whether film grain is enabled across the video sequence using the film_grain_params_present syntax flag. If this flag is set to zero, the decoder bypasses all film grain operations for the entire sequence, reducing processing overhead.

  2. Frame Header OBU (OBU_FRAME_HEADER or OBU_FRAME):
    When enabled at the sequence level, grain parameters are conveyed within the frame header via the film_grain_params() syntax element. While custom or external metadata can be routed through OBU_METADATA, standard film grain synthesis parameters in AV1 are explicitly native to the frame-level bitstream syntax to ensure frame-accurate synchronization.

  3. Parameter Inheritance:
    To minimize metadata overhead, AV1 allows inter-coded frames to reference grain characteristics from previously decoded frames. The update_grain flag informs the decoder whether to parse a new set of grain coefficients or reuse the parameters from an earlier designated reference frame.

The Film Grain Parameter Payload

When a frame introduces or updates film grain metadata, the decoder parses the film_grain_params() structure, which contains several crucial mathematical descriptors:

Decoding and Applying the Metadata

Once the parameters are extracted from the OBU structure, the decoder executes the reconstruction pipeline:

  1. Generation of the Noise Template: The decoder uses the transmitted grain_seed to drive a PRNG, filling an internal template buffer with synthetic noise shaped by the AR filter coefficients.
  2. Intensity Scaling: The base noise values are scaled dynamically against the reconstructed pixel values using the piecewise linear lookup tables defined in the metadata.
  3. Additive Blending: The synthesized noise is clamped and added to the decoded pixels. Because this step occurs entirely post-loop-filter, the synthesis process avoids feedback loops that could disrupt the motion-compensation engine, ensuring both visual consistency and compression efficiency.