Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Unified Diff: media/formats/webm/webm_tracks_parser.cc

Issue 213153008: MSE: Parse WebM TrackEntry DefaultDuration field (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes lint err (c-style cast). Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/formats/webm/webm_tracks_parser.h ('k') | media/formats/webm/webm_tracks_parser_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..ed7fd521be106861051fc7b77a97fc0f69007880 100644
--- a/media/formats/webm/webm_tracks_parser.cc
+++ b/media/formats/webm/webm_tracks_parser.cc
@@ -29,14 +29,31 @@ 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();
+
+ int64 mult = duration_in_ns / 1000;
+ mult /= timecode_scale_in_us;
+ if (mult == 0)
+ return kNoTimestamp();
+
+ mult = static_cast<double>(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 +66,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 +88,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 +111,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 +198,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 +219,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 +255,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 +289,9 @@ bool WebMTracksParser::OnUInt(int id, int64 val) {
case kWebMIdCodecDelay:
dst = &codec_delay_;
break;
+ case kWebMIdDefaultDuration:
+ dst = &default_duration_;
+ break;
default:
return true;
}
« no previous file with comments | « media/formats/webm/webm_tracks_parser.h ('k') | media/formats/webm/webm_tracks_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698