OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/filters/source_buffer_stream.h" | 5 #include "media/filters/source_buffer_stream.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
212 last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); | 212 last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); |
213 last_appended_buffer_is_keyframe_ = false; | 213 last_appended_buffer_is_keyframe_ = false; |
214 DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range"; | 214 DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range"; |
215 } else if (last_range != ranges_.end()) { | 215 } else if (last_range != ranges_.end()) { |
216 DCHECK(last_range == range_for_next_append_); | 216 DCHECK(last_range == range_for_next_append_); |
217 DVLOG(3) << __FUNCTION__ << " next appended buffers will continue range " | 217 DVLOG(3) << __FUNCTION__ << " next appended buffers will continue range " |
218 << "unless intervening remove makes discontinuity"; | 218 << "unless intervening remove makes discontinuity"; |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 static std::string BufferQueueToLogString( | |
wolenetz
2015/07/30 18:55:15
nit: s/static/...move to anonymous namespace at th
servolk
2015/07/30 19:46:16
Done.
| |
223 const SourceBufferStream::BufferQueue& buffers) { | |
224 std::stringstream result; | |
225 if (buffers.front()->GetDecodeTimestamp().InMicroseconds() == | |
226 buffers.front()->timestamp().InMicroseconds() && | |
227 buffers.back()->GetDecodeTimestamp().InMicroseconds() == | |
228 buffers.back()->timestamp().InMicroseconds()) { | |
229 result << "dts/pts=[" << buffers.front()->timestamp().InSecondsF() << ";" | |
230 << buffers.back()->timestamp().InSecondsF() << "(last frame dur=" | |
231 << buffers.back()->duration().InSecondsF() << ")]"; | |
232 } else { | |
233 result << "dts=[" << buffers.front()->GetDecodeTimestamp().InSecondsF() | |
234 << ";" << buffers.back()->GetDecodeTimestamp().InSecondsF() | |
235 << "] pts=[" << buffers.front()->timestamp().InSecondsF() << ";" | |
236 << buffers.back()->timestamp().InSecondsF() << "(last frame dur=" | |
237 << buffers.back()->duration().InSecondsF() << ")]"; | |
238 } | |
239 return result.str(); | |
240 } | |
241 | |
222 bool SourceBufferStream::Append(const BufferQueue& buffers) { | 242 bool SourceBufferStream::Append(const BufferQueue& buffers) { |
223 TRACE_EVENT2("media", "SourceBufferStream::Append", | 243 TRACE_EVENT2("media", "SourceBufferStream::Append", |
224 "stream type", GetStreamTypeName(), | 244 "stream type", GetStreamTypeName(), |
225 "buffers to append", buffers.size()); | 245 "buffers to append", buffers.size()); |
226 | 246 |
227 DCHECK(!buffers.empty()); | 247 DCHECK(!buffers.empty()); |
228 DCHECK(media_segment_start_time_ != kNoDecodeTimestamp()); | 248 DCHECK(media_segment_start_time_ != kNoDecodeTimestamp()); |
229 DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); | 249 DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); |
230 DCHECK(!end_of_stream_); | 250 DCHECK(!end_of_stream_); |
231 | 251 |
232 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() << ": buffers dts=[" | 252 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
233 << buffers.front()->GetDecodeTimestamp().InSecondsF() << ";" | 253 << ": buffers " << BufferQueueToLogString(buffers); |
234 << buffers.back()->GetDecodeTimestamp().InSecondsF() << "] pts=[" | |
235 << buffers.front()->timestamp().InSecondsF() << ";" | |
236 << buffers.back()->timestamp().InSecondsF() << "(last frame dur=" | |
237 << buffers.back()->duration().InSecondsF() << ")]"; | |
238 | 254 |
239 // New media segments must begin with a keyframe. | 255 // New media segments must begin with a keyframe. |
240 // TODO(wolenetz): Relax this requirement. See http://crbug.com/229412. | 256 // TODO(wolenetz): Relax this requirement. See http://crbug.com/229412. |
241 if (new_media_segment_ && !buffers.front()->is_key_frame()) { | 257 if (new_media_segment_ && !buffers.front()->is_key_frame()) { |
242 MEDIA_LOG(ERROR, media_log_) << "Media segment did not begin with key " | 258 MEDIA_LOG(ERROR, media_log_) << "Media segment did not begin with key " |
243 "frame. Support for such segments will be " | 259 "frame. Support for such segments will be " |
244 "available in a future version. Please see " | 260 "available in a future version. Please see " |
245 "https://crbug.com/229412."; | 261 "https://crbug.com/229412."; |
246 return false; | 262 return false; |
247 } | 263 } |
(...skipping 1403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1651 return false; | 1667 return false; |
1652 | 1668 |
1653 DCHECK_NE(have_splice_buffers, have_preroll_buffer); | 1669 DCHECK_NE(have_splice_buffers, have_preroll_buffer); |
1654 splice_buffers_index_ = 0; | 1670 splice_buffers_index_ = 0; |
1655 pending_buffer_.swap(*out_buffer); | 1671 pending_buffer_.swap(*out_buffer); |
1656 pending_buffers_complete_ = false; | 1672 pending_buffers_complete_ = false; |
1657 return true; | 1673 return true; |
1658 } | 1674 } |
1659 | 1675 |
1660 } // namespace media | 1676 } // namespace media |
OLD | NEW |