• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/formats/webm/webm_webvtt_parser.h"
6 
7 namespace media {
8 
Parse(const uint8 * payload,int payload_size,std::string * id,std::string * settings,std::string * content)9 void WebMWebVTTParser::Parse(const uint8* payload, int payload_size,
10                              std::string* id,
11                              std::string* settings,
12                              std::string* content) {
13   WebMWebVTTParser parser(payload, payload_size);
14   parser.Parse(id, settings, content);
15 }
16 
WebMWebVTTParser(const uint8 * payload,int payload_size)17 WebMWebVTTParser::WebMWebVTTParser(const uint8* payload, int payload_size)
18     : ptr_(payload),
19       ptr_end_(payload + payload_size) {
20 }
21 
Parse(std::string * id,std::string * settings,std::string * content)22 void WebMWebVTTParser::Parse(std::string* id,
23                              std::string* settings,
24                              std::string* content) {
25   ParseLine(id);
26   ParseLine(settings);
27   content->assign(ptr_, ptr_end_);
28 }
29 
GetByte(uint8 * byte)30 bool WebMWebVTTParser::GetByte(uint8* byte) {
31   if (ptr_ >= ptr_end_)
32     return false;  // indicates end-of-stream
33 
34   *byte = *ptr_++;
35   return true;
36 }
37 
UngetByte()38 void WebMWebVTTParser::UngetByte() {
39   --ptr_;
40 }
41 
ParseLine(std::string * line)42 void WebMWebVTTParser::ParseLine(std::string* line) {
43   line->clear();
44 
45   // Consume characters from the stream, until we reach end-of-line.
46 
47   // The WebVTT spec states that lines may be terminated in any of the following
48   // three ways:
49   //  LF
50   //  CR
51   //  CR LF
52 
53   // The spec is here:
54   //  http://wiki.webmproject.org/webm-metadata/temporal-metadata/webvtt-in-webm
55 
56   enum {
57     kLF = '\x0A',
58     kCR = '\x0D'
59   };
60 
61   for (;;) {
62     uint8 byte;
63 
64     if (!GetByte(&byte) || byte == kLF)
65       return;
66 
67     if (byte == kCR) {
68       if (GetByte(&byte) && byte != kLF)
69         UngetByte();
70 
71       return;
72     }
73 
74     line->push_back(byte);
75   }
76 }
77 
78 }  // namespace media
79