Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(591)

Unified Diff: media/filters/legacy_frame_processor.cc

Issue 276573002: Add gapless playback support for AAC playback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix msvc error. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/frame_processor_base.cc ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/legacy_frame_processor.cc
diff --git a/media/filters/legacy_frame_processor.cc b/media/filters/legacy_frame_processor.cc
index ef8f89f92281917bb5940e3f8c813b5cdac07920..3707b01d633178f422d71ba9ae0fe0be0d581f6b 100644
--- a/media/filters/legacy_frame_processor.cc
+++ b/media/filters/legacy_frame_processor.cc
@@ -166,63 +166,59 @@ void LegacyFrameProcessor::FilterWithAppendWindow(
// (i.e., next keyframe) if a buffer gets dropped.
for (StreamParser::BufferQueue::const_iterator itr = buffers.begin();
itr != buffers.end(); ++itr) {
+ const scoped_refptr<StreamParserBuffer>& buffer = *itr;
+
// Filter out buffers that are outside the append window. Anytime
// a buffer gets dropped we need to set |*needs_keyframe| to true
// because we can only resume decoding at keyframes.
- base::TimeDelta presentation_timestamp = (*itr)->timestamp();
+ base::TimeDelta presentation_timestamp = buffer->timestamp();
// TODO(acolwell): Change |frame_end_timestamp| value to always be
// |presentation_timestamp + (*itr)->duration()|, like the spec
// requires, once frame durations are actually present in all buffers.
// See http://crbug.com/351166.
base::TimeDelta frame_end_timestamp = presentation_timestamp;
- base::TimeDelta frame_duration = (*itr)->duration();
+ base::TimeDelta frame_duration = buffer->duration();
if (frame_duration > base::TimeDelta()) {
DCHECK(frame_duration != kNoTimestamp());
frame_end_timestamp += frame_duration;
+
+ if (track->stream()->supports_partial_append_window_trimming() &&
+ HandlePartialAppendWindowTrimming(append_window_start,
+ append_window_end,
+ buffer)) {
+ // If |buffer| was shortened a discontinuity may exist, so treat the
+ // next frames appended as if they were the beginning of a new media
+ // segment.
+ if (buffer->timestamp() != presentation_timestamp)
+ *new_media_segment = true;
+
+ // |buffer| has been partially trimmed or had preroll added.
+ presentation_timestamp = buffer->timestamp();
+ frame_duration = buffer->duration();
+
+ // The end timestamp of the frame should be unchanged.
+ DCHECK(frame_end_timestamp == presentation_timestamp + frame_duration);
+ }
}
if (presentation_timestamp < append_window_start ||
frame_end_timestamp > append_window_end) {
- // See if a partial discard can be done around |append_window_start|.
- if (track->stream()->supports_partial_append_window_trimming() &&
- presentation_timestamp < append_window_start &&
- frame_end_timestamp > append_window_start &&
- frame_end_timestamp <= append_window_end) {
- DCHECK((*itr)->IsKeyframe());
- DVLOG(1) << "Truncating buffer which overlaps append window start."
- << " presentation_timestamp "
- << presentation_timestamp.InSecondsF()
- << " append_window_start " << append_window_start.InSecondsF();
-
- // Adjust the timestamp of this buffer forward to |append_window_start|,
- // while decreasing the duration appropriately.
- const scoped_refptr<StreamParserBuffer>& buffer = *itr;
- buffer->set_discard_padding(std::make_pair(
- append_window_start - presentation_timestamp, base::TimeDelta()));
- buffer->set_timestamp(append_window_start);
- buffer->SetDecodeTimestamp(append_window_start);
- buffer->set_duration(frame_end_timestamp - append_window_start);
-
- // TODO(dalecurtis): This could also be done with |append_window_end|,
- // but is not necessary since splice frames cover the overlap there.
- } else {
- track->set_needs_random_access_point(true);
- DVLOG(1) << "Dropping buffer outside append window."
- << " presentation_timestamp "
- << presentation_timestamp.InSecondsF();
- // 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;
- continue;
- }
+ track->set_needs_random_access_point(true);
+ DVLOG(1) << "Dropping buffer outside append window."
+ << " presentation_timestamp "
+ << presentation_timestamp.InSecondsF();
+ // 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;
+ continue;
}
// If the track needs a keyframe, then filter out buffers until we
// encounter the next keyframe.
if (track->needs_random_access_point()) {
- if (!(*itr)->IsKeyframe()) {
+ if (!buffer->IsKeyframe()) {
DVLOG(1) << "Dropping non-keyframe. presentation_timestamp "
<< presentation_timestamp.InSecondsF();
continue;
@@ -231,7 +227,7 @@ void LegacyFrameProcessor::FilterWithAppendWindow(
track->set_needs_random_access_point(false);
}
- filtered_buffers->push_back(*itr);
+ filtered_buffers->push_back(buffer);
}
}
« no previous file with comments | « media/filters/frame_processor_base.cc ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698