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

Side by Side Diff: media/filters/chunk_demuxer.cc

Issue 2343543002: MSE: Replace crossfade splicing overlap trimming. (Closed)
Patch Set: Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/chunk_demuxer.h" 5 #include "media/filters/chunk_demuxer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <list> 9 #include <list>
10 #include <utility> 10 #include <utility>
(...skipping 13 matching lines...) Expand all
24 #include "media/base/video_codecs.h" 24 #include "media/base/video_codecs.h"
25 #include "media/base/video_decoder_config.h" 25 #include "media/base/video_decoder_config.h"
26 #include "media/filters/frame_processor.h" 26 #include "media/filters/frame_processor.h"
27 #include "media/filters/stream_parser_factory.h" 27 #include "media/filters/stream_parser_factory.h"
28 28
29 using base::TimeDelta; 29 using base::TimeDelta;
30 30
31 namespace media { 31 namespace media {
32 32
33 ChunkDemuxerStream::ChunkDemuxerStream(Type type, 33 ChunkDemuxerStream::ChunkDemuxerStream(Type type,
34 bool splice_frames_enabled,
35 MediaTrack::Id media_track_id) 34 MediaTrack::Id media_track_id)
36 : type_(type), 35 : type_(type),
37 liveness_(DemuxerStream::LIVENESS_UNKNOWN), 36 liveness_(DemuxerStream::LIVENESS_UNKNOWN),
38 media_track_id_(media_track_id), 37 media_track_id_(media_track_id),
39 state_(UNINITIALIZED), 38 state_(UNINITIALIZED),
40 splice_frames_enabled_(splice_frames_enabled),
41 partial_append_window_trimming_enabled_(false), 39 partial_append_window_trimming_enabled_(false),
42 is_enabled_(true) {} 40 is_enabled_(true) {}
43 41
44 void ChunkDemuxerStream::StartReturningData() { 42 void ChunkDemuxerStream::StartReturningData() {
45 DVLOG(1) << "ChunkDemuxerStream::StartReturningData()"; 43 DVLOG(1) << "ChunkDemuxerStream::StartReturningData()";
46 base::AutoLock auto_lock(lock_); 44 base::AutoLock auto_lock(lock_);
47 DCHECK(read_cb_.is_null()); 45 DCHECK(read_cb_.is_null());
48 ChangeState_Locked(RETURNING_DATA_FOR_READS); 46 ChangeState_Locked(RETURNING_DATA_FOR_READS);
49 } 47 }
50 48
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 178
181 bool ChunkDemuxerStream::UpdateAudioConfig( 179 bool ChunkDemuxerStream::UpdateAudioConfig(
182 const AudioDecoderConfig& config, 180 const AudioDecoderConfig& config,
183 const scoped_refptr<MediaLog>& media_log) { 181 const scoped_refptr<MediaLog>& media_log) {
184 DCHECK(config.IsValidConfig()); 182 DCHECK(config.IsValidConfig());
185 DCHECK_EQ(type_, AUDIO); 183 DCHECK_EQ(type_, AUDIO);
186 base::AutoLock auto_lock(lock_); 184 base::AutoLock auto_lock(lock_);
187 if (!stream_) { 185 if (!stream_) {
188 DCHECK_EQ(state_, UNINITIALIZED); 186 DCHECK_EQ(state_, UNINITIALIZED);
189 187
190 // On platforms which support splice frames, enable splice frames and 188 // Enable partial append window support for most codecs (notably: not opus).
wolenetz 2016/09/15 23:47:52 nit: s/most codecs/most audio codecs/
chcunningham 2016/09/16 20:42:44 Done.
191 // partial append window support for most codecs (notably: not opus). 189 partial_append_window_trimming_enabled_ = config.codec() == kCodecMP3 ||
192 const bool codec_supported = config.codec() == kCodecMP3 || 190 config.codec() == kCodecAAC ||
193 config.codec() == kCodecAAC || 191 config.codec() == kCodecVorbis;
194 config.codec() == kCodecVorbis;
195 splice_frames_enabled_ = splice_frames_enabled_ && codec_supported;
196 partial_append_window_trimming_enabled_ =
197 splice_frames_enabled_ && codec_supported;
198 192
199 stream_.reset( 193 stream_.reset(new SourceBufferStream(config, media_log));
200 new SourceBufferStream(config, media_log, splice_frames_enabled_));
201 return true; 194 return true;
202 } 195 }
203 196
204 return stream_->UpdateAudioConfig(config); 197 return stream_->UpdateAudioConfig(config);
205 } 198 }
206 199
207 bool ChunkDemuxerStream::UpdateVideoConfig( 200 bool ChunkDemuxerStream::UpdateVideoConfig(
208 const VideoDecoderConfig& config, 201 const VideoDecoderConfig& config,
209 const scoped_refptr<MediaLog>& media_log) { 202 const scoped_refptr<MediaLog>& media_log) {
210 DCHECK(config.IsValidConfig()); 203 DCHECK(config.IsValidConfig());
211 DCHECK_EQ(type_, VIDEO); 204 DCHECK_EQ(type_, VIDEO);
212 base::AutoLock auto_lock(lock_); 205 base::AutoLock auto_lock(lock_);
213 206
214 if (!stream_) { 207 if (!stream_) {
215 DCHECK_EQ(state_, UNINITIALIZED); 208 DCHECK_EQ(state_, UNINITIALIZED);
216 stream_.reset( 209 stream_.reset(new SourceBufferStream(config, media_log));
217 new SourceBufferStream(config, media_log, splice_frames_enabled_));
218 return true; 210 return true;
219 } 211 }
220 212
221 return stream_->UpdateVideoConfig(config); 213 return stream_->UpdateVideoConfig(config);
222 } 214 }
223 215
224 void ChunkDemuxerStream::UpdateTextConfig( 216 void ChunkDemuxerStream::UpdateTextConfig(
225 const TextTrackConfig& config, 217 const TextTrackConfig& config,
226 const scoped_refptr<MediaLog>& media_log) { 218 const scoped_refptr<MediaLog>& media_log) {
227 DCHECK_EQ(type_, TEXT); 219 DCHECK_EQ(type_, TEXT);
228 base::AutoLock auto_lock(lock_); 220 base::AutoLock auto_lock(lock_);
229 DCHECK(!stream_); 221 DCHECK(!stream_);
230 DCHECK_EQ(state_, UNINITIALIZED); 222 DCHECK_EQ(state_, UNINITIALIZED);
231 stream_.reset( 223 stream_.reset(new SourceBufferStream(config, media_log));
232 new SourceBufferStream(config, media_log, splice_frames_enabled_));
233 } 224 }
234 225
235 void ChunkDemuxerStream::MarkEndOfStream() { 226 void ChunkDemuxerStream::MarkEndOfStream() {
236 base::AutoLock auto_lock(lock_); 227 base::AutoLock auto_lock(lock_);
237 stream_->MarkEndOfStream(); 228 stream_->MarkEndOfStream();
238 } 229 }
239 230
240 void ChunkDemuxerStream::UnmarkEndOfStream() { 231 void ChunkDemuxerStream::UnmarkEndOfStream() {
241 base::AutoLock auto_lock(lock_); 232 base::AutoLock auto_lock(lock_);
242 stream_->UnmarkEndOfStream(); 233 stream_->UnmarkEndOfStream();
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 DVLOG(2) << __func__ << ": returning kOk with EOS buffer, type " << type_; 384 DVLOG(2) << __func__ << ": returning kOk with EOS buffer, type " << type_;
394 break; 385 break;
395 } 386 }
396 387
397 base::ResetAndReturn(&read_cb_).Run(status, buffer); 388 base::ResetAndReturn(&read_cb_).Run(status, buffer);
398 } 389 }
399 390
400 ChunkDemuxer::ChunkDemuxer( 391 ChunkDemuxer::ChunkDemuxer(
401 const base::Closure& open_cb, 392 const base::Closure& open_cb,
402 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb, 393 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
403 const scoped_refptr<MediaLog>& media_log, 394 const scoped_refptr<MediaLog>& media_log)
404 bool splice_frames_enabled)
405 : state_(WAITING_FOR_INIT), 395 : state_(WAITING_FOR_INIT),
406 cancel_next_seek_(false), 396 cancel_next_seek_(false),
407 host_(NULL), 397 host_(NULL),
408 open_cb_(open_cb), 398 open_cb_(open_cb),
409 encrypted_media_init_data_cb_(encrypted_media_init_data_cb), 399 encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
410 enable_text_(false), 400 enable_text_(false),
411 media_log_(media_log), 401 media_log_(media_log),
412 pending_source_init_done_count_(0), 402 pending_source_init_done_count_(0),
413 duration_(kNoTimestamp), 403 duration_(kNoTimestamp),
414 user_specified_duration_(-1), 404 user_specified_duration_(-1),
415 liveness_(DemuxerStream::LIVENESS_UNKNOWN), 405 liveness_(DemuxerStream::LIVENESS_UNKNOWN),
416 splice_frames_enabled_(splice_frames_enabled),
417 detected_audio_track_count_(0), 406 detected_audio_track_count_(0),
418 detected_video_track_count_(0), 407 detected_video_track_count_(0),
419 detected_text_track_count_(0) { 408 detected_text_track_count_(0) {
420 DCHECK(!open_cb_.is_null()); 409 DCHECK(!open_cb_.is_null());
421 DCHECK(!encrypted_media_init_data_cb_.is_null()); 410 DCHECK(!encrypted_media_init_data_cb_.is_null());
422 } 411 }
423 412
424 std::string ChunkDemuxer::GetDisplayName() const { 413 std::string ChunkDemuxer::GetDisplayName() const {
425 return "ChunkDemuxer"; 414 return "ChunkDemuxer";
426 } 415 }
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 // processing, which happens when a new chunk of data is appended and the 1117 // processing, which happens when a new chunk of data is appended and the
1129 // lock_ must be held by ChunkDemuxer::AppendData. 1118 // lock_ must be held by ChunkDemuxer::AppendData.
1130 lock_.AssertAcquired(); 1119 lock_.AssertAcquired();
1131 1120
1132 MediaTrack::Id media_track_id = GenerateMediaTrackId(); 1121 MediaTrack::Id media_track_id = GenerateMediaTrackId();
1133 1122
1134 switch (type) { 1123 switch (type) {
1135 case DemuxerStream::AUDIO: 1124 case DemuxerStream::AUDIO:
1136 if (audio_) 1125 if (audio_)
1137 return NULL; 1126 return NULL;
1138 audio_.reset(new ChunkDemuxerStream( 1127 audio_.reset(
1139 DemuxerStream::AUDIO, splice_frames_enabled_, media_track_id)); 1128 new ChunkDemuxerStream(DemuxerStream::AUDIO, media_track_id));
1140 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) == 1129 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
1141 track_id_to_demux_stream_map_.end()); 1130 track_id_to_demux_stream_map_.end());
1142 track_id_to_demux_stream_map_[media_track_id] = audio_.get(); 1131 track_id_to_demux_stream_map_[media_track_id] = audio_.get();
1143 return audio_.get(); 1132 return audio_.get();
1144 break; 1133 break;
1145 case DemuxerStream::VIDEO: 1134 case DemuxerStream::VIDEO:
1146 if (video_) 1135 if (video_)
1147 return NULL; 1136 return NULL;
1148 video_.reset(new ChunkDemuxerStream( 1137 video_.reset(
1149 DemuxerStream::VIDEO, splice_frames_enabled_, media_track_id)); 1138 new ChunkDemuxerStream(DemuxerStream::VIDEO, media_track_id));
1150 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) == 1139 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
1151 track_id_to_demux_stream_map_.end()); 1140 track_id_to_demux_stream_map_.end());
1152 track_id_to_demux_stream_map_[media_track_id] = video_.get(); 1141 track_id_to_demux_stream_map_[media_track_id] = video_.get();
1153 return video_.get(); 1142 return video_.get();
1154 break; 1143 break;
1155 case DemuxerStream::TEXT: { 1144 case DemuxerStream::TEXT: {
1156 return new ChunkDemuxerStream(DemuxerStream::TEXT, splice_frames_enabled_, 1145 return new ChunkDemuxerStream(DemuxerStream::TEXT, media_track_id);
1157 media_track_id);
1158 break; 1146 break;
1159 } 1147 }
1160 case DemuxerStream::UNKNOWN: 1148 case DemuxerStream::UNKNOWN:
1161 case DemuxerStream::NUM_TYPES: 1149 case DemuxerStream::NUM_TYPES:
1162 NOTREACHED(); 1150 NOTREACHED();
1163 return NULL; 1151 return NULL;
1164 } 1152 }
1165 NOTREACHED(); 1153 NOTREACHED();
1166 return NULL; 1154 return NULL;
1167 } 1155 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 } 1260 }
1273 1261
1274 void ChunkDemuxer::ShutdownAllStreams() { 1262 void ChunkDemuxer::ShutdownAllStreams() {
1275 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); 1263 for (MediaSourceStateMap::iterator itr = source_state_map_.begin();
1276 itr != source_state_map_.end(); ++itr) { 1264 itr != source_state_map_.end(); ++itr) {
1277 itr->second->Shutdown(); 1265 itr->second->Shutdown();
1278 } 1266 }
1279 } 1267 }
1280 1268
1281 } // namespace media 1269 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698