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

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

Issue 2343543002: MSE: Replace crossfade splicing overlap trimming. (Closed)
Patch Set: fix compile error 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 audio codecs (notably: not
191 // partial append window support for most codecs (notably: not opus). 189 // opus).
192 const bool codec_supported = config.codec() == kCodecMP3 || 190 partial_append_window_trimming_enabled_ = config.codec() == kCodecMP3 ||
193 config.codec() == kCodecAAC || 191 config.codec() == kCodecAAC ||
194 config.codec() == kCodecVorbis; 192 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 193
199 stream_.reset( 194 stream_.reset(new SourceBufferStream(config, media_log));
200 new SourceBufferStream(config, media_log, splice_frames_enabled_));
201 return true; 195 return true;
202 } 196 }
203 197
204 return stream_->UpdateAudioConfig(config); 198 return stream_->UpdateAudioConfig(config);
205 } 199 }
206 200
207 bool ChunkDemuxerStream::UpdateVideoConfig( 201 bool ChunkDemuxerStream::UpdateVideoConfig(
208 const VideoDecoderConfig& config, 202 const VideoDecoderConfig& config,
209 const scoped_refptr<MediaLog>& media_log) { 203 const scoped_refptr<MediaLog>& media_log) {
210 DCHECK(config.IsValidConfig()); 204 DCHECK(config.IsValidConfig());
211 DCHECK_EQ(type_, VIDEO); 205 DCHECK_EQ(type_, VIDEO);
212 base::AutoLock auto_lock(lock_); 206 base::AutoLock auto_lock(lock_);
213 207
214 if (!stream_) { 208 if (!stream_) {
215 DCHECK_EQ(state_, UNINITIALIZED); 209 DCHECK_EQ(state_, UNINITIALIZED);
216 stream_.reset( 210 stream_.reset(new SourceBufferStream(config, media_log));
217 new SourceBufferStream(config, media_log, splice_frames_enabled_));
218 return true; 211 return true;
219 } 212 }
220 213
221 return stream_->UpdateVideoConfig(config); 214 return stream_->UpdateVideoConfig(config);
222 } 215 }
223 216
224 void ChunkDemuxerStream::UpdateTextConfig( 217 void ChunkDemuxerStream::UpdateTextConfig(
225 const TextTrackConfig& config, 218 const TextTrackConfig& config,
226 const scoped_refptr<MediaLog>& media_log) { 219 const scoped_refptr<MediaLog>& media_log) {
227 DCHECK_EQ(type_, TEXT); 220 DCHECK_EQ(type_, TEXT);
228 base::AutoLock auto_lock(lock_); 221 base::AutoLock auto_lock(lock_);
229 DCHECK(!stream_); 222 DCHECK(!stream_);
230 DCHECK_EQ(state_, UNINITIALIZED); 223 DCHECK_EQ(state_, UNINITIALIZED);
231 stream_.reset( 224 stream_.reset(new SourceBufferStream(config, media_log));
232 new SourceBufferStream(config, media_log, splice_frames_enabled_));
233 } 225 }
234 226
235 void ChunkDemuxerStream::MarkEndOfStream() { 227 void ChunkDemuxerStream::MarkEndOfStream() {
236 base::AutoLock auto_lock(lock_); 228 base::AutoLock auto_lock(lock_);
237 stream_->MarkEndOfStream(); 229 stream_->MarkEndOfStream();
238 } 230 }
239 231
240 void ChunkDemuxerStream::UnmarkEndOfStream() { 232 void ChunkDemuxerStream::UnmarkEndOfStream() {
241 base::AutoLock auto_lock(lock_); 233 base::AutoLock auto_lock(lock_);
242 stream_->UnmarkEndOfStream(); 234 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_; 385 DVLOG(2) << __func__ << ": returning kOk with EOS buffer, type " << type_;
394 break; 386 break;
395 } 387 }
396 388
397 base::ResetAndReturn(&read_cb_).Run(status, buffer); 389 base::ResetAndReturn(&read_cb_).Run(status, buffer);
398 } 390 }
399 391
400 ChunkDemuxer::ChunkDemuxer( 392 ChunkDemuxer::ChunkDemuxer(
401 const base::Closure& open_cb, 393 const base::Closure& open_cb,
402 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb, 394 const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
403 const scoped_refptr<MediaLog>& media_log, 395 const scoped_refptr<MediaLog>& media_log)
404 bool splice_frames_enabled)
405 : state_(WAITING_FOR_INIT), 396 : state_(WAITING_FOR_INIT),
406 cancel_next_seek_(false), 397 cancel_next_seek_(false),
407 host_(NULL), 398 host_(NULL),
408 open_cb_(open_cb), 399 open_cb_(open_cb),
409 encrypted_media_init_data_cb_(encrypted_media_init_data_cb), 400 encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
410 enable_text_(false), 401 enable_text_(false),
411 media_log_(media_log), 402 media_log_(media_log),
412 pending_source_init_done_count_(0), 403 pending_source_init_done_count_(0),
413 duration_(kNoTimestamp), 404 duration_(kNoTimestamp),
414 user_specified_duration_(-1), 405 user_specified_duration_(-1),
415 liveness_(DemuxerStream::LIVENESS_UNKNOWN), 406 liveness_(DemuxerStream::LIVENESS_UNKNOWN),
416 splice_frames_enabled_(splice_frames_enabled),
417 detected_audio_track_count_(0), 407 detected_audio_track_count_(0),
418 detected_video_track_count_(0), 408 detected_video_track_count_(0),
419 detected_text_track_count_(0) { 409 detected_text_track_count_(0) {
420 DCHECK(!open_cb_.is_null()); 410 DCHECK(!open_cb_.is_null());
421 DCHECK(!encrypted_media_init_data_cb_.is_null()); 411 DCHECK(!encrypted_media_init_data_cb_.is_null());
422 } 412 }
423 413
424 std::string ChunkDemuxer::GetDisplayName() const { 414 std::string ChunkDemuxer::GetDisplayName() const {
425 return "ChunkDemuxer"; 415 return "ChunkDemuxer";
426 } 416 }
(...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 1118 // processing, which happens when a new chunk of data is appended and the
1129 // lock_ must be held by ChunkDemuxer::AppendData. 1119 // lock_ must be held by ChunkDemuxer::AppendData.
1130 lock_.AssertAcquired(); 1120 lock_.AssertAcquired();
1131 1121
1132 MediaTrack::Id media_track_id = GenerateMediaTrackId(); 1122 MediaTrack::Id media_track_id = GenerateMediaTrackId();
1133 1123
1134 switch (type) { 1124 switch (type) {
1135 case DemuxerStream::AUDIO: 1125 case DemuxerStream::AUDIO:
1136 if (audio_) 1126 if (audio_)
1137 return NULL; 1127 return NULL;
1138 audio_.reset(new ChunkDemuxerStream( 1128 audio_.reset(
1139 DemuxerStream::AUDIO, splice_frames_enabled_, media_track_id)); 1129 new ChunkDemuxerStream(DemuxerStream::AUDIO, media_track_id));
1140 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) == 1130 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
1141 track_id_to_demux_stream_map_.end()); 1131 track_id_to_demux_stream_map_.end());
1142 track_id_to_demux_stream_map_[media_track_id] = audio_.get(); 1132 track_id_to_demux_stream_map_[media_track_id] = audio_.get();
1143 return audio_.get(); 1133 return audio_.get();
1144 break; 1134 break;
1145 case DemuxerStream::VIDEO: 1135 case DemuxerStream::VIDEO:
1146 if (video_) 1136 if (video_)
1147 return NULL; 1137 return NULL;
1148 video_.reset(new ChunkDemuxerStream( 1138 video_.reset(
1149 DemuxerStream::VIDEO, splice_frames_enabled_, media_track_id)); 1139 new ChunkDemuxerStream(DemuxerStream::VIDEO, media_track_id));
1150 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) == 1140 DCHECK(track_id_to_demux_stream_map_.find(media_track_id) ==
1151 track_id_to_demux_stream_map_.end()); 1141 track_id_to_demux_stream_map_.end());
1152 track_id_to_demux_stream_map_[media_track_id] = video_.get(); 1142 track_id_to_demux_stream_map_[media_track_id] = video_.get();
1153 return video_.get(); 1143 return video_.get();
1154 break; 1144 break;
1155 case DemuxerStream::TEXT: { 1145 case DemuxerStream::TEXT: {
1156 return new ChunkDemuxerStream(DemuxerStream::TEXT, splice_frames_enabled_, 1146 return new ChunkDemuxerStream(DemuxerStream::TEXT, media_track_id);
1157 media_track_id);
1158 break; 1147 break;
1159 } 1148 }
1160 case DemuxerStream::UNKNOWN: 1149 case DemuxerStream::UNKNOWN:
1161 case DemuxerStream::NUM_TYPES: 1150 case DemuxerStream::NUM_TYPES:
1162 NOTREACHED(); 1151 NOTREACHED();
1163 return NULL; 1152 return NULL;
1164 } 1153 }
1165 NOTREACHED(); 1154 NOTREACHED();
1166 return NULL; 1155 return NULL;
1167 } 1156 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 } 1261 }
1273 1262
1274 void ChunkDemuxer::ShutdownAllStreams() { 1263 void ChunkDemuxer::ShutdownAllStreams() {
1275 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); 1264 for (MediaSourceStateMap::iterator itr = source_state_map_.begin();
1276 itr != source_state_map_.end(); ++itr) { 1265 itr != source_state_map_.end(); ++itr) {
1277 itr->second->Shutdown(); 1266 itr->second->Shutdown();
1278 } 1267 }
1279 } 1268 }
1280 1269
1281 } // namespace media 1270 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698