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

Side by Side Diff: media/filters/source_buffer_stream.cc

Issue 220103002: Fix unit test failures with estimated durations and splice frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix removal of old buffers. Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/source_buffer_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 483
484 PrepareRangesForNextAppend(buffers, &deleted_buffers); 484 PrepareRangesForNextAppend(buffers, &deleted_buffers);
485 485
486 // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise, 486 // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise,
487 // create a new range with |buffers|. 487 // create a new range with |buffers|.
488 if (range_for_next_append_ != ranges_.end()) { 488 if (range_for_next_append_ != ranges_.end()) {
489 (*range_for_next_append_)->AppendBuffersToEnd(buffers); 489 (*range_for_next_append_)->AppendBuffersToEnd(buffers);
490 last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); 490 last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
491 last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe(); 491 last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe();
492 } else { 492 } else {
493 base::TimeDelta new_range_start_time = media_segment_start_time_; 493 base::TimeDelta new_range_start_time = std::min(
494 media_segment_start_time_, buffers.front()->GetDecodeTimestamp());
494 const BufferQueue* buffers_for_new_range = &buffers; 495 const BufferQueue* buffers_for_new_range = &buffers;
495 BufferQueue trimmed_buffers; 496 BufferQueue trimmed_buffers;
496 497
497 // If the new range is not being created because of a new media 498 // If the new range is not being created because of a new media
498 // segment, then we must make sure that we start with a keyframe. 499 // segment, then we must make sure that we start with a keyframe.
499 // This can happen if the GOP in the previous append gets destroyed 500 // This can happen if the GOP in the previous append gets destroyed
500 // by a Remove() call. 501 // by a Remove() call.
501 if (!new_media_segment_ && !buffers.front()->IsKeyframe()) { 502 if (!new_media_segment_ && !buffers.front()->IsKeyframe()) {
502 BufferQueue::const_iterator itr = buffers.begin(); 503 BufferQueue::const_iterator itr = buffers.begin();
503 504
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 if (prev_timestamp != kNoTimestamp() && prev_timestamp != next_timestamp) { 982 if (prev_timestamp != kNoTimestamp() && prev_timestamp != next_timestamp) {
982 // Clean up the old buffers between the last appended buffer and the 983 // Clean up the old buffers between the last appended buffer and the
983 // beginning of |new_buffers|. 984 // beginning of |new_buffers|.
984 RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers); 985 RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers);
985 } 986 }
986 987
987 // Make the delete range exclusive if we are dealing with an allowed same 988 // Make the delete range exclusive if we are dealing with an allowed same
988 // timestamp situation. This prevents the first buffer in the current append 989 // timestamp situation. This prevents the first buffer in the current append
989 // from deleting the last buffer in the previous append if both buffers 990 // from deleting the last buffer in the previous append if both buffers
990 // have the same timestamp. 991 // have the same timestamp.
991 bool is_exclusive = (prev_timestamp == next_timestamp) && 992 //
993 // The delete range should never be exclusive if a splice frame was generated
994 // because we don't generate splice frames for same timestamp situations.
995 DCHECK(new_buffers.front()->splice_timestamp() !=
996 new_buffers.front()->timestamp());
997 const bool is_exclusive =
998 new_buffers.front()->get_splice_buffers().empty() &&
999 prev_timestamp == next_timestamp &&
992 AllowSameTimestamp(prev_is_keyframe, next_is_keyframe, GetType()); 1000 AllowSameTimestamp(prev_is_keyframe, next_is_keyframe, GetType());
993 1001
994 // Delete the buffers that |new_buffers| overlaps. 1002 // Delete the buffers that |new_buffers| overlaps.
995 base::TimeDelta start = new_buffers.front()->GetDecodeTimestamp(); 1003 base::TimeDelta start = new_buffers.front()->GetDecodeTimestamp();
996 base::TimeDelta end = new_buffers.back()->GetDecodeTimestamp(); 1004 base::TimeDelta end = new_buffers.back()->GetDecodeTimestamp();
997 base::TimeDelta duration = new_buffers.back()->duration(); 1005 base::TimeDelta duration = new_buffers.back()->duration();
998 1006
999 if (duration != kNoTimestamp() && duration > base::TimeDelta()) { 1007 if (duration != kNoTimestamp() && duration > base::TimeDelta()) {
1000 end += duration; 1008 end += duration;
1001 } else { 1009 } else {
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 interbuffer_distance_cb_(interbuffer_distance_cb), 1678 interbuffer_distance_cb_(interbuffer_distance_cb),
1671 size_in_bytes_(0) { 1679 size_in_bytes_(0) {
1672 DCHECK(!new_buffers.empty()); 1680 DCHECK(!new_buffers.empty());
1673 DCHECK(new_buffers.front()->IsKeyframe()); 1681 DCHECK(new_buffers.front()->IsKeyframe());
1674 DCHECK(!interbuffer_distance_cb.is_null()); 1682 DCHECK(!interbuffer_distance_cb.is_null());
1675 AppendBuffersToEnd(new_buffers); 1683 AppendBuffersToEnd(new_buffers);
1676 } 1684 }
1677 1685
1678 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { 1686 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) {
1679 DCHECK(buffers_.empty() || CanAppendBuffersToEnd(new_buffers)); 1687 DCHECK(buffers_.empty() || CanAppendBuffersToEnd(new_buffers));
1688 DCHECK(media_segment_start_time_ == kNoTimestamp() ||
1689 media_segment_start_time_ <=
1690 new_buffers.front()->GetDecodeTimestamp());
1680 for (BufferQueue::const_iterator itr = new_buffers.begin(); 1691 for (BufferQueue::const_iterator itr = new_buffers.begin();
1681 itr != new_buffers.end(); ++itr) { 1692 itr != new_buffers.end();
1693 ++itr) {
1682 DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp()); 1694 DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp());
1683 buffers_.push_back(*itr); 1695 buffers_.push_back(*itr);
1684 size_in_bytes_ += (*itr)->data_size(); 1696 size_in_bytes_ += (*itr)->data_size();
1685 1697
1686 if ((*itr)->IsKeyframe()) { 1698 if ((*itr)->IsKeyframe()) {
1687 keyframe_map_.insert( 1699 keyframe_map_.insert(
1688 std::make_pair((*itr)->GetDecodeTimestamp(), 1700 std::make_pair((*itr)->GetDecodeTimestamp(),
1689 buffers_.size() - 1 + keyframe_map_index_base_)); 1701 buffers_.size() - 1 + keyframe_map_index_base_));
1690 } 1702 }
1691 } 1703 }
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
2180 if (buffer->end_of_stream() || buffer->timestamp() >= end) 2192 if (buffer->end_of_stream() || buffer->timestamp() >= end)
2181 break; 2193 break;
2182 if (buffer->timestamp() + buffer->duration() <= start) 2194 if (buffer->timestamp() + buffer->duration() <= start)
2183 continue; 2195 continue;
2184 buffers->push_back(buffer); 2196 buffers->push_back(buffer);
2185 } 2197 }
2186 return previous_size < buffers->size(); 2198 return previous_size < buffers->size();
2187 } 2199 }
2188 2200
2189 } // namespace media 2201 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/pipeline_integration_test.cc ('k') | media/filters/source_buffer_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698