| // Copyright (c) 2016 The WebM project authors. All Rights Reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style license | |
| // that can be found in the LICENSE file in the root of the source | |
| // tree. An additional intellectual property rights grant can be found | |
| // in the file PATENTS. All contributing project authors may | |
| // be found in the AUTHORS file in the root of the source tree. | |
| #ifndef SRC_VIDEO_PARSER_H_ | |
| #define SRC_VIDEO_PARSER_H_ | |
| #include <cassert> | |
| #include <cstdint> | |
| #include "src/bool_parser.h" | |
| #include "src/colour_parser.h" | |
| #include "src/float_parser.h" | |
| #include "src/int_parser.h" | |
| #include "src/master_value_parser.h" | |
| #include "src/projection_parser.h" | |
| #include "webm/callback.h" | |
| #include "webm/dom_types.h" | |
| #include "webm/id.h" | |
| #include "webm/reader.h" | |
| #include "webm/status.h" | |
| namespace webm { | |
| // Spec reference: | |
| // http://matroska.org/technical/specs/index.html#Video | |
| // http://www.webmproject.org/docs/container/#Video | |
| class VideoParser : public MasterValueParser<Video> { | |
| public: | |
| VideoParser() | |
| : MasterValueParser<Video>( | |
| MakeChild<IntParser<FlagInterlaced>>(Id::kFlagInterlaced, | |
| &Video::interlaced), | |
| MakeChild<IntParser<StereoMode>>(Id::kStereoMode, | |
| &Video::stereo_mode), | |
| MakeChild<UnsignedIntParser>(Id::kAlphaMode, &Video::alpha_mode), | |
| MakeChild<UnsignedIntParser>(Id::kPixelWidth, &Video::pixel_width), | |
| MakeChild<UnsignedIntParser>(Id::kPixelHeight, | |
| &Video::pixel_height), | |
| MakeChild<UnsignedIntParser>(Id::kPixelCropBottom, | |
| &Video::pixel_crop_bottom), | |
| MakeChild<UnsignedIntParser>(Id::kPixelCropTop, | |
| &Video::pixel_crop_top), | |
| MakeChild<UnsignedIntParser>(Id::kPixelCropLeft, | |
| &Video::pixel_crop_left), | |
| MakeChild<UnsignedIntParser>(Id::kPixelCropRight, | |
| &Video::pixel_crop_right), | |
| MakeChild<UnsignedIntParser>(Id::kDisplayWidth, | |
| &Video::display_width) | |
| .NotifyOnParseComplete(), | |
| MakeChild<UnsignedIntParser>(Id::kDisplayHeight, | |
| &Video::display_height) | |
| .NotifyOnParseComplete(), | |
| MakeChild<IntParser<DisplayUnit>>(Id::kDisplayUnit, | |
| &Video::display_unit), | |
| MakeChild<IntParser<AspectRatioType>>(Id::kAspectRatioType, | |
| &Video::aspect_ratio_type), | |
| MakeChild<FloatParser>(Id::kFrameRate, &Video::frame_rate), | |
| MakeChild<ColourParser>(Id::kColour, &Video::colour), | |
| MakeChild<ProjectionParser>(Id::kProjection, &Video::projection)) {} | |
| Status Init(const ElementMetadata& metadata, | |
| std::uint64_t max_size) override { | |
| display_width_has_value_ = false; | |
| display_height_has_value_ = false; | |
| return MasterValueParser::Init(metadata, max_size); | |
| } | |
| void InitAfterSeek(const Ancestory& child_ancestory, | |
| const ElementMetadata& child_metadata) override { | |
| display_width_has_value_ = false; | |
| display_height_has_value_ = false; | |
| return MasterValueParser::InitAfterSeek(child_ancestory, child_metadata); | |
| } | |
| Status Feed(Callback* callback, Reader* reader, | |
| std::uint64_t* num_bytes_read) override { | |
| const Status status = | |
| MasterValueParser::Feed(callback, reader, num_bytes_read); | |
| if (status.completed_ok()) { | |
| FixMissingDisplaySize(); | |
| } | |
| return status; | |
| } | |
| protected: | |
| void OnChildParsed(const ElementMetadata& metadata) override { | |
| assert(metadata.id == Id::kDisplayWidth || | |
| metadata.id == Id::kDisplayHeight); | |
| if (metadata.id == Id::kDisplayWidth) { | |
| display_width_has_value_ = metadata.size > 0; | |
| } else { | |
| display_height_has_value_ = metadata.size > 0; | |
| } | |
| } | |
| private: | |
| bool display_width_has_value_; | |
| bool display_height_has_value_; | |
| void FixMissingDisplaySize() { | |
| if (!display_width_has_value_) { | |
| *mutable_value()->display_width.mutable_value() = | |
| value().pixel_width.value(); | |
| } | |
| if (!display_height_has_value_) { | |
| *mutable_value()->display_height.mutable_value() = | |
| value().pixel_height.value(); | |
| } | |
| } | |
| }; | |
| } // namespace webm | |
| #endif // SRC_VIDEO_PARSER_H_ |