// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/shared/starboard/media/media_support_internal.h"

#include "starboard/android/shared/max_output_buffers_lookup_table.h"
#include "starboard/android/shared/media_capabilities_cache.h"
#include "starboard/android/shared/media_common.h"
#include "starboard/configuration.h"
#include "starboard/media.h"
#include "starboard/shared/starboard/media/media_util.h"

using starboard::android::shared::MaxMediaCodecOutputBuffersLookupTable;
using starboard::android::shared::MediaCapabilitiesCache;
using starboard::android::shared::SupportedVideoCodecToMimeType;
using starboard::shared::starboard::media::IsSDRVideo;
using starboard::shared::starboard::media::MimeType;

bool SbMediaIsVideoSupported(SbMediaVideoCodec video_codec,
                             const MimeType* mime_type,
                             int profile,
                             int level,
                             int bit_depth,
                             SbMediaPrimaryId primary_id,
                             SbMediaTransferId transfer_id,
                             SbMediaMatrixId matrix_id,
                             int frame_width,
                             int frame_height,
                             int64_t bitrate,
                             int fps,
                             bool decode_to_texture_required) {
  const bool must_support_hdr =
      !IsSDRVideo(bit_depth, primary_id, transfer_id, matrix_id);
  if (must_support_hdr &&
      !MediaCapabilitiesCache::GetInstance()
           ->IsHDRTransferCharacteristicsSupported(transfer_id)) {
    return false;
  }
  // While not necessarily true, for now we assume that all Android devices
  // can play decode-to-texture video just as well as normal video.

  bool must_support_tunnel_mode = false;
  bool force_improved_support_check = true;
  int decoder_cache_ttl_ms = -1;
  if (mime_type) {
    if (!mime_type->is_valid()) {
      return false;
    }

    // Allows for enabling tunneled playback. Disabled by default.
    // https://source.android.com/devices/tv/multimedia-tunneling
    if (!mime_type->ValidateBoolParameter("tunnelmode")) {
      return false;
    }
    must_support_tunnel_mode =
        mime_type->GetParamBoolValue("tunnelmode", false);

    // Override endianness on HDR Info header. Defaults to little.
    if (!mime_type->ValidateStringParameter("hdrinfoendianness",
                                            "big|little")) {
      return false;
    }

    // Allow the web app to control how software decoders should be used.
    if (!mime_type->ValidateStringParameter(
            "softwaredecoder",
            "allowed|disallowed|preferred|unpreferred|required")) {
      return false;
    }

    // Forces the use of specific Android APIs (isSizeSupported() and
    // areSizeAndRateSupported()) to determine format support.
    if (!mime_type->ValidateBoolParameter("forceimprovedsupportcheck")) {
      return false;
    }
    force_improved_support_check =
        mime_type->GetParamBoolValue("forceimprovedsupportcheck", true);

    decoder_cache_ttl_ms =
        mime_type->GetParamIntValue("decoder_cache_ttl_ms", -1);

    // Disable MediaCapabilitiesCache if "disablecache" option presented.
    if (!mime_type->ValidateBoolParameter("disablecache")) {
      return false;
    }
    if (mime_type->GetParamBoolValue("disablecache", false)) {
      MediaCapabilitiesCache::GetInstance()->SetCacheEnabled(false);
    }

    if (!mime_type->ValidateBoolParameter("disabledynamicprerollframecount")) {
      return false;
    }
    if (mime_type->GetParamBoolValue("disabledynamicprerollframecount",
                                     false)) {
      MaxMediaCodecOutputBuffersLookupTable::GetInstance()->SetEnabled(false);
    }
  }

  if (must_support_tunnel_mode && decode_to_texture_required) {
    SB_LOG(WARNING) << "Tunnel mode is rejected because output mode decode to "
                       "texture is required but not supported.";
    return false;
  }

  const char* mime = SupportedVideoCodecToMimeType(video_codec);
  if (!mime) {
    return false;
  }

  // We assume that if a device supports a format for clear playback, it will
  // also support it for encrypted playback. However, some devices require
  // tunneled playback to be encrypted, so we must align the tunnel mode
  // requirement with the secure playback requirement.
  const bool require_secure_playback = must_support_tunnel_mode;

  return MediaCapabilitiesCache::GetInstance()->HasVideoDecoderFor(
      mime, require_secure_playback, must_support_hdr, must_support_tunnel_mode,
      force_improved_support_check, frame_width, frame_height, bitrate, fps);
}
