From 4386ac3500178307d398a5e67f27f3b2577811e1 Mon Sep 17 00:00:00 2001 From: "acolwell@chromium.org" Date: Mon, 11 Jun 2012 19:29:19 +0000 Subject: Update ChunkDemuxer to allow midstream initialization segments that match the first one. BUG=122913 TEST=ChunkDemuxerTest.TestMultipleHeaders Review URL: https://chromiumcodereview.appspot.com/10535058 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@141460 0039d316-1c4b-4281-b951-d872f2087c98 --- media/webm/webm_stream_parser.cc | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'media/webm') diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc index bd03148..c8ca10e 100644 --- a/media/webm/webm_stream_parser.cc +++ b/media/webm/webm_stream_parser.cc @@ -261,6 +261,7 @@ bool WebMStreamParser::Parse(const uint8* buf, int size) { } void WebMStreamParser::ChangeState(State new_state) { + DVLOG(1) << "ChangeState() : " << state_ << " -> " << new_state; state_ = new_state; } @@ -332,10 +333,16 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { FFmpegConfigHelper config_helper; - if (!config_helper.Parse(data, bytes_parsed)) + if (!config_helper.Parse(data, bytes_parsed)) { + DVLOG(1) << "Failed to parse config data."; return -1; + } - config_cb_.Run(config_helper.audio_config(),config_helper.video_config()); + if (!config_cb_.Run(config_helper.audio_config(), + config_helper.video_config())) { + DVLOG(1) << "New config data isn't allowed."; + return -1; + } // TODO(xhwang): Support decryption of audio (see http://crbug.com/123421). if (tracks_parser.video_encryption_key_id()) { @@ -354,8 +361,11 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { tracks_parser.video_encryption_key_id_size())); ChangeState(kParsingClusters); - init_cb_.Run(true, duration); - init_cb_.Reset(); + + if (!init_cb_.is_null()) { + init_cb_.Run(true, duration); + init_cb_.Reset(); + } return bytes_parsed; } @@ -380,6 +390,11 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) { return result + element_size; } + if (id == kWebMIdEBMLHeader) { + ChangeState(kParsingHeaders); + return 0; + } + int bytes_parsed = cluster_parser_->Parse(data, size); if (bytes_parsed <= 0) -- cgit v1.1