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 #ifndef SRC_VIDEO_PARSER_H_ 9*103e46e4SHarish Mahendrakar #define SRC_VIDEO_PARSER_H_ 10*103e46e4SHarish Mahendrakar 11*103e46e4SHarish Mahendrakar #include <cassert> 12*103e46e4SHarish Mahendrakar #include <cstdint> 13*103e46e4SHarish Mahendrakar 14*103e46e4SHarish Mahendrakar #include "src/bool_parser.h" 15*103e46e4SHarish Mahendrakar #include "src/colour_parser.h" 16*103e46e4SHarish Mahendrakar #include "src/float_parser.h" 17*103e46e4SHarish Mahendrakar #include "src/int_parser.h" 18*103e46e4SHarish Mahendrakar #include "src/master_value_parser.h" 19*103e46e4SHarish Mahendrakar #include "src/projection_parser.h" 20*103e46e4SHarish Mahendrakar #include "webm/callback.h" 21*103e46e4SHarish Mahendrakar #include "webm/dom_types.h" 22*103e46e4SHarish Mahendrakar #include "webm/id.h" 23*103e46e4SHarish Mahendrakar #include "webm/reader.h" 24*103e46e4SHarish Mahendrakar #include "webm/status.h" 25*103e46e4SHarish Mahendrakar 26*103e46e4SHarish Mahendrakar namespace webm { 27*103e46e4SHarish Mahendrakar 28*103e46e4SHarish Mahendrakar // Spec reference: 29*103e46e4SHarish Mahendrakar // http://matroska.org/technical/specs/index.html#Video 30*103e46e4SHarish Mahendrakar // http://www.webmproject.org/docs/container/#Video 31*103e46e4SHarish Mahendrakar class VideoParser : public MasterValueParser<Video> { 32*103e46e4SHarish Mahendrakar public: VideoParser()33*103e46e4SHarish Mahendrakar VideoParser() 34*103e46e4SHarish Mahendrakar : MasterValueParser<Video>( 35*103e46e4SHarish Mahendrakar MakeChild<IntParser<FlagInterlaced>>(Id::kFlagInterlaced, 36*103e46e4SHarish Mahendrakar &Video::interlaced), 37*103e46e4SHarish Mahendrakar MakeChild<IntParser<StereoMode>>(Id::kStereoMode, 38*103e46e4SHarish Mahendrakar &Video::stereo_mode), 39*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kAlphaMode, &Video::alpha_mode), 40*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelWidth, &Video::pixel_width), 41*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelHeight, 42*103e46e4SHarish Mahendrakar &Video::pixel_height), 43*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelCropBottom, 44*103e46e4SHarish Mahendrakar &Video::pixel_crop_bottom), 45*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelCropTop, 46*103e46e4SHarish Mahendrakar &Video::pixel_crop_top), 47*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelCropLeft, 48*103e46e4SHarish Mahendrakar &Video::pixel_crop_left), 49*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kPixelCropRight, 50*103e46e4SHarish Mahendrakar &Video::pixel_crop_right), 51*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kDisplayWidth, 52*103e46e4SHarish Mahendrakar &Video::display_width) 53*103e46e4SHarish Mahendrakar .NotifyOnParseComplete(), 54*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kDisplayHeight, 55*103e46e4SHarish Mahendrakar &Video::display_height) 56*103e46e4SHarish Mahendrakar .NotifyOnParseComplete(), 57*103e46e4SHarish Mahendrakar MakeChild<IntParser<DisplayUnit>>(Id::kDisplayUnit, 58*103e46e4SHarish Mahendrakar &Video::display_unit), 59*103e46e4SHarish Mahendrakar MakeChild<IntParser<AspectRatioType>>(Id::kAspectRatioType, 60*103e46e4SHarish Mahendrakar &Video::aspect_ratio_type), 61*103e46e4SHarish Mahendrakar MakeChild<FloatParser>(Id::kFrameRate, &Video::frame_rate), 62*103e46e4SHarish Mahendrakar MakeChild<ColourParser>(Id::kColour, &Video::colour), 63*103e46e4SHarish Mahendrakar MakeChild<ProjectionParser>(Id::kProjection, &Video::projection)) {} 64*103e46e4SHarish Mahendrakar Init(const ElementMetadata & metadata,std::uint64_t max_size)65*103e46e4SHarish Mahendrakar Status Init(const ElementMetadata& metadata, 66*103e46e4SHarish Mahendrakar std::uint64_t max_size) override { 67*103e46e4SHarish Mahendrakar display_width_has_value_ = false; 68*103e46e4SHarish Mahendrakar display_height_has_value_ = false; 69*103e46e4SHarish Mahendrakar 70*103e46e4SHarish Mahendrakar return MasterValueParser::Init(metadata, max_size); 71*103e46e4SHarish Mahendrakar } 72*103e46e4SHarish Mahendrakar InitAfterSeek(const Ancestory & child_ancestory,const ElementMetadata & child_metadata)73*103e46e4SHarish Mahendrakar void InitAfterSeek(const Ancestory& child_ancestory, 74*103e46e4SHarish Mahendrakar const ElementMetadata& child_metadata) override { 75*103e46e4SHarish Mahendrakar display_width_has_value_ = false; 76*103e46e4SHarish Mahendrakar display_height_has_value_ = false; 77*103e46e4SHarish Mahendrakar 78*103e46e4SHarish Mahendrakar return MasterValueParser::InitAfterSeek(child_ancestory, child_metadata); 79*103e46e4SHarish Mahendrakar } 80*103e46e4SHarish Mahendrakar Feed(Callback * callback,Reader * reader,std::uint64_t * num_bytes_read)81*103e46e4SHarish Mahendrakar Status Feed(Callback* callback, Reader* reader, 82*103e46e4SHarish Mahendrakar std::uint64_t* num_bytes_read) override { 83*103e46e4SHarish Mahendrakar const Status status = 84*103e46e4SHarish Mahendrakar MasterValueParser::Feed(callback, reader, num_bytes_read); 85*103e46e4SHarish Mahendrakar if (status.completed_ok()) { 86*103e46e4SHarish Mahendrakar FixMissingDisplaySize(); 87*103e46e4SHarish Mahendrakar } 88*103e46e4SHarish Mahendrakar return status; 89*103e46e4SHarish Mahendrakar } 90*103e46e4SHarish Mahendrakar 91*103e46e4SHarish Mahendrakar protected: OnChildParsed(const ElementMetadata & metadata)92*103e46e4SHarish Mahendrakar void OnChildParsed(const ElementMetadata& metadata) override { 93*103e46e4SHarish Mahendrakar assert(metadata.id == Id::kDisplayWidth || 94*103e46e4SHarish Mahendrakar metadata.id == Id::kDisplayHeight); 95*103e46e4SHarish Mahendrakar 96*103e46e4SHarish Mahendrakar if (metadata.id == Id::kDisplayWidth) { 97*103e46e4SHarish Mahendrakar display_width_has_value_ = metadata.size > 0; 98*103e46e4SHarish Mahendrakar } else { 99*103e46e4SHarish Mahendrakar display_height_has_value_ = metadata.size > 0; 100*103e46e4SHarish Mahendrakar } 101*103e46e4SHarish Mahendrakar } 102*103e46e4SHarish Mahendrakar 103*103e46e4SHarish Mahendrakar private: 104*103e46e4SHarish Mahendrakar bool display_width_has_value_; 105*103e46e4SHarish Mahendrakar bool display_height_has_value_; 106*103e46e4SHarish Mahendrakar FixMissingDisplaySize()107*103e46e4SHarish Mahendrakar void FixMissingDisplaySize() { 108*103e46e4SHarish Mahendrakar if (!display_width_has_value_) { 109*103e46e4SHarish Mahendrakar *mutable_value()->display_width.mutable_value() = 110*103e46e4SHarish Mahendrakar value().pixel_width.value(); 111*103e46e4SHarish Mahendrakar } 112*103e46e4SHarish Mahendrakar 113*103e46e4SHarish Mahendrakar if (!display_height_has_value_) { 114*103e46e4SHarish Mahendrakar *mutable_value()->display_height.mutable_value() = 115*103e46e4SHarish Mahendrakar value().pixel_height.value(); 116*103e46e4SHarish Mahendrakar } 117*103e46e4SHarish Mahendrakar } 118*103e46e4SHarish Mahendrakar }; 119*103e46e4SHarish Mahendrakar 120*103e46e4SHarish Mahendrakar } // namespace webm 121*103e46e4SHarish Mahendrakar 122*103e46e4SHarish Mahendrakar #endif // SRC_VIDEO_PARSER_H_ 123