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; |
} |