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

#ifndef STARBOARD_EXTENSION_ENHANCED_AUDIO_H_
#define STARBOARD_EXTENSION_ENHANCED_AUDIO_H_

#include "starboard/configuration.h"
#include "starboard/drm.h"
#include "starboard/media.h"
#include "starboard/player.h"
#include "starboard/types.h"

#ifdef __cplusplus
extern "C" {
#endif

#define kCobaltExtensionEnhancedAudioName "dev.cobalt.extension.EnhancedAudio"

// The structure has the same binary layout as `SbMediaAudioStreamInfo` in the
// most recent Starboard version, and is verified by unit tests.
// The comment of individual members are explicitly removed, please refer to the
// comment of `SbMediaAudioStreamInfo` in `media.h` for more details.
typedef struct CobaltExtensionEnhancedAudioMediaAudioStreamInfo {
  SbMediaAudioCodec codec;
  const char* mime;
  uint16_t number_of_channels;
  uint32_t samples_per_second;
  uint16_t bits_per_sample;
  uint16_t audio_specific_config_size;
  const void* audio_specific_config;
} CobaltExtensionEnhancedAudioMediaAudioStreamInfo;

// The structure has the same binary layout as `SbMediaAudioSampleInfo` in the
// most recent Starboard version, and is verified by unit tests.
// The comment of individual members are explicitly removed, please refer to the
// comment of `SbMediaAudioSampleInfo` in `media.h` for more details.
typedef struct CobaltExtensionEnhancedAudioMediaAudioSampleInfo {
  CobaltExtensionEnhancedAudioMediaAudioStreamInfo stream_info;
  int64_t discarded_duration_from_front;  // in microseconds.
  int64_t discarded_duration_from_back;   // in microseconds.
} CobaltExtensionEnhancedAudioMediaAudioSampleInfo;

// The structure has the same binary layout as `SbMediaVideoStreamInfo` in the
// most recent Starboard version, and is verified by unit tests.
// The comment of individual members are explicitly removed, please refer to the
// comment of `SbMediaVideoStreamInfo` in `media.h` for more details.
typedef struct CobaltExtensionEnhancedAudioMediaVideoStreamInfo {
  SbMediaVideoCodec codec;
  const char* mime;
  const char* max_video_capabilities;
  int frame_width;
  int frame_height;
  SbMediaColorMetadata color_metadata;
} CobaltExtensionEnhancedAudioMediaVideoStreamInfo;

// The structure has the same binary layout as `SbMediaVideoSampleInfo` in the
// most recent Starboard version, and is verified by unit tests.
// The comment of individual members are explicitly removed, please refer to the
// comment of `SbMediaVideoSampleInfo` in `media.h` for more details.
typedef struct CobaltExtensionEnhancedAudioMediaVideoSampleInfo {
  CobaltExtensionEnhancedAudioMediaVideoStreamInfo stream_info;
  bool is_key_frame;
} CobaltExtensionEnhancedAudioMediaVideoSampleInfo;

// The structure has the same binary layout as `SbPlayerSampleInfo` in the
// most recent Starboard version, and is verified by unit tests.
// The comment of individual members are explicitly removed, please refer to the
// comment of `SbPlayerSampleInfo` in `player.h` for more details.
typedef struct CobaltExtensionEnhancedAudioPlayerSampleInfo {
  SbMediaType type;
  const void* buffer;
  int buffer_size;
  int64_t timestamp;  // Microseconds since Windows epoch UTC.
  SbPlayerSampleSideData* side_data;
  int side_data_count;
  union {
    CobaltExtensionEnhancedAudioMediaAudioSampleInfo audio_sample_info;
    CobaltExtensionEnhancedAudioMediaVideoSampleInfo video_sample_info;
  };
  const SbDrmSampleInfo* drm_info;
} CobaltExtensionEnhancedAudioPlayerSampleInfo;

typedef struct CobaltExtensionEnhancedAudioApi {
  // Name should be the string kCobaltExtensionEnhancedAudioName.
  // This helps to validate that the extension API is correct.
  const char* name;

  // This specifies the version of the API that is implemented.
  uint32_t version;

  // EnhancedAudio API Wrapper.

  // Writes samples of the given media type to |player|'s input stream.
  // It has exactly the same interface as `SbPlayerWriteSamples()` defined in
  // `player.h`, except that |sample_infos| is under type specific to this
  // extension.
  // Please refer to the comment of `SbPlayerWriteSamples()` in `player.h` for
  // more details.
  void (*PlayerWriteSamples)(
      SbPlayer player,
      SbMediaType sample_type,
      const CobaltExtensionEnhancedAudioPlayerSampleInfo* sample_infos,
      int number_of_sample_infos);
} CobaltExtensionEnhancedAudioApi;

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // STARBOARD_EXTENSION_ENHANCED_AUDIO_H_
