| 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 |