// Copyright 2020 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 "media/gpu/vaapi/test/scoped_va_config.h"

#include <va/va_str.h>

#include "media/gpu/vaapi/test/macros.h"
#include "media/gpu/vaapi/test/vaapi_device.h"

namespace media {
namespace vaapi_test {

ScopedVAConfig::ScopedVAConfig(const VaapiDevice& device,
                               VAProfile profile,
                               unsigned int va_rt_format)
    : device_(device),
      config_id_(VA_INVALID_ID),
      profile_(profile),
      va_rt_format_(va_rt_format) {
  // We rely on vaCreateConfig to specify the error mode if decode is not
  // supported for the given profile.
  std::vector<VAConfigAttrib> attribs;
  attribs.push_back(
      {VAConfigAttribRTFormat, base::strict_cast<uint32_t>(va_rt_format_)});
  const VAStatus res =
      vaCreateConfig(device_.display(), profile_, VAEntrypointVLD,
                     attribs.data(), attribs.size(), &config_id_);
  VA_LOG_ASSERT(res, "vaCreateConfig");
  LOG_ASSERT(config_id_ != VA_INVALID_ID)
      << "vaCreateConfig created invalid config ID";
  VLOG(1) << "Created config with ID " << config_id_ << " and profile "
          << vaProfileStr(profile_);
}

ScopedVAConfig::~ScopedVAConfig() {
  VLOG(1) << "Destroying config " << config_id_ << " with profile "
          << vaProfileStr(profile_);
  DCHECK_NE(config_id_, VA_INVALID_ID);
  const VAStatus res = vaDestroyConfig(device_.display(), config_id_);
  VA_LOG_ASSERT(res, "vaDestroyConfig");
}

}  // namespace vaapi_test
}  // namespace media
