// Copyright 2012 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.

#include "cobalt/media/base/mime_util.h"

#include "base/lazy_instance.h"
#include "cobalt/media/base/mime_util_internal.h"

namespace cobalt {
namespace media {

// This variable is Leaky because it is accessed from WorkerPool threads.
static base::LazyInstance<internal::MimeUtil>::DestructorAtExit
    g_media_mime_util = LAZY_INSTANCE_INITIALIZER;

bool IsSupportedMediaMimeType(const std::string& mime_type) {
  return g_media_mime_util.Pointer()->IsSupportedMediaMimeType(mime_type);
}

SupportsType IsSupportedMediaFormat(const std::string& mime_type,
                                    const std::vector<std::string>& codecs) {
  return g_media_mime_util.Pointer()->IsSupportedMediaFormat(mime_type, codecs,
                                                             false);
}

SupportsType IsSupportedEncryptedMediaFormat(
    const std::string& mime_type, const std::vector<std::string>& codecs) {
  return g_media_mime_util.Pointer()->IsSupportedMediaFormat(mime_type, codecs,
                                                             true);
}

void ParseCodecString(const std::string& codecs,
                      std::vector<std::string>* codecs_out, bool strip) {
  g_media_mime_util.Pointer()->ParseCodecString(codecs, codecs_out, strip);
}

void RemoveProprietaryMediaTypesAndCodecsForTests() {
  g_media_mime_util.Pointer()->RemoveProprietaryMediaTypesAndCodecs();
}

}  // namespace media
}  // namespace cobalt
