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

Unified Diff: media/filters/media_source_state.cc

Issue 1843823003: MSE: Protect better against out-of-sequence parser callbacks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix_597447_1
Patch Set: Removed patchset dependency - this can land by itself Created 4 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/filters/media_source_state.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/media_source_state.cc
diff --git a/media/filters/media_source_state.cc b/media/filters/media_source_state.cc
index 89d488ef21031b58eaf62f692f25f8f738ac2007..98028b40a00cc9cb59a6208628ed90c152362829 100644
--- a/media/filters/media_source_state.cc
+++ b/media/filters/media_source_state.cc
@@ -100,6 +100,7 @@ MediaSourceState::MediaSourceState(
video_(NULL),
frame_processor_(frame_processor.release()),
media_log_(media_log),
+ state_(UNINITIALIZED),
auto_update_timestamp_offset_(false) {
DCHECK(!create_demuxer_stream_cb_.is_null());
DCHECK(frame_processor_);
@@ -117,9 +118,11 @@ void MediaSourceState::Init(
bool allow_video,
const StreamParser::EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
const NewTextTrackCB& new_text_track_cb) {
+ DCHECK_EQ(state_, UNINITIALIZED);
new_text_track_cb_ = new_text_track_cb;
init_cb_ = init_cb;
+ state_ = PENDING_PARSER_CONFIG;
stream_parser_->Init(
base::Bind(&MediaSourceState::OnSourceInitDone, base::Unretained(this)),
base::Bind(&MediaSourceState::OnNewConfigs, base::Unretained(this),
@@ -475,6 +478,7 @@ bool MediaSourceState::OnNewConfigs(
bool allow_video,
scoped_ptr<MediaTracks> tracks,
const StreamParser::TextTrackConfigMap& text_configs) {
+ DCHECK_GE(state_, PENDING_PARSER_CONFIG);
DCHECK(tracks.get());
media_tracks_ = std::move(tracks);
const AudioDecoderConfig& audio_config = media_tracks_->getFirstAudioConfig();
@@ -649,6 +653,8 @@ bool MediaSourceState::OnNewConfigs(
DVLOG(1) << "OnNewConfigs() : " << (success ? "success" : "failed");
if (success) {
+ if (state_ == PENDING_PARSER_CONFIG)
+ state_ = PENDING_PARSER_INIT;
DCHECK(!init_segment_received_cb_.is_null());
init_segment_received_cb_.Run(std::move(media_tracks_));
}
@@ -658,6 +664,7 @@ bool MediaSourceState::OnNewConfigs(
void MediaSourceState::OnNewMediaSegment() {
DVLOG(2) << "OnNewMediaSegment()";
+ DCHECK_EQ(state_, PARSER_INITIALIZED);
parsing_media_segment_ = true;
media_segment_contained_audio_frame_ = false;
media_segment_contained_video_frame_ = false;
@@ -665,6 +672,7 @@ void MediaSourceState::OnNewMediaSegment() {
void MediaSourceState::OnEndOfMediaSegment() {
DVLOG(2) << "OnEndOfMediaSegment()";
+ DCHECK_EQ(state_, PARSER_INITIALIZED);
parsing_media_segment_ = false;
const bool missing_audio = audio_ && !media_segment_contained_audio_frame_;
@@ -687,6 +695,7 @@ bool MediaSourceState::OnNewBuffers(
const StreamParser::BufferQueue& video_buffers,
const StreamParser::TextBufferQueueMap& text_map) {
DVLOG(2) << "OnNewBuffers()";
+ DCHECK_EQ(state_, PARSER_INITIALIZED);
DCHECK(timestamp_offset_during_append_);
DCHECK(parsing_media_segment_);
@@ -730,6 +739,8 @@ bool MediaSourceState::OnNewBuffers(
void MediaSourceState::OnSourceInitDone(
const StreamParser::InitParameters& params) {
+ DCHECK_EQ(state_, PENDING_PARSER_INIT);
+ state_ = PARSER_INITIALIZED;
auto_update_timestamp_offset_ = params.auto_update_timestamp_offset;
base::ResetAndReturn(&init_cb_).Run(params);
}
« no previous file with comments | « media/filters/media_source_state.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698