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

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

Issue 346613003: Fix WebMStreamParser to handle Cues between Clusters correctly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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
Index: media/formats/webm/webm_stream_parser.cc
diff --git a/media/formats/webm/webm_stream_parser.cc b/media/formats/webm/webm_stream_parser.cc
index 3f370daa8000f24f7ed266537a3d5cb2cbfbbc89..ecc64017107c398582c40b03a2e7d3d09a6b7154 100644
--- a/media/formats/webm/webm_stream_parser.cc
+++ b/media/formats/webm/webm_stream_parser.cc
@@ -20,8 +20,7 @@ namespace media {
WebMStreamParser::WebMStreamParser()
: state_(kWaitingForInit),
- unknown_segment_size_(false),
- parsing_cluster_(false) {
+ unknown_segment_size_(false) {
}
WebMStreamParser::~WebMStreamParser() {
@@ -59,12 +58,11 @@ void WebMStreamParser::Flush() {
DCHECK_NE(state_, kWaitingForInit);
byte_queue_.Reset();
- parsing_cluster_ = false;
-
- if (state_ != kParsingClusters)
- return;
-
cluster_parser_->Reset();
wolenetz 2014/06/18 22:47:53 cluster_parser_ may still be null prior to complet
Sergey Ulanov 2014/06/18 23:26:50 Done.
+ if (state_ == kParsingClusters) {
+ ChangeState(kParsingHeaders);
+ end_of_segment_cb_.Run();
+ }
}
bool WebMStreamParser::Parse(const uint8* buf, int size) {
@@ -151,6 +149,15 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) {
// Skip the element.
return result + element_size;
break;
+ case kWebMIdCluster:
+ if (!cluster_parser_) {
+ MEDIA_LOG(log_cb_) << "Found Cluster element before Info.";
+ return -1;
+ }
+ ChangeState(kParsingClusters);
+ new_segment_cb_.Run();
+ return 0;
+ break;
case kWebMIdSegment:
// Segment of unknown size indicates live stream.
if (element_size == kWebMUnknownSize)
@@ -231,8 +238,6 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) {
tracks_parser.video_encryption_key_id(),
log_cb_));
- ChangeState(kParsingClusters);
-
if (!init_cb_.is_null())
base::ResetAndReturn(&init_cb_).Run(true, params);
@@ -243,70 +248,28 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
if (!cluster_parser_)
return -1;
- int result = 0;
- int bytes_parsed;
- bool cluster_ended;
- do {
- cluster_ended = false;
-
- // If we are not parsing a cluster then handle the case when the next
- // element is not a cluster.
- if (!parsing_cluster_) {
- int id;
- int64 element_size;
- bytes_parsed = WebMParseElementHeader(data, size, &id, &element_size);
-
- if (bytes_parsed < 0)
- return bytes_parsed;
-
- if (bytes_parsed == 0)
- return result;
-
- if (id != kWebMIdCluster) {
- ChangeState(kParsingHeaders);
- return result;
- }
- }
-
- bytes_parsed = cluster_parser_->Parse(data, size);
-
- if (bytes_parsed < 0)
- return bytes_parsed;
+ int bytes_parsed = cluster_parser_->Parse(data, size);
+ if (bytes_parsed < 0)
+ return bytes_parsed;
- // If cluster detected, immediately notify new segment if we have not
- // already done this.
- if (!parsing_cluster_ && bytes_parsed > 0) {
- parsing_cluster_ = true;
- new_segment_cb_.Run();
- }
-
- const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers();
- const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers();
- const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers();
-
- cluster_ended = cluster_parser_->cluster_ended();
-
- if ((!audio_buffers.empty() || !video_buffers.empty() ||
- !text_map.empty()) &&
- !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) {
- return -1;
- }
+ const BufferQueue& audio_buffers = cluster_parser_->GetAudioBuffers();
+ const BufferQueue& video_buffers = cluster_parser_->GetVideoBuffers();
+ const TextBufferQueueMap& text_map = cluster_parser_->GetTextBuffers();
- if (cluster_ended) {
- parsing_cluster_ = false;
- end_of_segment_cb_.Run();
- }
+ bool cluster_ended = cluster_parser_->cluster_ended();
- result += bytes_parsed;
- data += bytes_parsed;
- size -= bytes_parsed;
+ if ((!audio_buffers.empty() || !video_buffers.empty() ||
+ !text_map.empty()) &&
+ !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) {
+ return -1;
+ }
- // WebMClusterParser returns 0 and |cluster_ended| is true if previously
- // parsing an unknown-size cluster and |data| does not continue that
- // cluster. Try parsing again in that case.
- } while (size > 0 && (bytes_parsed > 0 || cluster_ended));
+ if (cluster_ended) {
+ ChangeState(kParsingHeaders);
+ end_of_segment_cb_.Run();
+ }
- return result;
+ return bytes_parsed;
}
void WebMStreamParser::FireNeedKey(const std::string& key_id) {
« media/filters/chunk_demuxer_unittest.cc ('K') | « media/formats/webm/webm_stream_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698