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/filters/legacy_frame_processor.h" | 5 #include "media/filters/legacy_frame_processor.h" |
6 | 6 |
7 #include "media/base/buffers.h" | 7 #include "media/base/buffers.h" |
8 #include "media/base/stream_parser_buffer.h" | 8 #include "media/base/stream_parser_buffer.h" |
9 | 9 |
10 namespace media { | 10 namespace media { |
(...skipping 15 matching lines...) Expand all Loading... |
26 sequence_mode_ = sequence_mode; | 26 sequence_mode_ = sequence_mode; |
27 } | 27 } |
28 | 28 |
29 bool LegacyFrameProcessor::ProcessFrames( | 29 bool LegacyFrameProcessor::ProcessFrames( |
30 const StreamParser::BufferQueue& audio_buffers, | 30 const StreamParser::BufferQueue& audio_buffers, |
31 const StreamParser::BufferQueue& video_buffers, | 31 const StreamParser::BufferQueue& video_buffers, |
32 const StreamParser::TextBufferQueueMap& text_map, | 32 const StreamParser::TextBufferQueueMap& text_map, |
33 base::TimeDelta append_window_start, | 33 base::TimeDelta append_window_start, |
34 base::TimeDelta append_window_end, | 34 base::TimeDelta append_window_end, |
35 bool* new_media_segment, | 35 bool* new_media_segment, |
36 base::TimeDelta* timestamp_offset) { | 36 base::TimeDelta* timestamp_offset, |
| 37 base::TimeDelta media_time) { |
37 DVLOG(2) << __FUNCTION__ << "()"; | 38 DVLOG(2) << __FUNCTION__ << "()"; |
38 DCHECK(new_media_segment); | 39 DCHECK(new_media_segment); |
39 DCHECK(timestamp_offset); | 40 DCHECK(timestamp_offset); |
40 | 41 |
41 // NOTE: Legacy coded frame processing does not update timestamp offset. | 42 // NOTE: Legacy coded frame processing does not update timestamp offset. |
42 base::TimeDelta offset = *timestamp_offset; | 43 base::TimeDelta offset = *timestamp_offset; |
43 | 44 |
44 DCHECK(!audio_buffers.empty() || !video_buffers.empty() || | 45 DCHECK(!audio_buffers.empty() || !video_buffers.empty() || |
45 !text_map.empty()); | 46 !text_map.empty()); |
46 | 47 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 segment_timestamp = std::min(filtered_video.front()->GetDecodeTimestamp(), | 105 segment_timestamp = std::min(filtered_video.front()->GetDecodeTimestamp(), |
105 segment_timestamp); | 106 segment_timestamp); |
106 } | 107 } |
107 | 108 |
108 *new_media_segment = false; | 109 *new_media_segment = false; |
109 DCHECK(segment_timestamp != kInfiniteDuration()); | 110 DCHECK(segment_timestamp != kInfiniteDuration()); |
110 NotifyNewMediaSegmentStarting(segment_timestamp); | 111 NotifyNewMediaSegmentStarting(segment_timestamp); |
111 } | 112 } |
112 | 113 |
113 if (!filtered_audio.empty() && | 114 if (!filtered_audio.empty() && |
114 !AppendAndUpdateDuration(audio_track->stream(), filtered_audio)) { | 115 !AppendAndUpdateDuration( |
| 116 audio_track->stream(), filtered_audio, media_time)) { |
115 return false; | 117 return false; |
116 } | 118 } |
117 | 119 |
118 if (!filtered_video.empty() && | 120 if (!filtered_video.empty() && |
119 !AppendAndUpdateDuration(video_track->stream(), filtered_video)) { | 121 !AppendAndUpdateDuration( |
| 122 video_track->stream(), filtered_video, media_time)) { |
120 return false; | 123 return false; |
121 } | 124 } |
122 | 125 |
123 if (!filtered_text.empty()) { | 126 if (!filtered_text.empty()) { |
124 for (StreamParser::TextBufferQueueMap::const_iterator itr = | 127 for (StreamParser::TextBufferQueueMap::const_iterator itr = |
125 filtered_text.begin(); | 128 filtered_text.begin(); |
126 itr != filtered_text.end(); | 129 itr != filtered_text.end(); |
127 ++itr) { | 130 ++itr) { |
128 MseTrackBuffer* track = FindTrack(itr->first); | 131 MseTrackBuffer* track = FindTrack(itr->first); |
129 if (!track || !AppendAndUpdateDuration(track->stream(), itr->second)) | 132 if (!track || !AppendAndUpdateDuration( |
| 133 track->stream(), itr->second, media_time)) |
130 return false; | 134 return false; |
131 } | 135 } |
132 } | 136 } |
133 | 137 |
134 return true; | 138 return true; |
135 } | 139 } |
136 | 140 |
137 void LegacyFrameProcessor::AdjustBufferTimestamps( | 141 void LegacyFrameProcessor::AdjustBufferTimestamps( |
138 const StreamParser::BufferQueue& buffers, | 142 const StreamParser::BufferQueue& buffers, |
139 base::TimeDelta timestamp_offset) { | 143 base::TimeDelta timestamp_offset) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 230 |
227 track->set_needs_random_access_point(false); | 231 track->set_needs_random_access_point(false); |
228 } | 232 } |
229 | 233 |
230 filtered_buffers->push_back(buffer); | 234 filtered_buffers->push_back(buffer); |
231 } | 235 } |
232 } | 236 } |
233 | 237 |
234 bool LegacyFrameProcessor::AppendAndUpdateDuration( | 238 bool LegacyFrameProcessor::AppendAndUpdateDuration( |
235 ChunkDemuxerStream* stream, | 239 ChunkDemuxerStream* stream, |
236 const StreamParser::BufferQueue& buffers) { | 240 const StreamParser::BufferQueue& buffers, |
| 241 base::TimeDelta media_time) { |
237 DCHECK(!buffers.empty()); | 242 DCHECK(!buffers.empty()); |
238 | 243 |
239 if (!stream || !stream->Append(buffers)) | 244 if (!stream || !stream->Append(buffers, media_time)) |
240 return false; | 245 return false; |
241 | 246 |
242 // Approximate spec's "highest presentation end timestamp". | 247 // Approximate spec's "highest presentation end timestamp". |
243 base::TimeDelta highest_end_timestamp = stream->GetBufferedDuration(); | 248 base::TimeDelta highest_end_timestamp = stream->GetBufferedDuration(); |
244 DCHECK(highest_end_timestamp > base::TimeDelta()); | 249 DCHECK(highest_end_timestamp > base::TimeDelta()); |
245 | 250 |
246 increase_duration_cb_.Run(highest_end_timestamp); | 251 increase_duration_cb_.Run(highest_end_timestamp); |
247 return true; | 252 return true; |
248 } | 253 } |
249 | 254 |
(...skipping 29 matching lines...) Expand all Loading... |
279 std::min(*lowest_segment_timestamp, | 284 std::min(*lowest_segment_timestamp, |
280 filtered_buffers.front()->GetDecodeTimestamp()); | 285 filtered_buffers.front()->GetDecodeTimestamp()); |
281 DCHECK(filtered_text->find(text_track_id) == filtered_text->end()); | 286 DCHECK(filtered_text->find(text_track_id) == filtered_text->end()); |
282 filtered_text->insert(std::make_pair(text_track_id, filtered_buffers)); | 287 filtered_text->insert(std::make_pair(text_track_id, filtered_buffers)); |
283 } | 288 } |
284 | 289 |
285 return true; | 290 return true; |
286 } | 291 } |
287 | 292 |
288 } // namespace media | 293 } // namespace media |
OLD | NEW |