| // 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 "media/formats/webm/webm_webvtt_parser.h" |
| |
| 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 |