15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/source_buffer_stream.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "media/base/audio_splicer.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/filters/source_buffer_platform.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/filters/source_buffer_range.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper method that returns true if |ranges| is sorted in increasing order, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false otherwise. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsRangeListSorted( 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::list<media::SourceBufferRange*>& ranges) { 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp prev = kNoDecodeTimestamp(); 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (std::list<SourceBufferRange*>::const_iterator itr = 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.begin(); itr != ranges.end(); ++itr) { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (prev != kNoDecodeTimestamp() && prev >= (*itr)->GetStartTimestamp()) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev = (*itr)->GetEndTimestamp(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an estimate of how far from the beginning or end of a range a buffer 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be to still be considered in the range, given the |approximate_duration| 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a buffer in the stream. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(wolenetz): Once all stream parsers emit accurate frame durations, use 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// logic like FrameProcessor (2*last_frame_duration + last_decode_timestamp) 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// instead of an overall maximum interbuffer delta for range discontinuity 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// detection, and adjust similarly for splice frame discontinuity detection. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// See http://crbug.com/351489 and http://crbug.com/351166. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::TimeDelta ComputeFudgeRoom(base::TimeDelta approximate_duration) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we do not know exactly when is the next timestamp, any buffer 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that starts within 2x the approximate duration of a buffer is considered 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // within this range. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 * approximate_duration; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An arbitrarily-chosen number to estimate the duration of a buffer if none 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is set and there's not enough information to get a better estimate. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kDefaultBufferDurationInMs = 125; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The amount of time the beginning of the buffered data can differ from the 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// start time in order to still be considered the start of stream. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::TimeDelta kSeekToStartFudgeRoom() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(1000); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic SourceBufferRange::GapPolicy TypeToGapPolicy( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SourceBufferStream::Type type) { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (type) { 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case SourceBufferStream::kAudio: 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case SourceBufferStream::kVideo: 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SourceBufferRange::NO_GAPS_ALLOWED; 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case SourceBufferStream::kText: 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SourceBufferRange::ALLOW_GAPS; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SourceBufferRange::NO_GAPS_ALLOWED; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const LogCB& log_cb, 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool splice_frames_enabled) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : log_cb_(log_cb), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_config_index_(0), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_(0), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_pending_(false), 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) end_of_stream_(false), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_buffer_timestamp_(kNoTimestamp()), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_range_(NULL), 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_segment_start_time_(kNoDecodeTimestamp()), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_for_next_append_(ranges_.end()), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_media_segment_(false), 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_appended_buffer_is_keyframe_(false), 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_output_buffer_timestamp_(kNoDecodeTimestamp()), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_interbuffer_distance_(kNoTimestamp()), 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memory_limit_(kSourceBufferAudioMemoryLimit), 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) config_change_pending_(false), 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_buffers_index_(0), 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_(false), 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_frames_enabled_(splice_frames_enabled) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(audio_config.IsValidConfig()); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_configs_.push_back(audio_config); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const LogCB& log_cb, 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool splice_frames_enabled) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : log_cb_(log_cb), 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_config_index_(0), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_(0), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_pending_(false), 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) end_of_stream_(false), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_buffer_timestamp_(kNoTimestamp()), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_range_(NULL), 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_segment_start_time_(kNoDecodeTimestamp()), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_for_next_append_(ranges_.end()), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_media_segment_(false), 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_appended_buffer_is_keyframe_(false), 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_output_buffer_timestamp_(kNoDecodeTimestamp()), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_interbuffer_distance_(kNoTimestamp()), 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memory_limit_(kSourceBufferVideoMemoryLimit), 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) config_change_pending_(false), 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_buffers_index_(0), 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_(false), 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_frames_enabled_(splice_frames_enabled) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(video_config.IsValidConfig()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_configs_.push_back(video_config); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const LogCB& log_cb, 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool splice_frames_enabled) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : log_cb_(log_cb), 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_config_index_(0), 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) append_config_index_(0), 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) text_track_config_(text_config), 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) seek_pending_(false), 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) end_of_stream_(false), 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) seek_buffer_timestamp_(kNoTimestamp()), 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) selected_range_(NULL), 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_segment_start_time_(kNoDecodeTimestamp()), 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) range_for_next_append_(ranges_.end()), 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_media_segment_(false), 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) last_appended_buffer_is_keyframe_(false), 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_output_buffer_timestamp_(kNoDecodeTimestamp()), 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) max_interbuffer_distance_(kNoTimestamp()), 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch memory_limit_(kSourceBufferAudioMemoryLimit), 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) config_change_pending_(false), 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_buffers_index_(0), 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_(false), 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_frames_enabled_(splice_frames_enabled) {} 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::~SourceBufferStream() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!ranges_.empty()) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete ranges_.front(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.pop_front(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::OnNewMediaSegment( 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp media_segment_start_time) { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DVLOG(1) << __FUNCTION__ << "(" << media_segment_start_time.InSecondsF() 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << ")"; 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!end_of_stream_); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media_segment_start_time_ = media_segment_start_time; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_media_segment_ = true; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator last_range = range_for_next_append_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_for_next_append_ = FindExistingRangeFor(media_segment_start_time); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only reset |last_appended_buffer_timestamp_| if this new media segment is 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not adjacent to the previous media segment appended to the stream. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (range_for_next_append_ == ranges_.end() || 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !AreAdjacentInSequence(last_appended_buffer_timestamp_, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_segment_start_time)) { 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_appended_buffer_is_keyframe_ = false; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range"; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (last_range != ranges_.end()) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(last_range == range_for_next_append_); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DVLOG(3) << __FUNCTION__ << " next appended buffers will continue range " 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "unless intervening remove makes discontinuity"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SourceBufferStream::Append(const BufferQueue& buffers) { 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT2("media", "SourceBufferStream::Append", 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "stream type", GetStreamTypeName(), 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "buffers to append", buffers.size()); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!buffers.empty()); 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(media_segment_start_time_ != kNoDecodeTimestamp()); 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!end_of_stream_); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // New media segments must begin with a keyframe. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_media_segment_ && !buffers.front()->IsKeyframe()) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Media segment did not begin with keyframe."; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Buffers within a media segment should be monotonically increasing. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsMonotonicallyIncreasing(buffers)) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (media_segment_start_time_ < DecodeTimestamp() || 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Cannot append a media segment with negative timestamps."; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(), 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) buffers.front()->IsKeyframe())) { 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MEDIA_LOG(log_cb_) << "Invalid same timestamp construct detected at time " 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << buffers.front()->GetDecodeTimestamp().InSecondsF(); 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMaxInterbufferDistance(buffers); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetConfigIds(buffers); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save a snapshot of stream state before range modifications are made. 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferQueue deleted_buffers; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrepareRangesForNextAppend(buffers, &deleted_buffers); 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create a new range with |buffers|. 2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (range_for_next_append_ != ranges_.end()) { 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (*range_for_next_append_)->AppendBuffersToEnd(buffers); 2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp new_range_start_time = std::min( 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch media_segment_start_time_, buffers.front()->GetDecodeTimestamp()); 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const BufferQueue* buffers_for_new_range = &buffers; 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) BufferQueue trimmed_buffers; 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If the new range is not being created because of a new media 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // segment, then we must make sure that we start with a keyframe. 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This can happen if the GOP in the previous append gets destroyed 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // by a Remove() call. 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!new_media_segment_) { 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) BufferQueue::const_iterator itr = buffers.begin(); 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Scan past all the non-keyframes. 2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) while (itr != buffers.end() && !(*itr)->IsKeyframe()) { 2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ++itr; 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If we didn't find a keyframe, then update the last appended 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // buffer state and return. 2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (itr == buffers.end()) { 2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); 2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe(); 2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return true; 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (itr != buffers.begin()) { 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Copy the first keyframe and everything after it into 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |trimmed_buffers|. 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) trimmed_buffers.assign(itr, buffers.end()); 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) buffers_for_new_range = &trimmed_buffers; 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new_range_start_time = 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) buffers_for_new_range->front()->GetDecodeTimestamp(); 2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) range_for_next_append_ = 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddToRanges(new SourceBufferRange( 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TypeToGapPolicy(GetType()), 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *buffers_for_new_range, new_range_start_time, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SourceBufferStream::GetMaxInterbufferDistance, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_timestamp_ = 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) buffers_for_new_range->back()->GetDecodeTimestamp(); 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_is_keyframe_ = 2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) buffers_for_new_range->back()->IsKeyframe(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_media_segment_ = false; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) MergeWithAdjacentRangeIfNecessary(range_for_next_append_); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seek to try to fulfill a previous call to Seek(). 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (seek_pending_) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!selected_range_); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(deleted_buffers.empty()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Seek(seek_buffer_timestamp_); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!deleted_buffers.empty()) { 2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start_of_deleted = 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) deleted_buffers.front()->GetDecodeTimestamp(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(track_buffer_.empty() || 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_buffer_.back()->GetDecodeTimestamp() < start_of_deleted) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "decode timestamp " 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << track_buffer_.back()->GetDecodeTimestamp().InSecondsF() << " sec" 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", start_of_deleted " << start_of_deleted.InSecondsF()<< " sec"; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_buffer_.insert(track_buffer_.end(), deleted_buffers.begin(), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) deleted_buffers.end()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prune any extra buffers in |track_buffer_| if new keyframes 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are appended to the range covered by |track_buffer_|. 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!track_buffer_.empty()) { 3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp keyframe_timestamp = 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp()); 3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (keyframe_timestamp != kNoDecodeTimestamp()) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PruneTrackBuffer(keyframe_timestamp); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSelectedRangeIfNeeded(next_buffer_timestamp); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GarbageCollectIfNeeded(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(IsRangeListSorted(ranges_)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(OnlySelectedRangeIsSeeked()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, 322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::TimeDelta duration) { 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << ", " << end.InSecondsF() 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << ", " << duration.InSecondsF() << ")"; 326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(start >= base::TimeDelta()) << start.InSecondsF(); 327bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(start < end) << "start " << start.InSecondsF() 328bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch << " end " << end.InSecondsF(); 329bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(duration != kNoTimestamp()); 330bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start_dts = DecodeTimestamp::FromPresentationTime(start); 3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp end_dts = DecodeTimestamp::FromPresentationTime(end); 3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp remove_end_timestamp = 3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp::FromPresentationTime(duration); 3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp keyframe_timestamp = FindKeyframeAfterTimestamp(end_dts); 3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (keyframe_timestamp != kNoDecodeTimestamp()) { 337bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch remove_end_timestamp = keyframe_timestamp; 3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else if (end_dts < remove_end_timestamp) { 3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remove_end_timestamp = end_dts; 340bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 341bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) BufferQueue deleted_buffers; 3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RemoveInternal(start_dts, remove_end_timestamp, false, &deleted_buffers); 3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!deleted_buffers.empty()) 3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp()); 3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SourceBufferStream::RemoveInternal( 3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start, DecodeTimestamp end, bool is_exclusive, 3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) BufferQueue* deleted_buffers) { 3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() 3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << ", " << end.InSecondsF() 3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << ", " << is_exclusive << ")"; 3551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(start >= DecodeTimestamp()); 3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(start < end) << "start " << start.InSecondsF() 3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << " end " << end.InSecondsF(); 3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(deleted_buffers); 3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 361bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch RangeList::iterator itr = ranges_.begin(); 362bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 363bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch while (itr != ranges_.end()) { 364bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SourceBufferRange* range = *itr; 3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (range->GetStartTimestamp() >= end) 366bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch break; 367bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 368bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Split off any remaining end piece and add it to |ranges_|. 3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SourceBufferRange* new_range = range->SplitRange(end, is_exclusive); 370bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (new_range) { 371bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch itr = ranges_.insert(++itr, new_range); 372bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch --itr; 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Update the selected range if the next buffer position was transferred 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to |new_range|. 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (new_range->HasNextBufferPosition()) 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetSelectedRange(new_range); 378bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 379bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 380bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Truncate the current range so that it only contains data before 381bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // the removal range. 382bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch BufferQueue saved_buffers; 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool delete_range = range->TruncateAt(start, &saved_buffers, is_exclusive); 384bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 385bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Check to see if the current playback position was removed and 386bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // update the selected range appropriately. 387bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!saved_buffers.empty()) { 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!range->HasNextBufferPosition()); 3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(deleted_buffers->empty()); 3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *deleted_buffers = saved_buffers; 3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (range == selected_range_ && !range->HasNextBufferPosition()) 395bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch SetSelectedRange(NULL); 3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If the current range now is completely covered by the removal 3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // range then delete it and move on. 3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (delete_range) { 4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DeleteAndRemoveRange(&itr); 4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) continue; 4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Clear |range_for_next_append_| if we determine that the removal 4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // operation makes it impossible for the next append to be added 4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // to the current range. 4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (range_for_next_append_ != ranges_.end() && 4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) *range_for_next_append_ == range && 4096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) { 4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp potential_next_append_timestamp = 4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) last_appended_buffer_timestamp_ + 4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::TimeDelta::FromInternalValue(1); 4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!range->BelongsToRange(potential_next_append_timestamp)) { 4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << "Resetting range_for_next_append_ since the next append" 4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << " can't add to the current range."; 4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) range_for_next_append_ = 4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FindExistingRangeFor(potential_next_append_timestamp); 4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 420bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 421bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 422bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Move on to the next range. 423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ++itr; 424bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(IsRangeListSorted(ranges_)); 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(OnlySelectedRangeIsSeeked()); 4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : done"; 429bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 430bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::ResetSeekState() { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSelectedRange(NULL); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_buffer_.clear(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_change_pending_ = false; 4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_output_buffer_timestamp_ = kNoDecodeTimestamp(); 436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_buffers_index_ = 0; 43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffer_ = NULL; 43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_ = false; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::ShouldSeekToStartOfBuffered( 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta seek_timestamp) const { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ranges_.empty()) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta beginning_of_buffered = 4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ranges_.front()->GetStartTimestamp().ToPresentationTime(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (seek_timestamp <= beginning_of_buffered && 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) beginning_of_buffered < kSeekToStartFudgeRoom()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsMonotonicallyIncreasing( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BufferQueue& buffers) const { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!buffers.empty()); 4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool prev_is_keyframe = last_appended_buffer_is_keyframe_; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BufferQueue::const_iterator itr = buffers.begin(); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr != buffers.end(); ++itr) { 4586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp(); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool current_is_keyframe = (*itr)->IsKeyframe(); 4606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(current_timestamp != kNoDecodeTimestamp()); 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK((*itr)->duration() >= base::TimeDelta()) 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << "Packet with invalid duration." 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " pts " << (*itr)->timestamp().InSecondsF() 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF() 465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << " dur " << (*itr)->duration().InSecondsF(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (prev_timestamp != kNoDecodeTimestamp()) { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_timestamp < prev_timestamp) { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Buffers were not monotonically increasing."; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_timestamp == prev_timestamp && 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !SourceBufferRange::AllowSameTimestamp(prev_is_keyframe, 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_is_keyframe)) { 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Unexpected combination of buffers with the" 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << " same timestamp detected at " 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << current_timestamp.InSecondsF(); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_timestamp = current_timestamp; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prev_is_keyframe = current_is_keyframe; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SourceBufferStream::IsNextTimestampValid( 4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp next_timestamp, bool next_is_keyframe) const { 4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return (last_appended_buffer_timestamp_ != next_timestamp) || 4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new_media_segment_ || 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SourceBufferRange::AllowSameTimestamp(last_appended_buffer_is_keyframe_, 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next_is_keyframe); 4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::OnlySelectedRangeIsSeeked() const { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RangeList::const_iterator itr = ranges_.begin(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr != ranges_.end(); ++itr) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !selected_range_ || selected_range_->HasNextBufferPosition(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::UpdateMaxInterbufferDistance( 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BufferQueue& buffers) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!buffers.empty()); 5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BufferQueue::const_iterator itr = buffers.begin(); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr != buffers.end(); ++itr) { 5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp(); 5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(current_timestamp != kNoDecodeTimestamp()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta interbuffer_distance = (*itr)->duration(); 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(interbuffer_distance >= base::TimeDelta()); 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (prev_timestamp != kNoDecodeTimestamp()) { 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci interbuffer_distance = 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::max(current_timestamp - prev_timestamp, interbuffer_distance); 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (interbuffer_distance > base::TimeDelta()) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_interbuffer_distance_ == kNoTimestamp()) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_interbuffer_distance_ = interbuffer_distance; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) max_interbuffer_distance_ = 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(max_interbuffer_distance_, interbuffer_distance); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_timestamp = current_timestamp; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (BufferQueue::const_iterator itr = buffers.begin(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr != buffers.end(); ++itr) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*itr)->SetConfigId(append_config_index_); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::GarbageCollectIfNeeded() { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute size of |ranges_|. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ranges_size = 0; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_size += (*itr)->size_in_bytes(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return if we're under or at the memory limit. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ranges_size <= memory_limit_) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_to_free = ranges_size - memory_limit_; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Begin deleting after the last appended buffer. 55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free); 55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begin deleting from the front. 55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (bytes_to_free - bytes_freed > 0) 56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begin deleting from the back. 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bytes_to_free - bytes_freed > 0) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeBuffers(bytes_to_free - bytes_freed, true); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { 5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); 5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() || 5706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) next_buffer_timestamp == kNoDecodeTimestamp() || 57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) last_appended_buffer_timestamp_ >= next_buffer_timestamp) { 57268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return 0; 57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp remove_range_start = last_appended_buffer_timestamp_; 57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (last_appended_buffer_is_keyframe_) 57768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) remove_range_start += GetMaxInterbufferDistance(); 57868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp remove_range_start_keyframe = FindKeyframeAfterTimestamp( 58068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) remove_range_start); 5816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (remove_range_start_keyframe != kNoDecodeTimestamp()) 58268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) remove_range_start = remove_range_start_keyframe; 58368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (remove_range_start >= next_buffer_timestamp) 58468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return 0; 58568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp remove_range_end; 58768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int bytes_freed = GetRemovalRange( 58868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) remove_range_start, next_buffer_timestamp, total_bytes_to_free, 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &remove_range_end); 5906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (bytes_freed > 0) { 5916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Remove(remove_range_start.ToPresentationTime(), 5926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remove_range_end.ToPresentationTime(), 5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) next_buffer_timestamp.ToPresentationTime()); 5946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 5956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 59668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return bytes_freed; 59768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 59868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 59968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int SourceBufferStream::GetRemovalRange( 6006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp, 6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) { 6026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(start_timestamp >= DecodeTimestamp()) << start_timestamp.InSecondsF(); 60368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(start_timestamp < end_timestamp) 60468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "start " << start_timestamp.InSecondsF() 60568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << ", end " << end_timestamp.InSecondsF(); 60668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 60768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int bytes_to_free = total_bytes_to_free; 60868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int bytes_freed = 0; 60968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 61068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (RangeList::iterator itr = ranges_.begin(); 61168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) itr != ranges_.end() && bytes_to_free > 0; ++itr) { 61268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SourceBufferRange* range = *itr; 61368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (range->GetStartTimestamp() >= end_timestamp) 61468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 61568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (range->GetEndTimestamp() < start_timestamp) 61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) continue; 61768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 61868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int bytes_removed = range->GetRemovalGOP( 61968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) start_timestamp, end_timestamp, bytes_to_free, removal_end_timestamp); 62068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bytes_to_free -= bytes_removed; 62168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bytes_freed += bytes_removed; 62268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 62368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return bytes_freed; 62468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SourceBufferStream::FreeBuffers(int total_bytes_to_free, 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool reverse_direction) { 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers", 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "total bytes to free", total_bytes_to_free, 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "reverse direction", reverse_direction); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(total_bytes_to_free, 0); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_to_free = total_bytes_to_free; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_freed = 0; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This range will save the last GOP appended to |range_for_next_append_| 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the buffers surrounding it get deleted during garbage collection. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceBufferRange* new_range_for_append = NULL; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!ranges_.empty() && bytes_to_free > 0) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceBufferRange* current_range = NULL; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferQueue buffers; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_deleted = 0; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reverse_direction) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_range = ranges_.back(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_range->LastGOPContainsNextBufferPosition()) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(current_range, selected_range_); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_deleted = current_range->DeleteGOPFromBack(&buffers); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_range = ranges_.front(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_range->FirstGOPContainsNextBufferPosition()) { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(current_range, selected_range_); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_deleted = current_range->DeleteGOPFromFront(&buffers); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see if we've just deleted the GOP that was last appended. 6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_timestamp == last_appended_buffer_timestamp_) { 6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!new_range_for_append); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new range containing these buffers. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_range_for_append = new SourceBufferRange( 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TypeToGapPolicy(GetType()), 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffers, kNoDecodeTimestamp(), 6701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&SourceBufferStream::GetMaxInterbufferDistance, 6711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Unretained(this))); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_for_next_append_ = ranges_.end(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_to_free -= bytes_deleted; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_freed += bytes_deleted; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_range->size_in_bytes() == 0) { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(current_range, selected_range_); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(range_for_next_append_ == ranges_.end() || 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *range_for_next_append_ != current_range); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete current_range; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reverse_direction ? ranges_.pop_back() : ranges_.pop_front(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert |new_range_for_append| into |ranges_|, if applicable. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_range_for_append) { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_for_next_append_ = AddToRanges(new_range_for_append); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(range_for_next_append_ != ranges_.end()); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see if we need to merge |new_range_for_append| with the range 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before or after it. |new_range_for_append| is created whenever the last 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GOP appended is encountered, regardless of whether any buffers after it 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are ultimately deleted. Merging is necessary if there were no buffers 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (or very few buffers) deleted after creating |new_range_for_append|. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (range_for_next_append_ != ranges_.begin()) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator range_before_next = range_for_next_append_; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --range_before_next; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MergeWithAdjacentRangeIfNecessary(range_before_next); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MergeWithAdjacentRangeIfNecessary(range_for_next_append_); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bytes_freed; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SourceBufferStream::PrepareRangesForNextAppend( 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BufferQueue& new_buffers, BufferQueue* deleted_buffers) { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(deleted_buffers); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool temporarily_select_range = false; 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!track_buffer_.empty()) { 7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp tb_timestamp = track_buffer_.back()->GetDecodeTimestamp(); 7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp); 7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (seek_timestamp != kNoDecodeTimestamp() && 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seek_timestamp < new_buffers.front()->GetDecodeTimestamp() && 7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) range_for_next_append_ != ranges_.end() && 7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (*range_for_next_append_)->BelongsToRange(seek_timestamp)) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(tb_timestamp < seek_timestamp); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!selected_range_); 7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(!(*range_for_next_append_)->HasNextBufferPosition()); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are GOPs between the end of the track buffer and the 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // beginning of the new buffers, then temporarily seek the range 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so that the buffers between these two times will be deposited in 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |deleted_buffers| as if they were part of the current playback 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // position. 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(acolwell): Figure out a more elegant way to do this. 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SeekAndSetSelectedRange(*range_for_next_append_, seek_timestamp); 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temporarily_select_range = true; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Handle splices between the existing buffers and the new buffers. If a 735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // splice is generated the timestamp and duration of the first buffer in 736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |new_buffers| will be modified. 737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (splice_frames_enabled_) 738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GenerateSpliceFrame(new_buffers); 739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool prev_is_keyframe = last_appended_buffer_is_keyframe_; 7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp next_timestamp = new_buffers.front()->GetDecodeTimestamp(); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool next_is_keyframe = new_buffers.front()->IsKeyframe(); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (prev_timestamp != kNoDecodeTimestamp() && 7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) prev_timestamp != next_timestamp) { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up the old buffers between the last appended buffer and the 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // beginning of |new_buffers|. 7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Make the delete range exclusive if we are dealing with an allowed same 7531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // timestamp situation. This prevents the first buffer in the current append 7541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // from deleting the last buffer in the previous append if both buffers 7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // have the same timestamp. 7560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // 7570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // The delete range should never be exclusive if a splice frame was generated 7580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // because we don't generate splice frames for same timestamp situations. 7590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(new_buffers.front()->splice_timestamp() != 7600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new_buffers.front()->timestamp()); 7610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const bool is_exclusive = 762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new_buffers.front()->splice_buffers().empty() && 7630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch prev_timestamp == next_timestamp && 7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SourceBufferRange::AllowSameTimestamp(prev_is_keyframe, next_is_keyframe); 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Delete the buffers that |new_buffers| overlaps. 7676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start = new_buffers.front()->GetDecodeTimestamp(); 7686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp end = new_buffers.back()->GetDecodeTimestamp(); 7691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::TimeDelta duration = new_buffers.back()->duration(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (duration != kNoTimestamp() && duration > base::TimeDelta()) { 7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) end += duration; 7731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } else { 7741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // TODO(acolwell): Ensure all buffers actually have proper 7751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // duration info so that this hack isn't needed. 7761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // http://crbug.com/312836 7771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) end += base::TimeDelta::FromInternalValue(1); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RemoveInternal(start, end, is_exclusive, deleted_buffers); 7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Restore the range seek state if necessary. 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (temporarily_select_range) 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSelectedRange(NULL); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::AreAdjacentInSequence( 7886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp first_timestamp, DecodeTimestamp second_timestamp) const { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return first_timestamp < second_timestamp && 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_timestamp <= 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SourceBufferStream::PruneTrackBuffer(const DecodeTimestamp timestamp) { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we don't have the next timestamp, we don't have anything to delete. 7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (timestamp == kNoDecodeTimestamp()) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!track_buffer_.empty() && 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) track_buffer_.back()->GetDecodeTimestamp() >= timestamp) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_buffer_.pop_back(); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RangeList::iterator& range_with_new_buffers_itr) { 8078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(range_with_new_buffers_itr != ranges_.end()); 8088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator next_range_itr = range_with_new_buffers_itr; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++next_range_itr; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (next_range_itr == ranges_.end() || 8148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) !range_with_new_buffers->CanAppendRangeToEnd(**next_range_itr)) { 8158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 8168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool transfer_current_position = selected_range_ == *next_range_itr; 8198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) range_with_new_buffers->AppendRangeToEnd(**next_range_itr, 8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) transfer_current_position); 8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Update |selected_range_| pointer if |range| has become selected after 8228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // merges. 8238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (transfer_current_position) 8248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetSelectedRange(range_with_new_buffers); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (next_range_itr == range_for_next_append_) 8278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) range_for_next_append_ = range_with_new_buffers_itr; 8288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DeleteAndRemoveRange(&next_range_itr); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::Seek(base::TimeDelta timestamp) { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(timestamp >= base::TimeDelta()); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSeekState(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldSeekToStartOfBuffered(timestamp)) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.front()->SeekToStart(); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSelectedRange(ranges_.front()); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_pending_ = false; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_buffer_timestamp_ = timestamp; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_pending_ = true; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp seek_dts = DecodeTimestamp::FromPresentationTime(timestamp); 8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator itr = ranges_.end(); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 8506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if ((*itr)->CanSeekTo(seek_dts)) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (itr == ranges_.end()) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SeekAndSetSelectedRange(*itr, seek_dts); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seek_pending_ = false; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsSeekPending() const { 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return !(end_of_stream_ && IsEndSelected()) && seek_pending_; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { 8666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp duration_dts = 8676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp::FromPresentationTime(duration); 8686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator itr = ranges_.end(); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 8716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if ((*itr)->GetEndTimestamp() > duration_dts) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (itr == ranges_.end()) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to partially truncate this range. 8786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if ((*itr)->GetStartTimestamp() < duration_dts) { 8796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool delete_range = (*itr)->TruncateAt(duration_dts, NULL, false); 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if ((*itr == selected_range_) && !selected_range_->HasNextBufferPosition()) 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetSelectedRange(NULL); 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delete_range) { 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteAndRemoveRange(&itr); 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++itr; 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Delete all ranges that begin after |duration_dts|. 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (itr != ranges_.end()) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're about to delete the selected range, also reset the seek state. 8936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK((*itr)->GetStartTimestamp() >= duration_dts); 8948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (*itr == selected_range_) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSeekState(); 8968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DeleteAndRemoveRange(&itr); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::Status SourceBufferStream::GetNextBuffer( 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<StreamParserBuffer>* out_buffer) { 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!pending_buffer_.get()) { 9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SourceBufferStream::Status status = GetNextBufferInternal(out_buffer); 90446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (status != SourceBufferStream::kSuccess || !SetPendingBuffer(out_buffer)) 9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return status; 9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 90846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!pending_buffer_->splice_buffers().empty()) 90946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return HandleNextBufferWithSplice(out_buffer); 91046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(pending_buffer_->preroll_buffer().get()); 91246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return HandleNextBufferWithPreroll(out_buffer); 91346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 91446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 91546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithSplice( 91646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<StreamParserBuffer>* out_buffer) { 91746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BufferQueue& splice_buffers = pending_buffer_->splice_buffers(); 918effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const size_t last_splice_buffer_index = splice_buffers.size() - 1; 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 920effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Are there any splice buffers left to hand out? The last buffer should be 921effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // handed out separately since it represents the first post-splice buffer. 922effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (splice_buffers_index_ < last_splice_buffer_index) { 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Account for config changes which occur between fade out buffers. 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (current_config_index_ != 925effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch splice_buffers[splice_buffers_index_]->GetConfigId()) { 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) config_change_pending_ = true; 927effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DVLOG(1) << "Config change (splice buffer config ID does not match)."; 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SourceBufferStream::kConfigChange; 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 931a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Every pre splice buffer must have the same splice_timestamp(). 93246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(pending_buffer_->splice_timestamp() == 933a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch splice_buffers[splice_buffers_index_]->splice_timestamp()); 934a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 93546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // No pre splice buffers should have preroll. 9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!splice_buffers[splice_buffers_index_]->preroll_buffer().get()); 93746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 938effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *out_buffer = splice_buffers[splice_buffers_index_++]; 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SourceBufferStream::kSuccess; 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 942effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Did we hand out the last pre-splice buffer on the previous call? 94346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!pending_buffers_complete_) { 9445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(splice_buffers_index_, last_splice_buffer_index); 94546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_ = true; 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) config_change_pending_ = true; 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(1) << "Config change (forced for fade in of splice frame)."; 9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SourceBufferStream::kConfigChange; 9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 951effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // All pre-splice buffers have been handed out and a config change completed, 952effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // so hand out the final buffer for fade in. Because a config change is 953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // always issued prior to handing out this buffer, any changes in config id 954effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // have been inherently handled. 95546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(pending_buffers_complete_); 9565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_EQ(splice_buffers_index_, splice_buffers.size() - 1); 957a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK(splice_buffers.back()->splice_timestamp() == kNoTimestamp()); 958effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *out_buffer = splice_buffers.back(); 95946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffer_ = NULL; 96046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 96146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If the last splice buffer has preroll, hand off to the preroll handler. 96246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return SetPendingBuffer(out_buffer) ? HandleNextBufferWithPreroll(out_buffer) 96346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : SourceBufferStream::kSuccess; 96446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 96546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithPreroll( 96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<StreamParserBuffer>* out_buffer) { 96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Any config change should have already been handled. 96946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_EQ(current_config_index_, pending_buffer_->GetConfigId()); 97046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 97146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Check if the preroll buffer has already been handed out. 97246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!pending_buffers_complete_) { 97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_ = true; 97446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *out_buffer = pending_buffer_->preroll_buffer(); 97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return SourceBufferStream::kSuccess; 97646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 97746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 97846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Preroll complete, hand out the final buffer. 97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *out_buffer = pending_buffer_; 98046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffer_ = NULL; 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SourceBufferStream::kSuccess; 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SourceBufferStream::Status SourceBufferStream::GetNextBufferInternal( 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<StreamParserBuffer>* out_buffer) { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!config_change_pending_); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!track_buffer_.empty()) { 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!selected_range_); 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<StreamParserBuffer>& next_buffer = track_buffer_.front(); 9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the next buffer is an audio splice frame, the next effective config id 993effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // comes from the first splice buffer. 9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (next_buffer->GetSpliceBufferConfigId(0) != current_config_index_) { 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_change_pending_ = true; 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Config change (track buffer config ID does not match)."; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kConfigChange; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out_buffer = next_buffer; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_buffer_.pop_front(); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp(); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the track buffer becomes empty, then try to set the selected range 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // based on the timestamp of this buffer being returned. 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (track_buffer_.empty()) 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSelectedRangeIfNeeded(last_output_buffer_timestamp_); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kSuccess; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!selected_range_ || !selected_range_->HasNextBuffer()) { 10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (end_of_stream_ && IsEndSelected()) 10147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return kEndOfStream; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kNeedBuffer; 10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_range_->GetNextConfigId() != current_config_index_) { 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_change_pending_ = true; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "Config change (selected range config ID does not match)."; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kConfigChange; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(selected_range_->GetNextBuffer(out_buffer)); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kSuccess; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::GetNextBufferTimestamp() { 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!track_buffer_.empty()) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return track_buffer_.front()->GetDecodeTimestamp(); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!selected_range_) 10346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(selected_range_->HasNextBufferPosition()); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return selected_range_->GetNextTimestamp(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator 10416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SourceBufferStream::FindExistingRangeFor(DecodeTimestamp start_timestamp) { 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*itr)->BelongsToRange(start_timestamp)) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return itr; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ranges_.end(); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::AddToRanges(SourceBufferRange* new_range) { 10516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start_timestamp = new_range->GetStartTimestamp(); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator itr = ranges_.end(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*itr)->GetStartTimestamp() > start_timestamp) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ranges_.insert(itr, new_range); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::GetSelectedRangeItr() { 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(selected_range_); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangeList::iterator itr = ranges_.end(); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*itr == selected_range_) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(itr != ranges_.end()); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return itr; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SourceBufferStream::SeekAndSetSelectedRange( 10736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SourceBufferRange* range, DecodeTimestamp seek_timestamp) { 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (range) 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) range->Seek(seek_timestamp); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetSelectedRange(range); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) { 10801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : " << selected_range_ << " -> " << range; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_range_) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_range_->ResetNextBufferPosition(); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!range || range->HasNextBufferPosition()); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected_range_ = range; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const { 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Ranges<base::TimeDelta> ranges; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RangeList::const_iterator itr = ranges_.begin(); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itr != ranges_.end(); ++itr) { 10916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ranges.Add((*itr)->GetStartTimestamp().ToPresentationTime(), 10926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (*itr)->GetBufferedEndTimestamp().ToPresentationTime()); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ranges; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeDelta SourceBufferStream::GetBufferedDuration() const { 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ranges_.empty()) 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::TimeDelta(); 11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); 11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SourceBufferStream::MarkEndOfStream() { 11057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!end_of_stream_); 11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) end_of_stream_ = true; 11077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SourceBufferStream::UnmarkEndOfStream() { 11107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(end_of_stream_); 11117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) end_of_stream_ = false; 11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 11137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsEndSelected() const { 11157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (ranges_.empty()) 11167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 11177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (seek_pending_) { 11196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeDelta last_range_end_time = 11206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); 11216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return seek_buffer_timestamp_ >= last_range_end_time; 11226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 11237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return selected_range_ == ranges_.back(); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() { 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_change_pending_) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteConfigChange(); 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return audio_configs_[current_config_index_]; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() { 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config_change_pending_) 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteConfigChange(); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return video_configs_[current_config_index_]; 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const TextTrackConfig& SourceBufferStream::GetCurrentTextTrackConfig() { 1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return text_track_config_; 1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta SourceBufferStream::GetMaxInterbufferDistance() const { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_interbuffer_distance_ == kNoTimestamp()) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(kDefaultBufferDurationInMs); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return max_interbuffer_distance_; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) { 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!audio_configs_.empty()); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(video_configs_.empty()); 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(3) << "UpdateAudioConfig."; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (audio_configs_[0].codec() != config.codec()) { 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Audio codec changes not allowed."; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (audio_configs_[0].is_encrypted() != config.is_encrypted()) { 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Audio encryption changes not allowed."; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see if the new config matches an existing one. 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < audio_configs_.size(); ++i) { 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (config.Matches(audio_configs_[i])) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_ = i; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No matches found so let's add this one to the list. 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_ = audio_configs_.size(); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(2) << "New audio config - index: " << append_config_index_; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_configs_.resize(audio_configs_.size() + 1); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_configs_[append_config_index_] = config; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!video_configs_.empty()); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(audio_configs_.empty()); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(3) << "UpdateVideoConfig."; 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (video_configs_[0].codec() != config.codec()) { 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Video codec changes not allowed."; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (video_configs_[0].is_encrypted() != config.is_encrypted()) { 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MEDIA_LOG(log_cb_) << "Video encryption changes not allowed."; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see if the new config matches an existing one. 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < video_configs_.size(); ++i) { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (config.Matches(video_configs_[i])) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_ = i; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No matches found so let's add this one to the list. 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_config_index_ = video_configs_.size(); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(2) << "New video config - index: " << append_config_index_; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_configs_.resize(video_configs_.size() + 1); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_configs_[append_config_index_] = config; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::CompleteConfigChange() { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_change_pending_ = false; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pending_buffer_.get()) { 12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) current_config_index_ = 12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_buffer_->GetSpliceBufferConfigId(splice_buffers_index_); 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!track_buffer_.empty()) { 12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_config_index_ = track_buffer_.front()->GetSpliceBufferConfigId(0); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_range_ && selected_range_->HasNextBuffer()) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_config_index_ = selected_range_->GetNextConfigId(); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SourceBufferStream::SetSelectedRangeIfNeeded( 12306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const DecodeTimestamp timestamp) { 123158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")"; 123258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selected_range_) { 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(track_buffer_.empty()); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!track_buffer_.empty()) { 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!selected_range_); 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp start_timestamp = timestamp; 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the next buffer timestamp is not known then use a timestamp just after 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the timestamp on the last buffer returned by GetNextBuffer(). 12476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (start_timestamp == kNoDecodeTimestamp()) { 12486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (last_output_buffer_timestamp_ == kNoDecodeTimestamp()) 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_timestamp = last_output_buffer_timestamp_ + 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromInternalValue(1); 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp seek_timestamp = 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FindNewSelectedRangeSeekTimestamp(start_timestamp); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we don't have buffered data to seek to, then return. 12596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (seek_timestamp == kNoDecodeTimestamp()) 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(track_buffer_.empty()); 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SeekAndSetSelectedRange(*FindExistingRangeFor(seek_timestamp), 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) seek_timestamp); 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp( 12686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const DecodeTimestamp start_timestamp) { 12696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(start_timestamp != kNoDecodeTimestamp()); 12706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(start_timestamp >= DecodeTimestamp()); 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RangeList::iterator itr = ranges_.begin(); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (; itr != ranges_.end(); ++itr) { 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*itr)->GetEndTimestamp() >= start_timestamp) { 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (itr == ranges_.end()) 12816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First check for a keyframe timestamp >= |start_timestamp| 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the current range. 12856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp keyframe_timestamp = 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*itr)->NextKeyframeTimestamp(start_timestamp); 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (keyframe_timestamp != kNoDecodeTimestamp()) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return keyframe_timestamp; 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If a keyframe was not found then look for a keyframe that is 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "close enough" in the current or next range. 12936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp end_timestamp = 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(start_timestamp < end_timestamp); 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the current range doesn't start beyond |end_timestamp|. 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((*itr)->GetStartTimestamp() >= end_timestamp) 12996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check to see if the keyframe is within the acceptable range 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (|start_timestamp|, |end_timestamp|]. 13056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (keyframe_timestamp != kNoDecodeTimestamp() && 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_timestamp < keyframe_timestamp && 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyframe_timestamp <= end_timestamp) { 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return keyframe_timestamp; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |end_timestamp| is within this range, then no other checks are 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // necessary. 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_timestamp <= (*itr)->GetEndTimestamp()) 13146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Move on to the next range. 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++itr; 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return early if the next range does not contain |end_timestamp|. 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp) 13216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check to see if the keyframe is within the acceptable range 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (|start_timestamp|, |end_timestamp|]. 13276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (keyframe_timestamp != kNoDecodeTimestamp() && 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_timestamp < keyframe_timestamp && 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keyframe_timestamp <= end_timestamp) { 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return keyframe_timestamp; 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp( 13376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const DecodeTimestamp timestamp) { 13386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(timestamp != kNoDecodeTimestamp()); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RangeList::iterator itr = FindExistingRangeFor(timestamp); 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (itr == ranges_.end()) 13436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return kNoDecodeTimestamp(); 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First check for a keyframe timestamp >= |timestamp| 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in the current range. 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (*itr)->NextKeyframeTimestamp(timestamp); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string SourceBufferStream::GetStreamTypeName() const { 13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (GetType()) { 13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case kAudio: 13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "AUDIO"; 13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case kVideo: 13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "VIDEO"; 13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case kText: 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "TEXT"; 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ""; 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SourceBufferStream::Type SourceBufferStream::GetType() const { 13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!audio_configs_.empty()) 13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kAudio; 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!video_configs_.empty()) 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kVideo; 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(text_track_config_.kind(), kTextNone); 13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return kText; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void SourceBufferStream::DeleteAndRemoveRange(RangeList::iterator* itr) { 13731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__; 13741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 13758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(*itr != ranges_.end()); 13761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (**itr == selected_range_) { 13771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " deleting selected range."; 13788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetSelectedRange(NULL); 13791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 13801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 13811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (*itr == range_for_next_append_) { 13821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " deleting range_for_next_append_."; 13831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) range_for_next_append_ = ranges_.end(); 13846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); 1385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) last_appended_buffer_is_keyframe_ = false; 13861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 13878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) delete **itr; 13898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) *itr = ranges_.erase(*itr); 13908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 13918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) { 1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!new_buffers.empty()); 1394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Splice frames are only supported for audio. 1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (GetType() != kAudio) 1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find the overlapped range (if any). 1400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp(); 14016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const DecodeTimestamp splice_dts = 14026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp::FromPresentationTime(splice_timestamp); 14036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RangeList::iterator range_itr = FindExistingRangeFor(splice_dts); 1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (range_itr == ranges_.end()) 1405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 14076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const DecodeTimestamp max_splice_end_dts = 14086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) splice_dts + base::TimeDelta::FromMilliseconds( 14096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AudioSplicer::kCrossfadeDurationInMilliseconds); 1410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find all buffers involved before the splice point. 1412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BufferQueue pre_splice_buffers; 1413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!(*range_itr)->GetBuffersInRange( 14146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) splice_dts, max_splice_end_dts, &pre_splice_buffers)) { 1415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // If there are gaps in the timeline, it's possible that we only find buffers 1419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // after the splice point but within the splice range. For simplicity, we do 1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // not generate splice frames in this case. 1421e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // 1422e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // We also do not want to generate splices if the first new buffer replaces an 1423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // existing buffer exactly. 1424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (pre_splice_buffers.front()->timestamp() >= splice_timestamp) 1425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 1426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If any |pre_splice_buffers| are already splices or preroll, do not generate 142846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // a splice. 1429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (size_t i = 0; i < pre_splice_buffers.size(); ++i) { 1430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const BufferQueue& original_splice_buffers = 1431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pre_splice_buffers[i]->splice_buffers(); 1432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!original_splice_buffers.empty()) { 1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DVLOG(1) << "Can't generate splice: overlapped buffers contain a " 1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "pre-existing splice."; 1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 143746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pre_splice_buffers[i]->preroll_buffer().get()) { 143946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << "Can't generate splice: overlapped buffers contain preroll."; 144046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 144146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 1442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 1443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Don't generate splice frames which represent less than two frames, since we 1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // need at least that much to generate a crossfade. Per the spec, make this 1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // check using the sample rate of the overlapping buffers. 1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::TimeDelta splice_duration = 1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pre_splice_buffers.back()->timestamp() + 1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pre_splice_buffers.back()->duration() - splice_timestamp; 1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::TimeDelta minimum_splice_duration = base::TimeDelta::FromSecondsD( 1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2.0 / audio_configs_[append_config_index_].samples_per_second()); 1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (splice_duration < minimum_splice_duration) { 1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DVLOG(1) << "Can't generate splice: not enough samples for crossfade; have " 1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << splice_duration.InMicroseconds() << " us, but need " 1455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << minimum_splice_duration.InMicroseconds() << " us."; 1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 1457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch new_buffers.front()->ConvertToSpliceBuffer(pre_splice_buffers); 1460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 146246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool SourceBufferStream::SetPendingBuffer( 146346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<StreamParserBuffer>* out_buffer) { 14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(out_buffer->get()); 14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!pending_buffer_.get()); 146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 146746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const bool have_splice_buffers = !(*out_buffer)->splice_buffers().empty(); 14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const bool have_preroll_buffer = !!(*out_buffer)->preroll_buffer().get(); 146946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!have_splice_buffers && !have_preroll_buffer) 147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 147246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK_NE(have_splice_buffers, have_preroll_buffer); 147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) splice_buffers_index_ = 0; 147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffer_.swap(*out_buffer); 147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) pending_buffers_complete_ = false; 147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 147846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1481