Ctrl K
ComunidadGuías…

server/src/nvenc/nvenc_config.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/nvenc/nvenc_config.h
 * @brief Declarations for NVENC encoder configuration.
 */
#pragma once

#include <string_view>

namespace nvenc {

  enum class nvenc_two_pass {
    disabled,  ///< Single pass, the fastest and no extra vram
    quarter_resolution,  ///< Larger motion vectors being caught, faster and uses less extra vram
    full_resolution,  ///< Better overall statistics, slower and uses more extra vram
  };

  enum class split_encode_mode {
    auto_mode,  ///< Let the NVIDIA driver decide when split-frame encoding should be used
    enabled,  ///< Force split-frame encoding when supported
    disabled,  ///< Disable split-frame encoding even when it would otherwise be auto-enabled
  };

  struct encoder_selection_policy_t {
    bool include_native = true;
    bool fail_closed = false;
  };

  inline constexpr std::string_view canonical_encoder_name(
    std::string_view requested_encoder) noexcept {
    if (requested_encoder == "nvenc_experimental") {
      return "nvenc";
    }
    return requested_encoder;
  }

  /** Native Linux NVENC is preferred unless the legacy backend is requested. */
  inline constexpr encoder_selection_policy_t encoder_selection_policy(
    std::string_view requested_encoder) noexcept {
    const auto canonical_encoder = canonical_encoder_name(requested_encoder);
    return {
      canonical_encoder != "nvenc_legacy",
      canonical_encoder == "nvenc",
    };
  }

  /**
   * @brief NVENC encoder configuration.
   */
  struct nvenc_config {
    // Quality preset from 1 to 7, higher is slower
    int quality_preset = 1;

    // Use optional preliminary pass for better motion vectors, bitrate distribution and stricter VBV(HRD), uses CUDA cores
    nvenc_two_pass two_pass = nvenc_two_pass::quarter_resolution;

    // Percentage increase of VBV/HRD from the default single frame, allows low-latency variable bitrate
    int vbv_percentage_increase = 0;

    // Improves fades compression, uses CUDA cores
    bool weighted_prediction = false;

    // Allocate more bitrate to flat regions since they're visually more perceptible, uses CUDA cores
    bool adaptive_quantization = false;

    // Allocate more bitrate to frames with more motion, reduces block-artefact pulsing in moving scenes
    bool temporal_aq = false;

    // Don't use QP below certain value, limits peak image quality to save bitrate
    bool enable_min_qp = false;

    // Min QP value for H.264 when enable_min_qp is selected
    unsigned min_qp_h264 = 19;

    // Min QP value for HEVC when enable_min_qp is selected
    unsigned min_qp_hevc = 23;

    // Min QP value for AV1 when enable_min_qp is selected
    unsigned min_qp_av1 = 23;

    // Use CAVLC entropy coding in H.264 instead of CABAC, not relevant and here for historical reasons
    bool h264_cavlc = false;

    // Control split-frame encoding for supported HEVC/AV1 sessions
    nvenc::split_encode_mode split_encode_mode = nvenc::split_encode_mode::auto_mode;

    // Add filler data to encoded frames to stay at target bitrate, mainly for testing
    bool insert_filler_data = false;

    // Intra refresh for clients that doesn't request keyframe correctly
    bool intra_refresh = false;
  };

}  // namespace nvenc