OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/base/audio_discard_helper.h" | 5 #include "media/base/audio_discard_helper.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "media/base/audio_buffer.h" | 10 #include "media/base/audio_buffer.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 } | 79 } |
80 return false; | 80 return false; |
81 } | 81 } |
82 | 82 |
83 const size_t original_frame_count = decoded_buffer->frame_count(); | 83 const size_t original_frame_count = decoded_buffer->frame_count(); |
84 | 84 |
85 // If there's a one buffer delay for decoding, pick up the last encoded | 85 // If there's a one buffer delay for decoding, pick up the last encoded |
86 // buffer's discard padding for processing with the current decoded buffer. | 86 // buffer's discard padding for processing with the current decoded buffer. |
87 DecoderBuffer::DiscardPadding current_discard_padding = | 87 DecoderBuffer::DiscardPadding current_discard_padding = |
88 encoded_buffer->discard_padding(); | 88 encoded_buffer->discard_padding(); |
89 if (delayed_discard_) | 89 if (delayed_discard_) { |
| 90 // For simplicity disallow cases where decoder delay is present with delayed |
| 91 // discard (no codecs at present). Doing so allows us to avoid complexity |
| 92 // around endpoint tracking when handling complete buffer discards. |
| 93 DCHECK_EQ(decoder_delay_, 0u); |
90 std::swap(current_discard_padding, delayed_discard_padding_); | 94 std::swap(current_discard_padding, delayed_discard_padding_); |
| 95 } |
91 | 96 |
92 if (discard_frames_ > 0) { | 97 if (discard_frames_ > 0) { |
93 const size_t decoded_frames = decoded_buffer->frame_count(); | 98 const size_t decoded_frames = decoded_buffer->frame_count(); |
94 const size_t frames_to_discard = std::min(discard_frames_, decoded_frames); | 99 const size_t frames_to_discard = std::min(discard_frames_, decoded_frames); |
95 discard_frames_ -= frames_to_discard; | 100 discard_frames_ -= frames_to_discard; |
96 | 101 |
97 // If everything would be discarded, indicate a new buffer is required. | 102 // If everything would be discarded, indicate a new buffer is required. |
98 if (frames_to_discard == decoded_frames) { | 103 if (frames_to_discard == decoded_frames) { |
99 // For simplicity disallow cases where a buffer with discard padding is | 104 // For simplicity disallow cases where a buffer with discard padding is |
100 // present. Doing so allows us to avoid complexity around tracking | 105 // present. Doing so allows us to avoid complexity around tracking |
101 // discards across buffers. | 106 // discards across buffers. |
102 DCHECK(current_discard_padding.first == base::TimeDelta()); | 107 DCHECK(current_discard_padding.first == base::TimeDelta()); |
103 DCHECK(current_discard_padding.second == base::TimeDelta()); | 108 DCHECK(current_discard_padding.second == base::TimeDelta()); |
104 return false; | 109 return false; |
105 } | 110 } |
106 | 111 |
107 decoded_buffer->TrimStart(frames_to_discard); | 112 decoded_buffer->TrimStart(frames_to_discard); |
108 } | 113 } |
109 | 114 |
110 // Handle front discard padding. | 115 // Handle front discard padding. |
111 if (current_discard_padding.first > base::TimeDelta()) { | 116 if (current_discard_padding.first > base::TimeDelta()) { |
112 const size_t decoded_frames = decoded_buffer->frame_count(); | 117 const size_t decoded_frames = decoded_buffer->frame_count(); |
| 118 |
| 119 // If a complete buffer discard is requested and there's no decoder delay, |
| 120 // just discard all remaining frames from this buffer. With decoder delay |
| 121 // we have to estimate the correct number of frames to discard based on the |
| 122 // duration of the encoded buffer. |
113 const size_t start_frames_to_discard = | 123 const size_t start_frames_to_discard = |
114 TimeDeltaToFrames(current_discard_padding.first); | 124 current_discard_padding.first == kInfiniteDuration() |
| 125 ? (decoder_delay_ > 0 |
| 126 ? TimeDeltaToFrames(encoded_buffer->duration()) |
| 127 : decoded_frames) |
| 128 : TimeDeltaToFrames(current_discard_padding.first); |
115 | 129 |
116 // Regardless of the timestamp on the encoded buffer, the corresponding | 130 // Regardless of the timestamp on the encoded buffer, the corresponding |
117 // decoded output will appear |decoder_delay_| frames later. | 131 // decoded output will appear |decoder_delay_| frames later. |
118 size_t discard_start = decoder_delay_; | 132 size_t discard_start = decoder_delay_; |
119 if (decoder_delay_ > 0) { | 133 if (decoder_delay_ > 0) { |
120 // If we have a |decoder_delay_| and have already discarded frames from | 134 // If we have a |decoder_delay_| and have already discarded frames from |
121 // this buffer, the |discard_start| must be adjusted by the number of | 135 // this buffer, the |discard_start| must be adjusted by the number of |
122 // frames already discarded. | 136 // frames already discarded. |
123 const size_t frames_discarded_so_far = | 137 const size_t frames_discarded_so_far = |
124 original_frame_count - decoded_buffer->frame_count(); | 138 original_frame_count - decoded_buffer->frame_count(); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 DCHECK(current_discard_padding.second == base::TimeDelta()); | 190 DCHECK(current_discard_padding.second == base::TimeDelta()); |
177 } | 191 } |
178 | 192 |
179 // Assign timestamp to the buffer. | 193 // Assign timestamp to the buffer. |
180 decoded_buffer->set_timestamp(timestamp_helper_.GetTimestamp()); | 194 decoded_buffer->set_timestamp(timestamp_helper_.GetTimestamp()); |
181 timestamp_helper_.AddFrames(decoded_buffer->frame_count()); | 195 timestamp_helper_.AddFrames(decoded_buffer->frame_count()); |
182 return true; | 196 return true; |
183 } | 197 } |
184 | 198 |
185 } // namespace media | 199 } // namespace media |
OLD | NEW |