// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "media/webm/webm_info_parser.h" #include "base/logging.h" #include "media/webm/webm_constants.h" namespace media { // Default timecode scale if the TimecodeScale element is // not specified in the INFO element. static const int kWebMDefaultTimecodeScale = 1000000; WebMInfoParser::WebMInfoParser() : timecode_scale_(-1), duration_(-1) { } WebMInfoParser::~WebMInfoParser() {} int WebMInfoParser::Parse(const uint8* buf, int size) { timecode_scale_ = -1; duration_ = -1; WebMListParser parser(kWebMIdInfo, this); int result = parser.Parse(buf, size); if (result <= 0) return result; // For now we do all or nothing parsing. return parser.IsParsingComplete() ? result : 0; } WebMParserClient* WebMInfoParser::OnListStart(int id) { return this; } bool WebMInfoParser::OnListEnd(int id) { if (id == kWebMIdInfo && timecode_scale_ == -1) { // Set timecode scale to default value if it isn't present in // the Info element. timecode_scale_ = kWebMDefaultTimecodeScale; } return true; } bool WebMInfoParser::OnUInt(int id, int64 val) { if (id != kWebMIdTimecodeScale) return true; if (timecode_scale_ != -1) { DVLOG(1) << "Multiple values for id " << std::hex << id << " specified"; return false; } timecode_scale_ = val; return true; } bool WebMInfoParser::OnFloat(int id, double val) { if (id != kWebMIdDuration) { DVLOG(1) << "Unexpected float for id" << std::hex << id; return false; } if (duration_ != -1) { DVLOG(1) << "Multiple values for duration."; return false; } duration_ = val; return true; } bool WebMInfoParser::OnBinary(int id, const uint8* data, int size) { return true; } bool WebMInfoParser::OnString(int id, const std::string& str) { return true; } } // namespace media