Chromium Code Reviews| 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/chunk_demuxer.h" | 5 #include "media/filters/chunk_demuxer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 111 // error occurred. | 111 // error occurred. |
| 112 bool Append(const uint8* data, size_t length); | 112 bool Append(const uint8* data, size_t length); |
| 113 | 113 |
| 114 // Aborts the current append sequence and resets the parser. | 114 // Aborts the current append sequence and resets the parser. |
| 115 void Abort(); | 115 void Abort(); |
| 116 | 116 |
| 117 // Calls Remove(|start|, |end|, |duration|) on all | 117 // Calls Remove(|start|, |end|, |duration|) on all |
| 118 // ChunkDemuxerStreams managed by this object. | 118 // ChunkDemuxerStreams managed by this object. |
| 119 void Remove(TimeDelta start, TimeDelta end, TimeDelta duration); | 119 void Remove(TimeDelta start, TimeDelta end, TimeDelta duration); |
| 120 | 120 |
| 121 // Sets |timestamp_offset_| if possible. | 121 // Sets user-specified |timestamp_offset_| if possible. |
| 122 // Returns if the offset was set. Returns false if the offset could not be | 122 // Returns true if the offset was set. Returns false if the offset could not |
| 123 // updated at this time. | 123 // be set at this time. |
| 124 bool SetTimestampOffset(TimeDelta timestamp_offset); | 124 bool SetTimestampOffset(TimeDelta timestamp_offset); |
| 125 | 125 |
| 126 // Gets the updated timestamp offset or indication that it has not been | |
| 127 // updated. | |
| 128 // If |using_user_specified_timestamp_offset_| is true, meaning | |
|
acolwell GONE FROM CHROMIUM
2014/02/25 21:50:41
nit: I wonder if the name should be something like
wolenetz
2014/02/25 22:56:29
Done. That does make more sense :)
| |
| 129 // |timestamp_offset_| was most recently set by SetTimestampOffset() or | |
| 130 // this SourceState's construction, returns kNoTimestamp(). | |
| 131 // Otherwise, returns the updated |timestamp_offset_| resulting from | |
| 132 // operations like "sequence" mode Append() coded frame processing. | |
| 133 TimeDelta GetUpdatedTimestampOffset() const; | |
| 134 | |
| 126 // Sets |sequence_mode_| to |sequence_mode| if possible. | 135 // Sets |sequence_mode_| to |sequence_mode| if possible. |
| 127 // Returns true if the mode update was allowed. Returns false if the mode | 136 // Returns true if the mode update was allowed. Returns false if the mode |
| 128 // could not be updated at this time. | 137 // could not be updated at this time. |
| 129 bool SetSequenceMode(bool sequence_mode); | 138 bool SetSequenceMode(bool sequence_mode); |
| 130 | 139 |
| 131 TimeDelta timestamp_offset() const { return timestamp_offset_; } | |
| 132 | |
| 133 void set_append_window_start(TimeDelta start) { | 140 void set_append_window_start(TimeDelta start) { |
| 134 append_window_start_ = start; | 141 append_window_start_ = start; |
| 135 } | 142 } |
| 136 void set_append_window_end(TimeDelta end) { append_window_end_ = end; } | 143 void set_append_window_end(TimeDelta end) { append_window_end_ = end; } |
| 137 | 144 |
| 138 // Returns the range of buffered data in this source, capped at |duration|. | 145 // Returns the range of buffered data in this source, capped at |duration|. |
| 139 // |ended| - Set to true if end of stream has been signalled and the special | 146 // |ended| - Set to true if end of stream has been signalled and the special |
| 140 // end of stream range logic needs to be executed. | 147 // end of stream range logic needs to be executed. |
| 141 Ranges<TimeDelta> GetBufferedRanges(TimeDelta duration, bool ended) const; | 148 Ranges<TimeDelta> GetBufferedRanges(TimeDelta duration, bool ended) const; |
| 142 | 149 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 bool* needs_keyframe, | 224 bool* needs_keyframe, |
| 218 StreamParser::BufferQueue* filtered_buffers); | 225 StreamParser::BufferQueue* filtered_buffers); |
| 219 | 226 |
| 220 CreateDemuxerStreamCB create_demuxer_stream_cb_; | 227 CreateDemuxerStreamCB create_demuxer_stream_cb_; |
| 221 IncreaseDurationCB increase_duration_cb_; | 228 IncreaseDurationCB increase_duration_cb_; |
| 222 NewTextTrackCB new_text_track_cb_; | 229 NewTextTrackCB new_text_track_cb_; |
| 223 | 230 |
| 224 // The offset to apply to media segment timestamps. | 231 // The offset to apply to media segment timestamps. |
| 225 TimeDelta timestamp_offset_; | 232 TimeDelta timestamp_offset_; |
| 226 | 233 |
| 234 // Flag that is true only if |timestamp_offset_| was most recently set by | |
| 235 // SetTimestampOffset() or this SourceState's construction. | |
| 236 bool using_user_specified_timestamp_offset_; | |
| 237 | |
| 227 // Tracks the mode by which appended media is processed. If true, then | 238 // Tracks the mode by which appended media is processed. If true, then |
| 228 // appended media is processed using "sequence" mode. Otherwise, appended | 239 // appended media is processed using "sequence" mode. Otherwise, appended |
| 229 // media is processed using "segments" mode. | 240 // media is processed using "segments" mode. |
| 230 // TODO(wolenetz): Enable "sequence" mode logic. See http://crbug.com/249422 | 241 // TODO(wolenetz): Enable "sequence" mode logic. See http://crbug.com/249422 |
| 231 // and http://crbug.com/333437. | 242 // and http://crbug.com/333437. |
| 232 bool sequence_mode_; | 243 bool sequence_mode_; |
| 233 | 244 |
| 234 TimeDelta append_window_start_; | 245 TimeDelta append_window_start_; |
| 235 TimeDelta append_window_end_; | 246 TimeDelta append_window_end_; |
| 236 | 247 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 358 | 369 |
| 359 DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream); | 370 DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream); |
| 360 }; | 371 }; |
| 361 | 372 |
| 362 SourceState::SourceState(scoped_ptr<StreamParser> stream_parser, | 373 SourceState::SourceState(scoped_ptr<StreamParser> stream_parser, |
| 363 const LogCB& log_cb, | 374 const LogCB& log_cb, |
| 364 const CreateDemuxerStreamCB& create_demuxer_stream_cb, | 375 const CreateDemuxerStreamCB& create_demuxer_stream_cb, |
| 365 const IncreaseDurationCB& increase_duration_cb) | 376 const IncreaseDurationCB& increase_duration_cb) |
| 366 : create_demuxer_stream_cb_(create_demuxer_stream_cb), | 377 : create_demuxer_stream_cb_(create_demuxer_stream_cb), |
| 367 increase_duration_cb_(increase_duration_cb), | 378 increase_duration_cb_(increase_duration_cb), |
| 379 using_user_specified_timestamp_offset_(true), | |
| 368 sequence_mode_(false), | 380 sequence_mode_(false), |
| 369 append_window_end_(kInfiniteDuration()), | 381 append_window_end_(kInfiniteDuration()), |
| 370 new_media_segment_(false), | 382 new_media_segment_(false), |
| 371 parsing_media_segment_(false), | 383 parsing_media_segment_(false), |
| 372 stream_parser_(stream_parser.release()), | 384 stream_parser_(stream_parser.release()), |
| 373 audio_(NULL), | 385 audio_(NULL), |
| 374 audio_needs_keyframe_(true), | 386 audio_needs_keyframe_(true), |
| 375 video_(NULL), | 387 video_(NULL), |
| 376 video_needs_keyframe_(true), | 388 video_needs_keyframe_(true), |
| 377 log_cb_(log_cb) { | 389 log_cb_(log_cb) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 405 base::Unretained(this)), | 417 base::Unretained(this)), |
| 406 base::Bind(&SourceState::OnEndOfMediaSegment, | 418 base::Bind(&SourceState::OnEndOfMediaSegment, |
| 407 base::Unretained(this)), | 419 base::Unretained(this)), |
| 408 log_cb_); | 420 log_cb_); |
| 409 } | 421 } |
| 410 | 422 |
| 411 bool SourceState::SetTimestampOffset(TimeDelta timestamp_offset) { | 423 bool SourceState::SetTimestampOffset(TimeDelta timestamp_offset) { |
| 412 if (parsing_media_segment_) | 424 if (parsing_media_segment_) |
| 413 return false; | 425 return false; |
| 414 | 426 |
| 427 using_user_specified_timestamp_offset_ = true; | |
| 415 timestamp_offset_ = timestamp_offset; | 428 timestamp_offset_ = timestamp_offset; |
| 429 | |
| 416 return true; | 430 return true; |
| 417 } | 431 } |
| 418 | 432 |
| 433 TimeDelta SourceState::GetUpdatedTimestampOffset() const { | |
| 434 if (using_user_specified_timestamp_offset_) | |
| 435 return kNoTimestamp(); | |
| 436 | |
| 437 return timestamp_offset_; | |
| 438 } | |
| 439 | |
| 419 bool SourceState::SetSequenceMode(bool sequence_mode) { | 440 bool SourceState::SetSequenceMode(bool sequence_mode) { |
| 420 if (parsing_media_segment_) | 441 if (parsing_media_segment_) |
| 421 return false; | 442 return false; |
| 422 | 443 |
| 423 sequence_mode_ = sequence_mode; | 444 sequence_mode_ = sequence_mode; |
| 424 return true; | 445 return true; |
| 425 } | 446 } |
| 426 | 447 |
| 427 | 448 |
| 428 bool SourceState::Append(const uint8* data, size_t length) { | 449 bool SourceState::Append(const uint8* data, size_t length) { |
| (...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1552 } | 1573 } |
| 1553 | 1574 |
| 1554 bool ChunkDemuxer::SetTimestampOffset(const std::string& id, TimeDelta offset) { | 1575 bool ChunkDemuxer::SetTimestampOffset(const std::string& id, TimeDelta offset) { |
| 1555 base::AutoLock auto_lock(lock_); | 1576 base::AutoLock auto_lock(lock_); |
| 1556 DVLOG(1) << "SetTimestampOffset(" << id << ", " << offset.InSecondsF() << ")"; | 1577 DVLOG(1) << "SetTimestampOffset(" << id << ", " << offset.InSecondsF() << ")"; |
| 1557 CHECK(IsValidId(id)); | 1578 CHECK(IsValidId(id)); |
| 1558 | 1579 |
| 1559 return source_state_map_[id]->SetTimestampOffset(offset); | 1580 return source_state_map_[id]->SetTimestampOffset(offset); |
| 1560 } | 1581 } |
| 1561 | 1582 |
| 1583 TimeDelta ChunkDemuxer::GetUpdatedTimestampOffset(const std::string& id) { | |
| 1584 base::AutoLock auto_lock(lock_); | |
| 1585 DVLOG(1) << "GetUpdatedTimestampOffset(" << id << ")"; | |
| 1586 CHECK(IsValidId(id)); | |
| 1587 | |
| 1588 return source_state_map_[id]->GetUpdatedTimestampOffset(); | |
| 1589 } | |
| 1590 | |
| 1562 bool ChunkDemuxer::SetSequenceMode(const std::string& id, | 1591 bool ChunkDemuxer::SetSequenceMode(const std::string& id, |
| 1563 bool sequence_mode) { | 1592 bool sequence_mode) { |
| 1564 base::AutoLock auto_lock(lock_); | 1593 base::AutoLock auto_lock(lock_); |
| 1565 DVLOG(1) << "SetSequenceMode(" << id << ", " << sequence_mode << ")"; | 1594 DVLOG(1) << "SetSequenceMode(" << id << ", " << sequence_mode << ")"; |
| 1566 CHECK(IsValidId(id)); | 1595 CHECK(IsValidId(id)); |
| 1567 DCHECK_NE(state_, ENDED); | 1596 DCHECK_NE(state_, ENDED); |
| 1568 | 1597 |
| 1569 return source_state_map_[id]->SetSequenceMode(sequence_mode); | 1598 return source_state_map_[id]->SetSequenceMode(sequence_mode); |
| 1570 } | 1599 } |
| 1571 | 1600 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1865 } | 1894 } |
| 1866 | 1895 |
| 1867 void ChunkDemuxer::ShutdownAllStreams() { | 1896 void ChunkDemuxer::ShutdownAllStreams() { |
| 1868 for (SourceStateMap::iterator itr = source_state_map_.begin(); | 1897 for (SourceStateMap::iterator itr = source_state_map_.begin(); |
| 1869 itr != source_state_map_.end(); ++itr) { | 1898 itr != source_state_map_.end(); ++itr) { |
| 1870 itr->second->Shutdown(); | 1899 itr->second->Shutdown(); |
| 1871 } | 1900 } |
| 1872 } | 1901 } |
| 1873 | 1902 |
| 1874 } // namespace media | 1903 } // namespace media |
| OLD | NEW |