Index: media/filters/frame_processor.cc |
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc |
index 6f7706df7621abbb1c232865b4ef821cd7047274..28503155763f13a08e024718c295efe3fd399f2d 100644 |
--- a/media/filters/frame_processor.cc |
+++ b/media/filters/frame_processor.cc |
@@ -197,7 +197,6 @@ bool FrameProcessor::ProcessFrames( |
const StreamParser::TextBufferQueueMap& text_map, |
base::TimeDelta append_window_start, |
base::TimeDelta append_window_end, |
- bool* new_media_segment, |
base::TimeDelta* timestamp_offset) { |
StreamParser::BufferQueue frames; |
if (!MergeBufferQueues(audio_buffers, video_buffers, text_map, &frames)) { |
@@ -217,7 +216,7 @@ bool FrameProcessor::ProcessFrames( |
for (StreamParser::BufferQueue::const_iterator frames_itr = frames.begin(); |
frames_itr != frames.end(); ++frames_itr) { |
if (!ProcessFrame(*frames_itr, append_window_start, append_window_end, |
- timestamp_offset, new_media_segment)) { |
+ timestamp_offset)) { |
FlushProcessedFrames(); |
return false; |
} |
@@ -291,10 +290,16 @@ void FrameProcessor::Reset() { |
itr->second->Reset(); |
} |
- if (sequence_mode_) { |
- DCHECK(kNoTimestamp() != group_end_timestamp_); |
- group_start_timestamp_ = group_end_timestamp_; |
+ // Maintain current |in_coded_frame_group_| state for Reset() during |
+ // sequence mode. Reset it here only if in segments mode. |
+ if (!sequence_mode_) { |
+ in_coded_frame_group_ = false; |
+ return; |
} |
+ |
+ // Sequence mode |
+ DCHECK(kNoTimestamp() != group_end_timestamp_); |
+ group_start_timestamp_ = group_end_timestamp_; |
} |
void FrameProcessor::OnPossibleAudioConfigUpdate( |
@@ -320,14 +325,14 @@ MseTrackBuffer* FrameProcessor::FindTrack(StreamParser::TrackId id) { |
return itr->second; |
} |
-void FrameProcessor::NotifyNewMediaSegmentStarting( |
- DecodeTimestamp segment_timestamp) { |
- DVLOG(2) << __FUNCTION__ << "(" << segment_timestamp.InSecondsF() << ")"; |
+void FrameProcessor::NotifyStartOfCodedFrameGroup( |
+ DecodeTimestamp start_timestamp) { |
+ DVLOG(2) << __FUNCTION__ << "(" << start_timestamp.InSecondsF() << ")"; |
for (TrackBufferMap::iterator itr = track_buffers_.begin(); |
itr != track_buffers_.end(); |
++itr) { |
- itr->second->stream()->OnNewMediaSegment(segment_timestamp); |
+ itr->second->stream()->OnStartOfCodedFrameGroup(start_timestamp); |
} |
} |
@@ -448,8 +453,7 @@ bool FrameProcessor::ProcessFrame( |
const scoped_refptr<StreamParserBuffer>& frame, |
base::TimeDelta append_window_start, |
base::TimeDelta append_window_end, |
- base::TimeDelta* timestamp_offset, |
- bool* new_media_segment) { |
+ base::TimeDelta* timestamp_offset) { |
// Implements the loop within step 1 of the coded frame processing algorithm |
// for a single input frame per April 1, 2014 MSE spec editor's draft: |
// https://dvcs.w3.org/hg/html-media/raw-file/d471a4412040/media-source/ |
@@ -587,12 +591,14 @@ bool FrameProcessor::ProcessFrame( |
// If last decode timestamp for track buffer is set and the difference |
// between decode timestamp and last decode timestamp is greater than 2 |
// times last frame duration: |
- DecodeTimestamp last_decode_timestamp = |
+ DecodeTimestamp track_last_decode_timestamp = |
track_buffer->last_decode_timestamp(); |
- if (last_decode_timestamp != kNoDecodeTimestamp()) { |
- base::TimeDelta dts_delta = decode_timestamp - last_decode_timestamp; |
- if (dts_delta < base::TimeDelta() || |
- dts_delta > 2 * track_buffer->last_frame_duration()) { |
+ if (track_last_decode_timestamp != kNoDecodeTimestamp()) { |
+ base::TimeDelta track_dts_delta = |
+ decode_timestamp - track_last_decode_timestamp; |
+ if (track_dts_delta < base::TimeDelta() || |
+ track_dts_delta > 2 * track_buffer->last_frame_duration()) { |
+ DCHECK(in_coded_frame_group_); |
// 7.1. If mode equals "segments": Set group end timestamp to |
// presentation timestamp. |
// If mode equals "sequence": Set group start timestamp equal to |
@@ -601,8 +607,8 @@ bool FrameProcessor::ProcessFrame( |
group_end_timestamp_ = presentation_timestamp; |
// This triggers a discontinuity so we need to treat the next frames |
// appended within the append window as if they were the beginning of |
- // a new segment. |
- *new_media_segment = true; |
+ // a new coded frame group. |
+ in_coded_frame_group_ = false; |
} else { |
DVLOG(3) << __FUNCTION__ << " : Sequence mode discontinuity, GETS: " |
<< group_end_timestamp_.InSecondsF(); |
@@ -692,19 +698,19 @@ bool FrameProcessor::ProcessFrame( |
} |
// We now have a processed buffer to append to the track buffer's stream. |
- // If it is the first in a new media segment or following a discontinuity, |
- // notify all the track buffers' streams that a new segment is beginning. |
- if (*new_media_segment) { |
- // First, complete the append to track buffer streams of previous media |
- // segment's frames, if any. |
+ // If it is the first in a new coded frame group (such as following a |
+ // discontinuity), notify all the track buffers' streams that a coded frame |
+ // group is starting. |
+ if (!in_coded_frame_group_) { |
+ // First, complete the append to track buffer streams of the previous |
+ // coded frame group's frames, if any. |
if (!FlushProcessedFrames()) |
return false; |
- *new_media_segment = false; |
- |
// TODO(acolwell/wolenetz): This should be changed to a presentation |
// timestamp. See http://crbug.com/402502 |
- NotifyNewMediaSegmentStarting(decode_timestamp); |
+ NotifyStartOfCodedFrameGroup(decode_timestamp); |
+ in_coded_frame_group_ = true; |
} |
DVLOG(3) << __FUNCTION__ << ": Sending processed frame to stream, " |
@@ -713,9 +719,7 @@ bool FrameProcessor::ProcessFrame( |
// Steps 13-18: Note, we optimize by appending groups of contiguous |
// processed frames for each track buffer at end of ProcessFrames() or prior |
- // to NotifyNewMediaSegmentStarting(). |
- // TODO(wolenetz): Refactor SourceBufferStream to conform to spec GC timing. |
- // See http://crbug.com/371197. |
+ // to NotifyStartOfCodedFrameGroup(). |
track_buffer->EnqueueProcessedFrame(frame); |
// 19. Set last decode timestamp for track buffer to decode timestamp. |