// Copyright 2018 Google Inc. 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 "cobalt/media_capture/encoders/linear16_audio_encoder.h"

#include <string>

#include "base/string_util.h"

namespace {
// See https://tools.ietf.org/html/rfc2586 for MIME type
const char kLinear16MimeType[] = "audio/L16";
}  // namespace

namespace cobalt {
namespace media_capture {
namespace encoders {

bool Linear16AudioEncoder::IsLinear16MIMEType(
    const base::StringPiece& mime_type) {
  base::StringPiece mime_type_container = mime_type;
  size_t pos = mime_type.find_first_of(';');
  if (pos != base::StringPiece::npos) {
    mime_type_container = base::StringPiece(mime_type.begin(), pos);
  }
  const base::StringPiece linear16_mime_type(kLinear16MimeType);
  auto match_iterator =
      std::search(mime_type_container.begin(), mime_type_container.end(),
                  linear16_mime_type.begin(), linear16_mime_type.end(),
                  base::CaseInsensitiveCompareASCII<char>());
  return match_iterator == mime_type_container.begin();
}

void Linear16AudioEncoder::Encode(const ShellAudioBus& audio_bus,
                                  base::TimeTicks reference_time) {
  DCHECK_EQ(audio_bus.sample_type(), ShellAudioBus::kInt16);
  DCHECK_EQ(audio_bus.channels(), 1);
  auto data = audio_bus.interleaved_data();
  size_t data_size = audio_bus.GetSampleSizeInBytes() * audio_bus.frames();
  PushDataToAllListeners(data, data_size, reference_time);
}

void Linear16AudioEncoder::Finish(base::TimeTicks reference_time) {
  PushDataToAllListeners(nullptr, 0, reference_time);
}

std::string Linear16AudioEncoder::GetMimeType() const {
  return kLinear16MimeType;
}

int64 Linear16AudioEncoder::GetEstimatedOutputBitsPerSecond(
    const media_stream::AudioParameters& params) const {
  DCHECK_EQ(params.bits_per_sample(), 16);
  DCHECK_EQ(params.channel_count(), 1);
  return params.GetBitsPerSecond();
}

void Linear16AudioEncoder::OnSetFormat(
    const media_stream::AudioParameters& params) {
  DCHECK_EQ(params.bits_per_sample(), 16);
  DCHECK_EQ(params.channel_count(), 1);
}

}  // namespace encoders
}  // namespace media_capture
}  // namespace cobalt
