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

#include "cobalt/media/formats/webm/webm_webvtt_parser.h"

namespace cobalt {
namespace media {

void WebMWebVTTParser::Parse(const uint8_t* payload, int payload_size,
                             std::string* id, std::string* settings,
                             std::string* content) {
  WebMWebVTTParser parser(payload, payload_size);
  parser.Parse(id, settings, content);
}

WebMWebVTTParser::WebMWebVTTParser(const uint8_t* payload, int payload_size)
    : ptr_(payload), ptr_end_(payload + payload_size) {}

void WebMWebVTTParser::Parse(std::string* id, std::string* settings,
                             std::string* content) {
  ParseLine(id);
  ParseLine(settings);
  content->assign(ptr_, ptr_end_);
}

bool WebMWebVTTParser::GetByte(uint8_t* byte) {
  if (ptr_ >= ptr_end_) return false;  // indicates end-of-stream

  *byte = *ptr_++;
  return true;
}

void WebMWebVTTParser::UngetByte() { --ptr_; }

void WebMWebVTTParser::ParseLine(std::string* line) {
  line->clear();

  // Consume characters from the stream, until we reach end-of-line.

  // The WebVTT spec states that lines may be terminated in any of the following
  // three ways:
  //  LF
  //  CR
  //  CR LF

  // The spec is here:
  //  http://wiki.webmproject.org/webm-metadata/temporal-metadata/webvtt-in-webm

  enum { kLF = '\x0A', kCR = '\x0D' };

  for (;;) {
    uint8_t byte;

    if (!GetByte(&byte) || byte == kLF) return;

    if (byte == kCR) {
      if (GetByte(&byte) && byte != kLF) UngetByte();

      return;
    }

    line->push_back(byte);
  }
}

}  // namespace media
}  // namespace cobalt
