summaryrefslogtreecommitdiffstats
path: root/media/webm
diff options
context:
space:
mode:
Diffstat (limited to 'media/webm')
-rw-r--r--media/webm/webm_cluster_parser.cc59
-rw-r--r--media/webm/webm_cluster_parser.h10
2 files changed, 58 insertions, 11 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
index 6cbd71d..5b18c56 100644
--- a/media/webm/webm_cluster_parser.cc
+++ b/media/webm/webm_cluster_parser.cc
@@ -230,38 +230,77 @@ bool WebMClusterParser::Track::AddBuffer(
return false;
}
- if (delayed_buffer_) {
+ if (!delayed_buffers_.empty()) {
// Update the duration of the delayed buffer and place it into the queue.
+ scoped_refptr<StreamParserBuffer> delayed_buffer = delayed_buffers_.front();
+
+ // If we get another buffer with the same timestamp, put it in the delay
+ // queue.
+ if (buffer->GetTimestamp() == delayed_buffer->GetTimestamp()) {
+ delayed_buffers_.push_back(buffer);
+
+ // If this buffer happens to have a duration, use it to set the
+ // duration on all the other buffers in the queue.
+ if (buffer->GetDuration() != kNoTimestamp())
+ SetDelayedBufferDurations(buffer->GetDuration());
+
+ return true;
+ }
+
base::TimeDelta new_duration =
- buffer->GetTimestamp() - delayed_buffer_->GetTimestamp();
+ buffer->GetTimestamp() - delayed_buffer->GetTimestamp();
- if (new_duration <= base::TimeDelta())
+ if (new_duration < base::TimeDelta()) {
+ DVLOG(1) << "Detected out of order timestamps.";
return false;
+ }
- delayed_buffer_->SetDuration(new_duration);
- buffers_.push_back(delayed_buffer_);
-
- delayed_buffer_ = NULL;
+ SetDelayedBufferDurations(new_duration);
}
// Place the buffer in delayed buffer slot if we don't know
// its duration.
if (buffer->GetDuration() == kNoTimestamp()) {
- delayed_buffer_ = buffer;
+ delayed_buffers_.push_back(buffer);
return true;
}
- buffers_.push_back(buffer);
+ AddToBufferQueue(buffer);
return true;
}
void WebMClusterParser::Track::Reset() {
buffers_.clear();
- delayed_buffer_ = NULL;
+ delayed_buffers_.clear();
}
void WebMClusterParser::Track::ClearBufferQueue() {
buffers_.clear();
}
+void WebMClusterParser::Track::SetDelayedBufferDurations(
+ base::TimeDelta duration) {
+
+ for (BufferQueue::iterator itr = delayed_buffers_.begin();
+ itr < delayed_buffers_.end(); ++itr) {
+ (*itr)->SetDuration(duration);
+
+ AddToBufferQueue(*itr);
+ }
+ delayed_buffers_.clear();
+}
+
+void WebMClusterParser::Track::AddToBufferQueue(
+ const scoped_refptr<StreamParserBuffer>& buffer) {
+ DCHECK(buffer->GetDuration() > base::TimeDelta());
+
+ DVLOG(2) << "AddToBufferQueue() : " << track_num_
+ << " ts " << buffer->GetTimestamp().InSecondsF()
+ << " dur " << buffer->GetDuration().InSecondsF()
+ << " kf " << buffer->IsKeyframe()
+ << " size " << buffer->GetDataSize();
+
+ buffers_.push_back(buffer);
+}
+
} // namespace media
diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h
index 159fd38..c702d10 100644
--- a/media/webm/webm_cluster_parser.h
+++ b/media/webm/webm_cluster_parser.h
@@ -58,9 +58,17 @@ class MEDIA_EXPORT WebMClusterParser : public WebMParserClient {
void ClearBufferQueue();
private:
+ // Sets the duration of all the buffers in |delayed_buffers_|
+ // and then moves these buffers into |buffers_|. |delayed_buffers_|
+ // is empty when this call returns.
+ void SetDelayedBufferDurations(base::TimeDelta duration);
+
+ // Adds the buffer to |buffers_|. |buffer| must have its duration set.
+ void AddToBufferQueue(const scoped_refptr<StreamParserBuffer>& buffer);
+
int track_num_;
BufferQueue buffers_;
- scoped_refptr<StreamParserBuffer> delayed_buffer_;
+ BufferQueue delayed_buffers_;
};
// WebMParserClient methods.