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_AUDIO_PARSER_H_ 9*103e46e4SHarish Mahendrakar #define SRC_AUDIO_PARSER_H_ 10*103e46e4SHarish Mahendrakar 11*103e46e4SHarish Mahendrakar #include <cassert> 12*103e46e4SHarish Mahendrakar #include <cstdint> 13*103e46e4SHarish Mahendrakar 14*103e46e4SHarish Mahendrakar #include "src/float_parser.h" 15*103e46e4SHarish Mahendrakar #include "src/int_parser.h" 16*103e46e4SHarish Mahendrakar #include "src/master_value_parser.h" 17*103e46e4SHarish Mahendrakar #include "webm/callback.h" 18*103e46e4SHarish Mahendrakar #include "webm/dom_types.h" 19*103e46e4SHarish Mahendrakar #include "webm/id.h" 20*103e46e4SHarish Mahendrakar #include "webm/reader.h" 21*103e46e4SHarish Mahendrakar #include "webm/status.h" 22*103e46e4SHarish Mahendrakar 23*103e46e4SHarish Mahendrakar namespace webm { 24*103e46e4SHarish Mahendrakar 25*103e46e4SHarish Mahendrakar // Spec reference: 26*103e46e4SHarish Mahendrakar // http://matroska.org/technical/specs/index.html#Audio 27*103e46e4SHarish Mahendrakar // http://www.webmproject.org/docs/container/#Audio 28*103e46e4SHarish Mahendrakar class AudioParser : public MasterValueParser<Audio> { 29*103e46e4SHarish Mahendrakar public: AudioParser()30*103e46e4SHarish Mahendrakar AudioParser() 31*103e46e4SHarish Mahendrakar : MasterValueParser<Audio>( 32*103e46e4SHarish Mahendrakar MakeChild<FloatParser>(Id::kSamplingFrequency, 33*103e46e4SHarish Mahendrakar &Audio::sampling_frequency), 34*103e46e4SHarish Mahendrakar MakeChild<FloatParser>(Id::kOutputSamplingFrequency, 35*103e46e4SHarish Mahendrakar &Audio::output_frequency) 36*103e46e4SHarish Mahendrakar .NotifyOnParseComplete(), 37*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kChannels, &Audio::channels), 38*103e46e4SHarish Mahendrakar MakeChild<UnsignedIntParser>(Id::kBitDepth, &Audio::bit_depth)) {} 39*103e46e4SHarish Mahendrakar Init(const ElementMetadata & metadata,std::uint64_t max_size)40*103e46e4SHarish Mahendrakar Status Init(const ElementMetadata& metadata, 41*103e46e4SHarish Mahendrakar std::uint64_t max_size) override { 42*103e46e4SHarish Mahendrakar output_frequency_has_value_ = false; 43*103e46e4SHarish Mahendrakar 44*103e46e4SHarish Mahendrakar return MasterValueParser::Init(metadata, max_size); 45*103e46e4SHarish Mahendrakar } 46*103e46e4SHarish Mahendrakar InitAfterSeek(const Ancestory & child_ancestory,const ElementMetadata & child_metadata)47*103e46e4SHarish Mahendrakar void InitAfterSeek(const Ancestory& child_ancestory, 48*103e46e4SHarish Mahendrakar const ElementMetadata& child_metadata) override { 49*103e46e4SHarish Mahendrakar output_frequency_has_value_ = false; 50*103e46e4SHarish Mahendrakar 51*103e46e4SHarish Mahendrakar return MasterValueParser::InitAfterSeek(child_ancestory, child_metadata); 52*103e46e4SHarish Mahendrakar } 53*103e46e4SHarish Mahendrakar Feed(Callback * callback,Reader * reader,std::uint64_t * num_bytes_read)54*103e46e4SHarish Mahendrakar Status Feed(Callback* callback, Reader* reader, 55*103e46e4SHarish Mahendrakar std::uint64_t* num_bytes_read) override { 56*103e46e4SHarish Mahendrakar const Status status = 57*103e46e4SHarish Mahendrakar MasterValueParser::Feed(callback, reader, num_bytes_read); 58*103e46e4SHarish Mahendrakar if (status.completed_ok()) { 59*103e46e4SHarish Mahendrakar FixMissingOutputFrequency(); 60*103e46e4SHarish Mahendrakar } 61*103e46e4SHarish Mahendrakar return status; 62*103e46e4SHarish Mahendrakar } 63*103e46e4SHarish Mahendrakar 64*103e46e4SHarish Mahendrakar protected: OnChildParsed(const ElementMetadata & metadata)65*103e46e4SHarish Mahendrakar void OnChildParsed(const ElementMetadata& metadata) override { 66*103e46e4SHarish Mahendrakar assert(metadata.id == Id::kOutputSamplingFrequency); 67*103e46e4SHarish Mahendrakar 68*103e46e4SHarish Mahendrakar output_frequency_has_value_ = metadata.size > 0; 69*103e46e4SHarish Mahendrakar } 70*103e46e4SHarish Mahendrakar 71*103e46e4SHarish Mahendrakar private: 72*103e46e4SHarish Mahendrakar bool output_frequency_has_value_; 73*103e46e4SHarish Mahendrakar FixMissingOutputFrequency()74*103e46e4SHarish Mahendrakar void FixMissingOutputFrequency() { 75*103e46e4SHarish Mahendrakar if (!output_frequency_has_value_) { 76*103e46e4SHarish Mahendrakar *mutable_value()->output_frequency.mutable_value() = 77*103e46e4SHarish Mahendrakar value().sampling_frequency.value(); 78*103e46e4SHarish Mahendrakar } 79*103e46e4SHarish Mahendrakar } 80*103e46e4SHarish Mahendrakar }; 81*103e46e4SHarish Mahendrakar 82*103e46e4SHarish Mahendrakar } // namespace webm 83*103e46e4SHarish Mahendrakar 84*103e46e4SHarish Mahendrakar #endif // SRC_AUDIO_PARSER_H_ 85