// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_BASE_MEDIA_LOG_H_ #define MEDIA_BASE_MEDIA_LOG_H_ #include <stddef.h> #include <stdint.h> #include <memory> #include <sstream> #include <string> #include <utility> #include "base/gtest_prod_util.h" #include "base/json/json_writer.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/thread_annotations.h" #include "build/build_config.h" #include "media/base/buffering_state.h" #include "media/base/media_export.h" #include "media/base/media_log_events.h" #include "media/base/media_log_message_levels.h" #include "media/base/media_log_properties.h" #include "media/base/media_log_record.h" #include "media/base/pipeline_status.h" #include "url/gurl.h" #if BUILDFLAG(IS_APPLE) #include "base/apple/osstatus_logging.h" #endif // BUILDFLAG(IS_APPLE) namespace media { // Interface for media components to log to chrome://media-internals log. // // To provide a logging implementation, derive from MediaLog instead. // // Implementations only need to implement AddLogRecordLocked(), which must be // thread safe in the sense that it may be called from multiple threads, though // it will not be called concurrently. See below for more details. // // Implementations should also call InvalidateLog during destruction, to signal // to any child logs that the underlying log is no longer available. class MEDIA_EXPORT MediaLog { … }; // Helper class to make it easier to use MediaLog like DVLOG(). class MEDIA_EXPORT LogHelper { … }; // Provides a stringstream to collect a log entry to pass to the provided // MediaLog at the requested level. #if DCHECK_IS_ON() #define MEDIA_PLOG(level, code, media_log) … #define MEDIA_LOG(level, media_log) … #else #define MEDIA_LOG … #define MEDIA_PLOG … #endif #if BUILDFLAG(IS_APPLE) // Prepends a description of an OSStatus to the log entry produced with // `MEDIA_LOG`. #define OSSTATUS_MEDIA_LOG … #endif // BUILDFLAG(IS_APPLE) // Logs only while |count| < |max|, increments |count| for each log, and warns // in the log if |count| has just reached |max|. // Multiple short-circuit evaluations are involved in this macro: // 1) LAZY_STREAM avoids wasteful MEDIA_LOG and evaluation of subsequent stream // arguments if |count| is >= |max|, and // 2) the |condition| given to LAZY_STREAM itself short-circuits to prevent // incrementing |count| beyond |max|. // Note that LAZY_STREAM guarantees exactly one evaluation of |condition|, so // |count| will be incremented at most once each time this macro runs. // The "|| true" portion of |condition| lets logging occur correctly when // |count| < |max| and |count|++ is 0. // TODO(wolenetz,chcunningham): Consider using a helper class instead of a macro // to improve readability. #define LIMITED_MEDIA_LOG(level, media_log, count, max) … } // namespace media #endif // MEDIA_BASE_MEDIA_LOG_H_