Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / media / formats / webm / webm_stream_parser.cc
index a90a623..384c9cf 100644 (file)
@@ -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,12 @@ void WebMStreamParser::Flush() {
   DCHECK_NE(state_, kWaitingForInit);
 
   byte_queue_.Reset();
-  parsing_cluster_ = false;
-
-  if (state_ != kParsingClusters)
-    return;
-
-  cluster_parser_->Reset();
+  if (cluster_parser_)
+    cluster_parser_->Reset();
+  if (state_ == kParsingClusters) {
+    ChangeState(kParsingHeaders);
+    end_of_segment_cb_.Run();
+  }
 }
 
 bool WebMStreamParser::Parse(const uint8* buf, int size) {
@@ -143,6 +142,9 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) {
     case kWebMIdCRC32:
     case kWebMIdCues:
     case kWebMIdChapters:
+    case kWebMIdTags:
+    case kWebMIdAttachments:
+      // TODO(matthewjheaney): Implement support for chapters.
       if (cur_size < (result + element_size)) {
         // We don't have the whole element yet. Signal we need more data.
         return 0;
@@ -150,6 +152,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)
@@ -230,8 +241,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);
 
@@ -242,57 +251,24 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
   if (!cluster_parser_)
     return -1;
 
-  int id;
-  int64 element_size;
-  int result = WebMParseElementHeader(data, size, &id, &element_size);
-
-  if (result <= 0)
-    return result;
-
-  // TODO(matthewjheaney): implement support for chapters
-  if (id == kWebMIdCues || id == kWebMIdChapters) {
-    // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly.
-    // See http://crbug.com/335676.
-    if (size < (result + element_size)) {
-      // We don't have the whole element yet. Signal we need more data.
-      return 0;
-    }
-    // Skip the element.
-    return result + element_size;
-  }
-
-  if (id == kWebMIdEBMLHeader) {
-    // TODO(wolenetz): Handle unknown-sized cluster parse completion correctly.
-    // See http://crbug.com/335676.
-    ChangeState(kParsingHeaders);
-    return 0;
-  }
-
   int bytes_parsed = cluster_parser_->Parse(data, size);
-
-  if (bytes_parsed <= 0)
+  if (bytes_parsed < 0)
     return bytes_parsed;
 
-  // If cluster detected, immediately notify new segment if we have not already
-  // done this.
-  if (id == kWebMIdCluster && !parsing_cluster_) {
-    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();
 
   bool cluster_ended = cluster_parser_->cluster_ended();
 
-  if ((!audio_buffers.empty() || !video_buffers.empty() || !text_map.empty()) &&
+  if ((!audio_buffers.empty() || !video_buffers.empty() ||
+       !text_map.empty()) &&
       !new_buffers_cb_.Run(audio_buffers, video_buffers, text_map)) {
     return -1;
   }
 
   if (cluster_ended) {
-    parsing_cluster_ = false;
+    ChangeState(kParsingHeaders);
     end_of_segment_cb_.Run();
   }
 
@@ -301,7 +277,7 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
 
 void WebMStreamParser::FireNeedKey(const std::string& key_id) {
   std::vector<uint8> key_id_vector(key_id.begin(), key_id.end());
-  need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector);
+  need_key_cb_.Run(kWebMInitDataType, key_id_vector);
 }
 
 }  // namespace media