1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #include "src/date_parser.h"
9*103e46e4SHarish Mahendrakar
10*103e46e4SHarish Mahendrakar #include <cassert>
11*103e46e4SHarish Mahendrakar #include <cstdint>
12*103e46e4SHarish Mahendrakar #include <limits>
13*103e46e4SHarish Mahendrakar
14*103e46e4SHarish Mahendrakar #include "src/parser_utils.h"
15*103e46e4SHarish Mahendrakar #include "webm/element.h"
16*103e46e4SHarish Mahendrakar #include "webm/reader.h"
17*103e46e4SHarish Mahendrakar #include "webm/status.h"
18*103e46e4SHarish Mahendrakar
19*103e46e4SHarish Mahendrakar namespace webm {
20*103e46e4SHarish Mahendrakar
21*103e46e4SHarish Mahendrakar // Spec reference:
22*103e46e4SHarish Mahendrakar // http://matroska.org/technical/specs/index.html#EBML_ex
23*103e46e4SHarish Mahendrakar // https://github.com/Matroska-Org/ebml-specification/blob/master/specification.markdown#ebml-element-types
DateParser(std::int64_t default_value)24*103e46e4SHarish Mahendrakar DateParser::DateParser(std::int64_t default_value)
25*103e46e4SHarish Mahendrakar : default_value_(default_value) {}
26*103e46e4SHarish Mahendrakar
Init(const ElementMetadata & metadata,std::uint64_t max_size)27*103e46e4SHarish Mahendrakar Status DateParser::Init(const ElementMetadata& metadata,
28*103e46e4SHarish Mahendrakar std::uint64_t max_size) {
29*103e46e4SHarish Mahendrakar assert(metadata.size == kUnknownElementSize || metadata.size <= max_size);
30*103e46e4SHarish Mahendrakar
31*103e46e4SHarish Mahendrakar if (metadata.size != 0 && metadata.size != 8) {
32*103e46e4SHarish Mahendrakar return Status(Status::kInvalidElementSize);
33*103e46e4SHarish Mahendrakar }
34*103e46e4SHarish Mahendrakar
35*103e46e4SHarish Mahendrakar num_bytes_remaining_ = static_cast<int>(metadata.size);
36*103e46e4SHarish Mahendrakar
37*103e46e4SHarish Mahendrakar // The meaning of a 0-byte element is still being debated. EBML says the value
38*103e46e4SHarish Mahendrakar // is zero; Matroska says it's the default according to whatever the document
39*103e46e4SHarish Mahendrakar // spec says. Neither specifies what a 0-byte mandatory element means. I've
40*103e46e4SHarish Mahendrakar // asked about this on the Matroska mailing list. I'm going to assume a 0-byte
41*103e46e4SHarish Mahendrakar // mandatory element should be treated the same as a 0-byte optional element,
42*103e46e4SHarish Mahendrakar // meaning that they both get their default value (which may be some value
43*103e46e4SHarish Mahendrakar // other than zero). This applies to all non-master-elements (not just dates).
44*103e46e4SHarish Mahendrakar // This parser is an EBML-level parser, and so will default to a value of
45*103e46e4SHarish Mahendrakar // zero. The Matroska-level parser can reset this default value to something
46*103e46e4SHarish Mahendrakar // else after parsing (as needed).
47*103e46e4SHarish Mahendrakar // See:
48*103e46e4SHarish Mahendrakar // https://github.com/Matroska-Org/ebml-specification/pull/17
49*103e46e4SHarish Mahendrakar // http://lists.matroska.org/pipermail/matroska-devel/2015-October/004866.html
50*103e46e4SHarish Mahendrakar if (metadata.size == 0) {
51*103e46e4SHarish Mahendrakar value_ = default_value_;
52*103e46e4SHarish Mahendrakar } else {
53*103e46e4SHarish Mahendrakar value_ = 0;
54*103e46e4SHarish Mahendrakar }
55*103e46e4SHarish Mahendrakar
56*103e46e4SHarish Mahendrakar return Status(Status::kOkCompleted);
57*103e46e4SHarish Mahendrakar }
58*103e46e4SHarish Mahendrakar
Feed(Callback * callback,Reader * reader,std::uint64_t * num_bytes_read)59*103e46e4SHarish Mahendrakar Status DateParser::Feed(Callback* callback, Reader* reader,
60*103e46e4SHarish Mahendrakar std::uint64_t* num_bytes_read) {
61*103e46e4SHarish Mahendrakar assert(callback != nullptr);
62*103e46e4SHarish Mahendrakar assert(reader != nullptr);
63*103e46e4SHarish Mahendrakar assert(num_bytes_read != nullptr);
64*103e46e4SHarish Mahendrakar
65*103e46e4SHarish Mahendrakar const Status status = AccumulateIntegerBytes(num_bytes_remaining_, reader,
66*103e46e4SHarish Mahendrakar &value_, num_bytes_read);
67*103e46e4SHarish Mahendrakar num_bytes_remaining_ -= static_cast<int>(*num_bytes_read);
68*103e46e4SHarish Mahendrakar
69*103e46e4SHarish Mahendrakar return status;
70*103e46e4SHarish Mahendrakar }
71*103e46e4SHarish Mahendrakar
72*103e46e4SHarish Mahendrakar } // namespace webm
73