| 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 <limits> | 8 #include <limits> |
| 9 #include <list> | 9 #include <list> |
| 10 | 10 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // frame processing. |init_segment_received_cb| is run for each new fully | 119 // frame processing. |init_segment_received_cb| is run for each new fully |
| 120 // parsed initialization segment. | 120 // parsed initialization segment. |
| 121 bool Append(const uint8* data, | 121 bool Append(const uint8* data, |
| 122 size_t length, | 122 size_t length, |
| 123 TimeDelta append_window_start, | 123 TimeDelta append_window_start, |
| 124 TimeDelta append_window_end, | 124 TimeDelta append_window_end, |
| 125 TimeDelta* timestamp_offset, | 125 TimeDelta* timestamp_offset, |
| 126 const InitSegmentReceivedCB& init_segment_received_cb); | 126 const InitSegmentReceivedCB& init_segment_received_cb); |
| 127 | 127 |
| 128 // Aborts the current append sequence and resets the parser. | 128 // Aborts the current append sequence and resets the parser. |
| 129 void Abort(TimeDelta append_window_start, | 129 void ResetParserState(TimeDelta append_window_start, |
| 130 TimeDelta append_window_end, | 130 TimeDelta append_window_end, |
| 131 TimeDelta* timestamp_offset); | 131 TimeDelta* timestamp_offset); |
| 132 | 132 |
| 133 // Calls Remove(|start|, |end|, |duration|) on all | 133 // Calls Remove(|start|, |end|, |duration|) on all |
| 134 // ChunkDemuxerStreams managed by this object. | 134 // ChunkDemuxerStreams managed by this object. |
| 135 void Remove(TimeDelta start, TimeDelta end, TimeDelta duration); | 135 void Remove(TimeDelta start, TimeDelta end, TimeDelta duration); |
| 136 | 136 |
| 137 // If the buffer is full, attempts to try to free up space, as specified in | 137 // If the buffer is full, attempts to try to free up space, as specified in |
| 138 // the "Coded Frame Eviction Algorithm" in the Media Source Extensions Spec. | 138 // the "Coded Frame Eviction Algorithm" in the Media Source Extensions Spec. |
| 139 // Returns false iff buffer is still full after running eviction. | 139 // Returns false iff buffer is still full after running eviction. |
| 140 // https://w3c.github.io/media-source/#sourcebuffer-coded-frame-eviction | 140 // https://w3c.github.io/media-source/#sourcebuffer-coded-frame-eviction |
| 141 bool EvictCodedFrames(DecodeTimestamp media_time, size_t newDataSize); | 141 bool EvictCodedFrames(DecodeTimestamp media_time, size_t newDataSize); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 << __FUNCTION__ << ": stream parsing failed." | 348 << __FUNCTION__ << ": stream parsing failed." |
| 349 << " Data size=" << length | 349 << " Data size=" << length |
| 350 << " append_window_start=" << append_window_start.InSecondsF() | 350 << " append_window_start=" << append_window_start.InSecondsF() |
| 351 << " append_window_end=" << append_window_end.InSecondsF(); | 351 << " append_window_end=" << append_window_end.InSecondsF(); |
| 352 } | 352 } |
| 353 timestamp_offset_during_append_ = NULL; | 353 timestamp_offset_during_append_ = NULL; |
| 354 init_segment_received_cb_.Reset(); | 354 init_segment_received_cb_.Reset(); |
| 355 return result; | 355 return result; |
| 356 } | 356 } |
| 357 | 357 |
| 358 void SourceState::Abort(TimeDelta append_window_start, | 358 void SourceState::ResetParserState(TimeDelta append_window_start, |
| 359 TimeDelta append_window_end, | 359 TimeDelta append_window_end, |
| 360 base::TimeDelta* timestamp_offset) { | 360 base::TimeDelta* timestamp_offset) { |
| 361 DCHECK(timestamp_offset); | 361 DCHECK(timestamp_offset); |
| 362 DCHECK(!timestamp_offset_during_append_); | 362 DCHECK(!timestamp_offset_during_append_); |
| 363 timestamp_offset_during_append_ = timestamp_offset; | 363 timestamp_offset_during_append_ = timestamp_offset; |
| 364 append_window_start_during_append_ = append_window_start; | 364 append_window_start_during_append_ = append_window_start; |
| 365 append_window_end_during_append_ = append_window_end; | 365 append_window_end_during_append_ = append_window_end; |
| 366 | 366 |
| 367 stream_parser_->Flush(); | 367 stream_parser_->Flush(); |
| 368 timestamp_offset_during_append_ = NULL; | 368 timestamp_offset_during_append_ = NULL; |
| 369 | 369 |
| 370 frame_processor_->Reset(); | 370 frame_processor_->Reset(); |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 1506 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 1507 } | 1507 } |
| 1508 | 1508 |
| 1509 ranges = GetBufferedRanges_Locked(); | 1509 ranges = GetBufferedRanges_Locked(); |
| 1510 } | 1510 } |
| 1511 | 1511 |
| 1512 for (size_t i = 0; i < ranges.size(); ++i) | 1512 for (size_t i = 0; i < ranges.size(); ++i) |
| 1513 host_->AddBufferedTimeRange(ranges.start(i), ranges.end(i)); | 1513 host_->AddBufferedTimeRange(ranges.start(i), ranges.end(i)); |
| 1514 } | 1514 } |
| 1515 | 1515 |
| 1516 void ChunkDemuxer::Abort(const std::string& id, | 1516 void ChunkDemuxer::ResetParserState(const std::string& id, |
| 1517 TimeDelta append_window_start, | 1517 TimeDelta append_window_start, |
| 1518 TimeDelta append_window_end, | 1518 TimeDelta append_window_end, |
| 1519 TimeDelta* timestamp_offset) { | 1519 TimeDelta* timestamp_offset) { |
| 1520 DVLOG(1) << "Abort(" << id << ")"; | 1520 DVLOG(1) << "ResetParserState(" << id << ")"; |
| 1521 base::AutoLock auto_lock(lock_); | 1521 base::AutoLock auto_lock(lock_); |
| 1522 DCHECK(!id.empty()); | 1522 DCHECK(!id.empty()); |
| 1523 CHECK(IsValidId(id)); | 1523 CHECK(IsValidId(id)); |
| 1524 bool old_waiting_for_data = IsSeekWaitingForData_Locked(); | 1524 bool old_waiting_for_data = IsSeekWaitingForData_Locked(); |
| 1525 source_state_map_[id]->Abort(append_window_start, | 1525 source_state_map_[id]->ResetParserState(append_window_start, |
| 1526 append_window_end, | 1526 append_window_end, |
| 1527 timestamp_offset); | 1527 timestamp_offset); |
| 1528 // Abort can possibly emit some buffers. | 1528 // ResetParserState can possibly emit some buffers. |
| 1529 // Need to check whether seeking can be completed. | 1529 // Need to check whether seeking can be completed. |
| 1530 if (old_waiting_for_data && !IsSeekWaitingForData_Locked() && | 1530 if (old_waiting_for_data && !IsSeekWaitingForData_Locked() && |
| 1531 !seek_cb_.is_null()) { | 1531 !seek_cb_.is_null()) { |
| 1532 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 1532 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 1533 } | 1533 } |
| 1534 } | 1534 } |
| 1535 | 1535 |
| 1536 void ChunkDemuxer::Remove(const std::string& id, TimeDelta start, | 1536 void ChunkDemuxer::Remove(const std::string& id, TimeDelta start, |
| 1537 TimeDelta end) { | 1537 TimeDelta end) { |
| 1538 DVLOG(1) << "Remove(" << id << ", " << start.InSecondsF() | 1538 DVLOG(1) << "Remove(" << id << ", " << start.InSecondsF() |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1958 } | 1958 } |
| 1959 | 1959 |
| 1960 void ChunkDemuxer::ShutdownAllStreams() { | 1960 void ChunkDemuxer::ShutdownAllStreams() { |
| 1961 for (SourceStateMap::iterator itr = source_state_map_.begin(); | 1961 for (SourceStateMap::iterator itr = source_state_map_.begin(); |
| 1962 itr != source_state_map_.end(); ++itr) { | 1962 itr != source_state_map_.end(); ++itr) { |
| 1963 itr->second->Shutdown(); | 1963 itr->second->Shutdown(); |
| 1964 } | 1964 } |
| 1965 } | 1965 } |
| 1966 | 1966 |
| 1967 } // namespace media | 1967 } // namespace media |
| OLD | NEW |