2025-12-04

perceptual video quality estimation based on fundamental video properties

this formula estimates the perceptual quality of digital video files by considering key properties that affect viewer experience. each factor in the formula scales in a specific way with changes in the underlying video file properties. below is a summarized description of how each factor influences the overall quality score.

  • resolution factor: increases logarithmically with the video resolution. baseline: 640x480, 0.3072 megapixel
  • frame rate factor: increases logarithmically with the frame rate. baseline: 30
  • bit depth factor: increases logarithmically with the bit depth. baseline: 8
  • bitrate factor: modeled using a sigmoid function relative to the optimal bitrate. baseline: resolution * bitdepth * framerate * codec_factor
  • codec factor: adjusts the optimal bitrate based on codec efficiency relative to a baseline codec. baseline: h264
  • quality score: additive aggregation with weighted contributions from each factor

the score is suitable for estimating quality in contexts where detailed subjective testing is impractical. furthermore, it can aid in decision-making for video encoding settings, streaming quality selection, or benchmarking.

coffeescript implementation

get_quality_score = (width, height, framerate, bitdepth, bitrate, codec) ->
  codec_efficiencies =
    av1: 1.5
    h264: 1.0
    h266: 2.0
    hevc: 1.7
    vp8: 0.9
    vp9: 1.3
  codec_factor = 1.0 / (codec_efficiencies[codec] or 0.8)
  resolution = width * height
  optimal_bitrate = resolution * bitdepth * framerate * codec_factor
  bitrate_factor = 2.0 / (1 + Math.exp(-0.001 * (bitrate - optimal_bitrate)))
  resolution_factor = Math.log2(resolution / (1920 * 1080) + 1)
  framerate_factor = Math.log2(framerate / 30.0 + 1)
  bitdepth_factor = Math.log2((bitdepth - 6.0) / 2.0)
  score = 0.4 * resolution_factor + 0.3 * framerate_factor + 0.2 * bitdepth_factor + 0.1 * bitrate_factor
  Math.max 0, Math.round(score * 10 - 1)

scores for various formats

640x480 30 8 9000000 h264 -> 3
640x480 30 8 25000000 h264 -> 3
640x480 30 8 75000000 h264 -> 5
640x480 30 8 100000000 h264 -> 5
640x480 30 8 200000000 h264 -> 5
640x480 30 8 9000000 av1 -> 3
640x480 30 8 25000000 av1 -> 3
640x480 30 8 75000000 av1 -> 5
640x480 30 8 100000000 av1 -> 5
640x480 30 8 200000000 av1 -> 5
640x480 30 10 9000000 h264 -> 5
640x480 30 10 25000000 h264 -> 5
640x480 30 10 75000000 h264 -> 5
640x480 30 10 100000000 h264 -> 7
640x480 30 10 200000000 h264 -> 7
640x480 30 10 9000000 av1 -> 5
640x480 30 10 25000000 av1 -> 5
640x480 30 10 75000000 av1 -> 7
640x480 30 10 100000000 av1 -> 7
640x480 30 10 200000000 av1 -> 7
640x480 60 8 9000000 h264 -> 5
640x480 60 8 25000000 h264 -> 5
640x480 60 8 75000000 h264 -> 5
640x480 60 8 100000000 h264 -> 5
640x480 60 8 200000000 h264 -> 7
640x480 60 8 9000000 av1 -> 5
640x480 60 8 25000000 av1 -> 5
640x480 60 8 75000000 av1 -> 5
640x480 60 8 100000000 av1 -> 7
640x480 60 8 200000000 av1 -> 7
640x480 60 10 9000000 h264 -> 7
640x480 60 10 25000000 h264 -> 7
640x480 60 10 75000000 h264 -> 7
640x480 60 10 100000000 h264 -> 7
640x480 60 10 200000000 h264 -> 9
640x480 60 10 9000000 av1 -> 7
640x480 60 10 25000000 av1 -> 7
640x480 60 10 75000000 av1 -> 7
640x480 60 10 100000000 av1 -> 7
640x480 60 10 200000000 av1 -> 9
640x480 120 8 9000000 h264 -> 7
640x480 120 8 25000000 h264 -> 7
640x480 120 8 75000000 h264 -> 7
640x480 120 8 100000000 h264 -> 7
640x480 120 8 200000000 h264 -> 7
640x480 120 8 9000000 av1 -> 7
640x480 120 8 25000000 av1 -> 7
640x480 120 8 75000000 av1 -> 7
640x480 120 8 100000000 av1 -> 7
640x480 120 8 200000000 av1 -> 9
640x480 120 10 9000000 h264 -> 9
640x480 120 10 25000000 h264 -> 9
640x480 120 10 75000000 h264 -> 9
640x480 120 10 100000000 h264 -> 9
640x480 120 10 200000000 h264 -> 9
640x480 120 10 9000000 av1 -> 9
640x480 120 10 25000000 av1 -> 9
640x480 120 10 75000000 av1 -> 9
640x480 120 10 100000000 av1 -> 9
640x480 120 10 200000000 av1 -> 9
1920x1080 30 8 9000000 h264 -> 6
1920x1080 30 8 25000000 h264 -> 6
1920x1080 30 8 75000000 h264 -> 6
1920x1080 30 8 100000000 h264 -> 6
1920x1080 30 8 200000000 h264 -> 6
1920x1080 30 8 9000000 av1 -> 6
1920x1080 30 8 25000000 av1 -> 6
1920x1080 30 8 75000000 av1 -> 6
1920x1080 30 8 100000000 av1 -> 6
1920x1080 30 8 200000000 av1 -> 6
1920x1080 30 10 9000000 h264 -> 8
1920x1080 30 10 25000000 h264 -> 8
1920x1080 30 10 75000000 h264 -> 8
1920x1080 30 10 100000000 h264 -> 8
1920x1080 30 10 200000000 h264 -> 8
1920x1080 30 10 9000000 av1 -> 8
1920x1080 30 10 25000000 av1 -> 8
1920x1080 30 10 75000000 av1 -> 8
1920x1080 30 10 100000000 av1 -> 8
1920x1080 30 10 200000000 av1 -> 8
1920x1080 60 8 9000000 h264 -> 8
1920x1080 60 8 25000000 h264 -> 8
1920x1080 60 8 75000000 h264 -> 8
1920x1080 60 8 100000000 h264 -> 8
1920x1080 60 8 200000000 h264 -> 8
1920x1080 60 8 9000000 av1 -> 8
1920x1080 60 8 25000000 av1 -> 8
1920x1080 60 8 75000000 av1 -> 8
1920x1080 60 8 100000000 av1 -> 8
1920x1080 60 8 200000000 av1 -> 8
1920x1080 60 10 9000000 h264 -> 10
1920x1080 60 10 25000000 h264 -> 10
1920x1080 60 10 75000000 h264 -> 10
1920x1080 60 10 100000000 h264 -> 10
1920x1080 60 10 200000000 h264 -> 10
1920x1080 60 10 9000000 av1 -> 10
1920x1080 60 10 25000000 av1 -> 10
1920x1080 60 10 75000000 av1 -> 10
1920x1080 60 10 100000000 av1 -> 10
1920x1080 60 10 200000000 av1 -> 10
1920x1080 120 8 9000000 h264 -> 10
1920x1080 120 8 25000000 h264 -> 10
1920x1080 120 8 75000000 h264 -> 10
1920x1080 120 8 100000000 h264 -> 10
1920x1080 120 8 200000000 h264 -> 10
1920x1080 120 8 9000000 av1 -> 10
1920x1080 120 8 25000000 av1 -> 10
1920x1080 120 8 75000000 av1 -> 10
1920x1080 120 8 100000000 av1 -> 10
1920x1080 120 8 200000000 av1 -> 10
1920x1080 120 10 9000000 h264 -> 12
1920x1080 120 10 25000000 h264 -> 12
1920x1080 120 10 75000000 h264 -> 12
1920x1080 120 10 100000000 h264 -> 12
1920x1080 120 10 200000000 h264 -> 12
1920x1080 120 10 9000000 av1 -> 12
1920x1080 120 10 25000000 av1 -> 12
1920x1080 120 10 75000000 av1 -> 12
1920x1080 120 10 100000000 av1 -> 12
1920x1080 120 10 200000000 av1 -> 12
3840x2160 30 8 9000000 h264 -> 11
3840x2160 30 8 25000000 h264 -> 11
3840x2160 30 8 75000000 h264 -> 11
3840x2160 30 8 100000000 h264 -> 11
3840x2160 30 8 200000000 h264 -> 11
3840x2160 30 8 9000000 av1 -> 11
3840x2160 30 8 25000000 av1 -> 11
3840x2160 30 8 75000000 av1 -> 11
3840x2160 30 8 100000000 av1 -> 11
3840x2160 30 8 200000000 av1 -> 11
3840x2160 30 10 9000000 h264 -> 13
3840x2160 30 10 25000000 h264 -> 13
3840x2160 30 10 75000000 h264 -> 13
3840x2160 30 10 100000000 h264 -> 13
3840x2160 30 10 200000000 h264 -> 13
3840x2160 30 10 9000000 av1 -> 13
3840x2160 30 10 25000000 av1 -> 13
3840x2160 30 10 75000000 av1 -> 13
3840x2160 30 10 100000000 av1 -> 13
3840x2160 30 10 200000000 av1 -> 13
3840x2160 60 8 9000000 h264 -> 13
3840x2160 60 8 25000000 h264 -> 13
3840x2160 60 8 75000000 h264 -> 13
3840x2160 60 8 100000000 h264 -> 13
3840x2160 60 8 200000000 h264 -> 13
3840x2160 60 8 9000000 av1 -> 13
3840x2160 60 8 25000000 av1 -> 13
3840x2160 60 8 75000000 av1 -> 13
3840x2160 60 8 100000000 av1 -> 13
3840x2160 60 8 200000000 av1 -> 13
3840x2160 60 10 9000000 h264 -> 15
3840x2160 60 10 25000000 h264 -> 15
3840x2160 60 10 75000000 h264 -> 15
3840x2160 60 10 100000000 h264 -> 15
3840x2160 60 10 200000000 h264 -> 15
3840x2160 60 10 9000000 av1 -> 15
3840x2160 60 10 25000000 av1 -> 15
3840x2160 60 10 75000000 av1 -> 15
3840x2160 60 10 100000000 av1 -> 15
3840x2160 60 10 200000000 av1 -> 15
3840x2160 120 8 9000000 h264 -> 15
3840x2160 120 8 25000000 h264 -> 15
3840x2160 120 8 75000000 h264 -> 15
3840x2160 120 8 100000000 h264 -> 15
3840x2160 120 8 200000000 h264 -> 15
3840x2160 120 8 9000000 av1 -> 15
3840x2160 120 8 25000000 av1 -> 15
3840x2160 120 8 75000000 av1 -> 15
3840x2160 120 8 100000000 av1 -> 15
3840x2160 120 8 200000000 av1 -> 15
3840x2160 120 10 9000000 h264 -> 17
3840x2160 120 10 25000000 h264 -> 17
3840x2160 120 10 75000000 h264 -> 17
3840x2160 120 10 100000000 h264 -> 17
3840x2160 120 10 200000000 h264 -> 17
3840x2160 120 10 9000000 av1 -> 17
3840x2160 120 10 25000000 av1 -> 17
3840x2160 120 10 75000000 av1 -> 17
3840x2160 120 10 100000000 av1 -> 17
3840x2160 120 10 200000000 av1 -> 17
7680x4320 30 8 9000000 h264 -> 18
7680x4320 30 8 25000000 h264 -> 18
7680x4320 30 8 75000000 h264 -> 18
7680x4320 30 8 100000000 h264 -> 18
7680x4320 30 8 200000000 h264 -> 18
7680x4320 30 8 9000000 av1 -> 18
7680x4320 30 8 25000000 av1 -> 18
7680x4320 30 8 75000000 av1 -> 18
7680x4320 30 8 100000000 av1 -> 18
7680x4320 30 8 200000000 av1 -> 18
7680x4320 30 10 9000000 h264 -> 20
7680x4320 30 10 25000000 h264 -> 20
7680x4320 30 10 75000000 h264 -> 20
7680x4320 30 10 100000000 h264 -> 20
7680x4320 30 10 200000000 h264 -> 20
7680x4320 30 10 9000000 av1 -> 20
7680x4320 30 10 25000000 av1 -> 20
7680x4320 30 10 75000000 av1 -> 20
7680x4320 30 10 100000000 av1 -> 20
7680x4320 30 10 200000000 av1 -> 20
7680x4320 60 8 9000000 h264 -> 20
7680x4320 60 8 25000000 h264 -> 20
7680x4320 60 8 75000000 h264 -> 20
7680x4320 60 8 100000000 h264 -> 20
7680x4320 60 8 200000000 h264 -> 20
7680x4320 60 8 9000000 av1 -> 20
7680x4320 60 8 25000000 av1 -> 20
7680x4320 60 8 75000000 av1 -> 20
7680x4320 60 8 100000000 av1 -> 20
7680x4320 60 8 200000000 av1 -> 20
7680x4320 60 10 9000000 h264 -> 22
7680x4320 60 10 25000000 h264 -> 22
7680x4320 60 10 75000000 h264 -> 22
7680x4320 60 10 100000000 h264 -> 22
7680x4320 60 10 200000000 h264 -> 22
7680x4320 60 10 9000000 av1 -> 22
7680x4320 60 10 25000000 av1 -> 22
7680x4320 60 10 75000000 av1 -> 22
7680x4320 60 10 100000000 av1 -> 22
7680x4320 60 10 200000000 av1 -> 22
7680x4320 120 8 9000000 h264 -> 22
7680x4320 120 8 25000000 h264 -> 22
7680x4320 120 8 75000000 h264 -> 22
7680x4320 120 8 100000000 h264 -> 22
7680x4320 120 8 200000000 h264 -> 22
7680x4320 120 8 9000000 av1 -> 22
7680x4320 120 8 25000000 av1 -> 22
7680x4320 120 8 75000000 av1 -> 22
7680x4320 120 8 100000000 av1 -> 22
7680x4320 120 8 200000000 av1 -> 22
7680x4320 120 10 9000000 h264 -> 24
7680x4320 120 10 25000000 h264 -> 24
7680x4320 120 10 75000000 h264 -> 24
7680x4320 120 10 100000000 h264 -> 24
7680x4320 120 10 200000000 h264 -> 24
7680x4320 120 10 9000000 av1 -> 24
7680x4320 120 10 25000000 av1 -> 24
7680x4320 120 10 75000000 av1 -> 24
7680x4320 120 10 100000000 av1 -> 24
7680x4320 120 10 200000000 av1 -> 24