// Copyright (c) 2013 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 "media/webm/webm_webvtt_parser.h" namespace media { void WebMWebVTTParser::Parse(const uint8* 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* 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* 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 byte; if (!GetByte(&byte) || byte == kLF) return; if (byte == kCR) { if (GetByte(&byte) && byte != kLF) UngetByte(); return; } line->push_back(byte); } } } // namespace media