Index: media/filters/source_buffer_stream.cc |
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc |
index e17a4f1c91952b64cf280a9777404e4adeec71d2..b0b2add52db68bd84d180e0e9fe2cd5640f439f6 100644 |
--- a/media/filters/source_buffer_stream.cc |
+++ b/media/filters/source_buffer_stream.cc |
@@ -134,7 +134,7 @@ SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, |
bool splice_frames_enabled) |
: media_log_(media_log), |
seek_buffer_timestamp_(kNoTimestamp()), |
- media_segment_start_time_(kNoDecodeTimestamp()), |
+ coded_frame_group_start_time_(kNoDecodeTimestamp()), |
range_for_next_append_(ranges_.end()), |
last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
@@ -150,7 +150,7 @@ SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, |
bool splice_frames_enabled) |
: media_log_(media_log), |
seek_buffer_timestamp_(kNoTimestamp()), |
- media_segment_start_time_(kNoDecodeTimestamp()), |
+ coded_frame_group_start_time_(kNoDecodeTimestamp()), |
range_for_next_append_(ranges_.end()), |
last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
@@ -167,7 +167,7 @@ SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, |
: media_log_(media_log), |
text_track_config_(text_config), |
seek_buffer_timestamp_(kNoTimestamp()), |
- media_segment_start_time_(kNoDecodeTimestamp()), |
+ coded_frame_group_start_time_(kNoDecodeTimestamp()), |
range_for_next_append_(ranges_.end()), |
last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
@@ -182,22 +182,25 @@ SourceBufferStream::~SourceBufferStream() { |
} |
} |
-void SourceBufferStream::OnNewMediaSegment( |
- DecodeTimestamp media_segment_start_time) { |
- DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
- << " (" << media_segment_start_time.InSecondsF() << ")"; |
+void SourceBufferStream::OnStartOfCodedFrameGroup( |
+ DecodeTimestamp coded_frame_group_start_time) { |
+ DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() << " (" |
+ << coded_frame_group_start_time.InSecondsF() << ")"; |
DCHECK(!end_of_stream_); |
- media_segment_start_time_ = media_segment_start_time; |
- new_media_segment_ = true; |
+ coded_frame_group_start_time_ = coded_frame_group_start_time; |
+ new_coded_frame_group_ = true; |
RangeList::iterator last_range = range_for_next_append_; |
- range_for_next_append_ = FindExistingRangeFor(media_segment_start_time); |
+ range_for_next_append_ = FindExistingRangeFor(coded_frame_group_start_time); |
- // Only reset |last_appended_buffer_timestamp_| if this new media segment is |
- // not adjacent to the previous media segment appended to the stream. |
+ // Only reset |last_appended_buffer_timestamp_| if this new coded frame group |
+ // is not adjacent to the previous coded frame group appended to the stream. |
+ // TODO(wolenetz): Change this to DCHECK or MEDIA_LOG if found to be adjacent, |
+ // and otherwise trust the caller to signal correctly only when there is a |
+ // discontinuity detected by coded frame processor? |
if (range_for_next_append_ == ranges_.end() || |
!AreAdjacentInSequence(last_appended_buffer_timestamp_, |
- media_segment_start_time)) { |
+ coded_frame_group_start_time)) { |
last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); |
last_appended_buffer_is_keyframe_ = false; |
DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range"; |
@@ -214,31 +217,38 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
"buffers to append", buffers.size()); |
DCHECK(!buffers.empty()); |
- DCHECK(media_segment_start_time_ != kNoDecodeTimestamp()); |
- DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); |
+ DCHECK(coded_frame_group_start_time_ != kNoDecodeTimestamp()); |
+ DCHECK(coded_frame_group_start_time_ <= |
+ buffers.front()->GetDecodeTimestamp()); |
DCHECK(!end_of_stream_); |
DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
<< ": buffers " << BufferQueueToLogString(buffers); |
- // New media segments must begin with a keyframe. |
- // TODO(wolenetz): Relax this requirement. See http://crbug.com/229412. |
- if (new_media_segment_ && !buffers.front()->is_key_frame()) { |
- MEDIA_LOG(ERROR, media_log_) << "Media segment did not begin with key " |
- "frame. Support for such segments will be " |
- "available in a future version. Please see " |
- "https://crbug.com/229412."; |
+ // New coded frame groups emitted by the coded frame processor must begin with |
+ // a keyframe. |
+ // TODO(wolenetz): Change this to a DCHECK, if not a CHECK, once the frame |
+ // processor becomes aware of discontinuities introduced by the range removal |
+ // algorithm. See http://crbug.com/229412. |
+ // BIG TODO: ensure this new log is exercised in unit test; adjust tests for |
+ // lack of old log "Media segment did not begin with key frame..." |
+ if (new_coded_frame_group_ && !buffers.front()->is_key_frame()) { |
+ MEDIA_LOG(ERROR, media_log_) |
+ << "Coded frame group did not begin with key frame."; |
return false; |
} |
- // Buffers within a media segment should be monotonically increasing. |
- if (!IsMonotonicallyIncreasing(buffers)) |
+ // Buffers within a coded frame group should be monotonically increasing. |
+ // TODO(wolenetz): Change this to a DCHECK in debug builds? |
+ if (!IsMonotonicallyIncreasing(buffers)) { |
return false; |
+ } |
- if (media_segment_start_time_ < DecodeTimestamp() || |
+ if (coded_frame_group_start_time_ < DecodeTimestamp() || |
buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) { |
+ // BIG TODO: if necessary, adjust any existing test log expectation |
MEDIA_LOG(ERROR, media_log_) |
- << "Cannot append a media segment with negative timestamps."; |
+ << "Cannot append a coded frame group with negative timestamps."; |
return false; |
} |
@@ -269,15 +279,17 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
last_appended_buffer_is_keyframe_ = buffers.back()->is_key_frame(); |
} else { |
DecodeTimestamp new_range_start_time = std::min( |
- media_segment_start_time_, buffers.front()->GetDecodeTimestamp()); |
+ coded_frame_group_start_time_, buffers.front()->GetDecodeTimestamp()); |
const BufferQueue* buffers_for_new_range = &buffers; |
BufferQueue trimmed_buffers; |
- // If the new range is not being created because of a new media |
- // segment, then we must make sure that we start with a key frame. |
- // This can happen if the GOP in the previous append gets destroyed |
- // by a Remove() call. |
- if (!new_media_segment_) { |
+ // If the new range is not being created because of a new coded frame group, |
+ // then we must make sure that we start with a key frame. This can happen |
+ // if the GOP in the previous append gets destroyed by a Remove() call. |
+ // TODO(wolenetz): Change this to at least a DCHECK once the frame processor |
+ // becomes aware of discontinuities introduced by the range removal |
+ // algorithm. See http://crbug.com/229412. |
+ if (!new_coded_frame_group_) { |
BufferQueue::const_iterator itr = buffers.begin(); |
// Scan past all the non-key-frames. |
@@ -320,7 +332,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
buffers_for_new_range->back()->is_key_frame(); |
} |
- new_media_segment_ = false; |
+ new_coded_frame_group_ = false; |
MergeWithAdjacentRangeIfNecessary(range_for_next_append_); |
@@ -560,9 +572,9 @@ bool SourceBufferStream::IsMonotonicallyIncreasing( |
bool SourceBufferStream::IsNextTimestampValid( |
DecodeTimestamp next_timestamp, bool next_is_keyframe) const { |
return (last_appended_buffer_timestamp_ != next_timestamp) || |
- new_media_segment_ || |
- SourceBufferRange::AllowSameTimestamp(last_appended_buffer_is_keyframe_, |
- next_is_keyframe); |
+ new_coded_frame_group_ || |
+ SourceBufferRange::AllowSameTimestamp( |
+ last_appended_buffer_is_keyframe_, next_is_keyframe); |
} |