// Copyright 2020 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/player.h"

#include <algorithm>

#include "starboard/configuration.h"
#include "starboard/shared/starboard/media/media_util.h"
#include "starboard/shared/starboard/player/filter/player_components.h"
#include "starboard/string.h"

SbPlayerOutputMode SbPlayerGetPreferredOutputMode(
    const SbPlayerCreationParam* creation_param) {
  using starboard::shared::starboard::player::filter::PlayerComponents;

  if (!creation_param) {
    SB_LOG(ERROR) << "creation_param cannot be NULL";
    return kSbPlayerOutputModeInvalid;
  }

#if SB_API_VERSION >= 15
  const SbMediaAudioStreamInfo& audio_stream_info =
      creation_param->audio_stream_info;
  const SbMediaVideoStreamInfo& video_stream_info =
      creation_param->video_stream_info;
#else   // SB_API_VERSION >= 15
  const SbMediaAudioSampleInfo& audio_stream_info =
      creation_param->audio_sample_info;
  const SbMediaVideoSampleInfo& video_stream_info =
      creation_param->video_sample_info;
#endif  // SB_API_VERSION >= 15

  if (audio_stream_info.codec != kSbMediaAudioCodecNone &&
      !audio_stream_info.mime) {
    SB_LOG(ERROR) << "creation_param->audio_stream_info.mime cannot be NULL";
    return kSbPlayerOutputModeInvalid;
  }

  if (video_stream_info.codec != kSbMediaVideoCodecNone &&
      !video_stream_info.mime) {
    SB_LOG(ERROR) << "creation_param->video_stream_info.mime cannot be NULL";
    return kSbPlayerOutputModeInvalid;
  }

  if (video_stream_info.codec != kSbMediaVideoCodecNone &&
      !video_stream_info.max_video_capabilities) {
    SB_LOG(ERROR) << "creation_param->video_stream_info.max_video_capabilities"
                  << " cannot be NULL";
    return kSbPlayerOutputModeInvalid;
  }

  auto codec = video_stream_info.codec;
  auto drm_system = creation_param->drm_system;
  auto max_video_capabilities = video_stream_info.max_video_capabilities;

  bool is_sdr = true;
  if (codec != kSbMediaVideoCodecNone) {
    const auto& color_metadata = video_stream_info.color_metadata;
    is_sdr = starboard::shared::starboard::media::IsSDRVideo(
        color_metadata.bits_per_channel, color_metadata.primaries,
        color_metadata.transfer, color_metadata.matrix);
  }

  if (max_video_capabilities && strlen(max_video_capabilities) > 0) {
    // Sub players must use "decode-to-texture" on Android.
    // Since hdr videos are not supported under "decode-to-texture" mode, reject
    // it for sub players.
    if (PlayerComponents::Factory::OutputModeSupported(
            kSbPlayerOutputModeDecodeToTexture, codec, drm_system) &&
        is_sdr) {
      return kSbPlayerOutputModeDecodeToTexture;
    }
    return kSbPlayerOutputModeInvalid;
  }

  SbPlayerOutputMode output_modes_to_check[2] = {kSbPlayerOutputModeInvalid,
                                                 kSbPlayerOutputModeInvalid};
  int number_of_output_modes_to_check = 2;

  if (is_sdr) {
    if (creation_param->output_mode == kSbPlayerOutputModeDecodeToTexture) {
      output_modes_to_check[0] = kSbPlayerOutputModeDecodeToTexture;
      output_modes_to_check[1] = kSbPlayerOutputModePunchOut;
    } else {
      output_modes_to_check[0] = kSbPlayerOutputModePunchOut;
      output_modes_to_check[1] = kSbPlayerOutputModeDecodeToTexture;
    }
  } else {
    // HDR videos require "punch-out".
    output_modes_to_check[0] = kSbPlayerOutputModePunchOut;
    number_of_output_modes_to_check = 1;
  }

  for (int i = 0; i < number_of_output_modes_to_check; ++i) {
    if (PlayerComponents::Factory::OutputModeSupported(output_modes_to_check[i],
                                                       codec, drm_system)) {
      return output_modes_to_check[i];
    }
  }

  SB_LOG(WARNING) << "creation_param->video_stream_info.codec ("
                  << video_stream_info.codec << ") is not supported";
  return kSbPlayerOutputModeInvalid;
}
