| OLD | NEW |
| 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 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1338 | 1338 |
| 1339 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { | 1339 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { |
| 1340 DCHECK(buffers_.empty() || | 1340 DCHECK(buffers_.empty() || |
| 1341 buffers_.back()->GetDecodeTimestamp() <= | 1341 buffers_.back()->GetDecodeTimestamp() <= |
| 1342 new_buffers.front()->GetDecodeTimestamp()); | 1342 new_buffers.front()->GetDecodeTimestamp()); |
| 1343 | 1343 |
| 1344 for (BufferQueue::const_iterator itr = new_buffers.begin(); | 1344 for (BufferQueue::const_iterator itr = new_buffers.begin(); |
| 1345 itr != new_buffers.end(); ++itr) { | 1345 itr != new_buffers.end(); ++itr) { |
| 1346 DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp()); | 1346 DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp()); |
| 1347 buffers_.push_back(*itr); | 1347 buffers_.push_back(*itr); |
| 1348 size_in_bytes_ += (*itr)->GetDataSize(); | 1348 size_in_bytes_ += (*itr)->get_data_size(); |
| 1349 | 1349 |
| 1350 if ((*itr)->IsKeyframe()) { | 1350 if ((*itr)->IsKeyframe()) { |
| 1351 keyframe_map_.insert( | 1351 keyframe_map_.insert( |
| 1352 std::make_pair((*itr)->GetDecodeTimestamp(), | 1352 std::make_pair((*itr)->GetDecodeTimestamp(), |
| 1353 buffers_.size() - 1 + keyframe_map_index_base_)); | 1353 buffers_.size() - 1 + keyframe_map_index_base_)); |
| 1354 } | 1354 } |
| 1355 } | 1355 } |
| 1356 } | 1356 } |
| 1357 | 1357 |
| 1358 void SourceBufferRange::Seek(base::TimeDelta timestamp) { | 1358 void SourceBufferRange::Seek(base::TimeDelta timestamp) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 } | 1428 } |
| 1429 | 1429 |
| 1430 return split_range; | 1430 return split_range; |
| 1431 } | 1431 } |
| 1432 | 1432 |
| 1433 SourceBufferRange::BufferQueue::iterator SourceBufferRange::GetBufferItrAt( | 1433 SourceBufferRange::BufferQueue::iterator SourceBufferRange::GetBufferItrAt( |
| 1434 base::TimeDelta timestamp, bool skip_given_timestamp) { | 1434 base::TimeDelta timestamp, bool skip_given_timestamp) { |
| 1435 // Need to make a dummy buffer with timestamp |timestamp| in order to search | 1435 // Need to make a dummy buffer with timestamp |timestamp| in order to search |
| 1436 // the |buffers_| container. | 1436 // the |buffers_| container. |
| 1437 scoped_refptr<StreamParserBuffer> dummy_buffer = | 1437 scoped_refptr<StreamParserBuffer> dummy_buffer = |
| 1438 StreamParserBuffer::CopyFrom(NULL, 0, false); | 1438 StreamParserBuffer::copy_from(NULL, 0, false); |
| 1439 dummy_buffer->SetDecodeTimestamp(timestamp); | 1439 dummy_buffer->SetDecodeTimestamp(timestamp); |
| 1440 | 1440 |
| 1441 if (skip_given_timestamp) { | 1441 if (skip_given_timestamp) { |
| 1442 return std::upper_bound( | 1442 return std::upper_bound( |
| 1443 buffers_.begin(), buffers_.end(), dummy_buffer, BufferComparator); | 1443 buffers_.begin(), buffers_.end(), dummy_buffer, BufferComparator); |
| 1444 } | 1444 } |
| 1445 return std::lower_bound( | 1445 return std::lower_bound( |
| 1446 buffers_.begin(), buffers_.end(), dummy_buffer, BufferComparator); | 1446 buffers_.begin(), buffers_.end(), dummy_buffer, BufferComparator); |
| 1447 } | 1447 } |
| 1448 | 1448 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1495 | 1495 |
| 1496 // Now we need to delete all the buffers that depend on the keyframe we've | 1496 // Now we need to delete all the buffers that depend on the keyframe we've |
| 1497 // just deleted. | 1497 // just deleted. |
| 1498 int end_index = keyframe_map_.size() > 0 ? | 1498 int end_index = keyframe_map_.size() > 0 ? |
| 1499 keyframe_map_.begin()->second - keyframe_map_index_base_ : | 1499 keyframe_map_.begin()->second - keyframe_map_index_base_ : |
| 1500 buffers_.size(); | 1500 buffers_.size(); |
| 1501 | 1501 |
| 1502 // Delete buffers from the beginning of the buffered range up until (but not | 1502 // Delete buffers from the beginning of the buffered range up until (but not |
| 1503 // including) the next keyframe. | 1503 // including) the next keyframe. |
| 1504 for (int i = 0; i < end_index; i++) { | 1504 for (int i = 0; i < end_index; i++) { |
| 1505 int bytes_deleted = buffers_.front()->GetDataSize(); | 1505 int bytes_deleted = buffers_.front()->get_data_size(); |
| 1506 size_in_bytes_ -= bytes_deleted; | 1506 size_in_bytes_ -= bytes_deleted; |
| 1507 total_bytes_deleted += bytes_deleted; | 1507 total_bytes_deleted += bytes_deleted; |
| 1508 deleted_buffers->push_back(buffers_.front()); | 1508 deleted_buffers->push_back(buffers_.front()); |
| 1509 buffers_.pop_front(); | 1509 buffers_.pop_front(); |
| 1510 ++buffers_deleted; | 1510 ++buffers_deleted; |
| 1511 } | 1511 } |
| 1512 | 1512 |
| 1513 // Update |keyframe_map_index_base_| to account for the deleted buffers. | 1513 // Update |keyframe_map_index_base_| to account for the deleted buffers. |
| 1514 keyframe_map_index_base_ += buffers_deleted; | 1514 keyframe_map_index_base_ += buffers_deleted; |
| 1515 | 1515 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1535 DCHECK_GT(keyframe_map_.size(), 0u); | 1535 DCHECK_GT(keyframe_map_.size(), 0u); |
| 1536 --back; | 1536 --back; |
| 1537 | 1537 |
| 1538 // The index of the first buffer in the last GOP is equal to the new size of | 1538 // The index of the first buffer in the last GOP is equal to the new size of |
| 1539 // |buffers_| after that GOP is deleted. | 1539 // |buffers_| after that GOP is deleted. |
| 1540 size_t goal_size = back->second - keyframe_map_index_base_; | 1540 size_t goal_size = back->second - keyframe_map_index_base_; |
| 1541 keyframe_map_.erase(back); | 1541 keyframe_map_.erase(back); |
| 1542 | 1542 |
| 1543 int total_bytes_deleted = 0; | 1543 int total_bytes_deleted = 0; |
| 1544 while (buffers_.size() != goal_size) { | 1544 while (buffers_.size() != goal_size) { |
| 1545 int bytes_deleted = buffers_.back()->GetDataSize(); | 1545 int bytes_deleted = buffers_.back()->get_data_size(); |
| 1546 size_in_bytes_ -= bytes_deleted; | 1546 size_in_bytes_ -= bytes_deleted; |
| 1547 total_bytes_deleted += bytes_deleted; | 1547 total_bytes_deleted += bytes_deleted; |
| 1548 // We're removing buffers from the back, so push each removed buffer to the | 1548 // We're removing buffers from the back, so push each removed buffer to the |
| 1549 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing | 1549 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing |
| 1550 // order. | 1550 // order. |
| 1551 deleted_buffers->push_front(buffers_.back()); | 1551 deleted_buffers->push_front(buffers_.back()); |
| 1552 buffers_.pop_back(); | 1552 buffers_.pop_back(); |
| 1553 } | 1553 } |
| 1554 | 1554 |
| 1555 return total_bytes_deleted; | 1555 return total_bytes_deleted; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1579 KeyframeMap::const_iterator last_gop = keyframe_map_.end(); | 1579 KeyframeMap::const_iterator last_gop = keyframe_map_.end(); |
| 1580 --last_gop; | 1580 --last_gop; |
| 1581 return last_gop->second - keyframe_map_index_base_ <= next_buffer_index_; | 1581 return last_gop->second - keyframe_map_index_base_ <= next_buffer_index_; |
| 1582 } | 1582 } |
| 1583 | 1583 |
| 1584 void SourceBufferRange::FreeBufferRange( | 1584 void SourceBufferRange::FreeBufferRange( |
| 1585 const BufferQueue::iterator& starting_point, | 1585 const BufferQueue::iterator& starting_point, |
| 1586 const BufferQueue::iterator& ending_point) { | 1586 const BufferQueue::iterator& ending_point) { |
| 1587 for (BufferQueue::iterator itr = starting_point; | 1587 for (BufferQueue::iterator itr = starting_point; |
| 1588 itr != ending_point; ++itr) { | 1588 itr != ending_point; ++itr) { |
| 1589 size_in_bytes_ -= (*itr)->GetDataSize(); | 1589 size_in_bytes_ -= (*itr)->get_data_size(); |
| 1590 DCHECK_GE(size_in_bytes_, 0); | 1590 DCHECK_GE(size_in_bytes_, 0); |
| 1591 } | 1591 } |
| 1592 buffers_.erase(starting_point, ending_point); | 1592 buffers_.erase(starting_point, ending_point); |
| 1593 } | 1593 } |
| 1594 | 1594 |
| 1595 void SourceBufferRange::TruncateAt( | 1595 void SourceBufferRange::TruncateAt( |
| 1596 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) { | 1596 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) { |
| 1597 DCHECK(!removed_buffers || removed_buffers->empty()); | 1597 DCHECK(!removed_buffers || removed_buffers->empty()); |
| 1598 | 1598 |
| 1599 // Return if we're not deleting anything. | 1599 // Return if we're not deleting anything. |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 return start_timestamp; | 1722 return start_timestamp; |
| 1723 } | 1723 } |
| 1724 | 1724 |
| 1725 base::TimeDelta SourceBufferRange::GetEndTimestamp() const { | 1725 base::TimeDelta SourceBufferRange::GetEndTimestamp() const { |
| 1726 DCHECK(!buffers_.empty()); | 1726 DCHECK(!buffers_.empty()); |
| 1727 return buffers_.back()->GetDecodeTimestamp(); | 1727 return buffers_.back()->GetDecodeTimestamp(); |
| 1728 } | 1728 } |
| 1729 | 1729 |
| 1730 base::TimeDelta SourceBufferRange::GetBufferedEndTimestamp() const { | 1730 base::TimeDelta SourceBufferRange::GetBufferedEndTimestamp() const { |
| 1731 DCHECK(!buffers_.empty()); | 1731 DCHECK(!buffers_.empty()); |
| 1732 base::TimeDelta duration = buffers_.back()->GetDuration(); | 1732 base::TimeDelta duration = buffers_.back()->get_duration(); |
| 1733 if (duration == kNoTimestamp() || duration == base::TimeDelta()) | 1733 if (duration == kNoTimestamp() || duration == base::TimeDelta()) |
| 1734 duration = GetApproximateDuration(); | 1734 duration = GetApproximateDuration(); |
| 1735 return GetEndTimestamp() + duration; | 1735 return GetEndTimestamp() + duration; |
| 1736 } | 1736 } |
| 1737 | 1737 |
| 1738 base::TimeDelta SourceBufferRange::NextKeyframeTimestamp( | 1738 base::TimeDelta SourceBufferRange::NextKeyframeTimestamp( |
| 1739 base::TimeDelta timestamp) { | 1739 base::TimeDelta timestamp) { |
| 1740 DCHECK(!keyframe_map_.empty()); | 1740 DCHECK(!keyframe_map_.empty()); |
| 1741 | 1741 |
| 1742 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) | 1742 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1769 return ComputeFudgeRoom(GetApproximateDuration()); | 1769 return ComputeFudgeRoom(GetApproximateDuration()); |
| 1770 } | 1770 } |
| 1771 | 1771 |
| 1772 base::TimeDelta SourceBufferRange::GetApproximateDuration() const { | 1772 base::TimeDelta SourceBufferRange::GetApproximateDuration() const { |
| 1773 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run(); | 1773 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run(); |
| 1774 DCHECK(max_interbuffer_distance != kNoTimestamp()); | 1774 DCHECK(max_interbuffer_distance != kNoTimestamp()); |
| 1775 return max_interbuffer_distance; | 1775 return max_interbuffer_distance; |
| 1776 } | 1776 } |
| 1777 | 1777 |
| 1778 } // namespace media | 1778 } // namespace media |
| OLD | NEW |