chromium/tools/perf/cli_tools/tbmv3/validators/media_metric.py

# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Validates the media_metric.
"""

from cli_tools.tbmv3.validators import simple_validator


def CompareHistograms(test_ctx):
  v2_metric = 'mediaMetric'
  v3_metric = 'media_metric'
  v2_histograms = test_ctx.RunTBMv2(v2_metric)
  v3_histograms = test_ctx.RunTBMv3(v3_metric)

  simple_config = {
      'v2_metric': v2_metric,
      'v3_metric': v3_metric,
      # 1 microsecond precision - default for ms unit histograms.
      'float_precision': 1e-3,
      'histogram_mappings': {
          # mappings are 'v2_histogram: 'v3_histogram'.
          'time_to_video_play': 'media::time_to_video_play',
          'time_to_audio_play': 'media::time_to_audio_play',
          # Dropped frame count is broken in the TBMv2 metric.
          # 'dropped_frame_count': 'media::dropped_frame_count',
          'buffering_time': 'media::buffering_time',
          # Roughness is reported as double in the v3 metric, but as int in v2.
          'roughness': ('media::roughness', 1),
          'freezing': 'media::freezing'
      },
  }

  simple_validator.CompareSimpleHistograms(test_ctx, simple_config,
                                           v2_histograms, v3_histograms)

  # seek time histograms are merged.
  seek_time_histograms = [
      # v3 histogram => set of v2 histograms that are merged into it.
      ['media::seek_time', ['seek_time_0_5', 'seek_time_9']],
      [
          'media::pipeline_seek_time',
          ['pipeline_seek_time_0_5', 'pipeline_seek_time_9']
      ],
  ]

  for entry in seek_time_histograms:
    v3_hist_name = entry[0]
    v3_hist = simple_validator.OptionalGetHistogram(v3_histograms, v3_hist_name,
                                                    v3_metric, 'v3')

    v2_hists = []
    for v2_hist_name in entry[1]:
      v2_hist = simple_validator.OptionalGetHistogram(v2_histograms,
                                                      v2_hist_name, v2_metric,
                                                      'v2')
      if v2_hist is None:
        continue
      v2_hists += [v2_hist]

    if v3_hist is None:
      if len(v2_hists) > 0:
        raise Exception('Expected a %s v3 histogram, but none exists' %
                        (v3_hist_name))
      continue

    if len(v2_hists) == 0:
      raise Exception('Have a %s v3 histogram but no matching v2 ones' %
                      (v3_hist_name))

    v2_samples = []
    for v2_hist in v2_hists:
      v2_samples += [s for s in v2_hist.sample_values if s is not None]
    v3_samples = [s for s in v3_hist.sample_values if s is not None]

    test_ctx.assertEqual(len(v2_samples), len(v3_samples))
    v2_samples.sort()
    v3_samples.sort()
    for v2_sample, v3_sample in zip(v2_samples, v3_samples):
      test_ctx.assertAlmostEqual(v2_sample,
                                 v3_sample,
                                 delta=simple_config['float_precision'])