blob: 8ab35fbb851823fa203d5b5d73d55061df6a5acd [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_CAPABILITIES_VIDEO_DECODE_STATS_DB_H_
#define MEDIA_CAPABILITIES_VIDEO_DECODE_STATS_DB_H_
#include <memory>
#include <string>
#include "base/callback_forward.h"
#include "base/logging.h"
#include "base/macros.h"
#include "media/base/media_export.h"
#include "media/base/video_codecs.h"
#include "ui/gfx/geometry/size.h"
namespace media {
// This defines the interface to be used by various media capabilities services
// to store/retrieve video decoding performance statistics.
class MEDIA_EXPORT VideoDecodeStatsDB {
public:
// Simple description of video decode complexity, serving as a key to look up
// associated DecodeStatsEntries in the database.
struct MEDIA_EXPORT VideoDescKey {
static VideoDescKey MakeBucketedKey(VideoCodecProfile codec_profile,
const gfx::Size& size,
int frame_rate,
std::string key_system,
bool use_hw_secure_codecs);
// Returns a concise string representation of the key for storing in DB.
std::string Serialize() const;
// For debug logging. NOT interchangeable with Serialize().
std::string ToLogString() const;
// Note: operator == and != are defined outside this class.
const VideoCodecProfile codec_profile;
const gfx::Size size;
const int frame_rate;
const std::string key_system;
const bool use_hw_secure_codecs;
private:
// All key's should be "bucketed" using MakeBucketedKey(...).
VideoDescKey(VideoCodecProfile codec_profile,
const gfx::Size& size,
int frame_rate,
std::string key_system,
bool use_hw_secure_codecs);
};
// DecodeStatsEntry saved to identify the capabilities related to a given
// |VideoDescKey|.
struct MEDIA_EXPORT DecodeStatsEntry {
DecodeStatsEntry(uint64_t frames_decoded,
uint64_t frames_dropped,
uint64_t frames_power_efficient);
DecodeStatsEntry(const DecodeStatsEntry& entry);
// Add stats from |right| to |this| entry.
DecodeStatsEntry& operator+=(const DecodeStatsEntry& right);
// For debug logging.
std::string ToLogString() const;
// Note: operator == and != are defined outside this class.
uint64_t frames_decoded;
uint64_t frames_dropped;
uint64_t frames_power_efficient;
};
virtual ~VideoDecodeStatsDB();
// Run asynchronous initialization of database. Initialization must complete
// before calling other APIs. Initialization must be RE-RUN after calling
// DestroyStats() and receiving its completion callback. |init_cb| must not be
// a null callback.
using InitializeCB = base::OnceCallback<void(bool)>;
virtual void Initialize(InitializeCB init_cb) = 0;
// Appends `stats` to existing entry associated with `key`. Will create a new
// entry if none exists. The operation is asynchronous. The caller should be
// aware of potential race conditions when calling this method for the same
// `key` very close to other calls. `append_done_cb` will be run with a bool
// to indicate whether the save succeeded.
using AppendDecodeStatsCB = base::OnceCallback<void(bool)>;
virtual void AppendDecodeStats(const VideoDescKey& key,
const DecodeStatsEntry& entry,
AppendDecodeStatsCB append_done_cb) = 0;
// Returns the stats associated with `key`. The `get_stats_cb` will receive
// the stats in addition to a boolean signaling if the call was successful.
// DecodeStatsEntry can be nullptr if there was no data associated with `key`.
using GetDecodeStatsCB =
base::OnceCallback<void(bool, std::unique_ptr<DecodeStatsEntry>)>;
virtual void GetDecodeStats(const VideoDescKey& key,
GetDecodeStatsCB get_stats_cb) = 0;
// Clear all statistics from the DB.
virtual void ClearStats(base::OnceClosure clear_done_cb) = 0;
// Tracking down root cause of crash probable UAF (https://crbug/865321).
// We will CHECK if a |dependent_db_| is found to be set during destruction.
// Dependent DB should always be destroyed and unhooked before |this|.
void set_dependent_db(VideoDecodeStatsDB* dependent) {
// One of these should be non-null.
CHECK(!dependent_db_ || !dependent);
// They shouldn't already match.
CHECK(dependent_db_ != dependent);
dependent_db_ = dependent;
}
private:
// See set_dependent_db().
VideoDecodeStatsDB* dependent_db_ = nullptr;
};
MEDIA_EXPORT bool operator==(const VideoDecodeStatsDB::VideoDescKey& x,
const VideoDecodeStatsDB::VideoDescKey& y);
MEDIA_EXPORT bool operator!=(const VideoDecodeStatsDB::VideoDescKey& x,
const VideoDecodeStatsDB::VideoDescKey& y);
MEDIA_EXPORT bool operator==(const VideoDecodeStatsDB::DecodeStatsEntry& x,
const VideoDecodeStatsDB::DecodeStatsEntry& y);
MEDIA_EXPORT bool operator!=(const VideoDecodeStatsDB::DecodeStatsEntry& x,
const VideoDecodeStatsDB::DecodeStatsEntry& y);
} // namespace media
#endif // MEDIA_CAPABILITIES_VIDEO_DECODE_STATS_DB_H_