// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_MOJO_MOJOM_AUDIO_DECODER_CONFIG_MOJOM_TRAITS_H_
#define MEDIA_MOJO_MOJOM_AUDIO_DECODER_CONFIG_MOJOM_TRAITS_H_

#include "media/base/audio_decoder_config.h"
#include "media/base/ipc/media_param_traits.h"
#include "media/mojo/mojom/media_types.mojom.h"

namespace mojo {

template <>
struct StructTraits<media::mojom::AudioDecoderConfigDataView,
                    media::AudioDecoderConfig> {
  static media::AudioCodec codec(const media::AudioDecoderConfig& input) {
    return input.codec();
  }

  static media::SampleFormat sample_format(
      const media::AudioDecoderConfig& input) {
    return input.sample_format();
  }

  static media::ChannelLayout channel_layout(
      const media::AudioDecoderConfig& input) {
    return input.channel_layout();
  }

  static int samples_per_second(const media::AudioDecoderConfig& input) {
    return input.samples_per_second();
  }

  static const std::vector<uint8_t>& extra_data(
      const media::AudioDecoderConfig& input) {
    return input.extra_data();
  }

  static media::EncryptionScheme encryption_scheme(
      const media::AudioDecoderConfig& input) {
    return input.encryption_scheme();
  }

  static base::TimeDelta seek_preroll(const media::AudioDecoderConfig& input) {
    return input.seek_preroll();
  }

  static int codec_delay(const media::AudioDecoderConfig& input) {
    return input.codec_delay();
  }

  static media::AudioCodecProfile profile(
      const media::AudioDecoderConfig& input) {
    return input.profile();
  }

  static media::ChannelLayout target_output_channel_layout(
      const media::AudioDecoderConfig& input) {
    return input.target_output_channel_layout();
  }

  static bool should_discard_decoder_delay(
      const media::AudioDecoderConfig& input) {
    return input.should_discard_decoder_delay();
  }

  static const std::vector<uint8_t>& aac_extra_data(
      const media::AudioDecoderConfig& input) {
    return input.aac_extra_data();
  }

  static bool Read(media::mojom::AudioDecoderConfigDataView input,
                   media::AudioDecoderConfig* output);
};

}  // namespace mojo

#endif  // MEDIA_MOJO_MOJOM_AUDIO_DECODER_CONFIG_MOJOM_TRAITS_H_
