// 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/nplb/player_creation_param_helpers.h"

#include "starboard/common/log.h"

namespace starboard {
namespace nplb {

SbMediaAudioSampleInfo CreateAudioSampleInfo(SbMediaAudioCodec codec) {
  SbMediaAudioSampleInfo audio_sample_info = {};

#if SB_API_VERSION >= 11
  audio_sample_info.codec = codec;
#endif  // SB_API_VERSION >= 11

  switch (codec) {
    case kSbMediaAudioCodecNone:
      break;
    case kSbMediaAudioCodecAac: {
      static const uint8_t kAacAudioSpecificConfig[16] = {18, 16};

      audio_sample_info.format_tag = 0xff;
      audio_sample_info.number_of_channels = 2;
      audio_sample_info.samples_per_second = 44100;
      audio_sample_info.block_alignment = 4;
      audio_sample_info.bits_per_sample = 16;
      audio_sample_info.audio_specific_config = kAacAudioSpecificConfig;
      audio_sample_info.audio_specific_config_size =
          sizeof(kAacAudioSpecificConfig);
      audio_sample_info.average_bytes_per_second =
          audio_sample_info.samples_per_second *
          audio_sample_info.number_of_channels *
          audio_sample_info.bits_per_sample / 8;
      break;
    }
    case kSbMediaAudioCodecAc3:
    case kSbMediaAudioCodecEac3: {
      audio_sample_info.format_tag = 0xff;
      audio_sample_info.number_of_channels = 6;
      audio_sample_info.samples_per_second = 48000;
      audio_sample_info.block_alignment = 4;
      audio_sample_info.bits_per_sample = 16;
      audio_sample_info.audio_specific_config = nullptr;
      audio_sample_info.audio_specific_config_size = 0;
      audio_sample_info.average_bytes_per_second =
          audio_sample_info.samples_per_second *
          audio_sample_info.number_of_channels *
          audio_sample_info.bits_per_sample / 8;
      break;
    }
    case kSbMediaAudioCodecOpus: {
      static const uint8_t kOpusAudioSpecificConfig[19] = {
          79, 112, 117, 115, 72, 101, 97, 100, 1, 2, 56, 1, 128, 187};

      audio_sample_info.format_tag = 0xff;
      audio_sample_info.number_of_channels = 2;
      audio_sample_info.samples_per_second = 48000;
      audio_sample_info.block_alignment = 4;
      audio_sample_info.bits_per_sample = 32;
      audio_sample_info.audio_specific_config = kOpusAudioSpecificConfig;
      audio_sample_info.audio_specific_config_size =
          sizeof(kOpusAudioSpecificConfig);
      audio_sample_info.average_bytes_per_second =
          audio_sample_info.samples_per_second *
          audio_sample_info.number_of_channels *
          audio_sample_info.bits_per_sample / 8;
      break;
    }
    case kSbMediaAudioCodecVorbis: {
      // Note that unlike the configuration of the other formats, the following
      // configuration is made up, instead of taking from a real input.
      audio_sample_info.format_tag = 0xff;
      audio_sample_info.number_of_channels = 2;
      audio_sample_info.samples_per_second = 48000;
      audio_sample_info.block_alignment = 4;
      audio_sample_info.bits_per_sample = 16;
      audio_sample_info.audio_specific_config = nullptr;
      audio_sample_info.audio_specific_config_size = 0;
      audio_sample_info.average_bytes_per_second =
          audio_sample_info.samples_per_second *
          audio_sample_info.number_of_channels *
          audio_sample_info.bits_per_sample / 8;
      break;
    }
  }
  return audio_sample_info;
}

SbMediaVideoSampleInfo CreateVideoSampleInfo(SbMediaVideoCodec codec) {
  SbMediaVideoSampleInfo video_sample_info = {};

#if SB_API_VERSION >= 11
  video_sample_info.codec = codec;
#endif  // SB_API_VERSION >= 11

#if SB_API_VERSION >= 11
  video_sample_info.color_metadata.primaries = kSbMediaPrimaryIdBt709;
  video_sample_info.color_metadata.transfer = kSbMediaTransferIdBt709;
  video_sample_info.color_metadata.matrix = kSbMediaMatrixIdBt709;
  video_sample_info.color_metadata.range = kSbMediaRangeIdLimited;
#else   // SB_API_VERSION >= 11
  static SbMediaColorMetadata color_metadata;
  color_metadata.primaries = kSbMediaPrimaryIdBt709;
  color_metadata.transfer = kSbMediaTransferIdBt709;
  color_metadata.matrix = kSbMediaMatrixIdBt709;
  color_metadata.range = kSbMediaRangeIdLimited;
  video_sample_info.color_metadata = &color_metadata;
#endif  // SB_API_VERSION >= 11

  video_sample_info.frame_width = 1920;
  video_sample_info.frame_height = 1080;

  return video_sample_info;
}

#if SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)

SbPlayerCreationParam CreatePlayerCreationParam(SbMediaAudioCodec audio_codec,
                                                SbMediaVideoCodec video_codec) {
  SbPlayerCreationParam creation_param = {};

  creation_param.audio_mime = "";
  creation_param.video_mime = "";
  creation_param.drm_system = kSbDrmSystemInvalid;
  creation_param.audio_sample_info = CreateAudioSampleInfo(audio_codec);
  creation_param.video_sample_info = CreateVideoSampleInfo(video_codec);
  creation_param.output_mode = kSbPlayerOutputModeInvalid;
  creation_param.max_video_capabilities = "";

  return creation_param;
}

#endif  // SB_HAS(PLAYER_CREATION_AND_OUTPUT_MODE_QUERY_IMPROVEMENT)

}  // namespace nplb
}  // namespace starboard
