// 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/time.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;
  SbTime discarded_duration_from_front;
  SbTime discarded_duration_from_back;
} 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;
  SbTime timestamp;
  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_
