// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/base/media.h"

#include <stdint.h>
#include <limits>

#include "base/allocator/buildflags.h"
#include "base/command_line.h"
#include "base/metrics/field_trial.h"
#include "base/no_destructor.h"
#include "base/trace_event/trace_event.h"
#include "media/base/media_switches.h"
#include "media/media_buildflags.h"
#include "third_party/libyuv/include/libyuv.h"

#if BUILDFLAG(ENABLE_FFMPEG)
#include "third_party/ffmpeg/ffmpeg_features.h"  // nogncheck
extern "C" {
#include <libavutil/cpu.h>
#include <libavutil/log.h>
#include <libavutil/mem.h>
}
#endif

namespace media {

// Media must only be initialized once; use a thread-safe static to do this.
class MediaInitializer {
 public:
  MediaInitializer() {
    // Initializing the CPU flags may query /proc for details on the current CPU
    // for NEON, VFP, etc optimizations. If in a sandboxed process, they should
    // have been forced (see InitializeMediaLibraryInSandbox).
    libyuv::InitCpuFlags();

#if BUILDFLAG(ENABLE_FFMPEG)
    av_get_cpu_flags();

    // Disable logging as it interferes with layout tests.
    av_log_set_level(AV_LOG_QUIET);

#if BUILDFLAG(USE_ALLOCATOR_SHIM)
    // Remove allocation limit from ffmpeg, so calls go down to shim layer.
    av_max_alloc(std::numeric_limits<size_t>::max());
#endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)

#endif  // BUILDFLAG(ENABLE_FFMPEG)
  }

  MediaInitializer(const MediaInitializer&) = delete;
  MediaInitializer& operator=(const MediaInitializer&) = delete;

 private:
  ~MediaInitializer() = delete;
};

static const MediaInitializer& GetMediaInstance() {
  static const base::NoDestructor<MediaInitializer> instance;
  return *instance;
}

void InitializeMediaLibrary() {
  GetMediaInstance();
}

void InitializeMediaLibraryInSandbox(int64_t libyuv_cpu_flags,
                                     int64_t libavutil_cpu_flags) {
  // Force the CPU flags so when they don't require disk access when queried
  // from MediaInitializer().
  libyuv::SetCpuFlags(libyuv_cpu_flags);
#if BUILDFLAG(ENABLE_FFMPEG)
  av_force_cpu_flags(libavutil_cpu_flags);
#endif
  GetMediaInstance();
}

}  // namespace media
