///|
/// Raw frame-level CDEF parameters. Primary strengths remain in 8-bit units;
/// secondary syntax value 3 has already been remapped to strength 4.
/// Monochrome configurations have empty UV arrays. A missing configuration
/// in a frame header means CDEF is disabled by the frame/sequence gates.
pub(all) struct Av1CdefConfig {
  bits : Int
  damping : Int
  y_primary : Array[Int]
  y_secondary : Array[Int]
  uv_primary : Array[Int]
  uv_secondary : Array[Int]
}

///|
fn av1_cdef_config_valid(
  config : Av1CdefConfig,
  monochrome? : Bool = false,
) -> Bool {
  if config.bits < 0 ||
    config.bits > 3 ||
    config.damping < 3 ||
    config.damping > 6 {
    return false
  }
  let count = 1 << config.bits
  let uv_count = if monochrome { 0 } else { count }
  if config.y_primary.length() != count ||
    config.y_secondary.length() != count ||
    config.uv_primary.length() != uv_count ||
    config.uv_secondary.length() != uv_count {
    return false
  }
  for strengths in [config.y_primary, config.uv_primary] {
    for strength in strengths {
      if strength < 0 || strength > 15 {
        return false
      }
    }
  }
  for strengths in [config.y_secondary, config.uv_secondary] {
    for strength in strengths {
      if strength != 0 && strength != 1 && strength != 2 && strength != 4 {
        return false
      }
    }
  }
  true
}