Chromium Code Reviews| Index: media/formats/webm/webm_tracks_parser.cc |
| diff --git a/media/formats/webm/webm_tracks_parser.cc b/media/formats/webm/webm_tracks_parser.cc |
| index 01fc83bf6e72d1b0279b7c8e48919647d8be6315..8d3a273db9045774e09a1a5a6bc16e68d0f50322 100644 |
| --- a/media/formats/webm/webm_tracks_parser.cc |
| +++ b/media/formats/webm/webm_tracks_parser.cc |
| @@ -29,14 +29,32 @@ static TextKind CodecIdToTextKind(const std::string& codec_id) { |
| return kTextNone; |
| } |
| +static base::TimeDelta PrecisionCappedDefaultDuration( |
| + const double timecode_scale_in_us, const int64 duration_in_ns) { |
| + if (duration_in_ns <= 0) |
| + return kNoTimestamp(); |
| + |
| + double mult = duration_in_ns / 1000.0; |
|
acolwell GONE FROM CHROMIUM
2014/03/26 22:25:32
nit: Do you really need the double here? Any fract
wolenetz
2014/03/27 01:21:43
Say we have default webm timecode scale_in_us of 1
|
| + mult /= timecode_scale_in_us; |
| + mult = std::floor(mult); |
| + if (mult == 0.0) |
|
acolwell GONE FROM CHROMIUM
2014/03/26 22:25:32
nit: if you don't do line 38 can't this just becom
wolenetz
2014/03/27 01:21:43
I don't think so. See previous comment's reply.
|
| + return kNoTimestamp(); |
| + |
| + mult *= timecode_scale_in_us; |
| + return base::TimeDelta::FromMicroseconds(mult); |
| +} |
| + |
| WebMTracksParser::WebMTracksParser(const LogCB& log_cb, bool ignore_text_tracks) |
| : track_type_(-1), |
| track_num_(-1), |
| track_uid_(-1), |
| seek_preroll_(-1), |
| codec_delay_(-1), |
| + default_duration_(-1), |
| audio_track_num_(-1), |
| + audio_default_duration_(-1), |
| video_track_num_(-1), |
| + video_default_duration_(-1), |
| ignore_text_tracks_(ignore_text_tracks), |
| log_cb_(log_cb), |
| audio_client_(log_cb), |
| @@ -49,11 +67,14 @@ int WebMTracksParser::Parse(const uint8* buf, int size) { |
| track_type_ =-1; |
| track_num_ = -1; |
| track_uid_ = -1; |
| + default_duration_ = -1; |
| track_name_.clear(); |
| track_language_.clear(); |
| audio_track_num_ = -1; |
| + audio_default_duration_ = -1; |
| audio_decoder_config_ = AudioDecoderConfig(); |
| video_track_num_ = -1; |
| + video_default_duration_ = -1; |
| video_decoder_config_ = VideoDecoderConfig(); |
| text_tracks_.clear(); |
| ignored_tracks_.clear(); |
| @@ -68,6 +89,18 @@ int WebMTracksParser::Parse(const uint8* buf, int size) { |
| return parser.IsParsingComplete() ? result : 0; |
| } |
| +base::TimeDelta WebMTracksParser::GetAudioDefaultDuration( |
| + const double timecode_scale_in_us) const { |
| + return PrecisionCappedDefaultDuration(timecode_scale_in_us, |
| + audio_default_duration_); |
| +} |
| + |
| +base::TimeDelta WebMTracksParser::GetVideoDefaultDuration( |
| + const double timecode_scale_in_us) const { |
| + return PrecisionCappedDefaultDuration(timecode_scale_in_us, |
| + video_default_duration_); |
| +} |
| + |
| WebMParserClient* WebMTracksParser::OnListStart(int id) { |
| if (id == kWebMIdContentEncodings) { |
| DCHECK(!track_content_encodings_client_.get()); |
| @@ -79,6 +112,7 @@ WebMParserClient* WebMTracksParser::OnListStart(int id) { |
| if (id == kWebMIdTrackEntry) { |
| track_type_ = -1; |
| track_num_ = -1; |
| + default_duration_ = -1; |
| track_name_.clear(); |
| track_language_.clear(); |
| codec_id_ = ""; |
| @@ -165,6 +199,12 @@ bool WebMTracksParser::OnListEnd(int id) { |
| audio_track_num_ = track_num_; |
| audio_encryption_key_id_ = encryption_key_id; |
| + if (default_duration_ == 0) { |
| + MEDIA_LOG(log_cb_) << "Illegal 0ns audio TrackEntry DefaultDuration"; |
| + return false; |
| + } |
| + audio_default_duration_ = default_duration_; |
| + |
| DCHECK(!audio_decoder_config_.IsValidConfig()); |
| if (!audio_client_.InitializeConfig( |
| codec_id_, codec_private_, seek_preroll_, codec_delay_, |
| @@ -180,6 +220,12 @@ bool WebMTracksParser::OnListEnd(int id) { |
| video_track_num_ = track_num_; |
| video_encryption_key_id_ = encryption_key_id; |
| + if (default_duration_ == 0) { |
| + MEDIA_LOG(log_cb_) << "Illegal 0ns video TrackEntry DefaultDuration"; |
| + return false; |
| + } |
| + video_default_duration_ = default_duration_; |
| + |
| DCHECK(!video_decoder_config_.IsValidConfig()); |
| if (!video_client_.InitializeConfig( |
| codec_id_, codec_private_, !video_encryption_key_id_.empty(), |
| @@ -210,6 +256,7 @@ bool WebMTracksParser::OnListEnd(int id) { |
| track_type_ = -1; |
| track_num_ = -1; |
| track_uid_ = -1; |
| + default_duration_ = -1; |
| track_name_.clear(); |
| track_language_.clear(); |
| codec_id_ = ""; |
| @@ -243,6 +290,9 @@ bool WebMTracksParser::OnUInt(int id, int64 val) { |
| case kWebMIdCodecDelay: |
| dst = &codec_delay_; |
| break; |
| + case kWebMIdDefaultDuration: |
| + dst = &default_duration_; |
| + break; |
| default: |
| return true; |
| } |