blob: a36a36402ea76be4759bc6e104bed7745bd7eb23 [file] [log] [blame]
// 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